Shipflow MCP

read-onlymachine-to-machine

An authenticated, read-only MCP endpoint that exposes Shipflow issues, cases, source health, and guides. Auth is machine-to-machine via Google OIDC — a caller (e.g. AURUM) presents a Google-signed ID token minted by an allowlisted service account. There is no static token, and it is not connectable from the claude.ai Connectors UI (that path needs interactive OAuth).

How auth works
Every request carries a Google-signed OIDC ID token in the Authorization header.
Endpoint
https://shipflow.agi.tech/api/shipflow/mcp
  1. Caller sends Authorization: Bearer <id_token>.
  2. Server verifies Google's signature, issuer, and expiry, and that aud equals SHIPFLOW_MCP_AUDIENCE.
  3. Server authorizes only if the token's verified email is in SHIPFLOW_MCP_ALLOWED_EMAILS.
Responses: 401 on a missing/invalid/expired token, 403for a verified caller that isn't allowlisted, and 503 if the server env vars are unset (fails closed).
Server config (Vercel)
Both are required — the endpoint fails closed with a 503 if either is unset.
SHIPFLOW_MCP_AUDIENCE

The expected aud claim. Must match the audience the caller mints for, byte-for-byte.

SHIPFLOW_MCP_ALLOWED_EMAILS

Comma-separated allowlist of trusted service-account emails. Must include the client_emailof the caller's service account (e.g. AURUM's GCP_KEY_BASE64 account).

Mint a token & call
The service account's email must be allowlisted on the server.
Mint an ID token (gcloud)
# Mint an ID token for the allowlisted service account.
# --audiences must equal SHIPFLOW_MCP_AUDIENCE on the server.
ID_TOKEN=$(gcloud auth print-identity-token \
  --impersonate-service-account="<allowlisted-sa>@<project>.iam.gserviceaccount.com" \
  --audiences="<SHIPFLOW_MCP_AUDIENCE>")
Mint in code (Python)
# In-process minting (how AURUM's sss client does it).
from google.oauth2 import service_account
import google.auth.transport.requests

creds = service_account.IDTokenCredentials.from_service_account_info(
    info,  # the service-account JSON (e.g. from GCP_KEY_BASE64)
    target_audience="<SHIPFLOW_MCP_AUDIENCE>",
)
creds.refresh(google.auth.transport.requests.Request())
id_token = creds.token  # short-lived (~1h); refresh when invalid
Call the endpoint (curl)
curl -X POST https://shipflow.agi.tech/api/shipflow/mcp \
  -H "Authorization: Bearer $ID_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Tools
Five read-only tools. Writes stay in the dashboard until actor identity and an audit trail exist.
list_shipflow_issues

List evaluated issues (feedback turned into new or updated tickets), each with a validity signal. Filter by label, priority, verdict, source, validity, and limit.

get_shipflow_issue_stats

Aggregate issue counts — total, plus breakdowns by label (bug/feature/improvement) and priority (critical/high/medium/low).

get_shipflow_case

One issue with safe source references, freshness, validity evidence, and guide state. Omits raw messages, prompts, author names, and screenshots.

get_shipflow_source_health

Per-source signal counts, pending counts, latest signal time, and age in minutes. The caller decides what age is acceptable.

list_shipflow_guides

AI-generated guides (reusable agent strategies) paired with their issue. Filter by review status; paginated 100 at a time.