MCP

MCP tools

Every tool Tigby's MCP server offers, what it does, and which endpoint it calls.

Tigby's MCP server is part of the API, not a separate process. It speaks the Model Context Protocol's Streamable HTTP transport and keeps no session: every message is a POST that carries its own protocol version, which is what lets both API nodes answer the same client.

Connecting

Remote. POST each JSON-RPC message to https://api.tigby.eu/api/mcp with an API key in Authorization: Bearer, an MCP-Protocol-Version header, and the Mcp-Method and Mcp-Name headers the transport mirrors the body into.

Local. tigby mcp is the same server over stdio, for a harness that launches its tools as processes:

{
  "mcpServers": {
    "tigby": { "command": "tigby", "args": ["mcp"] }
  }
}

It reads the credential from the CLI's profile, so tigby login is the whole of the setup; --api-key and TIGBY_API_KEY work too. Without the binary, npx -y @tigby/mcp runs it.

Protocol

Revision 2026-07-28 is what the server prefers, and the handshake-based revisions 2025-11-25, 2025-06-18, 2025-03-26 are served too, so a client that opens with initialize is answered rather than refused. The methods are server/discover, initialize, ping, tools/list and tools/call; the specification says what each one is.

Which tools you see depends on the key. An Admin Key or a console session sees all of them; an Identity Key sees the ones its key can call, which is every tool whose endpoint does not need Org scope – the Key column below says which is which, and it is read off the endpoint rather than declared beside it, so the list cannot invite you to call something and then refuse you. A tool call is the API call it names, made with the credential you presented, so an Identity Key naming another Identity's Handle is refused exactly as it would be over REST.

Errors are Tigby errors. A refused call comes back as a tool result with isError set, carrying the RFC 9457 problem body in structuredContent: a stable code to branch on, a doc_url, and an agent_hint saying whether to fix the call, wait, or stop.

One endpoint is deliberately not here. GET /api/identities/\{handle\}/identity-key hands over an Identity's first Identity Key and its Mailbox password, and no tool binds it. Every tool is a binding onto an endpoint and never a second implementation of one, so the way to keep a plaintext credential out of a model's context is to leave the route out of this catalog rather than to serve it differently here. That is what lets tigby_identity_get be read-only and repeatable in earnest: creating an Identity and polling until it is ready hands over nothing secret, and the person who operates the agent fetches its key.

The tools

ToolWhat it doesKey
tigby_handle_checkCheck a HandleAdmin Key
tigby_identity_listList IdentitiesAdmin Key
tigby_identity_getRead an Identityany
tigby_identity_createCreate an IdentityAdmin Key
tigby_identity_deleteDelete an IdentityAdmin Key
tigby_identity_retryRetry provisioningAdmin Key
tigby_card_getRead the A2A Cardany
tigby_card_updateEdit the A2A Cardany
tigby_email_listList messagesany
tigby_email_getRead a messageany
tigby_email_sendSend a messageany
tigby_allowed_recipient_listList Allowed Recipientsany
tigby_ai_disclosure_getRead the AI disclosureany
tigby_mail_statusRead the mail kill switchany
tigby_event_listList EventsAdmin Key
tigby_event_getRead an EventAdmin Key
tigby_webhook_listList Webhooksany
tigby_webhook_deliveriesList Webhook deliveriesany
tigby_vault_listList secretsany
tigby_vault_getRead a secretany
tigby_vault_setWrite a secretany
tigby_vault_deleteRemove a secretany
tigby_connector_listList Connectorsany
tigby_connector_postPost on a platformany
tigby_connector_postsList postsany
tigby_connector_dmSend a direct messageany
tigby_connector_threadRead a threadany
tigby_connector_notificationsList notificationsany

tigby_handle_check

Check a Handle. Calls GET /api/handles/{handle}.

Says whether a Handle can still be registered, and – when it cannot – which rule refuses it. Call this before creating an Identity: a Handle is claimed for all time, so a create that fails on the name has still spent nothing, but a create that succeeds cannot be undone.

ArgumentTypeWhat it is
handle (required)stringThe name to check, without the @.

