Skip to main content

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:

TokenCallerAccess
SPINE_MCP_TOKENThe interactive SABLE agentReads and approval proposals — never board delivery
SPINE_MCP_STAGE_TOKENPrompt stagingBroad read-only staging tools; also derives the separate scheduled-report bearer
HMAC-derived report bearerScheduled reportsOnly get_report_readiness and the active run's get_report_evidence_snapshot
SPINE_MCP_LEARNING_TOKENThe learning loopReads plus prompt_update proposals
SPINE_MCP_ORCHESTRATOR_TOKENTrigger.devPersistence 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_board
  • get_project
  • get_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 as record_unavailable with no text. Not available to scheduled reports, which read their evidence snapshot only.
  • search_documents
  • list_open_items
  • whoami
  • list_skills
  • read_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.ts
  • supabase/functions/_shared/rule_merge.js, _shared/fathom.js
  • docs-site/docs/architecture/managed-agents.md
  • docs-site/docs/architecture/act-layer.md