Skip to main content
Glama
ProductBrain MCP Server
by moxzas

ProductBrain MCP server

Drive your ProductBrain plan from an MCP client — Claude Desktop, Cursor, Claude Code — with tools for search, read, mutate, the methodology workflow, and the live view.

Design — a thin shim, on purpose

This server is a thin transport over ProductBrain's versioned v1 REST API. Each tool is one call to an existing /api/v1 endpoint. The REST contract stays canonical:

  • It's stable when the MCP spec churns — the contract you depend on is the frozen v1 API, not the protocol.

  • You can drop to raw HTTP or bring your own LLM at any time; MCP is one front-door, not the only one.

  • Responses carry the same in-band _meta coaching the API returns, so your agent self-corrects.

Related MCP server: hacknplan-mcp

Install

// Claude Desktop — claude_desktop_config.json
{
  "mcpServers": {
    "productbrain": {
      "command": "npx",
      "args": ["-y", "@productbrain-com/mcp"],
      "env": {
        "PRODUCTBRAIN_API_KEY": "pb_your_key",
        "PRODUCTBRAIN_PROJECT_ID": "your-project-id"
      }
    }
  }
}
# Claude Code
claude mcp add productbrain \
  -e PRODUCTBRAIN_API_KEY=pb_your_key \
  -e PRODUCTBRAIN_PROJECT_ID=your-project-id \
  -- npx -y @productbrain-com/mcp

Cursor and other clients: add an mcpServers entry with the same command/args/env.

Config (env)

Var

Required

Default

PRODUCTBRAIN_API_KEY

yes

