Skip to content

MCP Tools

These tools are available when connected via MCP. See MCP Setup for connection instructions.

ToolDescription
init_appCreate a new app. Accepts an optional region slug. Returns app_id and API base URL.
list_regionsList the regions an app can be created or moved to.
manage_appComprehensive app management: list/delete/pause, configure access/visibility, move between regions, clone templates, set webhooks. See manage_app actions below.
ActionDescription
listList all apps with metadata.
deletePermanently delete an app. Irreversible.
pauseKill-switch — pause/resume all data-plane traffic. Returns 503 (APP_PAUSED) on data-plane endpoints while paused.
get_configRead app configuration (CORS, JWT, storage limits).
update_corsSet allowed CORS origins.
update_access_modeToggle anonymous vs authenticated-only access.
set_visibilityMark an app public or private, optionally setting the templates-browser listed flag.
moveMove an existing app to another region. Pass dest_region. Returns a migration_id; the app stays available for reads during the move.
move_statusCheck the progress of a move in flight. Pass migration_id (returned by action: "move").
teardown_source_replicaAfter a completed move, decommission the retained source-region replica. Pass migration_id.
find_templatesSearch public, listed app templates. Pass optional q (name prefix), region, sort (recent or popular), limit (max 50), offset. Returns { items: [...], total, limit, offset }.
cloneClone a public app’s repo snapshot into a new app you own. Pass source_app_id and optionally name and region. Returns { job_id, status: "pending" }.
get_clone_jobPoll the status of a clone job by job_id. Returns status (pending, completed, or failed), dest_app_id when completed, and error_message when failed.
set_clone_webhookConfigure a webhook that fires when someone clones this app. Pass webhook_url and webhook_secret, or clear_webhook: true to remove.
get_envRead the app-level environment variable key names (values are never returned). Returns { keys: string[], updated_at }. See Environment variables.
update_envMerge app-level env vars in one call. Pass env: { KEY: "value" } to set/upsert, or env: { KEY: null } to delete. Values live for every function in the app via ctx.env.<KEY>. Response reports updated_keys plus the list of functions whose cache was invalidated. Keys matching /^BUTTERBASE_/i are rejected as reserved.
ToolDescription
get_schemaRead current database schema.
apply_schemaApply declarative schema. Set dry_run: true to preview.
dry_run_schemaPreview SQL without executing.
list_migrationsView migration history.
ToolDescription
select_rowsQuery rows with filtering, sorting, pagination.
insert_rowInsert a row into a table.
seed_databaseBulk-insert up to 100 rows in one call. Bypasses RLS (uses platform role).
ToolDescription
configure_oauth_providerRegister a social sign-in provider.
get_oauth_configList configured OAuth providers.
update_oauth_providerModify an OAuth provider.
delete_oauth_providerRemove an OAuth provider.
enable_rlsEnable row-level security on a table.
create_policyCreate a custom RLS policy.
create_user_isolation_policyQuick user isolation setup.
get_rls_policiesList active RLS policies.
delete_rls_policyRemove RLS from a table.
query_audit_logsSearch auth audit logs.
update_app_access_modeToggle an app’s data-API access between public and authenticated.
set_visibilityMark an app public or private as a template, optionally setting the templates browser listed flag.
secure_appSet access_mode = "authenticated" and create user-isolation RLS policies on listed tables in one call.
configure_auth_hookConfigure (or remove) the function invoked after every successful auth event.
ToolDescription
manage_repoPush, pull, inspect, or wipe your app’s repo (content-addressed code snapshots). MCP pushes are capped at ~1 MB; for larger snapshots shell out to butterbase repo push.
ToolDescription
generate_upload_urlGet a presigned upload URL.
generate_download_urlGet a presigned download URL.
get_storage_objectsList all files.
delete_storage_objectDelete a file.
update_storage_configToggle app-wide public read access for storage objects.
ToolDescription
deploy_functionDeploy a TypeScript/JavaScript function.
list_functionsList deployed functions.
invoke_functionTest-invoke a function.
delete_functionDelete a function.
update_function_envUpdate function-level environment variables (overrides app-level values on collision). For env vars shared across every function in the app, use manage_app.update_env instead. See Environment variables.
get_function_logsView invocation logs.
ToolDescription
create_frontend_deploymentCreate deployment and get upload URL.
start_frontend_deploymentStart deployment after upload.
list_frontend_deploymentsView deployment history.
set_frontend_envConfigure build environment variables.
ToolDescription
configure_realtimeEnable realtime on tables.
get_realtime_configView realtime configuration.

