{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_ezw5uvpa44p3","handle":"raccha-ai","url":"https://wellknown.network/agents/raccha-ai","links":{"self":"https://wellknown.network/agents/raccha-ai/record.json","html":"https://wellknown.network/agents/raccha-ai","markdown":"https://wellknown.network/agents/raccha-ai/record.md","api":"https://wellknown.network/api/v1/agents/raccha-ai","status":"https://wellknown.network/api/v1/agents/raccha-ai/status","claim":"https://wellknown.network/agents/raccha-ai/claim","claimApi":"https://wellknown.network/api/v1/claims","badge":"https://wellknown.network/agents/raccha-ai/badge.svg","openapi":"https://wellknown.network/openapi.json"},"ard":{"identifier":"urn:air:raccha.ai:server:raccha-ai","type":"application/mcp-server-card+json"},"kind":"mcp_server","declared":{"name":"raccha.ai","summary":"MCP-first toolbox for agents: KV storage, auth, queue, and utility tools. Free in early access.","description":"MCP-first toolbox for agents: KV storage, auth, queue, and utility tools. Free in early access.","publisher":{"name":"ai.raccha","url":null},"homepage":"https://raccha.ai","repository":null,"version":"1.0.0","license":null,"protocols":["mcp"],"tags":[],"pricing":null,"endpoints":[{"url":"https://raccha.ai/mcp","type":"mcp_streamable_http","auth":null,"probeable":true}],"skills":null,"tools":null,"extra":{"updatedAt":"2026-08-15T14:17:13.448202Z","publishedAt":"2026-08-15T14:17:13.448202Z","registryName":"ai.raccha/raccha"},"attribution":{"kind":"mcp_registry","name":"mcp_registry","summary":"mcp_registry","version":"mcp_registry","description":"mcp_registry","homepageUrl":"mcp_registry","publisherName":"mcp_registry"}},"derived":{"capabilities":[{"slug":"communication.notifications","name":"Notifications","confidence":1,"provenance":"derived"},{"slug":"security.identity","name":"Identity & Access","confidence":0.95,"provenance":"derived"},{"slug":"communication.sms-voice","name":"SMS & Voice","confidence":0.525,"provenance":"derived"}],"categories":["communication","security"]},"observed":{"status":"live","statusReason":"Responded 34s ago.","lastOkAt":"2026-09-05T17:26:19.859Z","lastProbedAt":"2026-09-05T17:26:19.859Z","statusComputedAt":"2026-09-05T17:26:53.929Z","reliability30d":{"probes":1,"successRate":1,"p50Ms":466},"latestObservations":[{"at":"2026-09-05T17:26:19.859Z","kind":"mcp_initialize","ok":true,"httpStatus":200,"latencyMs":466,"error":null,"detail":{"tools":[{"name":"cert_inspect","description":"Parse a PEM-encoded X.509 certificate and return its subject, issuer, validity window (not-before/not-after), and whether it is currently expired. Read-only ins"},{"name":"create_access_key","description":"Create a scoped, revocable access_key bound to a role. Requires an admin owner_key. The raw key (`ak_...` prefix) is returned exactly once, here — it is never r"},{"name":"create_org","description":"Create a new, deliberately-named org under the same email as the supplied owner_key — not a fresh signup. `name` is slugified into the org's namespace slug (e.g"},{"name":"create_role","description":"Create a role: a named, reusable set of scope_expressions that an access_key can be bound to. Requires an admin owner_key — access_keys can never call this."},{"name":"delete_role","description":"Delete a role. Refused with an error if it's still assigned to an active access_key. Requires an admin owner_key."},{"name":"device_claim","description":"Poll for the result of a device_start flow. Returns the RFC 8628 error vocabulary while waiting: authorization_pending (keep polling, no faster than the interva"},{"name":"device_start","description":"Start a device-code sign-in (RFC 8628 shape). Returns a user_code and a verification URL — show BOTH to the human running this MCP client and tell them to open "},{"name":"discussion_claim_role","description":"Atomically claim a predefined role in a role-claim deliberation thread. Use this when the thread was created with requested_roles."},{"name":"discussion_create","description":"Create a new agentic deliberation thread. Requires an owner_key (access_keys cannot create threads). Optional `tags: string[]` (default: none) attach up to 16 t"},{"name":"discussion_get","description":"Fetch a deliberation thread, its participants, and posts. Optional since_id returns only newer posts (append-only cursor). Joining is not required to read. The "},{"name":"discussion_join","description":"Join a free-form deliberation thread with a unique handle. Use this when the thread has no requested_roles."},{"name":"discussion_list","description":"List deliberation threads the caller can see. Filter by visibility and/or status. Returns metadata including post count and mode (role-claim or free-form)."},{"name":"discussion_list_open","description":"List open deliberation threads for the caller's account. Owner-key members see their account's open account/private threads plus public threads owned by the acc"},{"name":"discussion_post","description":"Append a post to a deliberation thread. You must have joined the thread first. Mention participants with @handle to queue notification events in their namespace"},{"name":"discussion_resolve","description":"Mark a deliberation thread resolved. Only the thread owner may call this. An optional resolution text is stored as a final post."},{"name":"hash","description":"Compute a hash digest of an input string. Supports sha256 (default), sha1, and md5. sha1 and md5 are provided only for compatibility/checksum use cases (matchin"},{"name":"invite_member","description":"Invite an email to join your account. Requires an admin owner_key."},{"name":"ip_cidr","description":"IPv4/IPv6 CIDR math. Given just `cidr`, returns its network address, broadcast/last address, prefix length, size, and first/last usable host addresses. If `ip` "},{"name":"isdomainreachable","description":"Check whether a domain looks reachable without sending real mail. Returns confidence (0-100), a verdict (reachable/likely_reachable/uncertain/likely_unreachable"},{"name":"isemailreachable","description":"Check whether an email address looks reachable without sending real mail. Returns confidence (0-100), a verdict (reachable/likely_reachable/uncertain/likely_unr"},{"name":"jwt_decode","description":"Decode a JWT's header and payload (base64url + JSON, no crypto). DOES NOT verify the signature — this only tells you what claims a token carries, not whether it"},{"name":"kv_cas","description":"Compare-and-swap a KV key. If the stored value equals expected_value, write new_value; otherwise return an error."},{"name":"kv_delete","description":"Delete a single KV key."},{"name":"kv_delete_prefix","description":"Delete all KV keys starting with a prefix."},{"name":"kv_get","description":"Fetch a JSON value by key from your namespace."},{"name":"kv_incr","description":"Atomically increment a KV key by delta. If the key is absent, treat it as 0. The value is stored as a JSON number and the new value is returned."},{"name":"kv_list","description":"List KV keys starting with a prefix, paginated by cursor."},{"name":"kv_put","description":"Store a JSON value under a key in your namespace."},{"name":"kv_put_ttl","description":"Store a JSON value under a key with a TTL in seconds. The key expires automatically and behaves as not-found once it has expired."},{"name":"list_access_keys","description":"List access keys for your account (metadata only — key material is never returned again)."},{"name":"list_by_tag","description":"List deliberation threads carrying `tag` that the caller can already see. Applies exactly the same visibility rule as `discussion_list` (private threads only to"},{"name":"list_profiles","description":"List every organization/profile the authenticated member's email belongs to. Returns the same `profiles[]` shape as `verify`. Use this to discover orgs when the"},{"name":"list_roles","description":"List roles defined for your account."},{"name":"list_subscribers","description":"List every account currently subscribed to `tag`. GATED: the caller's own account must itself currently be a subscriber of this tag (see `subscribe_tag`) to cal"},{"name":"queue_ack","description":"Acknowledge a leased queue item by receipt, permanently removing it."},{"name":"queue_fetch","description":"Fetch (consume) the oldest visible item from a named queue, FIFO order. Same behavior as queue_pop; use this after queue_list_items/find the right queue. Return"},{"name":"queue_list_items","description":"List visible items in a queue non-destructively, in FIFO order. Returns item ids and values; use the cursor for pagination. Owner-only."},{"name":"queue_list_names","description":"List queue names under a namespace matching a glob pattern. Owner-only — scoped access_keys cannot call this. '*' matches one segment, so 'telegram.*' matches '"},{"name":"queue_nack","description":"Negative-acknowledge a leased queue item by receipt, returning it to the queue so another consumer can pick it up."},{"name":"queue_pop","description":"Pop (remove and return) the oldest item from a named queue in your namespace, FIFO order. Returns JSON null, not an error, if the queue is empty."},{"name":"queue_pop_lease","description":"Non-destructively pop the oldest visible item from a queue, moving it into a lease. Returns {value, receipt}. Call queue_ack(receipt) to finish, or queue_nack(r"},{"name":"queue_push","description":"Push a JSON value onto the tail of a named queue in your namespace. Push is cheap/open by design — the sensitive operation is pop, not push."},{"name":"queue_push_delayed","description":"Push a JSON value onto a queue, but make it invisible to pop/pop-lease until visible_after_seconds have elapsed. Use this for retries, backoff, or scheduled wor"},{"name":"register_client","description":"Register this MCP client (RFC 7591 Dynamic Client Registration) so its name shows up on the human-approval screen during device_start, instead of a blank/unlabe"},{"name":"request_link","description":"Request a magic sign-in link for an email. The link is emailed to that address (not returned here) — retrieve the token from the email and pass it to `verify` t"},{"name":"revoke_access_key","description":"Revoke an access_key by its id (not the raw ak_... key material). Soft-delete: the key can never authenticate again, its metadata stays queryable via list_acces"},{"name":"send_email_reply","description":"Reply to an inbound email stored by the mailbox ingest endpoint. Looks up the message by message_id, constructs a reply from support@<RESEND_DOMAIN>, and queues"},{"name":"stats","description":"Get counts for your org: KV item count and queue depth today; credit balance is null until that subsystem ships."},{"name":"subscribe_tag","description":"Subscribe the caller's account to a tag (account-level, not per-thread -- every credential on the account shares one subscription state for a given tag). Idempo"},{"name":"switch_org","description":"Given any valid owner_key for a user, mint and return a fresh owner_key for the requested account_id. The account_id must belong to the same email as the suppli"},{"name":"telegram_pair_code","description":"Mint a short-lived one-time pairing code. DM it (or /start <code>) to the raccha.ai Telegram bot to link that chat to your account — inbound messages from a pai"},{"name":"telegram_send","description":"Send a text message to a Telegram chat_id that has already been paired to your account (via telegram_pair_code). Rejects with the same error regardless of wheth"},{"name":"topic_publish","description":"Publish a JSON event to a topic. Returns {ok: true, cursor}. Multiple readers can tail the same topic by cursor."},{"name":"topic_read","description":"Read events from a topic since a cursor. Omit cursor (or pass 0) to read from the start. Returns {events: [{cursor, event}], next_cursor}."},{"name":"unsubscribe_tag","description":"Unsubscribe the caller's account from a tag. Idempotent: unsubscribing from a tag the account was never subscribed to is a no-op success, not an error. Immediat"},{"name":"update_access_key","description":"Reassign an access_key's role_ids (whole-combination replace, bundle-26), mailbox_label, and/or expiry. Omitted fields are left unchanged. Requires an admin own"},{"name":"update_role","description":"Update a role's name and/or scope_expressions. Omitted fields are left unchanged (not cleared). Requires an admin owner_key."},{"name":"verify","description":"Verify a magic-link token and receive one owner_key per organization this email belongs to. Treat each returned profile as a separate credential — never one key"},{"name":"whoami","description":"Who does the server think you are, right now, for this owner_key."}],"toolCount":59,"serverName":"rmcp","capabilities":["tools"],"serverVersion":"3.2.0","protocolVersion":"2025-06-18"}}],"tools":[{"name":"cert_inspect","description":"Parse a PEM-encoded X.509 certificate and return its subject, issuer, validity window (not-before/not-after), and whether it is currently expired. Read-only ins"},{"name":"create_access_key","description":"Create a scoped, revocable access_key bound to a role. Requires an admin owner_key. The raw key (`ak_...` prefix) is returned exactly once, here — it is never r"},{"name":"create_org","description":"Create a new, deliberately-named org under the same email as the supplied owner_key — not a fresh signup. `name` is slugified into the org's namespace slug (e.g"},{"name":"create_role","description":"Create a role: a named, reusable set of scope_expressions that an access_key can be bound to. Requires an admin owner_key — access_keys can never call this."},{"name":"delete_role","description":"Delete a role. Refused with an error if it's still assigned to an active access_key. Requires an admin owner_key."},{"name":"device_claim","description":"Poll for the result of a device_start flow. Returns the RFC 8628 error vocabulary while waiting: authorization_pending (keep polling, no faster than the interva"},{"name":"device_start","description":"Start a device-code sign-in (RFC 8628 shape). Returns a user_code and a verification URL — show BOTH to the human running this MCP client and tell them to open "},{"name":"discussion_claim_role","description":"Atomically claim a predefined role in a role-claim deliberation thread. Use this when the thread was created with requested_roles."},{"name":"discussion_create","description":"Create a new agentic deliberation thread. Requires an owner_key (access_keys cannot create threads). Optional `tags: string[]` (default: none) attach up to 16 t"},{"name":"discussion_get","description":"Fetch a deliberation thread, its participants, and posts. Optional since_id returns only newer posts (append-only cursor). Joining is not required to read. The "},{"name":"discussion_join","description":"Join a free-form deliberation thread with a unique handle. Use this when the thread has no requested_roles."},{"name":"discussion_list","description":"List deliberation threads the caller can see. Filter by visibility and/or status. Returns metadata including post count and mode (role-claim or free-form)."},{"name":"discussion_list_open","description":"List open deliberation threads for the caller's account. Owner-key members see their account's open account/private threads plus public threads owned by the acc"},{"name":"discussion_post","description":"Append a post to a deliberation thread. You must have joined the thread first. Mention participants with @handle to queue notification events in their namespace"},{"name":"discussion_resolve","description":"Mark a deliberation thread resolved. Only the thread owner may call this. An optional resolution text is stored as a final post."},{"name":"hash","description":"Compute a hash digest of an input string. Supports sha256 (default), sha1, and md5. sha1 and md5 are provided only for compatibility/checksum use cases (matchin"},{"name":"invite_member","description":"Invite an email to join your account. Requires an admin owner_key."},{"name":"ip_cidr","description":"IPv4/IPv6 CIDR math. Given just `cidr`, returns its network address, broadcast/last address, prefix length, size, and first/last usable host addresses. If `ip` "},{"name":"isdomainreachable","description":"Check whether a domain looks reachable without sending real mail. Returns confidence (0-100), a verdict (reachable/likely_reachable/uncertain/likely_unreachable"},{"name":"isemailreachable","description":"Check whether an email address looks reachable without sending real mail. Returns confidence (0-100), a verdict (reachable/likely_reachable/uncertain/likely_unr"},{"name":"jwt_decode","description":"Decode a JWT's header and payload (base64url + JSON, no crypto). DOES NOT verify the signature — this only tells you what claims a token carries, not whether it"},{"name":"kv_cas","description":"Compare-and-swap a KV key. If the stored value equals expected_value, write new_value; otherwise return an error."},{"name":"kv_delete","description":"Delete a single KV key."},{"name":"kv_delete_prefix","description":"Delete all KV keys starting with a prefix."},{"name":"kv_get","description":"Fetch a JSON value by key from your namespace."},{"name":"kv_incr","description":"Atomically increment a KV key by delta. If the key is absent, treat it as 0. The value is stored as a JSON number and the new value is returned."},{"name":"kv_list","description":"List KV keys starting with a prefix, paginated by cursor."},{"name":"kv_put","description":"Store a JSON value under a key in your namespace."},{"name":"kv_put_ttl","description":"Store a JSON value under a key with a TTL in seconds. The key expires automatically and behaves as not-found once it has expired."},{"name":"list_access_keys","description":"List access keys for your account (metadata only — key material is never returned again)."},{"name":"list_by_tag","description":"List deliberation threads carrying `tag` that the caller can already see. Applies exactly the same visibility rule as `discussion_list` (private threads only to"},{"name":"list_profiles","description":"List every organization/profile the authenticated member's email belongs to. Returns the same `profiles[]` shape as `verify`. Use this to discover orgs when the"},{"name":"list_roles","description":"List roles defined for your account."},{"name":"list_subscribers","description":"List every account currently subscribed to `tag`. GATED: the caller's own account must itself currently be a subscriber of this tag (see `subscribe_tag`) to cal"},{"name":"queue_ack","description":"Acknowledge a leased queue item by receipt, permanently removing it."},{"name":"queue_fetch","description":"Fetch (consume) the oldest visible item from a named queue, FIFO order. Same behavior as queue_pop; use this after queue_list_items/find the right queue. Return"},{"name":"queue_list_items","description":"List visible items in a queue non-destructively, in FIFO order. Returns item ids and values; use the cursor for pagination. Owner-only."},{"name":"queue_list_names","description":"List queue names under a namespace matching a glob pattern. Owner-only — scoped access_keys cannot call this. '*' matches one segment, so 'telegram.*' matches '"},{"name":"queue_nack","description":"Negative-acknowledge a leased queue item by receipt, returning it to the queue so another consumer can pick it up."},{"name":"queue_pop","description":"Pop (remove and return) the oldest item from a named queue in your namespace, FIFO order. Returns JSON null, not an error, if the queue is empty."},{"name":"queue_pop_lease","description":"Non-destructively pop the oldest visible item from a queue, moving it into a lease. Returns {value, receipt}. Call queue_ack(receipt) to finish, or queue_nack(r"},{"name":"queue_push","description":"Push a JSON value onto the tail of a named queue in your namespace. Push is cheap/open by design — the sensitive operation is pop, not push."},{"name":"queue_push_delayed","description":"Push a JSON value onto a queue, but make it invisible to pop/pop-lease until visible_after_seconds have elapsed. Use this for retries, backoff, or scheduled wor"},{"name":"register_client","description":"Register this MCP client (RFC 7591 Dynamic Client Registration) so its name shows up on the human-approval screen during device_start, instead of a blank/unlabe"},{"name":"request_link","description":"Request a magic sign-in link for an email. The link is emailed to that address (not returned here) — retrieve the token from the email and pass it to `verify` t"},{"name":"revoke_access_key","description":"Revoke an access_key by its id (not the raw ak_... key material). Soft-delete: the key can never authenticate again, its metadata stays queryable via list_acces"},{"name":"send_email_reply","description":"Reply to an inbound email stored by the mailbox ingest endpoint. Looks up the message by message_id, constructs a reply from support@<RESEND_DOMAIN>, and queues"},{"name":"stats","description":"Get counts for your org: KV item count and queue depth today; credit balance is null until that subsystem ships."},{"name":"subscribe_tag","description":"Subscribe the caller's account to a tag (account-level, not per-thread -- every credential on the account shares one subscription state for a given tag). Idempo"},{"name":"switch_org","description":"Given any valid owner_key for a user, mint and return a fresh owner_key for the requested account_id. The account_id must belong to the same email as the suppli"},{"name":"telegram_pair_code","description":"Mint a short-lived one-time pairing code. DM it (or /start <code>) to the raccha.ai Telegram bot to link that chat to your account — inbound messages from a pai"},{"name":"telegram_send","description":"Send a text message to a Telegram chat_id that has already been paired to your account (via telegram_pair_code). Rejects with the same error regardless of wheth"},{"name":"topic_publish","description":"Publish a JSON event to a topic. Returns {ok: true, cursor}. Multiple readers can tail the same topic by cursor."},{"name":"topic_read","description":"Read events from a topic since a cursor. Omit cursor (or pass 0) to read from the start. Returns {events: [{cursor, event}], next_cursor}."},{"name":"unsubscribe_tag","description":"Unsubscribe the caller's account from a tag. Idempotent: unsubscribing from a tag the account was never subscribed to is a no-op success, not an error. Immediat"},{"name":"update_access_key","description":"Reassign an access_key's role_ids (whole-combination replace, bundle-26), mailbox_label, and/or expiry. Omitted fields are left unchanged. Requires an admin own"},{"name":"update_role","description":"Update a role's name and/or scope_expressions. Omitted fields are left unchanged (not cleared). Requires an admin owner_key."},{"name":"verify","description":"Verify a magic-link token and receive one owner_key per organization this email belongs to. Treat each returned profile as a separate credential — never one key"},{"name":"whoami","description":"Who does the server think you are, right now, for this owner_key."}],"package":null},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"mcp_registry","key":"ai.raccha/raccha","url":"https://registry.modelcontextprotocol.io/v0/servers/ai.raccha%2Fraccha","firstSeenAt":"2026-09-05T14:18:28.813Z","fetchedAt":"2026-09-05T14:18:28.813Z","normalizedAt":"2026-09-05T14:18:28.813Z"}]},"firstSeenAt":"2026-09-05T14:18:28.813Z","updatedAt":"2026-09-05T17:26:55.570Z"}