buildd
MCP & Integrations

MCP Server

Claude Code integration via Model Context Protocol

MCP Server

The Buildd MCP server integrates with Claude Code, providing task coordination and team knowledge directly in your coding workflow.

Setup

Option 1: CLI command

claude mcp add --transport http buildd https://buildd.dev/api/mcp \
  --header "Authorization: Bearer bld_your_api_key"

Option 2: .mcp.json

Add to your project's .mcp.json:

{
  "mcpServers": {
    "buildd": {
      "type": "http",
      "url": "https://buildd.dev/api/mcp",
      "headers": {
        "Authorization": "Bearer bld_your_api_key"
      }
    }
  }
}

Option 3: buildd login

If you use the buildd CLI, login auto-configures Claude Code:

curl -fsSL https://buildd.dev/install.sh | bash
buildd login

Restart Claude Code and the buildd tools will be available.

To also show your session in buildd while it's open, and release its task when you close it, install the agent plugin.

Get your API key from the Buildd dashboard under Accounts.

Workspace Detection

The MCP server resolves the workspace from the URL:

  1. ?workspace=<id> query param — direct workspace ID
  2. ?repo=<name> query param — matched against linked repositories
  3. workspaceId in tool params (per-action override)
  4. No filter — operations that require a workspace will prompt for workspaceId

When using buildd init <workspace-id>, the workspace is baked into the MCP URL automatically.

Tools

The server exposes six tools, but not all of them to every caller:

ToolPurposeAvailable to
builddTask coordination — an action parameter selects the operationall levels
check_path_claimMid-task path-claim check when you need a file outside your pathManifestworker, admin
send_worker_messageSend a structured message to another active worker in the workspaceworker, admin
recallRead the team knowledge baseall levels
learnWrite a durable lesson to the team knowledge baseall levels
buildd_memoryLegacy combined knowledge tool — still callableall levels

Two things narrow the list further:

  • A trigger token sees four tools — check_path_claim and send_worker_message are not registered for it.
  • In a workspace whose dataClass is sensitive, the three knowledge tools (recall, learn, buildd_memory) are not registered at all.

If you are writing a --allowedTools allowlist for CI, list the tools you actually need by name — mcp__buildd__buildd, mcp__buildd__recall, mcp__buildd__learn — because a tool you omit cannot be called.

A single buildd API key covers all of them. Memory is built into buildd — there is no separate memory service, no separate signup, and no second key. The retired memory.buildd.dev service and its mem_* keys are gone; see Memory.

buildd — Task Coordination

Available actions depend on your token level — trigger, worker, or admin — detected automatically from your API key. Out-of-level actions are omitted from the advertised action enum and rejected by the handler, so there is no way to reach them with the wrong token.

Trigger-level actions

A trigger token can file work and read status, but cannot claim or execute. These are also available at worker and admin.

ActionKey ParamsDescription
list_tasksoffset?List pending tasks sorted by priority
get_tasktaskId, include?Read-only status check; returns task fields, loop state, latest workers, artifacts
get_task_messagestaskIdInstruction history for the task's active or most recent worker
create_tasktitle, description, workspaceId?, …Create a new task. Rejects unknown parameters
create_artifacttype, title, content?, workerId?/missionId?/initiativeId?Create an artifact — see Artifacts for the type caveats
list_artifactsworkspaceId?, missionId?, key?, type?, limit?List artifacts
get_artifactartifactIdFetch full artifact content by ID
list_artifact_templates—List artifact templates with JSON schemas
emit_eventtype, label, metadata?, workerId?Record a custom milestone event
list_schedulesworkspaceId?, minutesAgo?, nameContains?Read-only schedule listing
trace_scheduletaskId? / minutesAgo? / taskTitleContains?Reverse-lookup: which schedule spawned this task

list_schedules is available at every token level, and it is the recommended probe for telling a privilege failure from an expired key: if list_schedules works but an admin action returns forbidden, your token is authentic and simply lacks admin level.

Worker-level actions

A worker token gets everything above, plus:

ActionKey ParamsDescription
claim_taskmaxTasks?, workspaceId?Return the current assignment, or auto-claim the highest-priority pending task
update_progressprogress, message?, plan?, workerId?Report progress (0-100%). plan only appends a timeline entry — see the plan note below
complete_tasksummary?, error?, structuredOutput?, workerId?Mark task done or failed. structuredOutput is how a planning task returns its plan
create_prtitle, head, body?, base?, draft?, prUrl?Create (or register) a GitHub PR on the worker
get_prprNumber?, workspaceId?Mergeable state, CI checks, reviews, diff stats, PR body
merge_prprNumber, mergeMethod?Merge via the workspace's GitHub App token — gated by the merge policy tier, see below
close_prprNumberClose a PR via the workspace's GitHub App token
update_tasktaskId, title?, description?, priority?, project?, status?, backend?, maxLoops?Update task fields. Only those fields — see the warning below
upload_artifactfilename, mimeType, sizeBytes, title?, type?Get a signed upload URL for a file artifact
update_artifactartifactId, title?, content?, metadata?Update an existing artifact
query_eventstype?, workerId?Read events from the worker timeline
get_error_tracestaskId?, since?, limit?Pattern-matched errors caught from agent tool output
get_failure_analyticswindow?, error?, limit?Team-scoped worker-failure aggregation
get_budget_forecastworkspaceId?Session pressure and monthly dollar budget for the team
get_usage_statswindow?, groupBy?Tokens / cost / turns per task
spec_comparefeature, topK?Spec-drift check: code evidence vs spec evidence
post_notetype, title, body?Post a note to the current task or mission
suggest_schedule_updatereason, scheduleId?, cronExpression?, enabled?Propose a schedule change for human approval
list_connectorsworkspaceId?Connectors mounted for this workspace, with health
list_releasesworkspaceId?, missionId?, state?, limit?List releases
get_releasereleaseIdA single release with attributed task edges