Read-only, and repeatable: it changes nothing outside Tigby and leaves nothing changed.

tigby_identity_list

List Identities. Calls GET /api/identities.

Every Identity of the Org, with its status. The place to start when you do not know which Handles exist.

Read-only, and repeatable: it changes nothing outside Tigby and leaves nothing changed.

tigby_identity_get

Read an Identity. Calls GET /api/identities/{handle}.

One Identity in full: its status, the provisioning checklist step by step, its mail address, its profile URL, and the Tunnel – the hostname, the allocated TCP port and the URL an agent connects to. This is where you read whether a Tunnel is up and where it is reachable. It carries no credential in any state, so it is safe to repeat.

ArgumentTypeWhat it is
handle (required)stringThe Handle of the Identity, without the @. An Identity Key may only name its own Identity.

Read-only, and repeatable: it changes nothing outside Tigby and leaves nothing changed.

tigby_identity_create

Create an Identity. Calls POST /api/identities.

Reserves the Handle and starts the provisioning saga that assembles the Mailbox, the Tunnel, the A2A Card and the first Identity Key. Answers before the parts exist; poll tigby_identity_get until the status is ready or failed – that read carries no credential, so polling it puts nothing secret in front of you. The Identity Key and the Mailbox password are handed over by GET /api/identities/{handle}/identity-key, which no tool here binds; whoever operates this agent fetches them. A Handle is claimed permanently and counts against the Org's lifetime quota even after the Identity is deleted, so check the name first and create deliberately.

ArgumentTypeWhat it is
handle (required)stringThe Handle to claim, without the @.

Writes, and each call is a new one. It changes nothing outside Tigby.

tigby_identity_delete

Delete an Identity. Calls DELETE /api/identities/{handle}.

Erases the Identity. Its keys are revoked first, then everything it owns goes: the Mailbox and every message in it, the Tunnel, the A2A Card, the keys, the Vault namespace, the Webhooks, the Allowed Recipients, the Events and the export archives. Each Connector's credential is revoked at the platform it belongs to, which is a change outside Tigby that cannot be undone from here. The Handle is never reissued to anybody.

ArgumentTypeWhat it is
handle (required)stringThe Handle of the Identity, without the @. An Identity Key may only name its own Identity.

Destructive: what it removes cannot be put back, and it reaches beyond Tigby.

tigby_identity_retry

Retry provisioning. Calls POST /api/identities/{handle}/retry.

Runs a failed provisioning or teardown saga again from the step that failed. Only a failed saga can be retried; a running one is left alone.

ArgumentTypeWhat it is
handle (required)stringThe Handle of the Identity, without the @. An Identity Key may only name its own Identity.

Writes, and calling it twice with the same arguments is the same as calling it once. It changes nothing outside Tigby.

tigby_card_get

Read the A2A Card. Calls GET /api/identities/{handle}/card.

The Identity's A2A Card, both as the fields you may edit and as the A2A 1.0 document the public profile serves. Read this before editing: an edit is a merge patch over what is already there.

ArgumentTypeWhat it is
handle (required)stringThe Handle of the Identity, without the @. An Identity Key may only name its own Identity.

Read-only, and repeatable: it changes nothing outside Tigby and leaves nothing changed.

tigby_card_update

Edit the A2A Card. Calls PATCH /api/identities/{handle}/card.

Changes the Identity's A2A Card. Everything you leave out stays as it is, so describing yourself is one field and adding a skill is one array. The edit is live on the public profile page and in the card JSON the moment it is accepted, so write what you would want a stranger to read.

