MCP documentation

SynthBoard MCP help center

Connect Claude Desktop, Cursor, ChatGPT, or any MCP-compatible client to a full SynthBoard account. 53 tools, 19 resources, 12 prompts — one engine.

Ask your board from an assistant

Not one AI. A board of them — called from inside Claude, ChatGPT or Cursor.

Before an expensive or hard-to-undo decision, your assistant can put the question to your SynthBoard board and bring back its call: the sharpest dissent, what would change the board's mind, and the first step — with a link to the whole board on SynthBoard. No key to paste: you connect once, with your own account.

  1. 1
    Connect
    Claude: Customize → Connectors → Add custom connector, paste the URL https://www.synthboard.ai/api/mcp, then Add (the Free plan holds one custom connector). ChatGPT: Settings → Apps & Connectors → Advanced settings → turn on Developer mode, then Create and paste the same URL. Cursor: Add to Cursor (one tap). Any other client that speaks MCP over OAuth takes the same URL.
  2. 2
    Pick a daily limit
    The SynthBoard sign-in screen says in plain words what the assistant may do and asks what it may spend each day: nothing that costs credits, one board a day, 3 boards a day, 10 boards a day (default: one board a day). Each board prints its price first — on the Free plan, about 95 credits — and bills what it really used.
  3. 3
    Ask
    Say it the way you would to a person. Your assistant calls synthboard.board.call (a glance or a full board), gets the board's link at once, and fetches the call with synthboard.board.result a few minutes later.

Try one of these

  • “Ask my SynthBoard board: should I raise prices on my existing customers? I run a small design studio, about 40 clients on monthly retainers, costs up 15% this year.”
  • “I have two job offers — a startup at 20% more salary with equity, or a bank with stability and a shorter commute. Take it to my SynthBoard board for a quick call.”
  • “Before I sign, get my board's call: should I hire my first employee or a contractor? Steady extra work of about 25 hours a week, budget around $3,000 a month.”
  • Past the limit, nothing runs. The assistant gets a polite refusal that says what is left today — never a partial charge.
  • It never touches your other tools. An assistant can ask your board and read your boards; it cannot send, post or change anything in your other tools.
  • Disconnect ends it at once. Settings → MCP and API → Connected assistants → Disconnect: the very next call is refused.

Quick start

From zero to your first board in 4 steps.

  1. 1
    Create an API key
    Open the Control Center → API Keys and click Create key. The key is shown exactly once — copy it somewhere safe.
  2. 2
    Paste into your client config
    Pick your client below. Each has a dedicated config file — paste the snippet and replace sb_live_... with your real key.
  3. 3
    Restart the client
    Quit fully and reopen. The SynthBoard tools + prompts should appear in the client's tool menu.
  4. 4
    Try a prompt
    Type /synthboard-boardroom and ask a real strategic question. The decision brief staffs the board; each expert researches alone and reacts once, and the board delivers a memo.

Let your AI set you up

Day one as a returning founder: your assistant brings your world, you say yes, the board gets to work.

If Claude (or another assistant) already knows your business, it can fill in your SynthBoard world for you and run the first Consults — with you saying yes in between. Nothing lands until you keep it, and every session it starts is on your Home the moment you sign in.

  1. 1
    Connect SynthBoard as a tool
    In Claude, add SynthBoard as a connector (Settings → Connectors) with the URL below and approve the scopes. If you do not have an account yet, the sign-in screen offers Sign up — one screen, then you are back in Claude. Claude cannot create the account by itself; that click is yours.
  2. 2
    Say the words
    Type /synthboard-onboard, or just say: “Set up my SynthBoard world from what you know about me, ask me to confirm, then find the gaps in my business and consult the right experts.”
  3. 3
    Confirm the chips
    Claude calls synthboard.world_model.bring with a brief, shows you the review chips, and only after your yes calls synthboard.world_model.confirm_transfer. Prefer the site? The same chips wait on your Home under World.
  4. 4
    Get the memos
    Claude reads synthboard://world-model, names the gaps, plans a Consult for each, and brings back the expert's call, floor and dissent. Open SynthBoard whenever you like — the sessions are already there.
What Claude sends, and what comes back
// 1. Bring — parks review chips, saves nothing
{ "name": "synthboard.world_model.bring",
  "arguments": { "client_name": "Claude",
    "text": "WHO I AM\n- Founder/CEO, Acme, seed stage …\nNUMBERS ON FILE\n- MRR: $42k (as of Aug 2026)\n- Churn: 3.1%/mo (as of Aug 2026)\nGOALS\n- $1M ARR by Q2 2027 …" } }