update_task forwards only title, description, priority, project, status, backend and maxLoops. Unlike create_task, it does not reject unknown parameters — anything else you pass is discarded silently and the call still reports success. In particular dependsOn and requiresReview do nothing here; see Task Dependencies and Autonomous Workflow.

update_progress with plan does not submit a plan for review. It appends a type: "plan" entry to the worker's milestone timeline and nothing else — no gate, no approval state, no child tasks. It is a progress annotation.

A reviewable plan is returned as validated structured output at complete_task. When a task's mode is planning, the runner asks the model for output constrained to the planning schema — plan (an array of steps with ref, title, description, and optional dependsOn), summary, and missionComplete — and reports it as structuredOutput. buildd action=approve_plan then reads task.result.structuredOutput.plan and materialises the child tasks. If the plan came back as prose instead, approve_plan fails with No plan found in task result.

buildd action=complete_task params={
  workerId: "...",
  summary: "Decomposed into 3 steps",
  structuredOutput: {
    plan: [
      { ref: "s1", title: "Add middleware", description: "..." },
      { ref: "s2", title: "Update routes", description: "...", dependsOn: ["s1"] }
    ],
    summary: "Auth refactor in two steps",
    missionComplete: false
  }
}

Admin-level actions

An admin token gets everything above, plus:

ActionKey ParamsDescription
register_skillname, content, slug?, isRole?, model?, allowedTools?, canDelegateTo?, connectorRefs?, …Create/upsert a skill or role
list_skillsworkspaceId?, enabled?, isRole?List skills/roles
get_skillslug, workspaceId?Fetch the full skill body and config
update_skillslug, name?, content?, enabled?, …Update a skill/role by slug
delete_skillslug, workspaceId?Delete a skill/role by slug
manage_secretsaction (list/set/delete), label?, value?, purpose?, secretId?Manage encrypted credentials
create_schedulename, cronExpression, title, …Create a recurring schedule
update_schedulescheduleId, cronExpression?, enabled?, …Update a schedule
delete_schedulescheduleIdRemove a schedule permanently
pause_schedulesscheduleIds?, namePattern?, enabled?Bulk-flip the enabled flag
approve_plantaskIdApprove a planning task and create child execution tasks
reject_plantaskId, feedbackReject a plan, create a revised planning task
manage_missionsaction (list/create/get/update/arm/delete/link_task/unlink_task/evaluate/get_criteria_state), …Manage team missions
manage_initiativesaction (list/create/get/update/delete/link_mission/unlink_mission/evaluate/get_kpi_state), …Manage initiatives
manage_workspacesaction (list/get/create/update/create_repo/init), …Manage workspaces
manage_watched_projectsaction (list/create/update/delete/run), …Manage watched projects
manage_model_tiersaction (list/set/delete), tier?, workspaceId?Manage model tier mappings
link_trackerentityType, entityId, urlLink a mission to an external tracker
trigger_releaseworkspaceId? / repo?, ref?, inputs?Trigger a release
release_statusworkspaceId? / repo?, ref?, prodBranch?Read-only release preflight
send_agent_messagetaskId, message, priority?Deliver a mid-flight steering message to a running agent
consolidate_knowledgeop (find_duplicates/find_decayed/archive), corpora?, threshold?Review near-duplicate or decayed knowledge entries, or archive a batch
memory_deleteidPermanently remove a memory. Prefer learn with supersedes

register_skill and update_skill still accept mcpServers and requiredEnvVars, and still store them — but they are no longer used to build a role's MCP configuration. MCP servers are injected at claim time from connectors; use connectorRefs to opt a role into them. The role bundle written to storage carries mcpConfig: {} and envMapping: {} by design.

They are not entirely inert: the claim path still reads mcpServers['codebase-memory'] === false as an opt-out flag for that one server. Anything else you put there is stored and ignored.

manage_missions create (and update) accept a branchStrategy of mission-branch or direct, overriding the workspace default for that one mission. Under mission-branch, buildd creates the mission's shared branch automatically — there's nothing to set up by hand. See Mission Branches for how each strategy gets a mission's work into your trunk branch.

