Skip to main content
The server is https://app.openscaffold.ai/api/mcp/mcp (streamable HTTP). It sees one workspace: the one picked when the agent signed in. Every tool except list_deployments, use_deployment and create_deployment works on one deployment and takes its deployment_id (the briefing’s Deployment id: dep_… line, or list_deployments). No tool ever returns two deployments’ data. The tools call the plan and profile together the harness (as in generate_harness); in the app it’s the deployment’s Build (the plan) and Customer tabs. Read-only tools are marked readOnlyHint: true, so clients that ask before writes (for example Codex’s writes approval mode) only ask for the rest. No tool deletes anything, and nothing an agent sends changes the plan directly: plan changes wait for a person under Needs you on the deployment’s Customer tab (or on Build, when they only move work items’ status).

Workspace tools

list_deployments · read-only

The workspace’s active deployments, names and ids only. Call it first when there’s no briefing in context. An empty list means a new user: offer to set up their first customer. No arguments.

use_deployment

Switch this session to a deployment by id or name (part of the name works). Returns its briefing. Announce the switch. If several match, it lists them and switches nothing.

create_deployment

Create a deployment for a new customer; it becomes this session’s. Check list_deployments first: one deployment per customer.

add_document

Add one of the customer’s documents the person has locally. For more than one file, use add_documents. Same processing as an upload in the app: parsed, searchable, read for findings. Adding the same text twice returns “Already uploaded (same content).” Once the deployment has a plan, anything these documents would change in it waits for a person: text your agent sends never counts as the customer’s own words.

add_documents

Add many of the customer’s documents in one call: the way to send a folder or a ticket export (one document per row). They’re read as one batch, so the first plan waits for all of them, and a deployment that already has a plan gets one plan change for the lot. A document with the same title and text as one already there is skipped.

generate_harness

Build the deployment’s first plan from its documents. Usually not needed: the first plan starts on its own once every document is read. Use it when get_briefing shows no plan and nothing reading or building (e.g. after a failed build). Runs for a minute or two in the background. Says so if documents are still being read or if a plan already exists.

Deployment tools

get_briefing · read-only

The deployment’s briefing, as markdown: goal, must-haves (each with its action, as in get_plan), rules, what to check before relying on it (facts only documentation or the FDE state), what we don’t know yet and who to ask, open questions, what changed since the person last looked, playbooks. The same text the Claude Code session hook prints. Before the first plan exists it shows progress instead.

search · read-only

Search everything this customer said or wrote: calls, tickets, emails, docs. Use it before assuming anything about their requirements, systems or wording, and cite results by title. Ranked by relevance (with the deployment’s vocabulary), weighted by its search rules (preferred and demoted authors, recency), with its source-type order breaking ties. Each hit has a quote: exact words from the source you can paste into propose_change citations.

get_document · read-only

Read one document, in full or a slice around a search locator (±1,000 characters). Up to 20,000 characters per call. Returns the document’s metadata, start_char, end_char, total_chars and text.

get_plan · read-only

