Service twin · API + UI
Gmail
Test email agents that triage inboxes, draft replies, and manage message workflows.
API + UIspec-groundedREST · MCP · CLI
Terminal
$ uv tool install blobfish-cli
$ blobfish twin login
$ blobfish twin-runs create --twins gmail --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.
Seeded entities
| Entity | Table | Fields | About |
|---|---|---|---|
| auto_forwarding | auto_forwardings | 4 | Auto-forwarding settings for an account. |
| batch_delete_messages_request | batch_delete_messages_requests | 2 | |
| batch_modify_messages_request | batch_modify_messages_requests | 6 | |
| cse_identity | cse_identities | 3 | The client-side encryption (CSE) configuration for the email address of an authenticated user. Gmail uses CSE configurations to save drafts… |
| cse_key_pair | cse_key_pairs | 7 | A client-side encryption S/MIME key pair, which is comprised of a public key, its certificate chain, and metadata for its paired private ke… |
| delegate | delegates | 3 | Settings for a delegate. Delegates can read, send, and delete messages, as well as view and add contacts, for the delegator's account. See … |
| draft | drafts | 7 | An unsent email. The canonical Gmail connector is draft-first: composing is a draft create. |
| filter | filters | 3 | Resource definition for Gmail filters. Filters apply to specific messages instead of an entire email thread. |
| forwarding_address | forwarding_addresses | 3 | Settings for a forwarding address. |
| history | histories | 2 | Inferred from operation parameters (spec has no named schema). |
| identity | identities | 2 | Inferred from operation parameters (spec has no named schema). |
| imap_setting | imap_settings | 5 | IMAP settings for an account. |
| keypair | keypairs | 2 | Inferred from operation parameters (spec has no named schema). |
| label | labels | 10 | Labels are used to categorize messages and threads within the user's mailbox. The maximum number of labels supported for a user's mailbox i… |
| language_setting | language_settings | 2 | Language settings for an account. These settings correspond to the "Language settings" feature in the web interface. |
| list_cse_identities_response | list_cse_identities_responses | 3 | |
| list_cse_key_pairs_response | list_cse_key_pairs_responses | 3 | |
| list_delegates_response | list_delegates_responses | 2 | Response for the ListDelegates method. |
| list_drafts_response | list_drafts_responses | 4 | |
| list_filters_response | list_filters_responses | 2 | Response for the ListFilters method. |
| list_forwarding_addresses_response | list_forwarding_addresses_responses | 2 | Response for the ListForwardingAddresses method. |
| list_history_response | list_history_responses | 3 | |
| list_labels_response | list_labels_responses | 2 | |
| list_messages_response | list_messages_responses | 4 | |
| list_send_as_response | list_send_as_responses | 2 | Response for the ListSendAs method. |
| list_smime_info_response | list_smime_info_responses | 2 | |
| list_threads_response | list_threads_responses | 4 | |
| message | messages | 14 | One email in the mailbox. |
| message_part_body | message_part_bodies | 3 | The body of a single MIME message part. |
| modify_message_request | modify_message_requests | 5 | |
| modify_thread_request | modify_thread_requests | 3 | |
| pop_setting | pop_settings | 3 | POP settings for an account. |
| profile | profiles | 4 | Profile for a Gmail user. |
| send_a | send_as | 10 | Settings associated with a send-as alias, which can be either the primary login address associated with the account or a custom "from" addr… |
| smime_info | smime_infos | 7 | An S/MIME email config. |
| thread | threads | 7 | A conversation: the messages exchanged with one counterparty on one topic. |
| user | users | 2 | Inferred from operation parameters (spec has no named schema). |
| vacation_setting | vacation_settings | 9 | Vacation auto-reply settings for an account. These settings correspond to the "Vacation responder" feature in the web interface. |
| watch_request | watch_requests | 5 | Set up or update a new push notification watch on this user's mailbox. |
| watch_response | watch_responses | 2 | Push notification watch response. |
| watch | watches | 6 | Push notification watch response. |
Three surfaces, one state
Mount Gmail 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":["gmail"],"ttl_minutes":60}'Known limitations
Spec-grounded surface with synthetic seeded values; operations outside the spec are not mounted.