// → { "transfer_id": "…", "status": "pending", "facts": [ … ], "numbers": [ … ], "next_step": "Show these to the user …" }

// 2. Confirm — after the user's yes (drops are optional, by text / label)
{ "name": "synthboard.world_model.confirm_transfer",
  "arguments": { "transfer_id": "…", "drop_numbers": ["Churn"] } }
// → { "status": "kept", "learned": 9, "metrics_written": 1 }

No connector? Copy the same brief prompt from Home → World → Or bring it from your AI, paste the answer back, and keep what is true.

Client setup

All 6 supported clients. Click a tab to switch.

~/Library/Application Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "synthboard": {
      "url": "https://www.synthboard.ai/api/mcp",
      "headers": { "Authorization": "Bearer sb_live_..." }
    }
  }
}
Quit and reopen Claude Desktop after editing. The file may not exist yet — create it.

Your first board

What actually happens when your agent starts a SynthBoard session.

Ask a real strategic question. Your agent calls synthboard.session.plan, shows you the proposal, then starts the run. No expert-picking needed — an adaptive decision brief reads the question and seats the right experts.

The plan-first flow
// 1. Plan — nothing charged yet
{ "name": "synthboard.session.plan",
  "arguments": {
    "question": "Should we launch a free tier next quarter?",
    "session_type": "boardroom"
  } }
// → { plan_id, proposal, estimated_credits, expires_at }

// 2. Start with the approved plan
{ "name": "synthboard.session.start",
  "arguments": { "plan_id": "<plan_id>" } }
// → { session_id, task_id, session_type: "boardroom", session_url }

// 3. Wait for the run (long-poll up to 60s per call)
{ "name": "synthboard.session.get",
  "arguments": { "session_id": "<id>", "wait_ms": 60000 } }
// → { v4_phase: "done", decision_brief, memo: { verdict,
//     confidence_0_100, conditions, dissent } }

What you'll see

  • Within seconds: session_id, task_id, and a link to watch live on synthboard.ai.
  • Phase progress as the board moves: the brief, the seats, each expert's research, the argument, the memo (v4_phase).
  • On completion: the decision memo — verdict, confidence, conditions, and the strongest dissent — or a shaped artifact for non-decision asks.
Tip

For a 1-on-1 instead of a full board, plan with session_type: "consult" and a synth_id, then drive turns with synthboard.consult.message.

Plan-before-start

The product rule: no surprise sessions. Sessions must be approved or explicitly configured.

Sessions can't auto-start from a bare question. That protects users and their credit balance from runaway agent loops. You have two paths:

Path A — preview, then start

  1. Call synthboard.session.plan with the question (+ optional session_type / synth_id).
  2. Receive a plan_id valid for 15 min + the full proposal (staffing note, credit ceiling).
  3. Show it to the user in whatever client invoked the tool.
  4. If approved → call synthboard.session.start({plan_id}). The plan is consumed; replay is blocked.

Best for interactive clients (Claude Desktop, ChatGPT). Users see what they're about to spend before committing.

Path B — explicit start

Call synthboard.session.start with an explicit setup: boardroom = question + session_type; consult = question + synth_id. The explicit setup counts as consent. Best for automation (n8n, cron, scripts) where you've already decided.

Legacy fields (synth_ids, rounds, llm_model) are still accepted — they map to pinned seats and per-seat model overrides.

Bare calls (question only, no plan_id and no setup signal) return validation_error with actionable guidance.

How sessions run

The concepts behind every MCP/API session — same engine as the web app.

Two rooms

boardroomThe Boardroom

A room where several named experts research alone, then argue with one another, and deliver the board's call (a decision memo) or a piece shaped to the question. The card shows one price, what a board like it typically costs; the bill is what it really used.

consultThe Consult

A room with one named expert on one question. Its card shows one price for the question, what it typically costs; the bill is what it really used. Follow-ups go through consult.message.

Express intake & the decision brief

Sessions started over MCP/API skip the interactive intake: a single facilitator pass turns your question + context into a decision brief — the framed question, the known facts, and the seated board (which experts, which seats, why). The brief is returned on session.get as decision_brief.

Board phases