Examples

# Claim a task
buildd action=claim_task

# Report progress
buildd action=update_progress params={ workerId: "...", progress: 50, message: "Implemented auth middleware" }

# Create a PR and complete
buildd action=create_pr params={ workerId: "...", title: "feat: add auth", head: "feat/auth" }
buildd action=complete_task params={ workerId: "...", summary: "Added JWT auth middleware" }

# Record a custom event
buildd action=emit_event params={ workerId: "...", type: "deploy", label: "Deployed to staging" }

merge_pr is gated by the merge policy tier

merge_pr is not a way around the workspace's merge policy. The tier decides, because it already encodes who is allowed to end a PR:

Tiermerge_pr
auto-thresholdPermitted, if the same safety check auto-merge uses passes: CI green, no deny-path files, diff under the source-line cap, migration inspector satisfied.
agent-reviewRefused (403). The reviewer agent's verdict is the gate, and a self-merge routes around it. Green CI does not substitute for the verdict. Call request_pr_review and then get_pr_review; an approve merges the PR for you when policy permits.
humanRefused (403). Report completion and let the owner merge from the dashboard.

A task carrying requiresReview is tier human for its own PR regardless of the workspace tier. A 403 carries the reason and the tier in its body — read it rather than retrying, since none of these refusals clear on a retry.

If the PR cannot be read to evaluate the policy, the merge is refused rather than attempted. A merge with no policy evaluation is the thing this gate exists to prevent, so an unreadable PR fails closed.

recall and learn — Team Knowledge

Memories are stored in buildd's own database, isolated per team and optionally scoped by project. Full detail on types, scoping, and maintenance lives on the Memory page.

recall — read

ParamDescription
queryNatural language query: task title, error text, or concept. Required unless id is given
idDirect fetch by memory ID — bypasses ranking; all other params ignored
limitMax results (default 10, capped at 50)
scopeCorpus to search — a string or an array for fused multi-corpus results: memory (default), task, pr, plan, artifact, code, docs, spec

recall's input schema also advertises type and files, but the handler reads neither. Passing them changes nothing and raises no error — you get unfiltered results that look filtered. Narrow with query and scope instead.

The legacy buildd_memory action=search does honour type and files, so it remains the only way to get a real type or file filter over memory.

learn — write

ParamRequiredDescription
typeYesgotcha, pattern, decision, discovery, or architecture — enforced by both the schema enum and the handler
titleYesShort title
contentYesThe lesson — what the next agent should know
filesNoRelated file paths
tagsNoTags for categorisation
scopeNoProject / monorepo scope for this memory
supersedesNoMemory IDs this entry replaces; they drop out of default retrieval

Near-duplicates are merged automatically. In a sensitive workspace learn is not registered at all.

Examples

# Recall before starting work — pass the task title or the error text
recall query="drizzle migrations"

# Also check recent task outcomes, not just lessons
recall query="drizzle migrations" scope="task"

# Or both corpora in one call
recall query="drizzle migrations" scope=["memory","task"]

# Record a lesson
learn type="gotcha" title="neon-http no transactions" content="..." files=["packages/core/db/schema.ts"]

# Replace a lesson that has gone stale
learn type="gotcha" title="neon-http supports transactions from v0.10" content="..." supersedes=["<old-memory-id>"]

scope is not the same field on both tools. On recall it picks the corpus to search; on learn it is the project/monorepo name. Don't copy one into the other.

buildd_memory (legacy)

The older combined buildd_memory tool remains callable for compatibility, with actions context, search, save, get, update, and query_knowledge. Prefer recall and learn in new sessions — with the one exception noted above, that search still supports type and files filters which recall does not. Deletion is no longer one of its actions — see memory_delete under admin actions.

buildd_memory action=update writes type without validating it, unlike save and learn, which both enforce the five allowed types. A typo'd type is stored verbatim and the memory then disappears from every type-filtered query.

MCP Resources

The server exposes read-only resources that MCP clients can read directly:

URIDescription
buildd://tasks/pendingPending tasks sorted by priority
buildd://workspace/memoryRecent team memories for this workspace
buildd://workspace/skillsAvailable skills

Observability Events

Workers can emit custom events to their timeline using emit_event, and read them back with query_events. Events piggyback on the existing milestones system — no additional setup needed.

Use cases:

  • Record deployment milestones
  • Track build/test results
  • Log decision points for later review

Worker Workflow

The typical MCP workflow:

  1. buildd action=list_tasks — see what's available
  2. buildd action=claim_task — claim a task, read the included memory
  3. git checkout <branch> — switch to the worker branch
  4. recall — query for context on unfamiliar files or a failing error
  5. Do the work, recording lessons with learn as you go
  6. buildd action=update_progress — report at milestones (check for admin instructions in the response)
  7. git push — push your commits
  8. buildd action=create_pr — create a pull request (use this instead of gh pr create)
  9. buildd action=complete_task — mark the task as done

On this page