All AI actions are routed through the single manage_ai MCP tool. Pass { app_id, action, ... } where action selects the operation.

ActionDescription
chatSynchronous chat completion (OpenAI-compatible). Pass messages, optional model, temperature, max_tokens.
embedGenerate vector embeddings. Pass input (string or array), optional model, encoding_format.
list_modelsList models available through the app’s gateway (chat, embedding, and video).
get_configRead the app’s AI configuration (default model, allowed models, max tokens).
update_configUpdate AI configuration. Can rotate BYOK keys, set default model, set allowed models.
get_usageAggregate token counts and credit spend over a date window.
submit_videoSubmit an async video generation job. Pass model, prompt, optional duration, resolution, aspect_ratio, generate_audio, seed. Returns { job_id, status, polling_url }.
poll_videoPoll a video job’s status. Pass job_id. Returns the current job state including content_urls (absolute) and charged_credits_usd when status === 'completed'.
configure_meetings_webhookConfigure where Butterbase forwards meeting-bot events for this app. Pass forward_url and optionally rotate_secret: true to mint a fresh signing-secret identifier (returned once). The stored hash is used in the x-bb-key-id header so your handler can detect post-rotation staleness.
usage_meetingsList recent meeting-bot usage rows for this app — actor_id, dimension (recording or transcription), seconds, usd_charged, created_at. Last 100 rows ordered by time desc.

For the full HTTP request/response shapes and end-to-end video example, see the AI API reference.

ToolDescription
rag_create_collectionCreate a named collection for storing and querying documents.
rag_list_collectionsList all RAG collections with document counts.
rag_delete_collectionDelete a collection and all its documents, chunks, and embeddings.
rag_ingestIngest raw text or an uploaded file into a collection. Returns a document ID; processing is async.
rag_ingest_statusPoll ingestion status (pendingprocessingready / failed).
rag_querySemantic search over a collection. Returns ranked chunks; optionally synthesizes an AI answer.
rag_list_documentsList all documents in a collection with status and metadata.
rag_delete_documentDelete a document and all its vector chunks.
ToolDescription
configure_integrationEnable a toolkit (Gmail, Slack, etc.) for an app.
list_available_integrationsList curated toolkits or search the full catalog.
list_integration_toolsList executable tools for a connected toolkit.
execute_integration_actionExecute a tool on behalf of a user.
list_connected_accountsList all users with connected accounts for an app.

People (people / company search + enrichment)

Section titled “People (people / company search + enrichment)”
ToolDescription
manage_peopleSearch for people and companies using structured filters or natural-language queries, enrich profiles by LinkedIn URL (with 30-day cache), and queue async work-email lookups. All metered against the user’s Butterbase credits at platform pricing. See People API for HTTP shapes, response payloads, and pricing details.

Each action is routed to one of two configurable backends (primary or secondary); routing is operator-controlled at deploy time and not visible to MCP callers.

All actions take { app_id, action, ... } where action selects the operation.

