{"server":{"name":"io.github.anima-labs-ai/anima","$schema":"https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json","remotes":[{"url":"https://mcp.useanima.sh/mcp","type":"streamable-http"}],"version":"1.0.1","repository":{"url":"https://github.com/anima-labs-ai/mcp-server","source":"github"},"websiteUrl":"https://useanima.sh","description":"Give your AI agent an identity it owns: email inbox, US phone number, SMS, voice, and a vault."},"_meta":{"io.modelcontextprotocol.registry/official":{"status":"active","isLatest":true,"updatedAt":"2026-09-04T15:37:25.051931Z","publishedAt":"2026-09-04T15:37:25.051931Z","statusChangedAt":"2026-09-04T15:37:25.051931Z"},"dev.protogrid/connectability":{"class":"R2","autonomous":false,"human_steps":["oauth_consent_once"],"preferred":{"kind":"remote","idx":0},"remotes":[{"idx":0,"url":"https://mcp.useanima.sh/mcp","transport":"streamable-http","templated":false,"headers":[],"auth":{"type":"oauth2","location":{"header":"Authorization","scheme":"Bearer"},"secret_name":null,"oauth":{"scopes":["email:read","email:send_as","phone:read_sms","phone:send_sms","vault:read_all","addresses:read","webhooks:subscribe"],"grant_types":["authorization_code","refresh_token"],"dcr_supported":true,"cimd_supported":false,"authorization_servers":["https://connect.useanima.sh"],"resource_metadata_url":"https://mcp.useanima.sh/.well-known/oauth-protected-resource","code_challenge_methods":["S256"],"authorization_server_metadata_url":"https://connect.useanima.sh/.well-known/oauth-authorization-server"}},"protocol":{"supported_versions":[],"stateless":null},"health":{"reachable":false,"uptime_30d":0.974359,"latency_ms_p50":280,"consecutive_failures":2,"last_probe_at":"2026-10-09T09:11:44.051Z","last_ok_at":"2026-10-08T16:25:09.346Z"}}],"packages":[]},"dev.protogrid/tools":[{"name":"account_overview","title":"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.","annotations":{"readOnlyHint":true,"openWorldHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"agent_create","title":"Create Agent","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.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"agent_delete","title":"Delete Agent","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.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":true},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"agent_get","title":"Get Agent","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.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"agent_list","title":"List Agents","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.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"agent_update","title":"Update Agent","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.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"domain_create","title":"Create Domain","description":"Register a custom sending domain in the workspace so it can be configured for email traffic. Use this before DNS setup and verification.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"domain_delete","title":"Delete Domain","description":"Delete a domain from the workspace when it is no longer needed. Use this to remove old or incorrect domain configurations.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":true},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"domain_get","title":"Get Domain","description":"Fetch full detail for a single domain by ID, including verification and configuration state. Use domain_list to browse all domains.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"domain_list","title":"List Domains","description":"List all domains connected to the current workspace. Use this to audit configured sender domains and choose one for follow-up actions.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"domain_update","title":"Update Domain","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.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"domain_verify","title":"Verify Domain","description":"Trigger a verification check for a domain after DNS records are configured. Use this to re-run DNS validation and update verification status.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"domain_zone_file","title":"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.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"email_attachment_get","title":"Get Email Attachment","description":"Get a temporary download URL for an email attachment. Use this when you need direct file access for preview or download.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"email_draft_create","title":"Create Email Draft","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.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"email_draft_delete","title":"Delete Email Draft","description":"Discard a draft. Use this to remove drafts that are no longer needed. Use email_draft_send if you want to deliver instead.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":true},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"email_draft_get","title":"Get Email Draft","description":"Fetch full detail for a single draft by ID. Use email_draft_list to browse drafts.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"email_draft_list","title":"List Email Drafts","description":"List email drafts with optional filters. Returns lightweight draft records — use email_draft_get for full detail.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"email_draft_send","title":"Send Email Draft","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.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"email_forward","title":"Forward Email","description":"Forward an existing email to another recipient by loading the original content first. Use this to share a prior message while preserving context.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"email_get","title":"Get Email","description":"Fetch full detail for a single email by ID, including metadata and body. Use email_list to browse emails in a folder.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"email_label","title":"Label Email","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.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"email_list","title":"List Emails","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.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"email_reply","title":"Reply Email","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.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"email_search","title":"Search Emails","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.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"email_send","title":"Send Email","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.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"email_thread_get","title":"Get Email Thread(s)","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.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"extension_connect","title":"Connect Browser Extension","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.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"inbox_create","title":"Create Inbox","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.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"inbox_delete","title":"Delete Inbox","description":"Permanently delete an inbox and its mailbox. Mail sent to the address after deletion bounces. This cannot be undone. Requires master key access.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":true},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"inbox_get","title":"Get Inbox","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.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"inbox_list","title":"List Inboxes","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.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"inbox_update","title":"Update Inbox","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.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"phone_call_create","title":"Phone Call (Live)","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.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"phone_call_get","title":"Get Phone Call","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.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"phone_call_list","title":"List Phone Calls","description":"List phone calls with optional filters. Returns lightweight call records — for full call detail including summary and score, use phone_call_get.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"phone_call_recording_get","title":"Get Phone Call Recording","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.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"phone_call_transcript_get","title":"Get Phone Call Transcript","description":"Get the full transcript of a phone call with speaker labels, timestamps, and confidence scores. Available after the call ends and transcription completes.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"phone_number_list","title":"List Phone Numbers","description":"List phone numbers assigned to an agent. Each result includes status and capability flags (sms/mms/voice).","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"phone_number_provision","title":"Provision Phone Number","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.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"phone_number_release","title":"Release Phone Number","description":"Release a previously provisioned phone number back to the carrier pool. Use this when cleaning up unused numbers. Released numbers cannot be recovered.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":true},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"sms_get","title":"Get SMS","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.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"sms_list","title":"List SMS","description":"List SMS messages with optional filters. Each result includes its `threadId` for joining the conversation. Use sms_get for full single-message detail.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"sms_send","title":"Send SMS","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.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"sms_thread_get","title":"Get SMS Thread","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.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"sms_thread_list","title":"List SMS Threads","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.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"usage_overview","title":"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).","annotations":{"readOnlyHint":true,"openWorldHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"vault_credential_create","title":"Create Vault Credential","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.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"vault_credential_delete","title":"Delete Vault Credential","description":"Delete a credential from vault storage by ID. Use to remove obsolete or compromised secrets.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":true},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"vault_credential_get","title":"Get Vault Credential","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.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"vault_credential_get_totp","title":"Get Vault 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.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"vault_credential_list","title":"List Vault Credentials","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.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"vault_credential_request_cancel","title":"Cancel Credential Request","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.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":true},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"vault_credential_request_create","title":"Request Credential From Human","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).","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"vault_credential_request_fill","title":"Submit Credential (widget)","description":"Internal: submit a credential-request secret from the Anima UI widget. Not for direct agent use.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"vault_credential_request_status","title":"Get 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.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"vault_credential_search","title":"Search Vault","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.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"vault_credential_update","title":"Update Vault Credential","description":"Update an existing vault credential by ID, including optional structured sections and metadata flags. Use to rotate passwords or revise stored details.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"vault_credential_use","title":"Use Vault Credential","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.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"vault_exchange_token_for_injection","title":"Exchange Vault Token (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.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"vault_provision","title":"Provision Vault","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.","annotations":{"readOnlyHint":false,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"voice_list","title":"List AI Voices","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.","annotations":{"readOnlyHint":true,"openWorldHint":true,"idempotentHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"webhook_delete","title":"Delete Webhook","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 }.","annotations":{"readOnlyHint":false,"openWorldHint":false,"destructiveHint":true},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"webhook_get","title":"Get Webhook","description":"Get a webhook subscription by ID. Returns the full configuration (URL, subscribed events, active state, description).","annotations":{"readOnlyHint":true,"openWorldHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"webhook_list","title":"List Webhooks","description":"List webhook subscriptions for the calling org with cursor pagination. Use to enumerate existing webhooks before set/delete operations.","annotations":{"readOnlyHint":true,"openWorldHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"webhook_set","title":"Set Webhook","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.","annotations":{"readOnlyHint":false,"openWorldHint":false,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"},{"name":"webhook_test","title":"Test Webhook","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.","annotations":{"readOnlyHint":false,"openWorldHint":true,"destructiveHint":false},"source":"probe","observed_at":"2026-09-20T11:48:23.039Z"}],"dev.protogrid/trust":{"score":70,"components":{"hygiene":100,"liveness":19,"freshness":85,"provenance":90},"drivers":["+repository","+namespace-matches-repo","+website","-unreachable(2 failures)","~updated-35d-ago"],"flags":[],"blocked":false,"computed_at":"2026-10-10T01:22:56.384Z","disclaimer":"Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed."},"dev.protogrid/quality":{"score":85,"label":"good","components":{"auth":83,"hygiene":86,"protocol":null,"stability":null,"dependencies":null},"checks":[{"id":"protocol.modern","detail":"no remote answered a protocol handshake (not probed yet, unreachable, or local-only)","status":"na","category":"protocol"},{"id":"protocol.stateless","detail":"no remote answered a protocol handshake (not probed yet, unreachable, or local-only)","status":"na","category":"protocol"},{"id":"protocol.transport","detail":"no remote answered a protocol handshake (not probed yet, unreachable, or local-only)","status":"na","category":"protocol"},{"id":"protocol.list_ttl","detail":"no remote answered a protocol handshake (not probed yet, unreachable, or local-only)","status":"na","category":"protocol"},{"id":"auth.prm","detail":"Protected Resource Metadata (RFC 9728) published","status":"pass","category":"auth"},{"id":"auth.as_metadata","detail":"authorization server metadata reachable","status":"pass","category":"auth"},{"id":"auth.cimd","detail":"only Dynamic Client Registration, deprecated in 2026-07-28 in favour of CIMD","status":"warn","category":"auth"},{"id":"auth.secret_in_url","detail":"no templated URL","status":"na","category":"auth"},{"id":"tools.descriptions","detail":"every tool has a description","status":"pass","category":"hygiene"},{"id":"tools.description_length","detail":"descriptions are concise","status":"pass","category":"hygiene"},{"id":"tools.schemas","detail":"every tool has an object input schema","status":"pass","category":"hygiene"},{"id":"tools.annotations","detail":"67 of 67 tools declare readOnlyHint or destructiveHint","status":"pass","category":"hygiene"},{"id":"tools.directory_hints","detail":"60 of 67 tools declare all four hints; missing: account_overview (idempotentHint); usage_overview (idempotentHint); webhook_list (idempotentHint); …","status":"warn","category":"hygiene"},{"id":"tools.token_cost","detail":"about 18,933 tokens to load every tool","status":"warn","category":"hygiene"},{"id":"tools.api_dump","detail":"tools are not a one-to-one API dump","status":"pass","category":"hygiene"},{"id":"stability.changes","detail":"tool history not recorded yet","status":"na","category":"stability"},{"id":"stability.rug_pull","detail":"tool history not recorded yet","status":"na","category":"stability"},{"id":"deps.known_vulns","detail":"no npm or PyPI package","status":"na","category":"dependencies"},{"id":"deps.mcp_sdk_version","detail":"no npm or PyPI package","status":"na","category":"dependencies"},{"id":"deps.resolvable","detail":"no npm or PyPI package","status":"na","category":"dependencies"}],"drivers":["~auth.cimd","~tools.directory_hints","~tools.token_cost"],"flags":[],"tool_count":67,"token_estimate":18933,"tools_hash":null,"tools_changed_at":null,"computed_at":"2026-10-10T01:26:27.160Z","disclaimer":"Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed."},"dev.protogrid/identity":{"canonical_id":"io.github.anima-labs-ai/anima","aliases":[],"alias_count":0,"repository_key":"github:anima-labs-ai/mcp-server","owner":{"verified":false,"method":null,"since":null}}},"next_actions":[{"action":"list_tools","description":"Every current tool with input schemas","href":"/v1/servers/io.github.anima-labs-ai%2Fanima/tools","arguments":{"name":"io.github.anima-labs-ai/anima"}},{"action":"get_connection","description":"Minimal connection block for the preferred remote or package","href":"/v1/servers/io.github.anima-labs-ai%2Fanima/connection?target=mcpServers","arguments":{"name":"io.github.anima-labs-ai/anima","target":"mcpServers"}},{"action":"search","description":"Find other servers by intent","href":"/v1/search?q={query}","arguments":{"q":"{query}"}}]}