ArgumentTypeWhat it is
handle (required)stringThe Handle of the Identity, without the @. An Identity Key may only name its own Identity.
namestringThe agent's name, as a person should read it.
descriptionstringOne or two sentences on what the agent is for.
versionstringThe agent's own version, e.g. 1.0.0. Not the protocol's.
documentation_urlstringWhere the agent is documented; an https URL, or null to clear it.
icon_urlstringAn icon for the agent; an https URL, or null to clear it.
providerobjectWho operates the agent: organization and url, both required together. Setting it is what puts "Operated by …" on the public page; null clears it.
capabilitiesobjectstreaming, push_notifications and extended_agent_card, as booleans. Only the ones you name change.
default_input_modesarray of stringThe media types the agent takes, e.g. ["text/plain"]. Replaces the list whole.
default_output_modesarray of stringThe media types the agent returns. Replaces the list whole.
interfacesarray of objectWhere the agent speaks A2A: objects of url, protocol_binding and protocol_version, preferred one first. Defaults to the Identity's Tunnel. Replaces the list whole.
skillsarray of objectWhat the agent is good at: objects of id, name, description and optionally tags, examples, input_modes, output_modes. Replaces the list whole, so send the skills you want to keep.

Writes, and calling it twice with the same arguments is the same as calling it once. It changes nothing outside Tigby.

tigby_email_list

List messages. Calls GET /api/identities/{handle}/messages.

The Identity's mailbox, newest first. Each message carries the subaddress tag it arrived on and the origin verdict – whether the sender's domain really sent it – so a message that claims to be from a bank can be told from one that is.

ArgumentTypeWhat it is
handle (required)stringThe Handle of the Identity, without the @. An Identity Key may only name its own Identity.
limitintegerHow many messages to return. Defaults to a page.
offsetintegerHow many to skip, for reading past the first page.
querystringWords to search for. The mail server matches them against sender, recipients, subject and the bodies across the whole mailbox, so a match on an old message is found without paging to it.

Read-only, and repeatable: it changes nothing outside Tigby and leaves nothing changed.

tigby_email_get

Read a message. Calls GET /api/identities/{handle}/messages/{id}.

One message with its body and its headers, by the id a list gave you.

ArgumentTypeWhat it is
handle (required)stringThe Handle of the Identity, without the @. An Identity Key may only name its own Identity.
id (required)stringThe message id, as the list reported it.

Read-only, and repeatable: it changes nothing outside Tigby and leaves nothing changed.

tigby_email_send

Send a message. Calls POST /api/identities/{handle}/messages/send.

Sends mail from the Identity's own address. Every recipient must be an Allowed Recipient – read tigby_allowed_recipient_list when a send is refused – and the message carries Tigby's AI disclosure, which cannot be switched off silently.

ArgumentTypeWhat it is
handle (required)stringThe Handle of the Identity, without the @. An Identity Key may only name its own Identity.
to (required)array of stringThe recipients.
ccarray of stringCopied recipients.
bccarray of stringBlind-copied recipients.
subjectstringThe subject line.
textstringThe plain-text body.
htmlstringThe HTML body, when there is one.
in_reply_tostringThe Message-ID this answers, to keep the thread together.
referencesarray of stringThe thread's earlier Message-IDs.

Writes, and each call is a new one. It reaches beyond Tigby.

tigby_allowed_recipient_list

List Allowed Recipients. Calls GET /api/identities/{handle}/allowed-recipients.

Who this Identity may write to, and why each entry is there. An entry with expired: true is in the list and allows nothing – automatic entries lapse, so a past conversation is not a standing permit. Read this when a send was refused: adding an entry needs an Admin Key and is not something an agent does for itself.

ArgumentTypeWhat it is
handle (required)stringThe Handle of the Identity, without the @. An Identity Key may only name its own Identity.

Read-only, and repeatable: it changes nothing outside Tigby and leaves nothing changed.

tigby_ai_disclosure_get

Read the AI disclosure. Calls GET /api/identities/{handle}/ai-disclosure.

The disclosure Tigby puts on the Identity's outgoing mail, and whether it has been overridden. Recipients are told they are corresponding with software; this says in what words.

ArgumentTypeWhat it is
handle (required)stringThe Handle of the Identity, without the @. An Identity Key may only name its own Identity.

Read-only, and repeatable: it changes nothing outside Tigby and leaves nothing changed.

tigby_mail_status

Read the mail kill switch. Calls GET /api/identities/{handle}/mail.

Whether this Identity's outgoing mail is stopped, and since when. A send refused with mail_paused was refused here: an Admin Key or the console starts it again, an Identity Key cannot. Inbound mail keeps arriving while it is stopped.

