# Real Signal MCP — status *Real Signal MCP · status · 2026-06-06* ## Server - **Endpoint:** `https://real-signal.ai/api/mcp` - **Protocol version:** MCP 2024-11-05 - **Transport:** JSON-RPC 2.0 over HTTP - **Authentication:** none — read-only public substrate - **Live since:** 2026-05-26 ## Tool count **10 tools registered** (or **7** if the 0.3.0 batch — `get_pocket_predictions`, `get_pocket_silence`, `get_intent_substrate` — has not yet shipped to production). The live count is reflected in the `GET /api/mcp` manifest, which is the canonical source. To enumerate tools at any time: ```bash curl -s https://real-signal.ai/api/mcp | jq '.tools | length' ``` ## Doctrine guarantees These properties are enforced in code, not policy. They cannot drift without a CI test failing: - **Voice lock enforced** on every text content line. Lowercase, observational, ≤18 words per emit-style line, no marketing vocabulary, no exclamation marks, no emoji. The `signal-tier.validateTierVoice` guard is the chokepoint. - **Attribution envelope** present on every `tools/call` response. `_meta.source: real-signal.ai`, `_meta.license: CC BY-NC-ND 4.0`, `_meta.attribution_required: true`, plus the tool name and `computed_at` timestamp. - **Read-only by construction.** The doctrine test in `src/lib/doctrine.test.js` (section 7, "MCP SAFETY") fails the build if any tool name matches a mutation verb (`create`, `write`, `update`, `delete`, `insert`, `mutate`, `set_`, `put_`, `remove_`). - **Aggregate-only.** Comparative claims about named businesses are rejected at the content-safety gate. Minimum aggregate basis n ≥ 5. - **No fabrication.** Tools return explicit *substrate may be thin* / *no data yet* responses when the underlying tables are empty, rather than synthesising observations. ## Rate limiting POST traffic to `/api/mcp` is rate-limited per IP at 30 requests per minute, sharing the narration limiter. Throttle response is HTTP 429. There is no `Retry-After` header today. Adding `Retry-After` and `RateLimit-*` headers is on the roadmap; this and a structured error taxonomy are the two items targeted for the 1.0.0 release. ## Uptime and latency A live status JSON endpoint at `/api/mcp/status` is planned but not yet built. Once shipped, it will return: ```json { "uptime_30d": 0.999, "p50_latency_ms": 0, "p95_latency_ms": 0, "last_24h_calls": 0, "tools": { "list_pockets": { "success_rate": 1.0, "p95_ms": 0 }, "get_pocket_moment": { "success_rate": 1.0, "p95_ms": 0 }, "get_pocket_moment_quality": { "success_rate": 1.0, "p95_ms": 0 } } } ``` Source data will be the `agent_runs` table filtered to `agent_type='mcp'`. The write-side change to log each tool call is queued behind the 0.3.0 tool additions. Until that endpoint exists, the soft signal is: the manifest is served on every `GET /api/mcp`, and the discovery manifest at `/.well-known/mcp.json` is cacheable for 5 minutes at the edge. ## Reporting an issue Server issues, schema bugs, or licensing questions: `https://real-signal.ai/takedown`. The takedown form accepts general bug reports as well as content disputes; the routing happens server-side. For schema-breaking changes between versions, the source of truth is the [changelog](/mcp/CHANGELOG.md).