ActionDescription
search_personSearch for people using structured filters, a free-form query, or both. When query is set it takes priority; otherwise structured filters are used. Structured filters: current_role_title, past_role_title, current_company_name, current_company_industry, country, region, city, education_school_name, education_degree_name, education_field_of_study, plus page_size, next_token. Boolean operators in structured fields are honored as ranking hints. Empty searches are free.
search_companySearch for companies using structured filters, a free-form query, or both. Filters: industry, country, employee_count_max, plus page_size, next_token.
get_profileFetch a full profile by LinkedIn URL with cache. Pass linkedin_profile_url. Optional live_fetch: "force" skips cache. 2 credits on a cache miss, 0 on a hit (cache TTL: 30d for hits, 7d for not-found, 1h for failed).
queue_email_lookupQueue an async work-email lookup. Pass linkedin_profile_url. Returns lookup_id and status: "pending". Poll with get_email_lookup. Charged ~3 credits at queue time and 1 more when the webhook resolves.
get_email_lookupPoll an email lookup by id. Returns { status, email, credits_consumed }.
// Semantic query — natural-language description of the ideal match
{
"action": "search_person",
"query": "founder of a YC-backed AI startup based in San Francisco",
"page_size": 25
}
// Structured filters — boolean syntax honored as ranking hints
{
"action": "search_person",
"current_role_title": "(VP OR \"Vice President\") AND NOT assistant",
"education_school_name": "(Harvard OR Stanford OR MIT OR Princeton OR Yale)",
"country": "US",
"page_size": 25
}
// Company search
{
"action": "search_company",
"industry": "Financial Services",
"employee_count_max": 200,
"country": "US"
}
// Profile lookup — cache absorbs duplicates within 30 days
{ "action": "get_profile", "linkedin_profile_url": "https://www.linkedin.com/in/jane-doe-abc123" }

Costs vary by which provider the operator routes the action to. Numbers below are typical defaults; actual cost is always reported in the x-people-* response headers and the usage body. See People API for the full table.

ActionTypical creditsTypical USD
search_person / search_company (up to 10 results)7$0.0084
get_profile cache miss2$0.040
get_profile cache hit0$0
queue_email_lookup queue accept3$0.060
Webhook email resolution1$0.020
Empty search (0 results)0$0

manage_people returns isError: true with the underlying control-api error text. Common conditions:

  • insufficient_credits (402) — user’s Butterbase balance is below the minimum gate ($0.05 default). No provider call is made.
  • forbidden (403) — authed user doesn’t own the app.
  • people_disabled (503) — feature flag is off on this deployment.
  • people_unavailable (503) — feature not enabled or required platform configuration missing on this deployment.
  • provider_not_registered (503) — operator misconfiguration; no provider configured for the slot this action routed to.
  • provider_action_unsupported (503) — operator misconfiguration; the configured provider for this slot doesn’t support this action.
  • Caching saves real money. Repeated get_profile calls against the same normalized LinkedIn URL within 30 days cost $0. Treat the cache as durable and feel free to re-fetch on render.
  • Searches return 0 credits when there are 0 results — use a page_size: 1 probe to preview cost (look at data.totalResultCount) before paginating.
  • Async email is genuinely async. The queue call returns immediately; the email lands minutes later via webhook. Plan your UI for a pending state.
  • Phone numbers are not supported at this tier.
ToolDescription
manage_kvManage app KV store: config rules (expose/unexpose namespaces) and data-plane operations (get/set/del/incr/etc).
ActionDescription
list_rulesList all KV namespace exposure rules for the app
exposeExpose a key pattern with read/write role access control
unexposeRemove an exposure rule by pattern
statsGet KV usage stats (key count, memory, etc.)
scanScan keys by prefix (cursor-based pagination)
flushDelete all keys in the KV store (requires confirm: true)
getGet the value of a key
setSet a key to a value with optional TTL or ephemeral flag
delDelete one key
incrIncrement a key’s integer value
decrDecrement a key’s integer value
setnxSet a key only if it does not already exist
setexSet a key with an explicit TTL in seconds
casCompare-and-swap: atomically set next only if current value matches expected
existsCheck if a key exists
ttlGet remaining TTL of a key in seconds
expireSet a TTL on an existing key
mgetGet values of multiple keys at once
msetSet multiple key-value pairs at once
{
"action": "manage_kv",
"app_id": "app_abc123",
"action": "set",
"key": "counter:requests",
"value": 42,
"ttl": 3600
}