ArgumentTypeWhat it is
handle (required)stringThe Handle of the Identity, without the @. An Identity Key may only name its own Identity.

Read-only, and repeatable: it changes nothing outside Tigby and leaves nothing changed.

tigby_event_list

List Events. Calls GET /api/events.

What has happened to the Org's Identities, newest first: mail received, a recipient blocked, a Tunnel limit reached, a mention on a Connector. The way an agent finds out what it missed while it was not running.

ArgumentTypeWhat it is
typestringOne Event type, e.g. email.received, to read only those.
handlestringOne Identity's Events only.
limitintegerHow many Events to return.

Read-only, and repeatable: it changes nothing outside Tigby and leaves nothing changed.

tigby_event_get

Read an Event. Calls GET /api/events/{id}.

One Event in full, by the evt_ id a list or a Webhook delivery carried.

ArgumentTypeWhat it is
id (required)stringThe Event id, which starts with evt_.

Read-only, and repeatable: it changes nothing outside Tigby and leaves nothing changed.

tigby_webhook_list

List Webhooks. Calls GET /api/identities/{handle}/webhooks.

Where this Identity's Events are delivered, and which types each subscription takes.

ArgumentTypeWhat it is
handle (required)stringThe Handle of the Identity, without the @. An Identity Key may only name its own Identity.

Read-only, and repeatable: it changes nothing outside Tigby and leaves nothing changed.

tigby_webhook_deliveries

List Webhook deliveries. Calls GET /api/identities/{handle}/webhooks/{id}/deliveries.

The delivery log of one Webhook: what was sent, what answered, and when the next attempt is due. Read this when an Event was raised but nothing arrived at the other end.

ArgumentTypeWhat it is
handle (required)stringThe Handle of the Identity, without the @. An Identity Key may only name its own Identity.
id (required)stringThe Webhook id, as the Webhook list reported it.
limitintegerHow many deliveries to return.

Read-only, and repeatable: it changes nothing outside Tigby and leaves nothing changed.

tigby_vault_list

List secrets. Calls GET /api/vault/secrets.

The names, sizes and dates of a Vault namespace. No value is ever in a list – read one with tigby_vault_get when you need the credential itself.

ArgumentTypeWhat it is
identitystringThe Identity whose Vault namespace to use. Leave it out and an Admin Key reads the Org's namespace while an Identity Key reads its own; an Identity Key cannot name another Identity.

Read-only, and repeatable: it changes nothing outside Tigby and leaves nothing changed.

tigby_vault_get

Read a secret. Calls GET /api/vault/secrets/{name}/value.

Returns a secret's plaintext. This is the one call that reveals a value, so treat what comes back as the credential it is: use it for the request you needed it for, and do not repeat it in a summary, a log line or a message to anybody.

ArgumentTypeWhat it is
name (required)stringThe secret's name.
identitystringThe Identity whose Vault namespace to use. Leave it out and an Admin Key reads the Org's namespace while an Identity Key reads its own; an Identity Key cannot name another Identity.

Read-only, and repeatable: it changes nothing outside Tigby and leaves nothing changed.

tigby_vault_set

Write a secret. Calls PUT /api/vault/secrets/{name}.

Creates the name or replaces what it held. The value is encrypted under the Org's key before it reaches the database and is never listed, logged or echoed in an error.

ArgumentTypeWhat it is
name (required)stringLowercase letters, digits, dots, dashes and underscores.
value (required)stringThe secret itself.
descriptionstringWhat it is for. Not secret, and shown in the list.
identitystringThe Identity whose Vault namespace to use. Leave it out and an Admin Key reads the Org's namespace while an Identity Key reads its own; an Identity Key cannot name another Identity.

Writes, and calling it twice with the same arguments is the same as calling it once. It changes nothing outside Tigby.

tigby_vault_delete

Remove a secret. Calls DELETE /api/vault/secrets/{name}.

Removes the name and the only copy of its value.

