All twins

Service twin · API + UI

Attio

Test CRM agents that manage people, companies, relationships, and sales workflows.

API + UIcaptured contractREST · MCP · CLI
Terminal
$ uv tool install blobfish-cli
$ blobfish twin login
$ blobfish twin-runs create --twins attio --ttl 60 --wait

What’s inside

A deterministic, seeded, resettable replica: every operation below executes real state transitions against the twin’s own SQLite state — reads are hash-invariant, writes produce inspectable diffs, and reset restores the seed baseline. This twin runs the captured contract sm--attio rekeyed onto seeded state.

Operations34
Reads24
Writes10
Entities26
Lifecycles0

Seeded entities

EntityTableFieldsAbout
add_record_toadd_record_tos7Inferred from MCP tool parameters; the tool contract remains the authority.
attribute_definitionattribute_definitions7Inferred from MCP tool parameters; the tool contract remains the authority.
call_recordingcall_recordings4Inferred from MCP tool parameters; the tool contract remains the authority.
call_recordings_by_metadatacall_recordings_by_metadatas11Inferred from MCP tool parameters; the tool contract remains the authority.
commentcomments11Inferred from MCP tool parameters; the tool contract remains the authority.
comment_replycomment_replies5Inferred from MCP tool parameters; the tool contract remains the authority.
email_contentemail_contents4Inferred from MCP tool parameters; the tool contract remains the authority.
emails_by_metadataemails_by_metadatas8Inferred from MCP tool parameters; the tool contract remains the authority.
listlists5Inferred from MCP tool parameters; the tool contract remains the authority.
list_attribute_definitionlist_attribute_definitions7Inferred from MCP tool parameters; the tool contract remains the authority.
list_records_inlist_records_ins7Inferred from MCP tool parameters; the tool contract remains the authority.
meetingmeetings12Inferred from MCP tool parameters; the tool contract remains the authority.
notenotes7Inferred from MCP tool parameters; the tool contract remains the authority.
note_bodynote_bodies3Inferred from MCP tool parameters; the tool contract remains the authority.
notes_by_metadatanotes_by_metadatas10Inferred from MCP tool parameters; the tool contract remains the authority.
recordrecords12Inferred from MCP tool parameters; the tool contract remains the authority.
records_by_idrecords_by_ids4Inferred from MCP tool parameters; the tool contract remains the authority.
run_basic_reportrun_basic_reports6Inferred from MCP tool parameters; the tool contract remains the authority.
semantic_call_recordingsemantic_call_recordings3Inferred from MCP tool parameters; the tool contract remains the authority.
semantic_emailsemantic_emails4Inferred from MCP tool parameters; the tool contract remains the authority.
semantic_notesemantic_notes3Inferred from MCP tool parameters; the tool contract remains the authority.
tasktasks17Inferred from MCP tool parameters; the tool contract remains the authority.
updateupdates5Inferred from MCP tool parameters; the tool contract remains the authority.
whoamiwhoamis2Inferred from MCP tool parameters; the tool contract remains the authority.
workspace_memberworkspace_members4Inferred from MCP tool parameters; the tool contract remains the authority.
workspace_teamworkspace_teams3Inferred from MCP tool parameters; the tool contract remains the authority.

Three surfaces, one state

Mount Attio in a twin environment and the same seeded state serves vendor-shaped REST operations, an MCP endpoint for tool calling, and a generated bf-twin CLI — with copy-on-write sessions per rollout and a one-call reset to the seed baseline. Prefer raw HTTP? The same create works with curl:

API
$ curl -sS -X POST https://blobfish.ai/api/v1/twin/environments \
    -H "X-API-Key: $BLOBFISH_API_KEY" -H "Content-Type: application/json" \
    -d '{"services":["attio"],"ttl_minutes":60}'

Known limitations

This twin mirrors the captured contract sm--attio: its tool surface is the captured server’s, with synthetic seeded values. Operations outside that capture are not mounted — we mount fewer, executable operations rather than stub the rest.