spine-mcp
spine-mcp is a remote MCP server — streamable-HTTP/JSON-RPC — that exposes the Supabase spine
to the SABLE Claude Managed Agent (CMA) as governed tools. This is the hybrid seam the whole
board-generation architecture depends on: SABLE's reasoning runs on CMA, but every fact comes
from the spine through this function, and nothing restricted ever crosses, because CMA is not
ZDR/BAA-eligible.
Auth: scoped bearer credentials
CMA dials this URL with a static bearer token from a CMA vault. Four environment secrets and one derived report bearer give each caller a separate capability:
| Token | Caller | Access |
|---|---|---|
SPINE_MCP_TOKEN | The interactive SABLE agent | Reads and approval proposals — never board delivery |
SPINE_MCP_STAGE_TOKEN | Prompt staging | Broad read-only staging tools; also derives the separate scheduled-report bearer |
| HMAC-derived report bearer | Scheduled reports | Only get_report_readiness and the active run's get_report_evidence_snapshot |
SPINE_MCP_LEARNING_TOKEN | The learning loop | Reads plus prompt_update proposals |
SPINE_MCP_ORCHESTRATOR_TOKEN | Trigger.dev | Persistence and delivery, orchestrator-only |
The report bearer is derived from SPINE_MCP_STAGE_TOKEN with a separate HMAC
domain. Its vault name uses a second HMAC domain so rotation creates a new vault
without exposing either credential. Trigger retries read the same run-bound
snapshot. The release workflow deploys Trigger, then spine-mcp, then the remaining
Edge functions; after Edge deploys,
every scheduled report request must include a snapshot ID.
v1 tools: read-only
get_boardget_projectget_meeting_records: the generated meeting record (not the transcript) for recent attributed, indexed meetings in scope, newest first. The default window is 3 days (14 at most), each record is capped at 6,000 characters by default and 12,000 at most, and a response at 48,000. It skips rejected meetings and those not yet indexed. A failed record comes back asrecord_unavailablewith no text. Not available to scheduled reports, which read their evidence snapshot only.search_documentslist_open_itemswhoamilist_skillsread_skill
Writes (propose_action → approvals, always_ask-gated) are a later phase — v1 is read-only by
design.
The hard exclusion: restricted evidence never crosses
Documents flagged documents.restricted (contracts, SOWs) are hard-excluded here regardless
of the calling tool's arguments — this is enforced in spine-mcp itself, not left to the agent to
decline to ask for. isRestrictedEvidence and toolCallBlockReason in logic.js are the checks
that make this true independent of what the agent's prompt says to do.
What else lives in logic.js
Beyond the restriction check, spine-mcp/logic.js carries the report-readiness logic shared with
the Trigger.dev report pipeline: evaluateReadiness, getReportWindow, resolveRequiredReportConnectors,
normalizeReportKind/normalizeReportTimezone, parseReportDate, and validateDraftClaims — the
same-day-evidence and structure validation described in
Board Reliability And Cutover. resolveProjectScope and
describeProjectScope implement the scope narrowing a caller's role and view-as selection resolve
to before any tool call runs.
Where the code lives
supabase/functions/spine-mcp/index.ts,logic.tssupabase/functions/_shared/rule_merge.js,_shared/fathom.jsdocs-site/docs/architecture/managed-agents.mddocs-site/docs/architecture/act-layer.md