v4_phase tracks the run: intake → staffed → research → debate → memo → done. Each seated expert researches alone, then reacts once to the others — with genuinely opposed theses on a decision — and the run terminates in a deliverable.

The deliverable: memo or shaped artifact

  • Decision boards deliver a decision memo: the verdict, confidence (0–100), the conditions that would flip it, and the strongest dissent — under a named author.
  • Every other ask delivers a board artifact shaped to the question — a plan, forecast, comparison, research brief, diagnosis, and more. Read it via board_artifact or the synthboard://session/{id}/memo resource.

Reconvene

A finished board isn't continued — it's reconvened. When something changed, call synthboard.session.reconvene({session_id, whats_changed}). The new run opens from the board's delivered call (verdict, confidence, dissent) plus your update, re-briefs, and runs — returning a new session_id linked to the parent. (session.continue remains for legacy-engine sessions and redirects boards here.)

Consult turns

A Consult is a conversation with one named expert. Each synthboard.consult.message call sends one message to the seated expert and returns their reply — plus a composed document when the ask calls for one (a memo, an email, a plan). If wait_ms elapses, the turn keeps running server-side; re-read via session.get.

Your World & wm_scope

Your Chief of Staff keeps your world on file — identity, situation, goals, constraints, the names that matter, each with its source and date — and a searchable memory of every delivered call. Nothing is kept as still true until you say it is. Agents read it via the synthboard://world-model resource and search it with synthboard.world_model.search (decisions, memos, board artifacts, world-model facts). Every session binds a wm_scope at creation (accepted by session.plan and session.start):

wm_scopeExperts read your worldThis session goes on file
grounded (default)YesYes — the delivered call goes on file and is searchable
read_onlyYesNo — nothing from this session is added
off_recordNoNo — fully off the record, excluded from search too

A reconvened run inherits its parent's scope — an off-record board's reconvene stays off the record. The latest brief is readable at synthboard://briefs/latest.

Pricing & billing

MCP uses the same credit system as the web UI. Plans set capacity and models.

TierConcurrentExperts on a boardWeb / vision
Free13—
ProPopular38✓
Max1012✓
Ultra2512✓

Plans differ in capacity and models — compare them on pricing. Experts on a board shows the default per plan; the live value is account-configurable and enforced server-side.