— (your pb_ key from the app's API Key modal)

PRODUCTBRAIN_PROJECT_ID

no

— (tools also accept a projectId argument)

PRODUCTBRAIN_API_URL

no

https://productbrain.com/api/v1

Tools

Every agent-facing /api/v1 endpoint has a tool. One tool, one endpoint, same _meta coaching passed back verbatim.

The plan

Tool

Maps to

Use

search

GET /search

Semantic search — use first for any lookup

list_nodes

GET /nodes

Bulk read, optional type/iteration filter

get_tree

GET /tree

A node in context (ancestors/siblings/children/subtree)

mutate

POST /mutate

Create/update/delete nodes + phases; pass idempotencyKey to make retries safe

list_iterations

GET /iterations

Phases; current:true for the active one

run_workflow

POST /workflow

Story-Mapping methodology (add / task-curate / phase-assign)

export_okf

GET /export-okf

The plan as a portable OKF file bundle

get_changelog

GET /changelog

Plan history: every add/update/delete/restore, attributed to the app or a named agent

The view

Tool

Maps to

Use

set_view / read_view

POST /view-command, GET /view-state

Drive / read the live canvas

Projects

Tool

Maps to

Use

list_projects

GET /projects

Projects you own or are a member of; includeArchived for the rest

create_project

POST /mutate {addProject}

Bootstrap a brain — seeds the system "Later" phase. Pass an explicit id: addProject runs before mutate reads Idempotency-Key, so it is not retry-safe

rename_project

POST /mutate {renameProject}

Change the display name; the id is immutable

archive_project

PATCH /projects

Hide/unhide without deleting (reversible)

Webhooks

Tool

Maps to

Use

list_webhooks

GET /webhooks

Registered hooks with lastStatus — spot a failing receiver

create_webhook

POST /webhooks

Register; returns the signing secret once

update_webhook

PATCH /webhooks

Change url/events in place, or rotateSecret:true. Prefer over delete+recreate

delete_webhook

DELETE /webhooks

Remove a registration

Share links

Tool

Maps to

Use

create_share_link

POST /share

Mint a public read-only link; expiresInDays for a TTL

list_share_links

GET /share

Audit every token minted, with an active flag

revoke_share_link

DELETE /share

Kill a leaked or stale link

Members and budget

Tool

Maps to

Use

list_members

GET /members

Humans and agent seats on a project

add_agent_seat

POST /members

Mint an agent seat; the pb_ key is returned once (Team tier)

invite_contributor

POST /members

Passwordless guest invite, scoped to the projects you name (Team tier)

revoke_member

DELETE /members

Remove a seat; an agent's key dies with its last membership

tier_status

GET /tier-status

Your tier, API access, credit balance and limits — check before a large run

submit_feedback

POST /feedback

Tell the PB team what to improve: feature requests, friction, bugs, notes

Full API reference: https://productbrain.com/docs/llm-guide.md.

Source, licence, registry

  • Source: https://github.com/moxzas/productbrain-mcp (MIT). Issues and pull requests welcome there.

  • npm: @productbrain-com/mcp. Every release is published from the repository's tag of the same version.

  • MCP registry name: io.github.moxzas/productbrain (server.json in this repo is the registry manifest).

  • The server sends User-Agent: productbrain-mcp/<version> so you can tell MCP traffic from raw REST calls in your own logs.

Proving it works

Two headless scripts in the repository (src/spike-proof.ts, src/parity-proof.ts; not shipped in the npm package), both run against a real deployment. Use a throwaway project on your own account:

PRODUCTBRAIN_API_KEY=pb_your_key \
PRODUCTBRAIN_PROJECT_ID=your-sandbox-project \
npm run spike     # transport + auth + one read + one write

PRODUCTBRAIN_API_KEY=pb_your_key \
npm run parity    # every non-plan tool once, on a throwaway project

parity creates its own throwaway project and cleans up after itself (archiving it at the end — there is no project-delete endpoint).

The Team-tier tools (add_agent_seat, invite_contributor) return 403 team_tier_required on a Builder key, and that counts as a pass — with one caveat worth knowing. It proves the shim reached the right route and passed the error and its _meta tip straight through; it does not validate the request body, because the tier gate runs before the body is read. Run parity with a Team-tier key to check those two properly.

Available Tools

27 tools
add_agent_seatA

Mint an agent seat on a project (owner only, Team tier). Returns a pb_ API key ONCE — store it now, there is no retrieval.

Inputs: name (required), projectId.

archive_projectA

Archive (archived:true) or unarchive (false) a project you own. Archiving hides it from list_projects without deleting anything — reversible, unlike delete.

Inputs: archived (required), projectId.

create_projectA

Create a project you own and seed its system "Later" phase, so nodes can be added immediately. id defaults to a slug of the name.

Inputs: name (required), id.

create_webhookA

Register an outbound webhook. events defaults to all (node.added|updated|deleted, iteration.added|updated|deleted). Returns the signing secret ONCE — store it immediately.

Inputs: url (required), events, projectId.

delete_webhookA

Remove a webhook registration. Irreversible — the secret is gone; re-registering mints a new one.

Inputs: id (required), projectId.

export_okfA

Serialize the whole plan to a portable OKF file bundle (markdown with frontmatter, one file per node). Use when you want the plan as files — for a repo, a diff, or handing it to a tool that reads markdown — rather than as JSON.

Inputs: projectId.

get_changelogA

Read the plan's history: every add/update/delete/restore, newest first, each attributed to the app or to a named agent. This is how you find a node AFTER it was deleted — /nodes can no longer see it, but restore needs its id. Filter by nodeId, action (add|update|delete|restore), source (app|api_key), agentId, since/before (ISO). Page with before=<_meta.next_before>, never an offset. Then undo with mutate {action:'restore', nodeId}, restoring a parent before its children.

Inputs: limit, since, action, before, +4 more.

get_treeB

Get a node in context. relation = context (ancestors+siblings+children, default) | ancestors | subtree | siblings. The endpoint's own names (up | down | lateral | context) are accepted too. There is no children-only view: subtree/children both return the full subtree.

Inputs: nodeId (required), relation, projectId.

invite_contributorA

Invite a guest contributor by email to one or more projects you own (owner only, Team tier). Sends a passwordless Clerk invite; one seat regardless of project count.

Inputs: email (required), projectIds (required).

list_iterationsC

List phases/iterations. current:true returns the active phase; status:active filters to active.

Inputs: status, current, projectId.

list_membersA

List the members (human and agent seats) on a project, plus the owner. Any member can read this.

Inputs: projectId.

list_nodesC

List nodes in a project (bulk read). Optional type (goal|need|approach|job|task) and iteration filters.

Inputs: type, iteration, projectId.

list_projectsA

List the projects you own or are a member of. Archived ones are hidden unless includeArchived is true.

Inputs: includeArchived.

list_webhooksA

List the outbound webhooks registered on a project (secrets are never returned). Shows lastStatus/lastDeliveryAt so you can spot a failing receiver.

Inputs: projectId.

mutateA

Create/update/delete plan nodes and phases. action = add|update|delete|batch|addIteration|updateIteration|deleteIteration|classify. Put the rest of the v1 mutate body in payload (node | nodeId+data | mutations | iteration). Pass idempotencyKey (a UUID) to make a retry safe — a replay returns the original result instead of double-creating.

Inputs: action (required), payload (required), projectId, idempotencyKey.

read_viewB

Read what the user is looking at now: view_mode, selected_iteration, expanded_nodes, focused_goals, selected_node.

Inputs: projectId.

rename_projectA

Change a project's display name (owner only). The id is immutable — keep using the same projectId afterwards.

Inputs: name (required), projectId.

revoke_memberC

Remove a member (human or agent) from a project. Removing an agent seat revokes its API key once its last membership is gone.

Inputs: userId (required), projectId.

run_workflowB

Run the Story-Mapping methodology workflow (flow = add | task-curate | phase-assign). Returns the next prompt + opaque state, or a terminal changeset with a focus hint. Put the v1 workflow body in body.

Inputs: body (required), projectId.

set_viewC

Drive the live canvas. command = { type: setViewMode|selectIteration|zoomToNode|expandNode|collapseNode|focusGoals, ... }.

Inputs: command (required), projectId.

submit_feedbackA

Tell the ProductBrain team how PB should improve: a feature you needed, friction you hit, a bug, or a general note. Stored for the team to read, not added to any plan. Make the summary self-explanatory (there is no reply channel). Keep credentials, customer records and confidential plan content out. Max 20 per 24h, so batch related points.

Inputs: kind (required), summary (required), context, details, +1 more.

tier_statusA

Read your own tier, API access, AI-credit balance, seat/project/node limits and billing period. Check this BEFORE a large run so you self-throttle instead of discovering a 402 mid-flight.

Inputs: no named parameters.

update_webhookA

Reconfigure a webhook in place (same id). Change url and/or events without minting a new secret, or pass rotateSecret:true to mint a new one (returned once). Prefer this over delete+recreate, which breaks the receiver.

Inputs: id (required), url, events, projectId, +1 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.5/5.0

    Scored across 27 tools

    Disambiguation4/5

    Most tools target distinct resource+action pairs, and descriptions actively disambiguate overlapping reads (search 'use FIRST', list_nodes bulk read, get_tree context, get_changelog for deleted nodes). However, the all-purpose `mutate` tool overlaps conceptually with targeted writers like `rename_project`/`archive_project`/`create_project`, and the read trio (search/list_nodes/get_tree) requires careful reading to pick correctly.

    Naming Consistency4/5

    Predominantly a consistent snake_case verb_noun pattern (list_projects, create_webhook, revoke_member, get_tree, set_view). Minor deviations are bare-verb names `search` and `mutate` and the noun-style `tier_status`, but the convention is largely predictable.

    Tool Count3/5

    27 tools is heavy territory for a single server, spanning projects, nodes, webhooks, share links, members, workflow, canvas view and account. Each cluster is individually justified, but the aggregate is borderline over-scoped and could be split by domain.

    Completeness4/5

    Strong lifecycle coverage: webhooks, share links, members, projects, nodes (add/update/delete/batch/classify via mutate), iterations, changelog/restore, plus view and workflow. Minor gaps remain — no explicit project delete tool (archive is the stand-in) and no dedicated project-update beyond rename, but agents can work around these.

    Maintenance

    ActivitySlowing
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      C
      maintenance
      Enables AI agents to create, manage, and search hierarchical plans with phases, tasks, and milestones through a comprehensive planning API. Supports CRUD operations, batch updates, rich context retrieval, and artifact management for structured project planning.
      37
      37 npm
      4
      MIT
    • A
      license
      B
      quality
      C
      maintenance
      Enables Claude to interact with HacknPlan project management via the MCP protocol. Provides tools for managing projects, work items, boards, milestones, time logs, design models, and cross-project portfolio views.
      75
      10 npm
      MIT
    • F
      license
      Not graded
      quality
      A
      maintenance
      Enables MCP-capable clients to browse and manage projects, todos, message boards, campfires, card tables, documents, uploads, comments, events, webhooks, and search through OAuth-authenticated API calls. It exposes 79+ tools and can also generate local client configuration for Codex, Cursor, and Claude Desktop.
      -