The plan as markdown, under one legend line (do = build it; check = verify in the system first; ask = don’t build, ask the FDE, who asks the customer; leave = don’t touch): goal, in-scope requirements (id, priority, status, action, what exists today vs. what to build), out of scope (leave), what we don’t know yet (up to 5 areas the customer’s material covers thinly, each with who to ask, only ever a person named in the material), open questions. Each requirement’s action is computed from its evidence: do for the customer’s word or an FDE decision on a must-have or agreed item, check for anything documentation, the FDE or nobody said (check: not agreed yet — confirm priority with the FDE for a should/could the customer said but nobody agreed), ask only when an open question or gap names an item that has no quote of its own. An open question that names a requirement, or quotes the same passage as one, shows ”⚠ Unsettled: <question> (ask the FDE before building this part)” right under it; the requirement keeps its action. Every question and gap says “blocks <id>” or “doesn’t block a plan item (ask only if your work needs it)”; the gaps list always ends by asking what rules the system doesn’t enforce that only people know. Every item ends with its citations, [document title, 00:14:22], or [added by FDE]. An item that isn’t the customer’s own word starts with a tag: [documented, unverified: check it in the system or a sandbox] (only product, API or vendor documentation says it), [FDE said; the customer hasn't confirmed], or [unverified: nobody at the customer said it]. A value that replaced an earlier one says (replaces X, which no longer holds): X is history, never the current value.

get_profile · read-only

The customer: summary, stakeholders, systems, constraints, vocabulary, each cited and tagged the same way as get_plan. Check constraints before proposing an architecture.

get_playbooks · read-only

Your team’s recipes for this kind of work, from the playbooks this deployment uses: setup, environments, domain knowledge, caveats, references. Guidance from past work, never facts about this customer.

what_changed · read-only

What changed since a plan version (default: since this person last read the briefing): plan changes, new documents, plan changes waiting for a person.

propose_change

Propose a change to the plan or profile when the customer’s material shows something new or different. Every citation must quote this deployment’s documents word for word (at least 4 words); a quote that isn’t in the document is refused. It waits under Needs you on the deployment’s Customer tab; nothing changes until a person approves.

record_decision

Record a decision the person just made in your conversation: answer one of the plan’s open questions, and/or save it as a rule your agents follow (optionally only somewhere, with applies_to) or as an agreed requirement. Only their own words, never your guess or the customer’s documents (use propose_change for those). It doesn’t change the plan: the decision waits for them to approve it in OpenScaffold, and becomes theirs only then. Tell them it’s waiting.

record_conversation

Record what someone at the customer told you during the work: their reply in this chat, an email or message the person pasted, an answer to a question you asked. OpenScaffold keeps it as a document (a transcript titled “Conversation with <person> (<role>), <date>”), reads it like any other, and the plan learns from it, so the next session and teammates don’t ask again. Call it straight away when a person settles a fact, rule or decision. The person’s own decisions go to record_decision; files to add_documents. A recorded conversation is your report of what was said: you write who spoke, their email and their side. So it never counts as the customer’s own words. Every plan change it implies waits for the FDE under Needs you, and an item that rests only on it is never marked as the customer’s word: it is unverified, documented or the FDE’s, by side (table below). With verbatim: true the answers are written as that person’s lines; with verbatim: false they are your notes. There’s no approval prompt: saving a note takes no click, so it works in auto mode and headless runs.

propose_playbook_entries

Before finishing: propose what you learned that would help on another customer doing the same kind of work. Never anything about this customer; the leak guard refuses names, people, domains, systems, their terms and copied passages, and says which entry and why. An admin approves.

report_session

Before the session ends: what you did, in 2–4 sentences, and any requirements whose status you moved. The summary shows in the deployment’s Activity (⋯ menu); status moves become one plan change under Needs you on Build.

request_review

Ask for an independent review of your change. Use it when the person asks you to check, review or verify your work, and before you finish any change. A separate reviewer on OpenScaffold’s side (not you) checks that the change does what the customer asked: the work items it claims, the customer’s rules and terms, what’s out of scope, and the caveats in the playbooks this deployment uses. It doesn’t review code quality or hunt for bugs. See The review. With the CLI signed in (not with the plugin or OAuth alone), npx -y @openscaffold/cli@latest review --req req_1,req_2 does all of this in one shell command: it collects the diff itself (or the listed files, in a folder git doesn’t track), waits and prints the verdict, or after about 2 minutes the review id to pass to get_review. See CLI.

get_review · read-only

The result of a request_review, as markdown: the verdict, a short summary, whether each claimed work item is met, and findings with file:line and the customer’s quotes. A running review is waited on for up to 50 seconds before the call answers (reviews take 30–50 s), so call it straight after request_review and one call usually returns the verdict. If it’s still running it says “Still reviewing (started N s ago…). Call get_review again now”. Findings come in sections: blockers, issues, “Ask before changing code — leave it as it is” (questions for the FDE, with who to ask), and notes; a work item can be open when it depends on something the customer hasn’t settled. Follow the last line: fix blockers (and issues, or say why not), put asks in report_session without changing code, and stop after 3 reviews of the same items. Only this deployment’s reviews.

get_test_scenarios · read-only

Acceptance scenarios to test before handover, written from this customer’s own rules and requirements: single steps and multi-turn conversations (for example, show a list and then act on one item from it), boundary cases (just inside, exactly at and just outside a limit the customer stated), consent before actions that charge money or can’t be undone, and failures the customer described. Each scenario has steps, the expected outcome (or what to check), the plan items it tests, and the customer’s quote it comes from; a scenario whose quote isn’t found word for word in the customer’s documents is never shown. Nothing is invented: when the customer’s words don’t settle an outcome, there’s no scenario for it. Always run every scenario whose tests ids include an item you built or changed, plus any that test only rules or systems your change must obey, and again after your last code change; a failing Check: is a question for the FDE, not a bug. It never changes the plan, so it’s marked read-only, but if the current plan version has no scenarios yet the call starts writing them in the background. They’re written once per plan version, as soon as that version exists (the plan is built, a change applies, or someone edits or restores it). If they’re still being written, the call waits up to 50 seconds; if a newer plan version’s are still on their way, you get the previous version’s with a note. Always run every scenario for what you built or changed (each names the plan items it tests), plus any that test only rules or systems your change must obey, and again after your last code change. An Expected: outcome comes only from the customer’s words or an FDE decision, and is followed by Customer said: "…" with the quote; a scenario testing anything documented, second-hand or blocked by an open question is a Check:: find out what the real system does, or ask the FDE. A failing Check: is a question, not a bug. There’s no minimum count: little settled means few scenarios.

answer_question

Your agent asks you one of the plan’s open questions in a form, with its best guess already filled in. Press Enter if it’s right, or edit it. Your answer waits for you to approve it in OpenScaffold, as a rule, an agreed requirement, or just the answer; only then is it your decision. Skip the form and nothing changes.

decide_change

Points you at a plan change that is waiting for you. It never approves or rejects anything: your agent shows you the change’s lines and the review link, and you decide it in OpenScaffold.

mark_done

A passing review marks the work items it graded met as done on its own (Undo is in Activity). get_review lists what’s left to mark (partly met → building), and your agent calls this with those ids. There’s no approval prompt.

use_playbooks

Start using team playbooks on this deployment, by id. Adds to what the deployment already uses, never removes; unknown ids change nothing. get_playbooks and the next briefing then include them. There’s no approval prompt: playbooks hold no customer data and only add guidance. OpenScaffold also starts using the playbooks it suggests for a deployment on its own after the first plan; remove any under Playbooks.

get_person · read-only

Who someone is on the customer side (role, stance, notes) and their most recent words, quoted. Arguments: deployment_id, name.

get_thread · read-only

The whole Slack thread a message belongs to, oldest first (up to 50 messages). Arguments: deployment_id, document_id (a Slack search hit).

run_command · read-only

The prompt for a command this customer’s plan adds (listed in the briefing under “Commands for this customer”), or one of the four defaults. Arguments: deployment_id, name.

list_feeds · read-only

Which connected tools feed this deployment, and, for Slack channels or Linear projects, only the ones that look like this customer’s. For a tool the workspace hasn’t connected, it returns a connect_url for the person to click. Arguments: deployment_id.

add_feed

Feeds channels or projects into this deployment, by id or name (#acme-ops). History starts arriving at once. Arguments: deployment_id, provider (slack, linear, …), values.

Staying current

When the plan changes or new sources arrive during a session, deployment tool results end with one line: “Since your briefing: plan updated, 2 new sources. Call what_changed.”

Prompts

The server also serves the four commands as MCP prompts (requirements, what-changed, check-plan, demo-check); in Claude Code they appear as /mcp__openscaffold__<name>.