{"name":"io.github.anima-labs-ai/anima","slug":"anima-labs-ai-anima","title":null,"description":"Give your AI agent an identity it owns: email inbox, US phone number, SMS, voice, and a vault.","url":"https://mcp.market/server/anima-labs-ai-anima","rating":null,"grade":"B","score":80,"certified":false,"status":"active","category":"email","tags":["email","ai"],"presence":{"score":26,"stars":1,"forks":0,"downloads_week":null,"last_push_at":"2026-09-12T21:57:39.000Z","license":"MIT"},"uptime":{"percent":100,"checks":4,"ok":4,"last_checked_at":"2026-09-20T10:31:00.870Z","last_ok_at":"2026-09-20T10:31:00.870Z","latency_ms":211},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/anima-labs-ai/mcp-server","website":"https://useanima.sh","version":"1.0.1","remotes":[{"type":"streamable-http","url":"https://mcp.useanima.sh/mcp"}],"packages":[],"tools":[{"name":"account_overview","description":"Single-call workspace snapshot: organization context, credential identity, send-capability flags (canSendEmail / canSendSms), inventory counts (agents, domains, phones), active blockers (each carrying the canonical MCP tool that resolves it), and the running MCP server's deploy identity (commitSha, revision, buildId, startedAt). Strict superset of the legacy whoami + workspace_health pair. Use before any non-trivial workflow to answer 'who am I, can I do X right now, and which deploy is serving me?' in one round-trip — no real send needed to find out.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"agent_create","description":"Create a new agent with optional metadata, and optionally attach an initial address. Use this when provisioning a new sending identity or automation actor. To add more addresses later, use agent_update. Pass idempotencyKey to make retries safe — same key + same body returns the original response, same key + different body returns IDEMPOTENCY_BODY_MISMATCH 409.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"name":{"type":"string","description":"Agent display name"},"slug":{"type":"string","pattern":"^[a-z0-9-]+$","minLength":2,"maxLength":64,"description":"URL-friendly unique identifier (lowercase alphanumeric + hyphens, 2-64 chars). Auto-derived from name if omitted."},"email":{"type":"string","format":"email","description":"Optional email address to provision for this agent"},"provisionPhone":{"type":"boolean","description":"Whether to auto-provision a phone number for this agent"},"metadata":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional agent metadata as key-value string pairs"},"address":{"type":"object","properties":{"type":{"type":"string","enum":["BILLING","SHIPPING","MAILING","REGISTERED"],"description":"Address type: BILLING, SHIPPING, MAILING, or REGISTERED."},"label":{"type":"string","description":"Optional human-readable label."},"street1":{"type":"string","description":"Primary street address line."},"street2":{"type":"string","description":"Secondary street address line (apt, suite, etc.)."},"city":{"type":"string","description":"City name."},"state":{"type":"string","description":"State or province code."},"postalCode":{"type":"string","description":"Postal or ZIP code."},"country":{"type":"string","description":"ISO country code (e.g. US, GB)."}},"required":["type","street1","city","state","postalCode","country"],"additionalProperties":false,"description":"Optional initial postal address to attach to the agent on creation. To add more addresses later, use agent_update."},"idempotencyKey":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[\\x20-\\x7E]+$","description":"Optional Idempotency-Key. Send the SAME key on retries of the SAME create payload to guarantee exactly-once provisioning even if the network drops mid-flight. Reuse with a different body returns IDEMPOTENCY_BODY_MISMATCH 409. Keys are scoped per-credential, ASCII-printable 1-255 chars (Stripe convention). Server caches the response for 24h. Note: the idempotency guarantee covers the agent record only — if a subsequent address attachment fails, the agent will still exist."}},"required":["name"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"agent_delete","description":"Delete an agent by ID. Use this to remove deprecated or compromised agents that should no longer send messages. Cascades to attached addresses, email identities, and phone identities.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Agent ID"}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"agent_get","description":"Fetch full detail for a single agent by ID: settings, metadata, status, and the full addresses[] / emailIdentities[] / phoneIdentities[] lists. Use agent_list to browse multiple agents.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Agent ID. Returns full agent detail including addresses, emailIdentities, and phoneIdentities."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"agent_list","description":"List agents in the current account context with cursor pagination. Returns a lightweight per-agent record (addresses are NOT included to avoid N+1 round-trips). Use agent_get for full single-agent detail.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"cursor":{"type":"string","description":"Pagination cursor from a previous list response."},"limit":{"type":"integer","exclusiveMinimum":0,"description":"Maximum number of agents to return."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"agent_update","description":"Update an agent's name or metadata, and/or add/update/delete an address. Use addAddress to attach a new address, updateAddress to change fields on an existing one (by addressId), deleteAddressId to remove one. Multiple field-level changes can be combined in a single call.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Agent ID"},"name":{"type":"string","description":"Updated agent display name"},"metadata":{"type":"object","additionalProperties":{"type":"string"},"description":"Updated metadata as key-value string pairs"},"addAddress":{"type":"object","properties":{"type":{"type":"string","enum":["BILLING","SHIPPING","MAILING","REGISTERED"],"description":"Address type: BILLING, SHIPPING, MAILING, or REGISTERED."},"label":{"type":"string","description":"Optional human-readable label."},"street1":{"type":"string","description":"Primary street address line."},"street2":{"type":"string","description":"Secondary street address line (apt, suite, etc.)."},"city":{"type":"string","description":"City name."},"state":{"type":"string","description":"State or province code."},"postalCode":{"type":"string","description":"Postal or ZIP code."},"country":{"type":"string","description":"ISO country code (e.g. US, GB)."}},"required":["type","street1","city","state","postalCode","country"],"additionalProperties":false,"description":"Attach a new postal address to this agent."},"updateAddress":{"type":"object","properties":{"addressId":{"type":"string","description":"ID of the address to update."},"type":{"type":"string","enum":["BILLING","SHIPPING","MAILING","REGISTERED"],"description":"Updated address type."},"label":{"type":"string","description":"Updated label."},"street1":{"type":"string","description":"Updated primary street address."},"street2":{"type":"string","description":"Updated secondary street address."},"city":{"type":"string","description":"Updated city."},"state":{"type":"string","description":"Updated state or province."},"postalCode":{"type":"string","description":"Updated postal code."},"country":{"type":"string","description":"Updated country code."}},"required":["addressId"],"additionalProperties":false,"description":"Update fields on an existing address. Pass addressId + the fields to change."},"deleteAddressId":{"type":"string","description":"ID of an address to remove from this agent."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"domain_create","description":"Register a custom sending domain in the workspace so it can be configured for email traffic. Use this before DNS setup and verification.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"domain":{"type":"string","description":"Domain name to add, such as mail.example.com or example.com."}},"required":["domain"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"domain_delete","description":"Delete a domain from the workspace when it is no longer needed. Use this to remove old or incorrect domain configurations.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Unique domain ID."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"domain_get","description":"Fetch full detail for a single domain by ID, including verification and configuration state. Use domain_list to browse all domains.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Unique domain ID."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"domain_list","description":"List all domains connected to the current workspace. Use this to audit configured sender domains and choose one for follow-up actions.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"domain_update","description":"Update mutable configuration on a domain. Currently the only updatable field is `feedbackEnabled` — toggle SES bounce and complaint feedback processing on or off without re-verifying the domain.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Unique domain ID."},"feedbackEnabled":{"type":"boolean","description":"Enable or disable bounce + complaint feedback processing for this domain."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"domain_verify","description":"Trigger a verification check for a domain after DNS records are configured. Use this to re-run DNS validation and update verification status.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Unique domain ID."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"domain_zone_file","description":"Get the full DNS zone file for a domain. Use this for complete DNS export or to verify all records are correctly configured.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Unique domain ID."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"email_attachment_get","description":"Get a temporary download URL for an email attachment. Use this when you need direct file access for preview or download.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Attachment ID. Returns a temporary download URL."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"email_draft_create","description":"Create a new email draft (composed but not sent). Drafts can be incomplete — missing recipients, subject, or body. Use email_draft_send later to actually deliver, or email_draft_delete to discard.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"string","description":"Owning agent ID."},"fromIdentityId":{"type":"string","description":"Optional EmailIdentity ID to send from. Must belong to this agent and be verified. If omitted, the agent's primary identity is used at send time. Discover available IDs from the `emailIdentities` array returned by agent_get."},"to":{"type":"array","items":{"type":"string"},"description":"Recipient email addresses (may be empty for an incomplete draft)."},"cc":{"type":"array","items":{"type":"string"},"description":"CC recipients."},"bcc":{"type":"array","items":{"type":"string"},"description":"BCC recipients."},"subject":{"type":"string","description":"Subject line."},"body":{"type":"string","description":"Plain-text body."},"bodyHtml":{"type":"string","description":"HTML body."},"inReplyTo":{"type":"string","description":"Optional In-Reply-To Message-ID for threading on send."},"references":{"type":"array","items":{"type":"string"},"description":"Optional References chain for threading."},"metadata":{"type":"object","additionalProperties":{},"description":"Arbitrary metadata."}},"required":["agentId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"email_draft_delete","description":"Discard a draft. Use this to remove drafts that are no longer needed. Use email_draft_send if you want to deliver instead.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Draft ID."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"email_draft_get","description":"Fetch full detail for a single draft by ID. Use email_draft_list to browse drafts.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Draft ID."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"email_draft_list","description":"List email drafts with optional filters. Returns lightweight draft records — use email_draft_get for full detail.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"string","description":"Filter drafts by agent ID."},"cursor":{"type":"string","description":"Pagination cursor from a previous list response."},"limit":{"type":"integer","exclusiveMinimum":0,"description":"Max drafts when listing. Ignored when `id` is provided."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"email_draft_send","description":"Send a draft. Atomically converts the draft to a delivered Message + deletes the draft row. The draft must have at least one recipient, a subject, and a body. Returns the newly-created Message.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Draft ID."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"email_forward","description":"Forward an existing email to another recipient by loading the original content first. Use this to share a prior message while preserving context.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"string","description":"Agent ID forwarding the email."},"originalId":{"type":"string","description":"Original email ID being forwarded."},"to":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Recipient email address(es) for the forwarded message."},"text":{"type":"string","description":"Optional introductory text to prepend before forwarded content."},"attachments":{"type":"array","items":{"type":"object","properties":{"filename":{"type":"string","description":"Filename presented to the recipient. Inferred from URL path when `url` is used and this is omitted; falls back to 'attachment'."},"contentId":{"type":"string","description":"Content-ID for inline attachments referenced in the HTML body via `cid:<id>` (e.g. set to 'logo' for `<img src=\"cid:logo\">`). Present → `Content-Disposition: inline`; absent → `attachment`."},"contentType":{"type":"string","description":"MIME type. Auto-detected from `filename` extension if omitted (e.g. 'application/pdf' for .pdf). Falls back to 'application/octet-stream'."},"content":{"type":"string","description":"Base64-encoded attachment bytes. Provide either `content` or `url`. Max ~33MB on the wire (decodes to ~25MB binary)."},"url":{"type":"string","description":"Public URL the server fetches and attaches. Provide either `content` or `url`. Private/loopback/link-local IPs are rejected (SSRF guard). Max 25MB after download."}},"additionalProperties":false,"description":"File attachment for outbound email. Provide exactly one of `content` (base64-inline) or `url` (server-fetch)."},"maxItems":20,"description":"Optional additional file attachments on the forward (max 20 entries, 25MB total). Original email's attachments are NOT auto-included — pass them explicitly if you want them forwarded."}},"required":["agentId","originalId","to"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"email_get","description":"Fetch full detail for a single email by ID, including metadata and body. Use email_list to browse emails in a folder.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Email ID. Returns full metadata and body."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"email_label","description":"Add and/or remove labels on one message — the agent's workflow state. Use this to mark mail read/unread (`read`/`unread`), archive it (`archived`), or apply your own tags, then filter with email_list's `labels`. Supply at least one of addLabels/removeLabels. One message per call: there is no batch form.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"ID of the message to relabel."},"addLabels":{"type":"array","items":{"type":"string"},"description":"Labels to add. Adding `read` removes `unread` and vice versa — one state under two names, and a message always carries exactly one of them."},"removeLabels":{"type":"array","items":{"type":"string"},"description":"Labels to remove. Removing `unread` marks the message read (and vice versa); a message is never left with neither."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"email_list","description":"List emails with cursor pagination. Returns lightweight per-email records plus a `pagination` object — pass `pagination.nextCursor` back as `cursor` for the next page. Use email_get for the full body, email_search to find specific messages.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"string","description":"Filter emails by agent ID. Agent-scoped keys are already limited to their own agent; master keys see the whole workspace unless filtered."},"cursor":{"type":"string","description":"Opaque pagination cursor from a previous response's `pagination.nextCursor`. Omit for the first page."},"limit":{"type":"integer","exclusiveMinimum":0,"description":"Max emails to return per page (1-100, default 20)."},"labels":{"type":"array","items":{"type":"string"},"description":"Only return messages carrying ALL of these labels. System labels: `unread`, `read`, `archived`, `spam`. Case-insensitive. Use email_label to change them."},"includeSpam":{"type":"boolean","description":"Include messages classified as spam on arrival. Excluded by default. Naming `spam` in `labels` also counts as asking for it."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"email_reply","description":"Reply to an existing email thread by first loading the original message and setting threading headers. Use this when you need a proper in-thread response.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"string","description":"Agent ID sending the reply."},"originalId":{"type":"string","description":"Original email ID being replied to."},"text":{"type":"string","description":"Plain-text content for your reply message."},"html":{"type":"string","description":"Optional HTML content for the reply body."},"replyAll":{"type":"boolean","description":"When true, include additional participants from the original email."},"attachments":{"type":"array","items":{"type":"object","properties":{"filename":{"type":"string","description":"Filename presented to the recipient. Inferred from URL path when `url` is used and this is omitted; falls back to 'attachment'."},"contentId":{"type":"string","description":"Content-ID for inline attachments referenced in the HTML body via `cid:<id>` (e.g. set to 'logo' for `<img src=\"cid:logo\">`). Present → `Content-Disposition: inline`; absent → `attachment`."},"contentType":{"type":"string","description":"MIME type. Auto-detected from `filename` extension if omitted (e.g. 'application/pdf' for .pdf). Falls back to 'application/octet-stream'."},"content":{"type":"string","description":"Base64-encoded attachment bytes. Provide either `content` or `url`. Max ~33MB on the wire (decodes to ~25MB binary)."},"url":{"type":"string","description":"Public URL the server fetches and attaches. Provide either `content` or `url`. Private/loopback/link-local IPs are rejected (SSRF guard). Max 25MB after download."}},"additionalProperties":false,"description":"File attachment for outbound email. Provide exactly one of `content` (base64-inline) or `url` (server-fetch)."},"maxItems":20,"description":"Optional file attachments on the reply (max 20 entries, 25MB total)."}},"required":["agentId","originalId","text"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"email_search","description":"Search messages by content. Fulltext mode (default) substring-matches subject/body/addresses of EMAIL messages and returns `{items, pagination}` with cursor paging. Semantic mode ranks by vector-embedding similarity and returns `{results}` scored 0-1 — each result spans ANY channel (check the `channel` field) and includes the message id for email_get / email_thread_get follow-ups.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"type":"string","minLength":1,"description":"Search query text."},"mode":{"type":"string","enum":["fulltext","semantic"],"description":"Search mode. `fulltext` (default) does substring matching over subject/body/addresses of EMAIL messages and supports cursor pagination. `semantic` ranks by vector-embedding similarity — better for meaning-level questions (\"emails about the contract renewal\") — but searches messages across ALL channels (each result carries a `channel` field) and does not paginate."},"agentId":{"type":"string","description":"Filter results to a specific agent."},"limit":{"type":"integer","exclusiveMinimum":0,"description":"Max results (fulltext: 1-100, default 20; semantic: 1-50, default 10)."},"cursor":{"type":"string","description":"Pagination cursor from a previous fulltext response's `pagination.nextCursor`. Fulltext mode only."},"labels":{"type":"array","items":{"type":"string"},"description":"Only return messages carrying ALL of these labels. System labels: `unread`, `read`, `archived`, `spam`. Case-insensitive. Use email_label to change them."},"includeSpam":{"type":"boolean","description":"Include messages classified as spam on arrival. Excluded by default. Naming `spam` in `labels` also counts as asking for it."},"threshold":{"type":"number","minimum":0,"maximum":1,"description":"Minimum similarity score 0-1 (semantic mode only, default 0.7)."}},"required":["query"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"email_send","description":"Send a new outbound email from the agent mailbox. Use this when you need to compose and deliver a message with optional CC, threading headers.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"string","description":"Agent ID sending the email."},"fromIdentityId":{"type":"string","description":"Optional EmailIdentity ID to send from. Must belong to this agent and be verified. If omitted, the agent's primary identity is used. Use this to route different message types through different identities (e.g. transactional from @brawz.ai, support from @support.brawz.ai). Discover available IDs from the `emailIdentities` array returned by agent_get."},"to":{"type":"array","items":{"type":"string"},"description":"List of recipient email addresses."},"subject":{"type":"string","description":"Subject line for the outgoing email."},"body":{"type":"string","description":"Plain-text body content for the email."},"bodyHtml":{"type":"string","description":"Optional HTML body content for rich email formatting."},"cc":{"type":"array","items":{"type":"string"},"description":"Optional CC recipient email addresses."},"bcc":{"type":"array","items":{"type":"string"},"description":"Optional BCC recipient email addresses."},"attachments":{"type":"array","items":{"type":"object","properties":{"filename":{"type":"string","description":"Filename presented to the recipient. Inferred from URL path when `url` is used and this is omitted; falls back to 'attachment'."},"contentId":{"type":"string","description":"Content-ID for inline attachments referenced in the HTML body via `cid:<id>` (e.g. set to 'logo' for `<img src=\"cid:logo\">`). Present → `Content-Disposition: inline`; absent → `attachment`."},"contentType":{"type":"string","description":"MIME type. Auto-detected from `filename` extension if omitted (e.g. 'application/pdf' for .pdf). Falls back to 'application/octet-stream'."},"content":{"type":"string","description":"Base64-encoded attachment bytes. Provide either `content` or `url`. Max ~33MB on the wire (decodes to ~25MB binary)."},"url":{"type":"string","description":"Public URL the server fetches and attaches. Provide either `content` or `url`. Private/loopback/link-local IPs are rejected (SSRF guard). Max 25MB after download."}},"additionalProperties":false,"description":"File attachment for outbound email. Provide exactly one of `content` (base64-inline) or `url` (server-fetch)."},"maxItems":20,"description":"Optional file attachments (max 20 entries, 25MB total). Each entry must provide either `content` (base64-inline) or `url` (public URL for server-fetch). Use `contentId` for inline images referenced in HTML via `cid:` URIs."},"inReplyTo":{"type":"string","description":"Optional message ID to set the In-Reply-To header for threading."},"references":{"type":"array","items":{"type":"string"},"description":"Optional list of message IDs to include in the References header."},"headers":{"type":"object","additionalProperties":{"type":"string"},"description":"Optional custom email headers as key-value pairs (e.g. {\"X-Campaign\": \"onboarding\"}). Merged with Anima's own threading/compliance headers, which win on conflict."}},"required":["agentId","to","subject","body"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"email_thread_get","description":"Fetch all email messages in one or more threads. Pass `id` for a single thread or `ids` for multiple. Returns messages ordered within each thread. Uses the messages endpoint filtered by threadId + channel=EMAIL under the hood.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Single thread ID to fetch. Pass either `id` or `ids`."},"ids":{"type":"array","items":{"type":"string"},"description":"Multiple thread IDs to fetch in parallel. Pass either `id` or `ids`."},"agentId":{"type":"string","description":"Optional agent scope filter (only return messages owned by this agent)."},"limit":{"type":"integer","exclusiveMinimum":0,"description":"Optional max messages per thread."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"extension_connect","description":"Create a short-lived, single-use connect URL that links a browser extension (or a headless Puppeteer worker) to an Anima agent. Returns `connectUrl` — hand it to the extension to complete the handshake before `exchangeExpiresAt`. The response carries no token or secret. Auth: with a master key you MUST pass `agentId`; with an agent key OMIT `agentId` (the server resolves it from the key). `ttl` is optional; a value above the org's maximum is rejected.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"string","description":"Agent to connect the extension to. REQUIRED when authenticating with a master key (mk_); OMIT when using an agent key (ak_/oat_) — the server resolves the agent from the key."},"ttl":{"type":"string","enum":["15m","1h","session"],"description":"Requested lifetime of the connection. A value longer than the org's policy maximum is rejected (not silently shortened); omit to use the policy default."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"inbox_create","description":"Create a new email inbox (mailbox) that can receive mail immediately at its address. Choose a username and domain or let the platform generate them. Requires master key access.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"username":{"type":"string","minLength":1,"maxLength":64,"description":"Local part of the inbox email address (letters, numbers, dots, hyphens, underscores; normalized to lowercase; must not start/end with a dot or hyphen). A random local part is generated when omitted."},"domain":{"type":"string","description":"Domain for the inbox address. Uses the platform default (agents.useanima.sh) when omitted. Custom domains must already be registered and verified — see domain_list."},"displayName":{"type":"string","maxLength":128,"description":"Human-readable display name for the inbox (max 128 characters)."},"agentId":{"type":"string","description":"Agent ID to associate with this inbox. Inbound mail to the inbox is attributed to this agent."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"inbox_delete","description":"Permanently delete an inbox and its mailbox. Mail sent to the address after deletion bounces. This cannot be undone. Requires master key access.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Unique inbox ID."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"inbox_get","description":"Fetch full detail for a single inbox by ID, including its email address, display name, and associated agent. Use inbox_list to browse all inboxes.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Unique inbox ID."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"inbox_list","description":"List inboxes in the workspace with cursor pagination and optional free-text search. Returns the address, display name, and agent association for each inbox.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"type":"string","description":"Free-text search filter matched against inbox email addresses and display names."},"cursor":{"type":"string","description":"Pagination cursor from a previous list response (pagination.nextCursor)."},"limit":{"type":"integer","exclusiveMinimum":0,"description":"Max inboxes to return per page (1-100, default 20)."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"inbox_update","description":"Update the display name or agent association of an inbox. Pass null for a field to clear it (unlink the agent / remove the display name); omitted fields are left unchanged. The email address itself cannot be changed. Requires master key access.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Unique inbox ID."},"displayName":{"anyOf":[{"type":"string","maxLength":128},{"type":"null"}],"description":"New human-readable display name (max 128 characters). Pass null to clear it. Omit to leave unchanged."},"agentId":{"type":["string","null"],"description":"Agent ID to associate with the inbox. Pass null to unlink the current agent. Omit to leave unchanged."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"phone_call_create","description":"Place a live phone call and have a real conversation. The tool stays open for the entire call duration. As the caller speaks, you receive live transcript chunks via progress notifications; when the caller finishes a turn (server emits isFinal: true), an elicitation prompt asks you what the agent should say next. You respond with `say` (the exact text to speak) and optional `endCallAfterSpoken: true` to hang up after the line. Returns the full transcript when the call ends. Requires the connecting MCP client to support elicitation — without it, the tool errors out immediately.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"to":{"type":"string","pattern":"^\\+[1-9]\\d{7,14}$","description":"Destination phone number in E.164 format."},"firstMessage":{"type":"string","minLength":1,"maxLength":500,"description":"Opening line the agent speaks when the call is answered. Be natural — this is what the human hears first."},"voiceId":{"type":"string","description":"Optional voice override. Use voice_list for valid IDs; the catalog is multilingual and each entry carries an audio preview."},"fromNumber":{"type":"string","description":"Optional source phone in E.164. Default: the calling agent's primary phone identity."},"maxDurationSec":{"type":"integer","exclusiveMinimum":0,"maximum":1800,"description":"Hard cap on total call duration in seconds. Default 600 (10 min). Max 1800 (30 min)."},"silenceTimeoutSec":{"type":"integer","exclusiveMinimum":0,"maximum":120,"description":"If no caller utterance arrives within this many seconds (measured from the last agent utterance), the call hangs up automatically. Default 30."},"agentId":{"type":"string","description":"Required when the API key / OAuth grant is user-bound (no agentId in the auth context, e.g. a master key or a user-consented Anima Connect grant) — picks which of the org's agents places the call. Ignored when the auth is already agent-bound (the bound agent wins; mismatches are rejected with AGENT_MISMATCH). Use agent_list to find valid IDs."},"agentConfig":{"type":"object","properties":{"systemPrompt":{"type":"string","maxLength":600,"description":"System prompt the server-side LLM uses to shape the agent's persona for this call. Defaults to a generic voice-assistant persona. Max 600 characters (~100 words) — long prompts add 50-150ms per-turn TTFT, the model is rehashing them every reply. Keep responses short and TTS-friendly (no markdown, no bullets); if you override, mirror that guidance."},"maxHistoryTurns":{"type":"integer","exclusiveMinimum":0,"description":"Max user+assistant turn pairs the server-side LLM retains in context. Defaults to 20. Long calls drop the oldest turns to keep the model's context window bounded."}},"additionalProperties":false,"description":"Opt in to the server-side conversation loop. When present (even as `{}`), the Anima API runs the LLM-backed conversation loop on each caller turn and speaks the reply — the MCP tool just records both sides of the transcript and returns it when the call ends. **Required when the connecting MCP client doesn't implement elicitation** (e.g. Claude Code returns `-32600 Elicitation not supported`). Omit ONLY if you have your own bot ready to subscribe to MCP elicitation requests and reply via the `say` field per turn."}},"required":["to","firstMessage"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"phone_call_get","description":"Get full detail for a single phone call: status, duration, participants, AI-generated summary (one-liner, topics, action items, decisions, open questions, next steps), and quality score. The summary is generated once on first read after post-call processing and cached.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"The call ID."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"phone_call_list","description":"List phone calls with optional filters. Returns lightweight call records — for full call detail including summary and score, use phone_call_get.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"string","description":"Filter by agent ID."},"direction":{"type":"string","enum":["INBOUND","OUTBOUND"],"description":"Filter by call direction."},"status":{"type":"string","description":"Filter by call state (INITIATING, RINGING, ACTIVE, ENDED, etc.)."},"limit":{"type":"integer","exclusiveMinimum":0,"description":"Max results (default: 20)."},"offset":{"type":"integer","minimum":0,"description":"Offset for pagination."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"phone_call_recording_get","description":"Get a time-limited download URL for a call recording (WAV format). The URL expires after 1 hour. Recording must have been enabled during the call.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"The call ID."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"phone_call_transcript_get","description":"Get the full transcript of a phone call with speaker labels, timestamps, and confidence scores. Available after the call ends and transcription completes.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"The call ID."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"phone_number_list","description":"List phone numbers assigned to an agent. Each result includes status and capability flags (sms/mms/voice).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"string","description":"Agent whose phone numbers to list."}},"required":["agentId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"phone_number_provision","description":"Provision a new phone number from the carrier pool and assign it to an agent. Note: provisioning a number costs money on the underlying carrier; do not call speculatively. Use countryCode / areaCode / capabilities to constrain selection.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"string","description":"Agent ID to assign the provisioned phone number to."},"countryCode":{"type":"string","description":"ISO 3166-1 alpha-2 country code for number selection (default US)."},"areaCode":{"type":"string","description":"Preferred area code for the phone number."},"capabilities":{"type":"array","items":{"type":"string","enum":["sms","mms","voice"]},"description":"Optional capability list (sms, mms, voice) the number must support."}},"required":["agentId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"phone_number_release","description":"Release a previously provisioned phone number back to the carrier pool. Use this when cleaning up unused numbers. Released numbers cannot be recovered.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"string","description":"Agent ID that currently owns the phone number."},"phoneNumber":{"type":"string","description":"E.164 formatted phone number to release."}},"required":["agentId","phoneNumber"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"sms_get","description":"Fetch full detail for a single SMS by ID (includes its `threadId` for joining the conversation). Use sms_list to browse multiple SMS messages.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"SMS message ID."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"sms_list","description":"List SMS messages with optional filters. Each result includes its `threadId` for joining the conversation. Use sms_get for full single-message detail.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"string","description":"Filter SMS by agent ID."},"cursor":{"type":"string","description":"Pagination cursor from a previous list response."},"limit":{"type":"integer","exclusiveMinimum":0,"description":"Max SMS messages to return."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"sms_send","description":"Send an SMS to a phone number, or an MMS by passing `mediaUrls`. The agent must have a provisioned phone number. Use this for transactional texts or conversational messaging.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"string","description":"Agent ID sending the SMS. The agent must have a provisioned phone number."},"to":{"type":"string","description":"Recipient phone number in E.164 format (e.g. +14155551234)."},"body":{"type":"string","description":"Message body. SMS character limits apply (~160 chars per segment)."},"mediaUrls":{"type":"array","items":{"type":"string"},"description":"Optional array of media URLs for MMS. Pass one URL for a single image/file; multiple for multi-part MMS. Carrier limits apply."}},"required":["agentId","to","body"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"sms_thread_get","description":"Get one SMS/MMS conversation with its message history, oldest first. Use sms_thread_list to find thread IDs (or take `threadId` off any SMS). For a conversation longer than `limit`, returns its most recent messages; page deeper history with sms_list.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Thread ID (use sms_thread_list to find IDs)."},"limit":{"type":"integer","exclusiveMinimum":0,"description":"Max messages to return in the thread."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"sms_thread_list","description":"List SMS/MMS conversations, most recently active first. A conversation is one agent number talking to one external contact. Returns summaries (participant, last message snippet, message count) — use sms_thread_get for the full history. Optionally filter by agentId.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"string","description":"Filter conversations by agent ID. Omit to see threads across all agents you have access to."},"limit":{"type":"integer","exclusiveMinimum":0,"description":"Max thread summaries to return. Defaults to 20."},"offset":{"type":"integer","minimum":0,"description":"Pagination offset (skip this many threads from the start)."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"usage_overview","description":"Usage rollup for a billing period. Returns counters keyed by usage type (e.g. 'email_sent', 'sms_sent', 'voice_call_minutes') plus the latest update timestamp. Defaults to the current calendar month in UTC when `period` is omitted. Read-only, callable by any authenticated credential — scoped to the caller's org. Use to answer 'where am I against my tier limits?' without paying for per-event detail (UsageEvent is operator-tier).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"period":{"type":"string","pattern":"^\\d{4}-\\d{2}$","description":"Billing period in YYYY-MM format (e.g. '2026-05'). Defaults to the current calendar month in UTC."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"vault_credential_create","description":"Create a new credential in an agent vault. Pass `type` plus the matching payload block (login / card / identity / oauthToken / apiKey / certificate / notes). For login credentials, prefer `generatePassword` over supplying `login.password` — the vault generates and stores the password server-side and returns only the credential reference, so the secret never enters the conversation. For api_key/oauth_token credentials, set `allowedHosts` so the credential can be exercised through vault_credential_use.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"string","description":"Agent ID that owns the new credential. Optional when using an agent-bound credential."},"type":{"type":"string","enum":["login","secure_note","card","identity","oauth_token","api_key","certificate"],"description":"Credential type."},"name":{"type":"string","description":"Human-readable credential name."},"login":{"type":"object","properties":{"username":{"type":"string","description":"Optional login username."},"password":{"type":"string","description":"Optional login password."},"uris":{"type":"array","items":{"type":"object","properties":{"uri":{"type":"string","description":"URI value."},"match":{"type":"string","description":"Optional URI match mode."}},"additionalProperties":false},"description":"Optional list of login URIs."},"totp":{"type":"string","description":"Optional TOTP secret."}},"additionalProperties":false,"description":"Login payload for login-type."},"generatePassword":{"type":"object","properties":{"length":{"type":"integer","minimum":8,"maximum":128,"description":"Desired password length (8-128 characters, default 24)."},"uppercase":{"type":"boolean","description":"Include uppercase letters (default true)."},"lowercase":{"type":"boolean","description":"Include lowercase letters (default true)."},"number":{"type":"boolean","description":"Include numeric digits (default true)."},"special":{"type":"boolean","description":"Include special characters (default true)."}},"additionalProperties":false,"description":"Generate the login password server-side instead of supplying login.password. Preferred for login credentials: the password is created and stored inside the vault and never enters the conversation. Only valid for login-type; mutually exclusive with login.password. Pass {} for defaults."},"card":{"type":"object","properties":{"cardholderName":{"type":"string","description":"Optional cardholder name."},"brand":{"type":"string","description":"Optional card brand."},"number":{"type":"string","description":"Optional card number."},"expMonth":{"type":"string","description":"Optional expiration month."},"expYear":{"type":"string","description":"Optional expiration year."},"code":{"type":"string","description":"Optional security code."}},"additionalProperties":false,"description":"Card payload for card-type."},"identity":{"type":"object","properties":{"title":{"type":"string","description":"Optional identity title."},"firstName":{"type":"string","description":"Optional first name."},"middleName":{"type":"string","description":"Optional middle name."},"lastName":{"type":"string","description":"Optional last name."},"address1":{"type":"string","description":"Optional address line 1."},"address2":{"type":"string","description":"Optional address line 2."},"address3":{"type":"string","description":"Optional address line 3."},"city":{"type":"string","description":"Optional city."},"state":{"type":"string","description":"Optional state or province."},"postalCode":{"type":"string","description":"Optional postal code."},"country":{"type":"string","description":"Optional country."},"company":{"type":"string","description":"Optional company name."},"email":{"type":"string","description":"Optional identity email."},"phone":{"type":"string","description":"Optional identity phone."},"ssn":{"type":"string","description":"Optional SSN or national ID."},"username":{"type":"string","description":"Optional username value."},"passportNumber":{"type":"string","description":"Optional passport number."},"licenseNumber":{"type":"string","description":"Optional license number."}},"additionalProperties":false,"description":"Identity payload for identity-type."},"oauthToken":{"type":"object","properties":{"provider":{"type":"string","description":"OAuth provider name (e.g. google, github, slack)."},"accessToken":{"type":"string","description":"OAuth access token. Stored encrypted."},"refreshToken":{"type":"string","description":"OAuth refresh token. Stored encrypted; never read back."},"tokenEndpoint":{"type":"string","description":"Token endpoint URL used for automatic refresh."},"clientId":{"type":"string","description":"OAuth client ID."},"clientSecret":{"type":"string","description":"Optional OAuth client secret."},"scopes":{"type":"array","items":{"type":"string"},"description":"OAuth scopes granted to this token."},"expiresAt":{"type":"string","description":"ISO-8601 token expiration timestamp."},"autoRefresh":{"type":"boolean","description":"Automatically refresh before expiry (default true)."},"allowedHosts":{"type":"array","items":{"type":"string"},"description":"Hosts this token may be brokered to via vault_credential_use. Fail-closed: with no hosts the broker refuses every call."}},"required":["provider","accessToken","refreshToken","tokenEndpoint","clientId","scopes","expiresAt"],"additionalProperties":false,"description":"OAuth token payload for oauth_token-type."},"apiKey":{"type":"object","properties":{"provider":{"type":"string","description":"API provider name (e.g. openai, anthropic, stripe)."},"key":{"type":"string","description":"The API key value. Stored encrypted; always read back masked."},"prefix":{"type":"string","description":"Optional display prefix (e.g. 'sk-...abc')."},"rateLimit":{"type":"object","properties":{"requests":{"type":"integer","exclusiveMinimum":0,"description":"Maximum requests allowed in the window."},"window":{"type":"string","description":"Rate-limit window (e.g. '1m', '1h', '1d')."}},"required":["requests","window"],"additionalProperties":false,"description":"Optional per-credential broker rate limit."},"expiresAt":{"type":"string","description":"Optional ISO-8601 key expiration timestamp."},"scopes":{"type":"array","items":{"type":"string"},"description":"Optional scopes or permissions this key carries."},"allowedHosts":{"type":"array","items":{"type":"string"},"description":"Hosts this key may be brokered to via vault_credential_use. Fail-closed: with no hosts the broker refuses every call. After creation only a master key may change this list."},"authHeader":{"type":"string","description":"Header the broker injects the key into (default 'Authorization')."},"authScheme":{"type":"string","description":"Value prefix before the key (default 'Bearer '; set '' for a raw key, e.g. x-api-key)."}},"required":["provider","key"],"additionalProperties":false,"description":"API key payload for api_key-type."},"certificate":{"type":"object","properties":{"format":{"type":"string","enum":["pem","p12","jks"],"description":"Certificate format."},"certificate":{"type":"string","description":"Certificate content. Stored encrypted."},"privateKey":{"type":"string","description":"Private key. Stored encrypted; always read back masked."},"chain":{"type":"array","items":{"type":"string"},"description":"Optional certificate chain."},"expiresAt":{"type":"string","description":"ISO-8601 certificate expiration timestamp."}},"required":["format","certificate","privateKey","expiresAt"],"additionalProperties":false,"description":"Certificate payload for certificate-type."},"notes":{"type":"string","description":"Optional secure note text."},"fields":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Custom field name."},"value":{"type":"string","description":"Optional custom field value."},"type":{"type":"string","description":"Optional custom field type."},"linkedId":{"type":"string","description":"Optional linked field identifier."}},"required":["name"],"additionalProperties":false},"description":"Optional custom fields."},"favorite":{"type":"boolean","description":"Optional favorite flag."},"revealPolicy":{"type":"string","enum":["standard","brokered"],"description":"Reveal policy. 'brokered' means the plaintext is never returned by any read/reveal/export path — not even to the org master key; the secret is only usable via vault_credential_use (recovery = rotation). 'standard' keeps master-key reveal available outside MCP."}},"required":["type","name"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"vault_credential_delete","description":"Delete a credential from vault storage by ID. Use to remove obsolete or compromised secrets.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"string","description":"Agent ID that owns the credential. Optional when using an agent-bound credential."},"id":{"type":"string","description":"Credential ID."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"vault_credential_get","description":"Get a single vault credential by ID. Sensitive fields (passwords, tokens, SSNs, CVV) are masked. To use the plaintext for autofill or as an upstream credential, mint a vault token at the credential broker — the LLM never sees the secret directly.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"string","description":"Agent ID that owns the credential. Optional when using an agent-bound credential."},"id":{"type":"string","description":"Credential ID."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"vault_credential_get_totp","description":"Get the current TOTP code for a credential that has a TOTP secret configured. Returns the live 6-digit code derived from the stored secret — the secret itself is never disclosed.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"string","description":"Agent ID that owns the credential. Optional when using an agent-bound credential."},"id":{"type":"string","description":"Credential ID."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"vault_credential_list","description":"List credentials in an agent vault with optional type filter. Use to browse stored secrets before reading, updating, or deleting entries. Sensitive fields are masked.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"string","description":"Agent ID whose vault to list. Optional when using an agent-bound credential (ak_* or oat_* with agentId)."},"type":{"type":"string","enum":["login","secure_note","card","identity","oauth_token","api_key","certificate"],"description":"Optional credential type filter."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"vault_credential_request_cancel","description":"Cancel a pending credential request by ID. Invalidates the single-use fill link so the human can no longer submit a value. Use when the request is no longer needed or was created in error.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"requestId":{"type":"string","description":"Credential-request ID."}},"required":["requestId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"vault_credential_request_create","description":"Request a credential from a HUMAN without the agent or LLM ever seeing the secret. When the connecting MCP client supports inline elicitation, the human is shown a form to type the secret directly — the tool returns `status: FULFILLED` with the `credentialId` in one call, no link needed. Otherwise it returns a single-use fill link (`fillUrl`, emailed to the org owner); poll vault_credential_request_status until `status` is FULFILLED, then use the returned `credentialId` as a normal vault credential. Use this when a flow needs a secret the agent doesn't hold and can't safely be given (passwords, API keys, card numbers).","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"string","description":"Agent ID whose vault the requested credential lands in. Optional when using an agent-bound credential."},"type":{"type":"string","enum":["login","secure_note","card"],"description":"Credential type the human will be asked to fill: login, secure_note, or card."},"name":{"type":"string","description":"Human-readable name for the requested credential."},"reason":{"type":"string","description":"Plain-language reason shown to the human explaining why the credential is needed."},"ttlSeconds":{"type":"number","description":"Optional fill-link lifetime in seconds before the request expires."},"notifyOwner":{"type":"boolean","description":"Whether to email the single-use fill link to the org owner. Defaults to true."}},"required":["type","name","reason"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"vault_credential_request_fill","description":"Internal: submit a credential-request secret from the Anima UI widget. Not for direct agent use.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"fillToken":{"type":"string","description":"Single-use fill token from the ui-tier render-data."},"values":{"type":"object","additionalProperties":{"type":"string"},"description":"The secret field values the human entered in the widget."}},"required":["fillToken","values"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"vault_credential_request_status","description":"Get the status of a pending credential request by ID. Poll this after vault_credential_request_create until `status` is FULFILLED, then use `credentialId` as a normal vault credential. `maskedPreview` shows a redacted hint of the filled value once available — the plaintext is never returned.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"requestId":{"type":"string","description":"Credential-request ID."}},"required":["requestId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"vault_credential_search","description":"Search vault credentials by keyword across names and content. Use when you know part of the name, URL, or username but not the exact credential ID. Different access pattern from vault_credential_list — list is paginated browsing, search is text-query lookup.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"string","description":"Agent ID whose vault to search. Optional when using an agent-bound credential."},"search":{"type":"string","description":"Search text matched against names and content."},"type":{"type":"string","enum":["login","secure_note","card","identity","oauth_token","api_key","certificate"],"description":"Optional credential type filter."}},"required":["search"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"vault_credential_update","description":"Update an existing vault credential by ID, including optional structured sections and metadata flags. Use to rotate passwords or revise stored details.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"string","description":"Agent ID that owns the credential. Optional when using an agent-bound credential."},"id":{"type":"string","description":"Credential ID to update."},"name":{"type":"string","description":"Optional updated name."},"login":{"type":"object","properties":{"username":{"type":"string","description":"Optional login username."},"password":{"type":"string","description":"Optional login password."},"uris":{"type":"array","items":{"type":"object","properties":{"uri":{"type":"string","description":"URI value."},"match":{"type":"string","description":"Optional URI match mode."}},"additionalProperties":false},"description":"Optional list of login URIs."},"totp":{"type":"string","description":"Optional TOTP secret."}},"additionalProperties":false,"description":"Optional updated login payload."},"card":{"type":"object","properties":{"cardholderName":{"type":"string","description":"Optional cardholder name."},"brand":{"type":"string","description":"Optional card brand."},"number":{"type":"string","description":"Optional card number."},"expMonth":{"type":"string","description":"Optional expiration month."},"expYear":{"type":"string","description":"Optional expiration year."},"code":{"type":"string","description":"Optional security code."}},"additionalProperties":false,"description":"Optional updated card payload."},"identity":{"type":"object","properties":{"title":{"type":"string","description":"Optional identity title."},"firstName":{"type":"string","description":"Optional first name."},"middleName":{"type":"string","description":"Optional middle name."},"lastName":{"type":"string","description":"Optional last name."},"address1":{"type":"string","description":"Optional address line 1."},"address2":{"type":"string","description":"Optional address line 2."},"address3":{"type":"string","description":"Optional address line 3."},"city":{"type":"string","description":"Optional city."},"state":{"type":"string","description":"Optional state or province."},"postalCode":{"type":"string","description":"Optional postal code."},"country":{"type":"string","description":"Optional country."},"company":{"type":"string","description":"Optional company name."},"email":{"type":"string","description":"Optional identity email."},"phone":{"type":"string","description":"Optional identity phone."},"ssn":{"type":"string","description":"Optional SSN or national ID."},"username":{"type":"string","description":"Optional username value."},"passportNumber":{"type":"string","description":"Optional passport number."},"licenseNumber":{"type":"string","description":"Optional license number."}},"additionalProperties":false,"description":"Optional updated identity payload."},"oauthToken":{"type":"object","properties":{"provider":{"type":"string","description":"OAuth provider name (e.g. google, github, slack)."},"accessToken":{"type":"string","description":"OAuth access token. Stored encrypted."},"refreshToken":{"type":"string","description":"OAuth refresh token. Stored encrypted; never read back."},"tokenEndpoint":{"type":"string","description":"Token endpoint URL used for automatic refresh."},"clientId":{"type":"string","description":"OAuth client ID."},"clientSecret":{"type":"string","description":"Optional OAuth client secret."},"scopes":{"type":"array","items":{"type":"string"},"description":"OAuth scopes granted to this token."},"expiresAt":{"type":"string","description":"ISO-8601 token expiration timestamp."},"autoRefresh":{"type":"boolean","description":"Automatically refresh before expiry (default true)."},"allowedHosts":{"type":"array","items":{"type":"string"},"description":"Hosts this token may be brokered to via vault_credential_use. Fail-closed: with no hosts the broker refuses every call."}},"required":["provider","accessToken","refreshToken","tokenEndpoint","clientId","scopes","expiresAt"],"additionalProperties":false,"description":"Optional updated OAuth token payload."},"apiKey":{"type":"object","properties":{"provider":{"type":"string","description":"API provider name (e.g. openai, anthropic, stripe)."},"key":{"type":"string","description":"The API key value. Stored encrypted; always read back masked."},"prefix":{"type":"string","description":"Optional display prefix (e.g. 'sk-...abc')."},"rateLimit":{"type":"object","properties":{"requests":{"type":"integer","exclusiveMinimum":0,"description":"Maximum requests allowed in the window."},"window":{"type":"string","description":"Rate-limit window (e.g. '1m', '1h', '1d')."}},"required":["requests","window"],"additionalProperties":false,"description":"Optional per-credential broker rate limit."},"expiresAt":{"type":"string","description":"Optional ISO-8601 key expiration timestamp."},"scopes":{"type":"array","items":{"type":"string"},"description":"Optional scopes or permissions this key carries."},"allowedHosts":{"type":"array","items":{"type":"string"},"description":"Hosts this key may be brokered to via vault_credential_use. Fail-closed: with no hosts the broker refuses every call. After creation only a master key may change this list."},"authHeader":{"type":"string","description":"Header the broker injects the key into (default 'Authorization')."},"authScheme":{"type":"string","description":"Value prefix before the key (default 'Bearer '; set '' for a raw key, e.g. x-api-key)."}},"required":["provider","key"],"additionalProperties":false,"description":"Optional updated API key payload. Changing allowedHosts requires a master key."},"certificate":{"type":"object","properties":{"format":{"type":"string","enum":["pem","p12","jks"],"description":"Certificate format."},"certificate":{"type":"string","description":"Certificate content. Stored encrypted."},"privateKey":{"type":"string","description":"Private key. Stored encrypted; always read back masked."},"chain":{"type":"array","items":{"type":"string"},"description":"Optional certificate chain."},"expiresAt":{"type":"string","description":"ISO-8601 certificate expiration timestamp."}},"required":["format","certificate","privateKey","expiresAt"],"additionalProperties":false,"description":"Optional updated certificate payload."},"notes":{"type":"string","description":"Optional updated note text."},"fields":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Custom field name."},"value":{"type":"string","description":"Optional custom field value."},"type":{"type":"string","description":"Optional custom field type."},"linkedId":{"type":"string","description":"Optional linked field identifier."}},"required":["name"],"additionalProperties":false},"description":"Optional updated custom fields."},"favorite":{"type":"boolean","description":"Optional updated favorite flag."},"revealPolicy":{"type":"string","enum":["standard","brokered"],"description":"Optional reveal-policy change. Upgrading standard → brokered needs UPDATE access; downgrading brokered → standard is master-key-only."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"vault_credential_use","description":"Make an outbound HTTPS call with a stored credential attached SERVER-SIDE, and get the upstream response. Use this to act with a secret (call an API, hit an authed endpoint) WITHOUT ever seeing the plaintext — the platform injects the credential on the wire. The target host must be on the credential's allowlist. Works even for `brokered` credentials that can never be revealed. Prefer this over trying to read a secret: you can use it, you cannot see it.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"string","description":"Agent ID that owns the credential. Optional when using an agent-bound credential."},"id":{"type":"string","description":"Credential ID to broker the call with."},"method":{"type":"string","enum":["GET","POST","PUT","PATCH","DELETE","HEAD"],"description":"HTTP method for the outbound call."},"url":{"type":"string","format":"uri","description":"Absolute https:// URL to call. Its host MUST be on the credential's allowlist (allowedHosts / login URIs)."},"headers":{"type":"object","additionalProperties":{"type":"string"},"description":"Extra request headers. Any Authorization / auth header you set is IGNORED and replaced by the real credential."},"body":{"type":"string","description":"Raw request body (encode JSON yourself)."}},"required":["id","method","url"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"vault_exchange_token_for_injection","description":"Exchange a vtk_ vault token for the PLAINTEXT credential, to inject into a trusted client process (a CLI, the browser extension) — NOT to read it yourself. The API gates this to injector credentials: it only succeeds for a master key or a key carrying the `vault:inject` scope; a plain agent key gets 403. If you are an agent that needs to USE a secret, do NOT use this — use vault_credential_use (the server-side broker), which never reveals the secret.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"token":{"type":"string","description":"The vtk_ vault token to exchange."}},"required":["token"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"vault_provision","description":"Provision a credential vault for an agent. Required before vault_credential_create can be called against a freshly-created agent — without a vault, credentials have nowhere to live. Idempotent: returns the existing vault if one already exists. Master-key only.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"agentId":{"type":"string","description":"Agent ID to provision a vault for. Master-key only."}},"required":["agentId"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"voice_list","description":"List available AI voices for placing phone calls. The catalog is multilingual — filter by language or gender. Each voice includes descriptive metadata and a vendor-neutral audio preview URL (sampleUrl), plus the voice ID needed for phone_call_create.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"gender":{"type":"string","enum":["male","female","neutral"],"description":"Filter by voice gender."},"language":{"type":"string","description":"Filter by BASE language code — the bare two-letter code, e.g. 'en' or 'fr'. Matching is a prefix test against the catalog's own base codes, so a region tag like 'en-US' matches nothing. Call without a filter to see which languages the catalog currently carries."}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"webhook_delete","description":"Delete a webhook subscription by ID. Permanently removes the configuration and stops future deliveries. To temporarily pause without deleting, use webhook_set with { id, active: false }.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Webhook ID"}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"webhook_get","description":"Get a webhook subscription by ID. Returns the full configuration (URL, subscribed events, active state, description).","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Webhook ID"}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"webhook_list","description":"List webhook subscriptions for the calling org with cursor pagination. Use to enumerate existing webhooks before set/delete operations.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"cursor":{"type":"string","description":"Pagination cursor from a previous list call"},"limit":{"type":"integer","exclusiveMinimum":0,"maximum":100,"description":"Maximum number of webhooks to return (1-100)"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"webhook_set","description":"Create or update a webhook subscription (upsert). If `id` is provided the call updates that webhook (PUT). If omitted it creates a new one (POST) — `url` and `events` are then required. Use this for declarative 'ensure webhook X exists' workflows.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Webhook ID. Present → updates that webhook (PUT). Omitted → creates a new one (POST)."},"url":{"type":"string","format":"uri","description":"HTTPS endpoint URL that will receive event payloads. Required on create; optional on update."},"events":{"type":"array","items":{"type":"string"},"description":"List of event types to subscribe to (e.g. 'message.received', 'email.bounced'). Required on create; optional on update."},"description":{"type":"string","description":"Optional human-readable label"},"active":{"type":"boolean","description":"Whether the webhook is active. Defaults to true on create."},"authConfig":{"anyOf":[{"type":"object","properties":{"type":{"type":"string","const":"none"}},"required":["type"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"bearer"},"token":{"type":"string","minLength":1,"maxLength":4096,"description":"Sent as `Authorization: Bearer <token>`"}},"required":["type","token"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"basic"},"username":{"type":"string","minLength":1,"maxLength":256},"password":{"type":"string","minLength":1,"maxLength":1024}},"required":["type","username","password"],"additionalProperties":false},{"type":"object","properties":{"type":{"type":"string","const":"custom_header"},"headerName":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9!#$%&'*+.^_`|~-]+$","description":"Custom header name, e.g. `X-My-Secret`"},"value":{"type":"string","minLength":1,"maxLength":4096}},"required":["type","headerName","value"],"additionalProperties":false}],"description":"Auth the platform presents to your endpoint IN ADDITION to the always-on X-Anima-Signature HMAC — a bearer token, HTTP basic, or a custom header. Pass { type: 'none' } to remove it."},"rateLimitPerMinute":{"type":"integer","exclusiveMinimum":0,"maximum":100000,"description":"Max deliveries per minute to this endpoint; omit for unlimited"},"maxAttempts":{"type":"integer","minimum":1,"maximum":10,"description":"Max delivery attempts before dead-lettering (default 3)"}},"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"webhook_test","description":"Send a test event payload to a webhook to verify the endpoint is reachable and signature verification works. Returns a deliveryId you can correlate with your endpoint's logs.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"id":{"type":"string","description":"Webhook ID to send a test delivery to"},"event":{"type":"string","description":"Event type to simulate in the test payload (e.g. 'message.received'). Defaults to 'message.received'."}},"required":["id"],"additionalProperties":false,"$schema":"http://json-schema.org/draft-07/schema#"}}],"scan":{"score":80,"grade":"B","scanned_at":"2026-09-20T11:40:53.024Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-20T11:40:52.959Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 427ms"]},"poisoning":{"score":15,"max":15,"notes":["67 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 34 write-action tools with no auth"]},"maintenance":{"score":15,"max":15,"notes":["last push 8 days ago"]},"identity":{"score":7,"max":10,"notes":["registry namespace matches repository owner"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"}],"inputs":{"probes":[{"url":"https://mcp.useanima.sh/mcp","reachable":true,"authRequired":false,"latencyMs":427,"serverInfo":{"name":"anima-mcp","version":"0.1.0"}}],"packages":[],"repo":{"found":true,"owner":"anima-labs-ai","repo":"mcp-server","archived":false,"pushedAt":"2026-09-12T21:57:39Z","stars":1,"forks":0,"openIssues":0,"ownerType":"Organization","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/270873968?v=4","ownerCreatedAt":"2026-03-25T07:18:18Z","license":"MIT"},"icon":{"url":"https://avatars.githubusercontent.com/u/270873968?v=4&s=128","source":"github"},"presence":{"stars":1,"forks":0,"downloadsWeek":null,"license":"MIT","lastPushAt":"2026-09-12T21:57:39.000Z","score":26}}}},"grade_history":[],"reviews":[]}