What does a board or a consult cost?
Every board and consult shows one number before it runs, what work like it typically costs: a new consult is about 45 credits (a full piece (a build guide, a whole plan, a comparison with today's prices) has its own card: about 120 credits), and a 3-seat board on Free is about 95 credits. Each card shows what a room like it typically costs; you pay for what it really used. session.plan returns a pre-flight estimated_credits before anything is charged.
Can I cap spend per key?
Yes, two guards per key: a daily credit cap (resets midnight UTC) and a monthly credit budget (resets at month start UTC). Hitting either blocks further billed calls on that key until reset, and email alerts fire at 50%, 80%, and 100% of each guard.
Failed session — do I get refunded?
Credits charged for completed work are retained. Anything unconsumed is either not charged or refunded automatically — including when a run fails mid-flight. Every charge and refund shows up in your credit history.
Does MCP cost more than the web UI?
No. Same credit pricing. Same charges. MCP just gives programmatic access to the same engine.

Rate limits & concurrency

Operational caps, not feature gates. Baselines below are the Pro tier; other tiers multiply.

Rate limits are per-user (or per-OAuth-client) per bucket. The baseline numbers below apply to Pro; other tiers multiply the baseline — Free ×0.15, Max ×3.3, Ultra ×16 (minimum 1). Buckets without explicit config get a bounded default of 30/min. Concurrent-session caps are enforced atomically — there's no way to race past them.

BucketPro baselineWindow
session.plan1201 h
session.start601 h
session.get601 min
session.list601 min
session.continue201 min
session.fork / session.reconvene301 h
session.outcomes / session.share301 h
session.export601 h
synth.chat / consult.message1001 h
assistant.ask1001 h
bookmark.create / decision.capture2001 h
catalog.search / resource reads60 / 1201 min
action.execute / action.undo101 min
share.verify_password101 min
webhooks read / write (REST)60 / 201 min

Hit a limit? The error tells you exactly which cap and when to retry (retry_after_s). Watch live headroom on the usage dashboard.

Scopes (8)

Every tool demands exactly one scope. Create keys with only what the workload needs.

ScopeGrants
session:readRead sessions, tasks, transcripts, exports, shares
session:writeCreate/reconvene/cancel/fork/share sessions + bookmarks/decisions
synth:chat1-on-1 expert chat + Consult turns
synth:readRead expert profiles + knowledge listings
synth:writeCreate/edit/delete custom experts, preferences, knowledge
assistant:useSession Assistant Q&A
integrations:readList connected integration providers
integrations:writeExecute tool actions + webhook subscription CRUD — API keys only; an assistant connection (OAuth) never gets it

Security

Built for production from day one.

Keys hashed, never stored

Your API key is shown exactly once, then hashed. Revoke or rotate anytime — it takes effect instantly.

IP allowlist (optional)

Lock any key to the IPs you trust. Calls from anywhere else are rejected before they reach a tool.

OAuth for web clients

Claude.ai, ChatGPT and other browser-based clients authenticate through modern, short-lived OAuth tokens.

Outbound request guard

Webhooks can't reach internal networks. Only public HTTPS endpoints are allowed.

Prompt-injection defense

Tool inputs are sandboxed before they ever reach a model, with layered guards on top.

Complete audit log

Every call logged with caller, tool, session, and cost. Filterable and exportable as CSV from the Control Center.

Key management

Stay out of trouble.

  • One key per client. Separate keys for Claude Desktop, Cursor, and automation scripts — revocation stays surgical.
  • Rotate quarterly. Click Rotate on a key to create a replacement with the same scopes. Old key works for 24 hours while you update clients.
  • Set a cap for automation. For n8n, Zapier, cron, anywhere you can't watch — a daily credit cap prevents runaway loops.
  • Never commit keys. Keep them out of git. If exposed, revoke instantly — it takes effect in real time.
  • Scope down. A read-only automation doesn't need session:write. Create keys with just the scopes you need.

OAuth 2.1 (for web clients)

How Claude.ai web, ChatGPT apps, and other browser-embedded clients authenticate.

Most MCP clients (Claude Desktop, Cursor, Windsurf, Zed, scripts) authenticate with a Bearer API key — simplest, fastest. Browser-based clients like Claude.ai web don't accept raw keys; they use OAuth 2.1 for user-mediated consent. SynthBoard exposes a native, spec-compliant Authorization Server at the standard discovery endpoints.

Discovery metadata

  • GET /.well-known/oauth-authorization-server — RFC 8414 AS metadata
  • GET /.well-known/oauth-protected-resource — RFC 9728 protected-resource metadata
  • GET /.well-known/jwks.json — public JWKS for token verification

Flow

  1. Dynamic client registration (RFC 7591): POST /api/oauth/register with your client metadata. https-only redirect URIs required.
  2. Authorize: send user to /api/oauth/authorize with response_type=code, code_challenge (S256), resource (your MCP URL), scopes.
  3. Consent page: user sees plain-English scope descriptions and approves. CSRF-protected.
  4. Token exchange: POST /api/oauth/token with the code + PKCE verifier. Receive a 10-minute access token and 7-day rotating refresh token.
  5. Use on /api/mcp — JWT in Authorization: Bearer. Server validates signature, audience (aud must match resource URL, RFC 8707), expiry, and revocation status on every call.
  6. Refresh: rotate the refresh token before the access expires. Reused old refreshes trigger grant-chain revocation.
What this gives you
Short-lived tokens · Strict redirect allowlist · Tokens bound to this server (never replayable elsewhere) · Reused refresh tokens trigger full revocation · Consent pages hardened against clickjacking and CSRF.

Webhooks

Two delivery systems coexist. Use subscriptions — the per-key mechanism is legacy.

A board takes 6–10 minutes; a consult turn, about a minute. Instead of polling, subscribe and let SynthBoard call you. There are two contracts with different signatures — verify with the right one:

Recommended

Subscriptions — X-SynthBoard-Signature

  • Manage in Control Center → Webhooks or via POST /api/v1/webhooks. Multiple subscriptions, per-event filters.
  • All 6 events: session.complete, session.failed, session.cancelled, session.continued, session.reconvened, outcomes.ready.
  • Fired by the engine itself — session completion/failure from the orchestrator, cancellation and follow-up runs from the tools, deliverables from outcomes.
  • Signature: X-SynthBoard-Signature: sha256=<hex> — HMAC-SHA256 of `${timestamp}.${body}` with the subscription's secret (returned once on create).
  • Headers: X-SynthBoard-Event, X-SynthBoard-Timestamp (unix seconds), X-SynthBoard-Delivery-Id.
Legacy

Per-key webhook — X-Mcp-Signature

  • Configured as a Webhook URL on an API key (not via /webhooks). Kept for existing integrations — new setups should use subscriptions.
  • Fires session.complete only, when a session started with that key finishes.
  • Signature: X-Mcp-Signature: sha256=<hex> — HMAC-SHA256 of the raw body alone (no timestamp in the MAC) with the key's whsec_ secret.
  • Headers: X-Mcp-Event, X-Mcp-Timestamp, X-Mcp-Delivery-Id.

Delivery guarantee

Every started session ends in exactly one terminal event — session.complete, session.failed (including engine timeouts swept by the watchdog, delivered with reason: "timeout"), or session.cancelled. Build state machines on that invariant.

Retries — both systems

Any non-2xx retries with backoff at 1, 5, 15, 60, 240 minutes — 5 attempts total. Subscriptions additionally auto-disable after 10 consecutive failures (re-enable in the Control Center, which resets the breaker).

Verify — subscriptions (Node.js)

X-SynthBoard-Signature over `${timestamp}.${body}`
import { createHmac, timingSafeEqual } from "node:crypto";

function verifySubscriptionWebhook(
  rawBody: string, sigHeader: string, tsHeader: string, secret: string,
): boolean {
  if (Math.abs(Date.now() / 1000 - Number(tsHeader)) > 300) return false; // replay guard
  const expected = "sha256=" + createHmac("sha256", secret)
    .update(`${tsHeader}.${rawBody}`).digest("hex");
  const a = Buffer.from(sigHeader), b = Buffer.from(expected);
  return a.length === b.length && timingSafeEqual(a, b);
}

Verify — legacy per-key (Node.js)

X-Mcp-Signature over the raw body
import { createHmac, timingSafeEqual } from "node:crypto";

function verifyLegacyKeyWebhook(
  rawBody: string, sigHeader: string, secret: string, // whsec_...
): boolean {
  const expected = "sha256=" +
    createHmac("sha256", secret).update(rawBody).digest("hex");
  const a = Buffer.from(sigHeader), b = Buffer.from(expected);
  return a.length === b.length && timingSafeEqual(a, b);
}
Test tip

Use webhook.site for a zero-setup inbox, or the Send test button on any subscription in the Control Center — it fires a signed test.ping without touching your delivery stats.

Tool reference (53)

The complete tool surface, grouped. Every tool demands one scope.

Their Chief of Staff and the work (9)

  • synthboard.asksession:write

    Bring the person's situation to their Chief of Staff: she answers, or sizes it as a job, a consult or a board, with next_actions to run each. Her free daily talk, then billed at actual cost.

    message

  • synthboard.startsession:write

    Run a job card or an in-room question she posted, once, inside the connection's daily limit.

    card_id

  • synthboard.job.startsession:write

    A named expert finds, drafts and builds end to end and hands back finished objects plus a one-sentence call. About 110–400 credits by size.

    title, brief, lead_expert, gets, steps, language?, idempotency_key?

  • synthboard.job.resultsession:read

    The job's progress, or its call, objects and next_actions. Read-only.

    job_id, wait_seconds? (≤45)

  • synthboard.job.controlsession:write

    A note the expert reads at the next step, or stop (keeps what is done).

    job_id, action: stop | note, note?

  • synthboard.steps.listsession:read

    The dated steps their Chief of Staff checks in on, with ids. Free.

    status?, due_before?, job_id?, limit?

  • synthboard.steps.reportsession:write

    Done, not yet (a new day) or stuck — lands as their check-in answer, marked via the agent. Free.

    step_id, status, note?, due_at?

  • synthboard.contexts.listsession:read

    The parts of their life SynthBoard keeps apart. Free.

  • synthboard.rooms.organizesession:write

    Archive, unarchive, rename, or move a room to a context. Signing a call stays theirs. Free.

    room_id, action, value?

Ask the board (2)

  • synthboard.board.callsession:write

    Bring a decision to the board: it seats its experts and returns a board_id at once; the price is the plan's board card (about N credits), reserved against the connection's daily limit.

    question, context?, experts?, size: glance | full, language?, idempotency_key?

  • synthboard.board.resultsession:read

    The board's call, its sharpest dissent, what would change its mind, the first step and the link — or when to ask again. Read-only.

    board_id, wait_seconds? (≤45)

Session lifecycle (13)

  • synthboard.session.plansession:write

    Propose a room (who sits, the shape, one up-to price) without opening it. Returns a single-use plan_id (15 min).

    question, session_type?, mode?, synth_id? (consult), context?, web_search?, language?

  • synthboard.session.startsession:write

    Open a room from an approved plan_id or an explicit setup. Board: the brief seats the experts. Consult: requires synth_id.

    plan_id | (question + session_type/mode) | (question + synth_id), preselected_synth_ids?, focus_synth_id?, synth_model_overrides?, images?, tags?

  • synthboard.session.getsession:read

    Session state + latest task. On finished boards: v4_phase, decision_brief, memo, board_artifact.

    session_id, wait_ms? (≤60000), include_transcript?, include_tool_calls?, include_action_items?

  • synthboard.session.continuesession:write

    Follow-up round on a legacy-engine session. Current boards redirect to session.reconvene.

    session_id, message

  • synthboard.session.reconvenesession:write

    Reconvene a completed board as Round N+1 — opens from the delivered verdict plus what changed, re-briefs, runs.

    session_id, whats_changed, question?, keep_board?

  • synthboard.session.cancelsession:write

    Cancel the in-flight task. Work delivered is retained; the remainder is refunded.

    session_id, reason?

  • synthboard.session.updatesession:write

    Mid-session mutations on legacy-engine sessions — add/remove synths, change mode, tune DNA/model/temperature. Current boards redirect to session.reconvene.

    session_id, add_synths?, remove_synths?, change_mode?, tune?

  • synthboard.session.forksession:write

    Duplicate a session with altered context; rerun=true starts the fork immediately.

    session_id, new_context?, rerun?

  • synthboard.session.listsession:read

    Filter, search, sort, and paginate your sessions.

    status?, mode?, tag?, q?, since?, until?, sort?, limit?, cursor?

  • synthboard.session.update_metasession:write

    Rename a session or update its tags.

    session_id, topic?, tags?

  • synthboard.session.deletesession:write

    Hard-delete a draft. Non-drafts archive instead.

    session_id, confirm: true

  • synthboard.session.archivesession:write

    Hide a session from default listings (or bring it back). Idempotent.

    session_id, action: archive | unarchive

  • synthboard.session.exportsession:read

    Export as markdown, JSON, or plain text with selectable parts.

    session_id, format, include? (transcript/synthesis/bookmarks/decision/action_items/full_reasoning)

The Consult (1)

  • synthboard.consult.messagesynth:chat

    Send one message to the seated expert of a Consult session; returns the reply and any composed document. Billed per turn.

    session_id, message (≤5000), wait_ms? (≤290000)

In-session interaction (7)

  • synthboard.session.outcomessession:write

    Generate a polished deliverable — action plan, report, decision memo, or bullets.

    session_id, format?, include?

  • synthboard.session.live_summarysession:read

    Live consensus snapshot — who agrees, who dissents, running confidence.

    session_id

  • synthboard.session.cross_roundsession:read

    How positions evolved across rounds.

    session_id

  • synthboard.synth.chatsynth:chat

    Direct message to a specific synth inside a session.

    session_id, synth_id, message

  • synthboard.assistant.askassistant:use

    Q&A grounded in the session transcript + synthesis.

    session_id, question

  • synthboard.bookmark.createsession:write

    Save a moment — a claim, agreement, conflict, or pinned thread.

    session_id, type, item_text, synth_id?, note?

  • synthboard.decision.capturesession:write

    Record a formal decision with rationale, stakeholders, deadline, action items.

    session_id, decision, rationale?, stakeholders?, deadline?, action_items?, confidence?

Your World Model (3)

  • synthboard.world_model.bringsession:write

    Read a brief your client wrote about the user into review chips and park them as a pending transfer — nothing lands until the user keeps it (here, or on Home).

    text (≤12000), client_name?

  • synthboard.world_model.confirm_transfersession:write

    Land a pending transfer after the user's review: prose, goals and constraints merge into the world model; numbers become told metrics with the brief's dates.

    transfer_id, drop_facts?, drop_numbers?, drop_goals?, drop_constraints?

  • synthboard.world_model.searchsession:read

    Hybrid semantic + keyword search over your board's memory — captured decisions, delivered memos, board artifacts, and world-model facts. Off-record material is never returned.

    query, types? (decision | memo | board_artifact | wm_fact), limit?

Synth management (7)

  • synthboard.synth.createsynth:write

    Create a custom Synth (your own named expert) — name, role, persona, expertise, DNA, model, training files.

    name, role, system_prompt, tagline?, expertise_tags?, dna_*?, preferred_model?, training_files?

  • synthboard.synth.updatesynth:write

    Edit one of your custom synths. Core synths use preferences.set.

    synth_id + any editable field

  • synthboard.synth.deletesynth:write

    Permanently delete a custom synth.

    synth_id, confirm: true

  • synthboard.synth.getsynth:read

    Fetch one synth — core, public, or your own (own prompt included).

    synth_id

  • synthboard.synth.listsynth:read

    List core, public, and your own synths with search + filters.

    search?, core_only?, expertise?, limit?, offset?

  • synthboard.synth.preferences.setsynth:write

    Per-user overlay for a core synth — DNA, model, temperature, directions.

    synth_id, dna_*?, preferred_model?, temperature?, user_directions?

  • synthboard.synth.preferences.resetsynth:write

    Reset your core-synth overlay to defaults.

    synth_id, confirm: true

Synth knowledge (4)

  • synthboard.synth.knowledge.addsynth:write

    Give a custom synth permanent knowledge from a URL or text (RAG). 1 credit per source.

    synth_id, source: url | text, url?, text?, label?

  • synthboard.synth.knowledge.listsynth:read

    List a custom synth's knowledge files.

    synth_id

  • synthboard.synth.knowledge.removesynth:write

    Delete a knowledge file and its chunks.

    synth_id, file_id, confirm: true

  • synthboard.synth.knowledge.promote_sessionsynth:write

    Persist a session's uploaded documents into a synth's permanent knowledge. Idempotent.

    session_id, synth_id, source_files?

Shares (4)

  • synthboard.session.sharesession:write

    Create a share link — public, password, or invite.

    session_id, type, password?, invite_emails?, expires_in_days?, share_scope?

  • synthboard.share.listsession:read

    Every active share for a session, with codes, URLs, and expiry.

    session_id

  • synthboard.share.revokesession:write

    Invalidate a share link immediately.

    share_code, confirm: true

  • synthboard.share.verify_passwordsession:read

    Validate a guest password against a protected share.

    share_code, password

Integrations (1)

  • synthboard.integrations.listintegrations:read

    Your connected providers across the live integration catalog.

Utilities (2)

  • synthboard.pingno scope

    Connectivity check — returns the authenticated principal. No billing.

  • synthboard.catalog.searchsession:read

    Search synths, modes, templates, strategies, and models.

    query?, kind?, limit?

Resources (19) & prompts (12)

Deep-linkable, cacheable read surfaces — plus slash commands.

MCP Resources are the "GET" side of SynthBoard — read them any time for the latest state. Resource subscriptions are not supported: for live board tracking, poll synthboard.session.get with wait_ms (long-polls up to 60s per call), or use webhooks to be called when a run finishes.

URIReturns
synthboard://session/{id}Full session state — plus decision brief, memo, and board artifact on finished boards.
synthboard://session/{id}/memoThe board's terminal deliverable alone — decision memo or shaped artifact.
synthboard://session/{id}/synthesisRound summaries + synthesis blocks.
synthboard://session/{id}/outcomesCaptured decisions, action plan, outcomes.
synthboard://session/{id}/transcriptComplete agent message transcript.
synthboard://session/{id}/bookmarksSaved moments with notes.
synthboard://session/{id}/citationsWeb-search citations used in the session.
synthboard://session/{id}/canvasCanvas layout, positions, metadata.
synthboard://synth/{id}Public-safe profile — role, tagline, expertise, rating.
synthboard://catalog/synthsThe full public synth library.
synthboard://catalog/modesAll session modes with recommended setups.
synthboard://catalog/templatesPre-built decision templates.
synthboard://catalog/synthesis_strategiesAll 5 synthesis strategies with best-for guidance.
synthboard://catalog/modelsLLM models available at your tier — same list as the web UI.
synthboard://recentYour 20 most recent sessions, engine + phase aware.
synthboard://accountCredit balance, tier, engine, available session types.
synthboard://world-modelThe board's dossier on your world — identity, situation, goals, constraints, named entities — plus per-section counts, freshness, and per-seat calibration records (whose judgment has held up, per decision type).
ui://synthboard/board-call.htmlThe inline card Claude and ChatGPT show for synthboard.board.result (an MCP App; self-contained, no data of its own).
synthboard://briefs/latestYour most recent weekly Board Brief — the standing board's proactive read on your world.

All session-scoped resources enforce ownership — cross-tenant reads return not_found, never a leak. Catalog resources are public read-only.

12 slash-prompts

Pre-configured commands — each routes through the plan-first flow./synthboard-consult opens the 1-on-1 room.

/synthboard-boardroom/synthboard-debate/synthboard-stress-test/synthboard-quick-take/synthboard-deep-dive/synthboard-decision/synthboard-war-room/synthboard-forecast/synthboard-research/synthboard-brainstorm/synthboard-consult/synthboard-onboard

Error code reference (29)

Every error carries a code, message, correlation_id, and — over REST — the HTTP status below.

CodeHTTPMeaningFix
unauthorized401Missing / malformed Authorization headerSend Authorization: Bearer sb_live_...
forbidden403Authenticated but not allowedCheck ownership and key scopes
invalid_credentials401Key invalid, expired, or revokedCreate a new key
key_revoked401This key was revokedCreate a new key
ip_not_allowed403Request IP not in the key's allowlistRemove the allowlist or add your IP
scope_missing403Key lacks the required scopeCreate a key with the scope
mcp_disabled403The MCP/API surface is disabledContact support
validation_error400Tool argument failed schema validationCheck error details for the field
not_found404Resource doesn't exist or isn't yoursVerify the ID
rate_limited429Too many calls for your tierWait retry_after_s seconds
concurrent_session_limit429Max parallel sessions reachedWait or cancel one
insufficient_credits402Balance below the estimateTop up credits
insufficient_credits_mid_execution402Credits ran out mid-runTop up; delivered work is retained
daily_spend_cap_exceeded429The key's daily credit cap is reachedWait for reset (midnight UTC) or raise the cap
monthly_budget_exceeded429The key's monthly credit budget is reachedWait for month start (UTC) or raise the budget
idempotency_mismatch400Same idempotency_key, different argumentsUse a fresh key per distinct call
invalid_synth400Expert ID not in the libraryCheck synthboard.synth.list
invalid_mode400Unknown session modeCheck synthboard://catalog/modes
invalid_session_state400Session can't accept this operation (e.g. continue on a finished board)Follow the guidance in details — usually session.reconvene
session_not_complete500Operation needs a completed sessionWait for the run to finish
session_failed500The session run failedCheck the error, re-run or fork
task_not_found404No task execution for this IDVerify the task_id
user_banned403Account suspendedContact support
ssrf_blocked403URL pointed at a private/internal hostUse a public https URL
upstream_error500An upstream model/provider failedRetry; fallback chains handle most cases
timeout504The operation exceeded its time budgetRetry; check session.get for partial state
internal_error500Unexpected server errorContact support with the correlation_id
failed_precondition412A precondition isn't met (e.g. provider not connected)Check details; connect the integration
resource_exhausted429Provider-side quota exhaustedWait and retry

A few statuses differ over REST where HTTP semantics demand it (e.g. concurrent_session_limit → 409, upstream_error → 502).

Troubleshooting

Client says 'connection refused'
  • URL: https://www.synthboard.ai/api/mcp
  • Confirm the Authorization header includes the full key including the sb_live_ prefix.
  • Quit + relaunch the client. Config is read at startup.
  • Hit /api/mcp/health — should return { "ok": true }.
session.continue says invalid_session_state
The session is a current-engine board — finished boards aren't continued, they're reconvened. Call synthboard.session.reconvene with whats_changed.
concurrent_session_limit error
Your tier allows N parallel sessions. Wait or call synthboard.session.cancel. Tier limits appear in the error details.
insufficient_credits
Check your balance on the usage dashboard. Error includes exact shortfall.
Session stuck 'running' forever
Stuck tasks are swept and auto-refunded, and the sweep emits a session.failed webhook with reason timeout. Cancel via synthboard.session.cancel; credits charged up to that point are retained.
401 Unauthorized
Key was likely revoked, rotated past grace, or expired. Visit the Control Center → API Keys.
Claude.ai web isn't discovering OAuth
Use the full URL https://www.synthboard.ai/api/mcp — the /api/mcp suffix is required for metadata discovery.

Still stuck?

Every error response includes a correlation_id. Include it in any support request and we can trace the full call in our audit log.