All substrate operations are routed through the single manage_substrate MCP tool. Pass { action, ... } where action selects the operation. The agent’s calling user is implicit — there is no app_id and no substrate_user_id; every call operates on the substrate that belongs to the caller.

ToolDescription
manage_substrateRead/write the caller’s substrate: propose/approve/reject actions, browse the ledger, look up entities and source artifacts, search memory, manage outbox and attention rules, read snapshots, toggle yolo. See manage_substrate actions below.

Writes — every substrate write (decisions, commitments, learnings, entities, source artifacts, side-effects) goes through propose with the appropriate capability.

ActionDescription
proposePropose an action. Pass capability, payload, optional idempotency_key, optional dangerously_skip_approval. Returns { action_id, verdict, requires_approval, result? }.
approveApprove a pending action. Pass action_id.
rejectReject a pending action. Pass action_id, optional reason.

Action ledger.

ActionDescription
list_actionsList ledger rows. Optional status (proposed | executed | rejected), capability, source_app_id, source_rule_id, limit (1–500, default 100), before (ISO timestamp).
get_actionFetch one action by action_id.

Entities.

ActionDescription
find_entitiesList/search entities. Optional type (person | company | fund | workspace | team | project | event | agent | self), q (display-name search), limit (1–200, default 50).
get_entityFetch one entity by entity_id.

Source artifacts — durable source material (meeting transcripts, email threads, call recordings, documents) that decisions, commitments, and learnings can link back to.

ActionDescription
list_source_artifactsList/search artifacts. Optional kind, q (FTS over title+summary+content), limit, count (true to include total).
get_source_artifactFetch one artifact by artifact_id, including its full content.

Memory.

ActionDescription
search_memoryFull-text search across long-form memory. Pass q; optional kinds (any subset of decisions, commitments, learnings, source_artifacts — defaults to all of them), limit.

Outbox.

ActionDescription
list_outboxList outbox deliveries. Optional status, limit.
retry_outboxRetry a failed delivery by outbox_id.
cancel_outboxCancel a pending delivery by outbox_id.

Attention rules.

ActionDescription
list_rulesList rules. Optional enabled filter.
get_ruleFetch one rule by rule_id.
create_ruleCreate a rule. Pass rule (see Substrate API for the body shape).
update_ruleUpdate a rule. Pass rule_id and rule.
delete_ruleDelete a rule by rule_id.
enable_ruleEnable a rule by rule_id.
disable_ruleDisable a rule by rule_id.
list_rule_firingsList firings for a rule. Pass rule_id; optional status, limit, before.

Snapshots & settings.

ActionDescription
snapshotsList daily substrate snapshots. Optional days (default 7).
get_settingsRead per-user toggles (yolo mode, etc.).
set_yoloToggle yolo mode. Pass yolo_mode: true | false.
{
"tool": "manage_substrate",
"action": "propose",
"capability": "upsert_source_artifact",
"payload": {
"kind": "meeting_transcript",
"title": "Weekly product sync — 2026-06-09",
"external_system": "fireflies",
"external_id": "abc123",
"content": "Alice: we should ship phase 6 by Friday…"
}
}
ToolDescription
configure_custom_domainAdd, list, check status, verify, or remove custom domains. Actions: add, list, status, verify, remove.

These tools are listed whenever any hackathon’s submission window is open. Multiple hackathons can be open simultaneously; tools that target one require an explicit hackathon_slug. See Hackathon.

ToolDescription
prep_and_submit_hackathon_entryTwo-step flow. action: "prep" resolves the hackathon from your submission_code and returns its field_schema plus a next_call template — a fully-formed example submit invocation with a placeholder per field. action: "submit" sends the confirmed data (use matched.slug from prep as hackathon_slug). First submission also needs submission_code. Pass app_id (from manage_app list) so automated scoring can award feature points and judges can verify your app.
ToolDescription
submit_suggestionSubmit feedback, bug reports, or feature requests.
butterbase_docsRead documentation by topic.