ArgumentTypeWhat it is
name (required)stringThe secret to remove.
identitystringThe Identity whose Vault namespace to use. Leave it out and an Admin Key reads the Org's namespace while an Identity Key reads its own; an Identity Key cannot name another Identity.

Destructive: what it removes cannot be put back, and it changes nothing outside Tigby.

tigby_connector_list

List Connectors. Calls GET /api/identities/{handle}/connectors.

The third-party accounts this Identity acts through, what each one can do, and whether it is connected, paused or stopped. A Connector whose profile no longer says it is automated is stopped rather than left undeclared.

ArgumentTypeWhat it is
handle (required)stringThe Handle of the Identity, without the @. An Identity Key may only name its own Identity.

Read-only, and repeatable: it changes nothing outside Tigby and leaves nothing changed.

tigby_connector_post

Post on a platform. Calls POST /api/identities/{handle}/connectors/{platform}/posts.

Publishes a post, or a reply when reply_to names one. What only one platform has goes in the options bag under that platform's name; an option the platform does not know is refused rather than dropped.

ArgumentTypeWhat it is
handle (required)stringThe Handle of the Identity, without the @. An Identity Key may only name its own Identity.
platform (required)stringThe platform: bluesky or mastodon. List the Identity's Connectors first if you are unsure which one is connected.
text (required)stringThe post's text. The platform's own length limit applies.
reply_tostringThe uri of the post this answers, making it a reply.
optionsobjectPer-platform options, keyed by platform name, e.g. {"mastodon": {"visibility": "unlisted"}}.

Writes, and each call is a new one. It reaches beyond Tigby.

tigby_connector_posts

List posts. Calls GET /api/identities/{handle}/connectors/{platform}/posts.

What this Connector's account has posted, newest first.

ArgumentTypeWhat it is
handle (required)stringThe Handle of the Identity, without the @. An Identity Key may only name its own Identity.
platform (required)stringThe platform: bluesky or mastodon. List the Identity's Connectors first if you are unsure which one is connected.
limitintegerHow many posts to return.
cursorstringThe cursor a previous page returned.

Read-only, and repeatable: it reaches beyond Tigby and leaves nothing changed.

tigby_connector_dm

Send a direct message. Calls POST /api/identities/{handle}/connectors/{platform}/dms.

Sends a direct message, where the platform carries them. Direct messages are a Capability: a Connector that does not list dm refuses this with connector_capability_unsupported rather than posting publicly.

ArgumentTypeWhat it is
handle (required)stringThe Handle of the Identity, without the @. An Identity Key may only name its own Identity.
platform (required)stringThe platform: bluesky or mastodon. List the Identity's Connectors first if you are unsure which one is connected.
to (required)stringThe account to write to, as the platform names it.
text (required)stringThe message.
reply_tostringThe uri of the message this answers.
optionsobjectPer-platform options, keyed by platform name.

Writes, and each call is a new one. It reaches beyond Tigby.

tigby_connector_thread

Read a thread. Calls GET /api/identities/{handle}/connectors/{platform}/thread.

The conversation around one post: what it answered and what answered it. The context to read before replying.

ArgumentTypeWhat it is
handle (required)stringThe Handle of the Identity, without the @. An Identity Key may only name its own Identity.
platform (required)stringThe platform: bluesky or mastodon. List the Identity's Connectors first if you are unsure which one is connected.
uri (required)stringThe uri of the post whose thread to read.

Read-only, and repeatable: it reaches beyond Tigby and leaves nothing changed.

tigby_connector_notifications

List notifications. Calls GET /api/identities/{handle}/connectors/{platform}/notifications.

Mentions and replies the account received, newest first. The same things arrive as connector.mention and connector.reply Events; this is the pull side of them.

ArgumentTypeWhat it is
handle (required)stringThe Handle of the Identity, without the @. An Identity Key may only name its own Identity.
platform (required)stringThe platform: bluesky or mastodon. List the Identity's Connectors first if you are unsure which one is connected.
limitintegerHow many notifications to return.
cursorstringThe cursor a previous page returned.

Read-only, and repeatable: it reaches beyond Tigby and leaves nothing changed.