# raccha.ai (remote · raccha.ai)

MCP-first toolbox for agents: KV storage, auth, queue, and utility tools. Free in early access.

- Trust score: 68/100 (medium)
- Change this week: 0
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-09-20

## Components

- remote · `raccha.ai`: 68/100 (this document), [markdown](https://verifymcp.io/servers/ai-raccha-raccha/raccha.md), [page](https://verifymcp.io/servers/ai-raccha-raccha/raccha)

## Channel facts

- Endpoint: `https://raccha.ai/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-09-20.

- **Endpoint Security**: 51/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not fully verified: no authorisation is required to call this server, and 59 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.
  - HTTPS enforcement could not be verified: the plaintext port answered with HTTP 406, which proves neither a plaintext path nor enforcement.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 72/100
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 7509 tokens (~127/item across 59 items; 59 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 62/100
  - Stability check failed: schema churn in the 30 days we've observed: 0 tool removals, 41 breaking changes, 0 auth/transport breaks, 5 additions.
- **Tool Coverage**: 87/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 61% of tool parameters carry a description.
- **Tool Safety**: 75/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 0 of 7 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "delete_role" implies "delete" and declares no destructiveHint at all, which the MCP spec reads as destructive by default.
  - An AI judge read all 60 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the raccha.ai MCP server?

raccha.ai is a hosted endpoint at https://raccha.ai/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http ai-raccha-raccha 'https://raccha.ai/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "ai-raccha-raccha": {
      "url": "https://raccha.ai/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "ai-raccha-raccha": {
      "type": "http",
      "url": "https://raccha.ai/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.ai-raccha-raccha]
url = "https://raccha.ai/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "ai-raccha-raccha": {
      "type": "remote",
      "url": "https://raccha.ai/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add ai-raccha-raccha --url 'https://raccha.ai/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  ai-raccha-raccha:
    url: "https://raccha.ai/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "ai-raccha-raccha": {
      "Transport": "http",
      "Url": "https://raccha.ai/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add ai-raccha-raccha -t streamable-http -u 'https://raccha.ai/mcp'
```

### Other

```json
{
  "mcpServers": {
    "ai-raccha-raccha": {
      "type": "http",
      "url": "https://raccha.ai/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-09-13 (score 68, +1)

No change was recorded against any check on this day. Stability & Change Management went from 61 to 64.

### 2026-09-11 (score 67, +1)

No change was recorded against any check on this day. Stability & Change Management went from 54 to 57.

### 2026-09-09 (score 66, +1)

No change was recorded against any check on this day. Stability & Change Management went from 47 to 51.

### 2026-09-06 (score 65, +1)

No change was recorded against any check on this day. Stability & Change Management went from 37 to 41.

### 2026-09-04 (score 64, +1)

No change was recorded against any check on this day. Stability & Change Management went from 31 to 34.

### 2026-09-03 (score 63, 0)

- [functional] Server version: 3.1.2 → 3.2.0

### 2026-09-02 (score 63, −4)

- [security regression] Stability: 0.57 → fail
- [security regression] A breaking change shipped without a version bump: still 3.1.2
- [security] Tool “discussion_create” rewrote its description, which is the text the model reads
- [security] Tool “discussion_get” rewrote its description, which is the text the model reads
- [functional regression] Schema quality: pass → fail
- [functional regression] “create_access_key” changed the type of “owner_key”: string → string|null
- [functional regression] “create_role” changed the type of “owner_key”: string → string|null
- [functional regression] “delete_role” changed the type of “owner_key”: string → string|null
- [functional regression] “discussion_claim_role” changed the type of “owner_key”: string → string|null
- [functional regression] “discussion_create” changed the type of “owner_key”: string → string|null
- [functional regression] “discussion_get” changed the type of “owner_key”: string → string|null
- [functional regression] “discussion_join” changed the type of “owner_key”: string → string|null
- [functional regression] “discussion_list” changed the type of “owner_key”: string → string|null
- [functional regression] “discussion_list_open” changed the type of “owner_key”: string → string|null
- [functional regression] “discussion_post” changed the type of “owner_key”: string → string|null
- [functional regression] “discussion_resolve” changed the type of “owner_key”: string → string|null
- [functional regression] “invite_member” changed the type of “owner_key”: string → string|null
- [functional regression] “isdomainreachable” changed the type of “owner_key”: string → string|null
- [functional regression] “isemailreachable” changed the type of “owner_key”: string → string|null
- [functional regression] “kv_delete” changed the type of “owner_key”: string → string|null
- [functional regression] “kv_delete_prefix” changed the type of “owner_key”: string → string|null
- [functional regression] “kv_get” changed the type of “owner_key”: string → string|null
- [functional regression] “kv_incr” changed the type of “owner_key”: string → string|null
- [functional regression] “kv_list” changed the type of “owner_key”: string → string|null
- [functional regression] “kv_put” changed the type of “owner_key”: string → string|null
- [functional regression] “list_access_keys” changed the type of “owner_key”: string → string|null
- [functional regression] “list_profiles” changed the type of “owner_key”: string → string|null
- [functional regression] “list_roles” changed the type of “owner_key”: string → string|null
- [functional regression] “queue_ack” changed the type of “owner_key”: string → string|null
- [functional regression] “queue_nack” changed the type of “owner_key”: string → string|null
- [functional regression] “queue_pop” changed the type of “owner_key”: string → string|null
- [functional regression] “queue_pop_lease” changed the type of “owner_key”: string → string|null
- [functional regression] “queue_push” changed the type of “owner_key”: string → string|null
- [functional regression] “revoke_access_key” changed the type of “owner_key”: string → string|null
- [functional regression] “send_email_reply” changed the type of “owner_key”: string → string|null
- [functional regression] “stats” changed the type of “owner_key”: string → string|null
- [functional regression] “switch_org” changed the type of “owner_key”: string → string|null
- [functional regression] “telegram_pair_code” changed the type of “owner_key”: string → string|null
- [functional regression] “telegram_send” changed the type of “owner_key”: string → string|null
- [functional regression] “topic_read” changed the type of “owner_key”: string → string|null
- [functional regression] “update_access_key” changed the type of “owner_key”: string → string|null
- [functional regression] “update_role” changed the type of “owner_key”: string → string|null
- [functional regression] “whoami” changed the type of “owner_key”: string → string|null
- [functional regression] Tool “delete_role” dropped its output schema
- [functional regression] Tool “invite_member” dropped its output schema
- [functional regression] Tool “update_access_key” dropped its output schema
- [functional regression] Tool “update_role” dropped its output schema
- [functional regression] Tool “whoami” dropped its output schema
- [functional improvement] Tool coverage: 47% → 61%
- [functional] Schema quality: good → excellent
- [functional] New tool “create_org”
- [functional] New tool “list_by_tag”
- [functional] New tool “list_subscribers”
- [functional] New tool “queue_fetch”
- [functional] New tool “queue_list_items”
- [functional] New tool “queue_list_names”
- [functional] New tool “subscribe_tag”
- [functional] New tool “unsubscribe_tag”
- [cosmetic] “discussion_create” added an optional parameter “tags”
- [cosmetic] “discussion_get” added an optional parameter “tag”
- [cosmetic] “invite_member” reworded the description of “owner_key”
- [cosmetic] “create_access_key” reworded the description of “owner_key”
- [cosmetic] “create_role” reworded the description of “owner_key”
- [cosmetic] “delete_role” reworded the description of “owner_key”
- [cosmetic] “discussion_claim_role” reworded the description of “owner_key”
- [cosmetic] “discussion_create” reworded the description of “owner_key”
- [cosmetic] “kv_put” reworded the description of “owner_key”
- [cosmetic] “discussion_get” reworded the description of “owner_key”
- [cosmetic] “discussion_join” reworded the description of “owner_key”
- [cosmetic] “discussion_list” reworded the description of “owner_key”
- [cosmetic] “discussion_list_open” reworded the description of “owner_key”
- [cosmetic] “discussion_post” reworded the description of “owner_key”
- [cosmetic] “discussion_resolve” reworded the description of “owner_key”
- [cosmetic] “isdomainreachable” reworded the description of “owner_key”
- [cosmetic] “isemailreachable” reworded the description of “owner_key”
- [cosmetic] “kv_delete” reworded the description of “owner_key”
- [cosmetic] “kv_delete_prefix” reworded the description of “owner_key”
- [cosmetic] “kv_get” reworded the description of “owner_key”
- [cosmetic] “kv_incr” reworded the description of “owner_key”
- [cosmetic] “kv_list” reworded the description of “owner_key”
- [cosmetic] “list_access_keys” reworded the description of “owner_key”
- [cosmetic] “list_profiles” reworded the description of “owner_key”
- [cosmetic] “list_roles” reworded the description of “owner_key”
- [cosmetic] “queue_ack” reworded the description of “owner_key”
- [cosmetic] “queue_nack” reworded the description of “owner_key”
- [cosmetic] “queue_pop” reworded the description of “owner_key”
- [cosmetic] “queue_pop_lease” reworded the description of “owner_key”
- [cosmetic] “queue_push” reworded the description of “owner_key”
- [cosmetic] “revoke_access_key” reworded the description of “owner_key”
- [cosmetic] “send_email_reply” reworded the description of “owner_key”
- [cosmetic] “stats” reworded the description of “owner_key”
- [cosmetic] “switch_org” reworded the description of “owner_key”
- [cosmetic] “telegram_pair_code” reworded the description of “owner_key”
- [cosmetic] “telegram_send” reworded the description of “owner_key”
- [cosmetic] “topic_read” reworded the description of “owner_key”
- [cosmetic] “update_access_key” reworded the description of “owner_key”
- [cosmetic] “update_role” reworded the description of “owner_key”
- [cosmetic] “whoami” reworded the description of “owner_key”
- [cosmetic] “create_access_key” made “owner_key” optional
- [cosmetic] “create_role” made “owner_key” optional
- [cosmetic] “delete_role” made “owner_key” optional
- [cosmetic] “discussion_claim_role” made “owner_key” optional
- [cosmetic] “discussion_create” made “owner_key” optional
- [cosmetic] “discussion_get” made “owner_key” optional
- [cosmetic] “discussion_join” made “owner_key” optional
- [cosmetic] “discussion_list” made “owner_key” optional
- [cosmetic] “discussion_list_open” made “owner_key” optional
- [cosmetic] “discussion_post” made “owner_key” optional
- [cosmetic] “discussion_resolve” made “owner_key” optional
- [cosmetic] “invite_member” made “owner_key” optional
- [cosmetic] “isdomainreachable” made “owner_key” optional
- [cosmetic] “isemailreachable” made “owner_key” optional
- [cosmetic] “kv_delete” made “owner_key” optional
- [cosmetic] “kv_delete_prefix” made “owner_key” optional
- [cosmetic] “kv_get” made “owner_key” optional
- [cosmetic] “kv_incr” made “owner_key” optional
- [cosmetic] “kv_list” made “owner_key” optional
- [cosmetic] “kv_put” made “owner_key” optional
- [cosmetic] “list_access_keys” made “owner_key” optional
- [cosmetic] “list_profiles” made “owner_key” optional
- [cosmetic] “list_roles” made “owner_key” optional
- [cosmetic] “queue_ack” made “owner_key” optional
- [cosmetic] “queue_nack” made “owner_key” optional
- [cosmetic] “queue_pop” made “owner_key” optional
- [cosmetic] “queue_pop_lease” made “owner_key” optional
- [cosmetic] “queue_push” made “owner_key” optional
- [cosmetic] “revoke_access_key” made “owner_key” optional
- [cosmetic] “send_email_reply” made “owner_key” optional
- [cosmetic] “stats” made “owner_key” optional
- [cosmetic] “switch_org” made “owner_key” optional
- [cosmetic] “telegram_pair_code” made “owner_key” optional
- [cosmetic] “telegram_send” made “owner_key” optional
- [cosmetic] “topic_read” made “owner_key” optional
- [cosmetic] “update_access_key” made “owner_key” optional
- [cosmetic] “update_role” made “owner_key” optional
- [cosmetic] “whoami” made “owner_key” optional

### 2026-08-31 (score 67, +1)

No change was recorded against any check on this day. Stability & Change Management went from 50 to 53. That category is still filling its 30-day observation window: 15 days of observed history at the previous scan, 16 at this one. The score rises as the window fills, whether or not the server changes.

## MCP tools (59)

### `cert_inspect` (~107 tokens)

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 private key.

Input parameters:

- `pem` (string, required): A PEM-encoded X.509 certificate, including the -----BEGIN CERTIFICATE----- / -----END CERTIFICATE----- markers.

### `create_access_key` (~179 tokens)

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.

Input parameters:

- `expiry` (string|null): RFC3339 expiry, e.g. "2026-12-31T00:00:00Z".
- `label` (string, required)
- `mailbox_label` (string)
- `owner_key` (string|null): Owner key. Must belong to an admin member. Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.
- `role_ids` (array): Roles to bind this key to (combination, bundle-26). Unset/empty grants no scopes (denies everything).

### `create_org` (~225 tokens)

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 same per-email account-creation quota as signup. Returns a fresh owner_key in the same shape as `switch_org`.

Input parameters:

- `name` (string, required): Human-readable name for the new org, e.g. "c-engineering". Slugified into the namespace's slug (lowercase, dash-separated); if the resulting slug is already taken, a short random suffix is appended a…
- `owner_key` (string|null): Any valid owner_key for this email. The new org is created under the same email, not a fresh signup. Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bea…

### `create_role` (~133 tokens)

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.

Input parameters:

- `name` (string, required)
- `owner_key` (string|null): Owner key. Must belong to an admin member — access_keys can never call this. Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.
- `scope_expressions` (array): Scope expressions in `<structure>:<prefix>` form, e.g. "kv.get:billing.acme.*".

### `delete_role` (~89 tokens)

Delete a role. Refused with an error if it's still assigned to an active access_key. Requires an admin owner_key.

Input parameters:

- `id` (string, required): The role's id.
- `owner_key` (string|null): Owner key. Must belong to an admin member. Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.

### `device_claim` (~110 tokens)

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 — start over with device_start). On success, returns the minted credential exactly once — save it, it cannot be fetched again.

Input parameters:

- `device_code` (string, required): The device_code returned by device_start.

### `device_start` (~170 tokens)

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 register_client (if you called it) so the approval screen shows your client's name. Call device_claim afterward (poll it, honoring its stated interval) with the returned device_code to pick up the result. This tool does not block/wait — a synchronous MCP tool call can't sit through a multi-minute browser approval.

Input parameters:

- `client_id` (string|null): Optional client_id from a prior register_client call. Omit to start a device-code flow exactly as before this bundle.

### `discussion_claim_role` (~132 tokens)

Atomically claim a predefined role in a role-claim deliberation thread. Use this when the thread was created with requested_roles.

Input parameters:

- `handle` (string, required): The participant's display handle. `nickname` is accepted as an alias.
- `owner_key` (string|null): Owner key or access key credential. Optional — if omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header (an access_key must still be passed expl…
- `role` (string, required)
- `thread_id` (string, required)

### `discussion_create` (~425 tokens)

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 change who can see the thread (its `visibility` still governs that for every reader); they only make the thread discoverable via `list_by_tag` and reachable through an account's `subscribe_tag` registry. Returns the thread id, slug, public URL, and the normalized tags actually stored.

Input parameters:

- `initial_post` (string|null)
- `owner_handle` (string|null)
- `owner_key` (string|null): Owner key or access key credential. Optional — if omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header (an access_key must still be passed expl…
- `requested_roles` (array|null): The task-specified `roles[]` alias for requested_roles.
- `slug` (string|null)
- `tags` (array): Tags to attach to the thread at creation time. Optional, defaults to none. Each tag: 1-64 chars, lowercase-normalized, ASCII alphanumeric/`-`/`_` only (matches the handle/slug charset). Up to 16 tags…
- `title` (string, required): The thread's question or title. `question` is accepted as an alias for the task-specified shape.
- `visibility` (string): Defaults to `account` visibility when omitted.

### `discussion_get` (~459 tokens)

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 fetch -- the tag must actually be attached to the thread (`tag not on thread` if not; this never grants extra visibility, the thread's normal visibility rule still applies on top of it). When `tag` is set and valid, the response carries a `tag_context: {org, tag, subscription_path}` field and each entry in `posts` is wrapped as `{org, tag, subscription_path, content: <the post, same shape as the untagged response>}` -- a generic, raccha-agnostic envelope any client (this org's or another's tooling) can interpret without raccha-specific business logic. A direct call with no `tag` returns the plain, unwrapped shape (`posts` is an array of posts, not envelopes) -- unchanged from before tags existed.

Input parameters:

- `limit` (integer|null)
- `owner_key` (string|null): Owner key or access key credential. Optional — if omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header (an access_key must still be passed expl…
- `since_id` (string|null)
- `tag` (string|null): Optional: read this thread as tag-mediated delivery rather than a direct-by-id fetch. Must be a tag actually attached to the thread (`invalid tag` if malformed, `tag not on thread` if the thread does…
- `thread_id` (string, required)

### `discussion_join` (~127 tokens)

Join a free-form deliberation thread with a unique handle. Use this when the thread has no requested_roles.

Input parameters:

- `handle` (string, required): The participant's display handle. `nickname` is accepted as an alias for the task-specified shape.
- `owner_key` (string|null): Owner key or access key credential. Optional — if omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header (an access_key must still be passed expl…
- `thread_id` (string, required)

### `discussion_list` (~124 tokens)

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).

Input parameters:

- `limit` (integer|null)
- `owner_key` (string|null): Owner key or access key credential. Optional — if omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header (an access_key must still be passed expl…
- `status` (string|null)
- `visibility` (string|null)

### `discussion_list_open` (~108 tokens)

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.

Input parameters:

- `owner_key` (string|null): Owner key or access key credential. Optional — if omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header (an access_key must still be passed expl…

### `discussion_post` (~144 tokens)

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.

Input parameters:

- `content` (string, required): The post body. `body` is accepted as an alias for the task-specified shape.
- `owner_key` (string|null): Owner key or access key credential. Optional — if omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header (an access_key must still be passed expl…
- `reply_to_post_id` (string|null)
- `thread_id` (string, required)

### `discussion_resolve` (~112 tokens)

Mark a deliberation thread resolved. Only the thread owner may call this. An optional resolution text is stored as a final post.

Input parameters:

- `owner_key` (string|null): Owner key or access key credential. Optional — if omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header (an access_key must still be passed expl…
- `resolution` (string|null)
- `thread_id` (string, required)

### `hash` (~112 tokens)

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; use sha256 for anything security-relevant.

Input parameters:

- `algorithm` (string): One of: sha256 (default), sha1, md5.
- `input` (string, required): The string to hash.

### `invite_member` (~78 tokens)

Invite an email to join your account. Requires an admin owner_key.

Input parameters:

- `email` (string, required): Email address to invite.
- `owner_key` (string|null): Owner key. Must belong to an admin member. Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.

### `ip_cidr` (~140 tokens)

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 the block is actually routed or reachable.

Input parameters:

- `cidr` (string, required): A CIDR block, e.g. "10.0.0.0/24" or "2001:db8::/32".
- `ip` (string|null): Optional IP address to test for membership in `cidr`.

### `isdomainreachable` (~186 tokens)

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 DBL, SURBL, URIBL), Google Safe Browsing (skipped if API key missing), Cisco Talos reputation (best-effort), and Google Transparency Report (best-effort). Owner-key-gated to prevent abuse.

Input parameters:

- `domain` (string, required): Domain to evaluate. No real email is sent.
- `owner_key` (string|null): Owner key. Gated to prevent unauthenticated abuse. Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.

### `isemailreachable` (~169 tokens)

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 lookup, SMTP RCPT TO probe, STARTTLS, reverse DNS alignment, and Spamhaus ZEN (best-effort). Owner-key-gated to prevent abuse.

Input parameters:

- `address` (string, required): Email address to evaluate. No real email is sent.
- `owner_key` (string|null): Owner key. Gated to prevent unauthenticated abuse. Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.

### `jwt_decode` (~123 tokens)

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 is present, also returns a human-readable relative expiry (e.g. "expires in 2 hours" or "expired 3 days ago").

Input parameters:

- `token` (string, required): The raw JWT string (header.payload.signature, or header.payload).

### `kv_cas` (~34 tokens)

Compare-and-swap a KV key. If the stored value equals expected_value, write new_value; otherwise return an error.

### `kv_delete` (~63 tokens)

Delete a single KV key.

Input parameters:

- `key` (string, required)
- `owner_key` (string|null): Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.
- `slug` (string, required)

### `kv_delete_prefix` (~67 tokens)

Delete all KV keys starting with a prefix.

Input parameters:

- `owner_key` (string|null): Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.
- `prefix` (string, required)
- `slug` (string, required)

### `kv_get` (~67 tokens)

Fetch a JSON value by key from your namespace.

Input parameters:

- `key` (string, required)
- `owner_key` (string|null): Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.
- `slug` (string, required)

### `kv_incr` (~101 tokens)

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.

Input parameters:

- `delta` (integer, required)
- `key` (string, required)
- `owner_key` (string|null): Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.
- `slug` (string, required)

### `kv_list` (~86 tokens)

List KV keys starting with a prefix, paginated by cursor.

Input parameters:

- `cursor` (string|null)
- `limit` (integer|null)
- `owner_key` (string|null): Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.
- `prefix` (string)
- `slug` (string, required)

### `kv_put` (~97 tokens)

Store a JSON value under a key in your namespace.

Input parameters:

- `key` (string, required)
- `owner_key` (string|null): Owner key for the org this KV item belongs to. Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.
- `slug` (string, required): Namespace slug, from the profile returned by `verify`.
- `value` (required): Any JSON value.

### `kv_put_ttl` (~37 tokens)

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` (~61 tokens)

List access keys for your account (metadata only — key material is never returned again).

Input parameters:

- `owner_key` (string|null): Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.

### `list_by_tag` (~199 tokens)

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 reach some other way, and a thread with zero visible matches returns an empty list, not an error. The caller does NOT need to be subscribed to the tag to call this (subscription only gates `list_subscribers`, not this tool). Returns the same shape as `discussion_list`.

Input parameters:

- `limit` (integer|null)
- `owner_key` (string|null): Owner key or access key credential. Optional — if omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header (an access_key must still be passed expl…
- `tag` (string, required)

### `list_profiles` (~112 tokens)

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.

Input parameters:

- `owner_key` (string|null): Any valid owner_key for this email. Returns every org/profile the authenticated member can act as. Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Beare…

### `list_roles` (~50 tokens)

List roles defined for your account.

Input parameters:

- `owner_key` (string|null): Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.

### `list_subscribers` (~221 tokens)

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: an empty list would still disclose that the tag exists with zero visible subscribers, which a non-member should not learn either. The denial is identical whether the tag has zero subscribers, many subscribers, or does not exist at all -- a non-subscriber cannot distinguish those cases from the error alone. On success, returns each subscriber's account_id, org (namespace slug/self-label), and subscribed_at.

Input parameters:

- `owner_key` (string|null): Owner key or access key credential. Optional — if omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header (an access_key must still be passed expl…
- `tag` (string, required)

### `queue_ack` (~64 tokens)

Acknowledge a leased queue item by receipt, permanently removing it.

Input parameters:

- `owner_key` (string|null): Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.
- `receipt` (string, required)

### `queue_fetch` (~99 tokens)

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.

Input parameters:

- `name` (string, required)
- `owner_key` (string|null): Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.
- `slug` (string, required)

### `queue_list_items` (~104 tokens)

List visible items in a queue non-destructively, in FIFO order. Returns item ids and values; use the cursor for pagination. Owner-only.

Input parameters:

- `cursor` (integer|null)
- `limit` (integer|null)
- `name` (string, required)
- `owner_key` (string|null): Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.
- `slug` (string, required)

### `queue_list_names` (~110 tokens)

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.

Input parameters:

- `owner_key` (string|null): Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.
- `pattern` (string)
- `slug` (string, required)

### `queue_nack` (~76 tokens)

Negative-acknowledge a leased queue item by receipt, returning it to the queue so another consumer can pick it up.

Input parameters:

- `owner_key` (string|null): Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.
- `receipt` (string, required)

### `queue_pop` (~91 tokens)

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.

Input parameters:

- `name` (string, required)
- `owner_key` (string|null): Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.
- `slug` (string, required)

### `queue_pop_lease` (~123 tokens)

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.

Input parameters:

- `lease_seconds` (integer, required)
- `name` (string, required)
- `owner_key` (string|null): Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.
- `slug` (string, required)

### `queue_push` (~147 tokens)

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.

Input parameters:

- `name` (string, required): Queue name (dot-hierarchical, e.g. "billing.acme.invoice"). Matched exactly on pop — not a wildcard/prefix scan.
- `owner_key` (string|null): Owner key for the org this queue belongs to. Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.
- `slug` (string, required): Namespace slug, from the profile returned by `verify`.
- `value` (required): Any JSON value.

### `queue_push_delayed` (~46 tokens)

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.

### `register_client` (~120 tokens)

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 approval; it only labels the client_id you pass to device_start next.

Input parameters:

- `client_name` (string, required): Human-readable name for this client, shown to the human on the device-code approval screen (e.g. "Claude Desktop", "my CI runner").

### `request_link` (~78 tokens)

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.

Input parameters:

- `email` (string, required): Email to send (or in the current no-SMTP setup, return) a magic sign-in link for.

### `revoke_access_key` (~123 tokens)

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.

Input parameters:

- `id` (string, required): The access key's `id` (not the raw `ak_...` key material).
- `owner_key` (string|null): Owner key. Must belong to an admin member. Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.

### `send_email_reply` (~154 tokens)

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 it for delivery. Requires any valid owner_key.

Input parameters:

- `body` (string, required): Plain-text body of the reply.
- `message_id` (integer, required): The message_id returned by the mailbox ingest endpoint for the inbound message you are replying to.
- `owner_key` (string|null): Owner key. Any valid owner_key is accepted; this tool is gated to prevent unauthenticated abuse, not to enforce message ownership. Optional. If omitted, defaults to the owner_key resolved from the co…

### `stats` (~65 tokens)

Get counts for your org: KV item count and queue depth today; credit balance is null until that subsystem ships.

Input parameters:

- `owner_key` (string|null): Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.

### `subscribe_tag` (~277 tokens)

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 read still apply the thread's own visibility rule (private/account/public) on top of any tag match. What subscribing actually grants: (1) the account is included when someone who IS a subscriber calls `list_subscribers` for this tag; (2) the account itself becomes able to call `list_subscribers` for this tag (that tool hard-denies any caller whose account is not currently subscribed). `tag`: 1-64 chars, lowercase-normalized, ASCII alphanumeric/-/_ only.

Input parameters:

- `owner_key` (string|null): Owner key or access key credential. Optional — if omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header (an access_key must still be passed expl…
- `tag` (string, required): 1-64 chars, ASCII alphanumeric/`-`/`_`, case-insensitive (lowercase-normalized on write, same as tags on `discussion_create`).

### `switch_org` (~127 tokens)

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.

Input parameters:

- `account_id` (string, required): The account_id of the org to switch to. Must belong to the same email.
- `owner_key` (string|null): Any valid owner_key for this email. Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.

### `telegram_pair_code` (~109 tokens)

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 paired chat land on the telegram.inbound queue in your namespace.

Input parameters:

- `owner_key` (string|null): Owner key for the org this pairing code will link a Telegram chat to. Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.

### `telegram_send` (~162 tokens)

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.

Input parameters:

- `chat_id` (integer, required): The Telegram chat_id to send to. Must already be paired to this account (via a pairing code consumed through the bot) — sending to an unpaired or someone-else's chat_id is rejected.
- `owner_key` (string|null): Owner key for the org that owns the paired Telegram chat. Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.
- `text` (string, required)

### `topic_publish` (~34 tokens)

Publish a JSON event to a topic. Returns {ok: true, cursor}. Multiple readers can tail the same topic by cursor.

### `topic_read` (~109 tokens)

Read events from a topic since a cursor. Omit cursor (or pass 0) to read from the start. Returns {events: [{cursor, event}], next_cursor}.

Input parameters:

- `cursor` (integer|null)
- `limit` (integer|null)
- `name` (string, required)
- `owner_key` (string|null): Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.
- `slug` (string, required)

### `unsubscribe_tag` (~166 tokens)

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 account is no longer a subscriber) the account itself can no longer call `list_subscribers` for this tag.

Input parameters:

- `owner_key` (string|null): Owner key or access key credential. Optional — if omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header (an access_key must still be passed expl…
- `tag` (string, required)

### `update_access_key` (~179 tokens)

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.

Input parameters:

- `expiry` (string|null): New RFC3339 expiry, or omit to leave unchanged.
- `id` (string, required): The access_key's id (not the raw ak_... key material).
- `mailbox_label` (string|null): New mailbox_label, or omit to leave unchanged.
- `owner_key` (string|null): Owner key. Must belong to an admin member. Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.
- `role_ids` (array|null): New full set of role ids to bind (replaces the existing combination), or omit to leave unchanged.

### `update_role` (~127 tokens)

Update a role's name and/or scope_expressions. Omitted fields are left unchanged (not cleared). Requires an admin owner_key.

Input parameters:

- `id` (string, required): The role's id.
- `name` (string|null): New name, or omit to leave unchanged.
- `owner_key` (string|null): Owner key. Must belong to an admin member. Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.
- `scope_expressions` (array|null): New scope_expressions, or omit to leave unchanged.

### `verify` (~62 tokens)

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.

Input parameters:

- `token` (string, required): The token from the end of a magic-link URL (?token=...).

### `whoami` (~64 tokens)

Who does the server think you are, right now, for this owner_key.

Input parameters:

- `owner_key` (string|null): Owner key to check. Optional. If omitted, defaults to the owner_key resolved from the connection's `Authorization: Bearer <owner_key>` header.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/ai-raccha-raccha/raccha#diagnostics

## Score history

- 2026-09-20: 68
- 2026-09-19: 68
- 2026-09-18: 68
- 2026-09-17: 68
- 2026-09-16: 68
- 2026-09-15: 68
- 2026-09-14: 68
- 2026-09-13: 68
- 2026-09-12: 67
- 2026-09-11: 67
- 2026-09-10: 66
- 2026-09-09: 66
- 2026-09-08: 65
- 2026-09-07: 65
- 2026-09-06: 65
- 2026-09-05: 64
- 2026-09-04: 64
- 2026-09-03: 63
- 2026-09-02: 63
- 2026-09-01: 67
- 2026-08-31: 67
- 2026-08-30: 66
- 2026-08-29: 66
- 2026-08-28: 65
- 2026-08-27: 65
- 2026-08-26: 64
- 2026-08-25: 64
- 2026-08-24: 63
- 2026-08-23: 63
- 2026-08-22: 62

## Common questions

### What is the raccha.ai MCP server?

raccha.ai is an MCP server listed in the public MCP registry as ai.raccha/raccha. MCP-first toolbox for agents: KV storage, auth, queue, and utility tools. Free in early access. This page covers its hosted endpoint (https://raccha.ai/mcp).

### Is the raccha.ai MCP server safe to use?

raccha.ai scores 68 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the raccha.ai MCP server expose?

raccha.ai exposes 59 tools: cert_inspect, create_access_key, create_org, create_role, delete_role, and 54 more. Their descriptions and schemas cost roughly 7,463 tokens of context every time the server is loaded.

### Does the raccha.ai MCP server require authentication?

No. We connected to raccha.ai without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the raccha.ai MCP server still maintained?

raccha.ai is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

## Links

- Remote endpoint: https://raccha.ai/mcp
- Website: https://raccha.ai/
- Changelog RSS feed: https://verifymcp.io/servers/ai-raccha-raccha/raccha.xml
- Changelog JSON feed: https://verifymcp.io/servers/ai-raccha-raccha/raccha.json
- HTML version of this page: https://verifymcp.io/servers/ai-raccha-raccha/raccha
