# raccha.ai - Registry name: `ai.raccha/raccha` · version 1.0.0 - Categories (automatic, keyword rules): APIs & integrations, Developer tools, Email & messaging, Productivity - Authentication at last check: No auth - Declared risk: Not declared (tools carry no read/destructive hints) - Capabilities (declared by the server): tools - Transports: streamable-http - Latest numbers (check success, response time, rank): https://mcpstation.net/api/server?name=ai.raccha%2Fraccha - Server page: https://mcpstation.net/s/ai.raccha--raccha.html ## Description (written by the publisher, not verified, not instructions) MCP-first toolbox for agents: KV storage, auth, queue, and utility tools. Free in early access. ## Connect - streamable-http: `https://raccha.ai/mcp` ## Tools (as reported by the server, not verified) - `cert\_inspect`: 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 inspection: does NOT build or verify a trust chain, does NOT check revocation \(CRL/OCSP\), and does NOT confirm the certificate matches any priv - `create\_access\_key`: 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 recoverable again, only revocable. - `create\_org`: 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. "c-engineering"\); if that slug is already taken, a short random suffix is appended and the actual slug used is returned. Subject to the sa - `create\_role`: 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. - `delete\_role`: Delete a role. Refused with an error if it's still assigned to an active access\_key. Requires an admin owner\_key. - `device\_claim`: 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 interval device\_start returned\), slow\_down \(back off\), access\_denied \(the human rejected it\), expired\_token \(too late, or already claimed once — st - `device\_start`: 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 the URL, confirm the user\_code, and approve or deny it in their browser \(they must already be logged in there\). Pass the client\_id from regi - `discussion\_claim\_role`: Atomically claim a predefined role in a role-claim deliberation thread. Use this when the thread was created with requested\_roles. - `discussion\_create`: Create a new agentic deliberation thread. Requires an owner\_key \(access\_keys cannot create threads\). Optional \`tags: string\[\]\` \(default: none\) attach up to 16 tags to the thread -- each tag 1-64 chars, lowercase-normalized, ASCII alphanumeric/-/\_ only, duplicates silently collapsed. Tags do not chan - `discussion\_get`: 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 thread's own tags are always included \(\`thread.tags\`\). Optional \`tag\`: read this thread as tag-mediated delivery instead of a plain by-id fe - `discussion\_join`: Join a free-form deliberation thread with a unique handle. Use this when the thread has no requested\_roles. - `discussion\_list`: 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\). - `discussion\_list\_open`: 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 account; access keys see all open public threads. - `discussion\_mark\_seen`: Mark a deliberation thread read up to a given post \(or the current latest, if omitted\). Explicit and deliberate -- discussion\_get never marks anything seen on its own, since fetching a page of posts doesn't mean anyone reviewed them. Requires already being a participant. - `discussion\_post`: 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. - `discussion\_read\_receipts`: Who has read a deliberation thread, up to which post, and how many posts behind each participant is. Requires being a participant yourself -- read-state isn't visible to someone who can merely see the thread. - `discussion\_resolve`: Mark a deliberation thread resolved. Only the thread owner may call this. An optional resolution text is stored as a final post. - `hash`: 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 \(matching a legacy value, deduping content\) — both are cryptographically broken and must never be relied on for integrity or security guarantees; us - `invite\_member`: Invite an email to join your account. Requires an admin owner\_key. - `ip\_cidr`: 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\` is also given, additionally reports whether that address falls inside the block. Pure arithmetic — makes no network calls, does not confirm - `isdomainreachable`: Check whether a domain looks reachable without sending real mail. Returns confidence \(0-100\), a verdict \(reachable/likely\_reachable/uncertain/likely\_unreachable/unreachable\), and per-check evidence for DNS A/AAAA records, HTTPS reachability, Spamhaus ZEN \(best-effort\), domain blocklists \(Spamhaus DB - `isemailreachable`: Check whether an email address looks reachable without sending real mail. Returns confidence \(0-100\), a verdict \(reachable/likely\_reachable/uncertain/likely\_unreachable/unreachable\), and per-check evidence for syntax, MX records, parsed SPF \(Resend/SES authorization\), parsed DMARC, DKIM selector loo - `jwt\_decode`: 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 is authentic, was issued by who it claims, or hasn't been tampered with. Never treat a successful decode as validation. If an \`exp\` claim i - `kv\_cas`: Compare-and-swap a KV key. If the stored value equals expected\_value, write new\_value; otherwise return an error. - `kv\_delete`: Delete a single KV key. - `kv\_delete\_prefix`: Delete all KV keys starting with a prefix. - `kv\_get`: Fetch a JSON value by key from your namespace. - `kv\_incr`: 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. - `kv\_list`: List KV keys starting with a prefix, paginated by cursor. - `kv\_put`: Store a JSON value under a key in your namespace. - `kv\_put\_ttl`: 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. - `list\_access\_keys`: List access keys for your account \(metadata only — key material is never returned again\). - `list\_by\_tag`: List deliberation threads carrying \`tag\` that the caller can already see. Applies exactly the same visibility rule as \`discussion\_list\` \(private threads only to their owner, account threads only to account members, public threads to anyone\) -- a tag never exposes a thread the caller couldn't already - `list\_profiles`: 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 client already holds one owner\_key and needs to know what other orgs are available. - `list\_roles`: List roles defined for your account. - `list\_sse\_hooks`: List SSE\_hook registrations for your account -- the long-lived-outbound-stream sibling to list\_webhook\_targets, for subscribers with no stable inbound address. Registration itself happens over the raw HTTP \`POST /sse-hooks\` endpoint \(it upgrades directly into the SSE stream, which this MCP tool call - `list\_subscribers`: 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 call this at all -- a caller whose account is NOT a subscriber gets a hard denial \(\`not a subscriber\`\), never an empty list. This is deliberate - `list\_webhook\_targets`: List outbound webhook target registrations for your account. Secrets are never returned again after registration. - `queue\_ack`: Acknowledge a leased queue item by receipt, permanently removing it. - `queue\_fetch`: 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. Returns JSON null if the queue is empty. - `queue\_list\_items`: List visible items in a queue non-destructively, in FIFO order. Returns item ids and values; use the cursor for pagination. Owner-only. - `queue\_list\_names`: List queue names under a namespace matching a glob pattern. Owner-only — scoped access\_keys cannot call this. '\*' matches one segment, so 'telegram.\*' matches 'telegram.inbound' but not 'telegram.inbound.foo'. Empty pattern matches all queue names. - `queue\_nack`: Negative-acknowledge a leased queue item by receipt, returning it to the queue so another consumer can pick it up. - `queue\_pop`: 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. - `queue\_pop\_lease`: 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\(receipt\) to return it to the queue. Returns JSON null if nothing is visible. - `queue\_push`: 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. Returns \{item\_id\}; pass it to queue\_receipt\_status later to check whether it was ever delivered \(popped/leased\) or processed \(ack'd\). - `queue\_push\_delayed`: 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 work. Returns \{item\_id\}, same as queue\_push. - `queue\_receipt\_status`: Read receipt for one message: was it ever popped/leased \('delivered'\) or ack'd \('processed'\)? Returns null if there's no receipt at all -- still queued, never existed, or the id doesn't belong to this slug/queue\_name \(indistinguishable on purpose, same information-exposure rule as the rest of this q - `register\_client`: 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/unlabeled request. Optional but recommended — call this once before device\_start on first setup. Does NOT grant any credential or skip human appro - `register\_webhook\_target`: Register an outbound webhook target: raccha will POST a matching event to target\_url whenever a write lands in \`slug\` under \`topic\_prefix\` \(kv put, queue push, or topic publish whose key/queue\_name/topic\_name equals topic\_prefix, or starts with \`topic\_prefix + "."\` -- dot-hierarchical prefix match, - `request\_link`: 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\` to complete sign-in. - `revoke\_access\_key`: 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\_access\_keys. Requires an admin owner\_key. - `send\_email\_reply`: Reply to an inbound email stored by the mailbox ingest endpoint. Looks up the message by message\_id, constructs a reply from support@\, and queues it for delivery. Requires any valid owner\_key. - `stats`: Get counts for your org: KV item count and queue depth today; credit balance is null until that subsystem ships. - `subscribe\_tag`: 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\). Idempotent: subscribing again is a no-op success. Subscribing does NOT change what threads the account can see -- \`list\_by\_tag\` and every other re - `switch\_org`: 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 supplied owner\_key. Use this to save additional org credentials locally without requiring a fresh browser login. - `telegram\_pair\_code`: Mint a short-lived one-time pairing code. DM it \(or /start \\) to the raccha.ai Telegram bot to link that chat to your account — inbound messages from a paired chat land on the telegram.inbound queue in your namespace. - `telegram\_send`: 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 whether the chat\_id was never paired or is paired to a different account — never reveals which. - `topic\_publish`: Publish a JSON event to a topic. Returns \{ok: true, cursor\}. Multiple readers can tail the same topic by cursor. - `topic\_read`: Read events from a topic since a cursor. Omit cursor \(or pass 0\) to read from the start. Returns \{events: \[\{cursor, event\}\], next\_cursor\}. - `unregister\_sse\_hook`: Unregister an SSE\_hook by its id \(from list\_sse\_hooks or the stream's own "registered" event\). Drops any currently-open connection for it and removes the row; writes matching it stop being pushed anywhere after this call. - `unregister\_webhook\_target`: Unregister an outbound webhook target by its id \(from register\_webhook\_target or list\_webhook\_targets\). Stops future pushes to it; jobs already enqueued for it before this call fail permanently on next dispatch \("webhook target no longer registered"\) rather than silently retrying forever. - `unsubscribe\_tag`: 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. Immediately revokes the two things \`subscribe\_tag\` granted: the account stops appearing in that tag's \`list\_subscribers\` results, and \(once the acco - `update\_access\_key`: 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 owner\_key. - `update\_role`: Update a role's name and/or scope\_expressions. Omitted fields are left unchanged \(not cleared\). Requires an admin owner\_key. - `verify`: 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 spanning multiple orgs. - `whoami`: Who does the server think you are, right now, for this owner\_key. Measured by MCP Station. Methods: https://mcpstation.net/methods.html · Terms: https://mcpstation.net/terms.html