Service twin · API + UI
Attio
Test CRM agents that manage people, companies, relationships, and sales workflows.
$ uv tool install blobfish-cli
$ blobfish twin login
$ blobfish twin-runs create --twins attio --ttl 60 --waitWhat’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.
Seeded entities
| Entity | Table | Fields | About |
|---|---|---|---|
| add_record_to | add_record_tos | 7 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| attribute_definition | attribute_definitions | 7 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| call_recording | call_recordings | 4 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| call_recordings_by_metadata | call_recordings_by_metadatas | 11 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| comment | comments | 11 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| comment_reply | comment_replies | 5 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| email_content | email_contents | 4 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| emails_by_metadata | emails_by_metadatas | 8 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| list | lists | 5 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| list_attribute_definition | list_attribute_definitions | 7 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| list_records_in | list_records_ins | 7 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| meeting | meetings | 12 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| note | notes | 7 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| note_body | note_bodies | 3 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| notes_by_metadata | notes_by_metadatas | 10 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| record | records | 12 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| records_by_id | records_by_ids | 4 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| run_basic_report | run_basic_reports | 6 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| semantic_call_recording | semantic_call_recordings | 3 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| semantic_email | semantic_emails | 4 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| semantic_note | semantic_notes | 3 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| task | tasks | 17 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| update | updates | 5 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| whoami | whoamis | 2 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| workspace_member | workspace_members | 4 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| workspace_team | workspace_teams | 3 | Inferred 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:
$ 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.