Service twin · API + UI
Discord
Test community and support agents that moderate servers, answer users, and coordinate channel workflows.
$ uv tool install blobfish-cli
$ blobfish twin login
$ blobfish twin-runs create --twins discord --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--discord rekeyed onto seeded state.
Seeded entities
| Entity | Table | Fields | About |
|---|---|---|---|
| application | applications | 3 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| applications_command | applications_commands | 16 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| applications_emoji | applications_emojis | 6 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| applications_entitlement | applications_entitlements | 16 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| applications_entitlements_consume | applications_entitlements_consumes | 4 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| applications_guilds_command | applications_guilds_commands | 17 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| applications_guilds_commands_permission | applications_guilds_commands_permissions | 6 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| applications_guilds_commands_permissions_by_guild_id | applications_guilds_commands_permissions_by_guild_ids | 4 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| applications_me | applications_mes | 2 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| applications_role_connections_metadata | applications_role_connections_metadatas | 3 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| channel | channels | 3 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| channels_follower | channels_followers | 4 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| channels_invite | channels_invites | 3 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| channels_message | channels_messages | 21 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| channels_messages_crosspost | channels_messages_crossposts | 4 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| channels_messages_pin | channels_messages_pins | 5 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| channels_messages_reaction | channels_messages_reactions | 9 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| channels_messages_reactions_by_emoji_name | channels_messages_reactions_by_emoji_names | 5 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| channels_messages_reactions_me | channels_messages_reactions_mes | 5 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| channels_messages_thread | channels_messages_threads | 7 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| channels_polls_answer | channels_polls_answers | 7 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| channels_polls_expire | channels_polls_expires | 4 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| channels_thread | channels_threads | 3 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| channels_thread_member | channels_thread_members | 7 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| channels_thread_members_me | channels_thread_members_mes | 3 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| channels_threads_archived_public | channels_threads_archived_publics | 5 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| channels_threads_search | channels_threads_searches | 14 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| channels_typing | channels_typings | 3 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| channels_users_me_threads_archived_private | channels_users_me_threads_archived_privates | 5 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| channels_webhook | channels_webhooks | 5 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| gateway | gateways | 2 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| guild | guilds | 4 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| guilds_audit_log | guilds_audit_logs | 9 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| guilds_ban | guilds_bans | 7 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| guilds_channel | guilds_channels | 22 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| guilds_emoji | guilds_emojis | 7 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| guilds_invite | guilds_invites | 3 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| guilds_member | guilds_members | 12 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| guilds_members_by_user_id | guilds_members_by_user_ids | 11 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| guilds_members_me | guilds_members_mes | 7 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| guilds_members_role | guilds_members_roles | 5 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| guilds_members_search | guilds_members_searches | 5 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| guilds_onboarding | guilds_onboardings | 3 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| guilds_preview | guilds_previews | 3 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| guilds_region | guilds_regions | 3 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| guilds_role | guilds_roles | 12 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| guilds_roles_member_count | guilds_roles_member_counts | 3 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| guilds_scheduled_event | guilds_scheduled_events | 5 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| guilds_scheduled_events_user | guilds_scheduled_events_users | 8 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| guilds_soundboard_sound | guilds_soundboard_sounds | 9 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| guilds_template | guilds_templates | 3 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| guilds_threads_active | guilds_threads_actives | 3 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| guilds_welcome_screen | guilds_welcome_screens | 3 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| invite | invites | 5 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| oauth2_key | oauth2_keys | 2 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| oauth2_me | oauth2_mes | 2 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| soundboard_default_sound | soundboard_default_sounds | 2 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| sticker_pack | sticker_packs | 2 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| user | users | 3 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| users_me | users_mes | 2 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| users_me_applications_entitlement | users_me_applications_entitlements | 5 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| users_me_channel | users_me_channels | 5 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| users_me_connection | users_me_connections | 2 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| users_me_guild | users_me_guilds | 6 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| users_me_guilds_member | users_me_guilds_members | 3 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| voice_region | voice_regions | 2 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| webhook | webhooks | 9 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| webhooks_by_webhook_id | webhooks_by_webhook_ids | 6 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| webhooks_github | webhooks_githubs | 26 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| webhooks_message | webhooks_messages | 14 | Inferred from MCP tool parameters; the tool contract remains the authority. |
| webhooks_slack | webhooks_slacks | 10 | Inferred from MCP tool parameters; the tool contract remains the authority. |
Three surfaces, one state
Mount Discord 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":["discord"],"ttl_minutes":60}'Known limitations
This twin mirrors the captured contract sm--discord: 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.