ProductBoardMCP
Lightweight MCP server for Productboard API β built with FastMCP (Python). 18 tools for features, products, notes, objectives & releases.
Ask AI about ProductBoardMCP
Powered by Claude Β· Grounded in docs
I know everything about ProductBoardMCP. Ask me about installation, configuration, usage, or troubleshooting.
0/500
Reviews
Documentation
Productboard MCP Server
A lightweight MCP server that gives Claude (and any MCP client) full access to the Productboard API v2 (Migration Guide). Built with FastMCP.
Try it now (public test server)
This is a shared test server for evaluation purposes only. No tokens are stored server-side β your API token is proxied directly to Productboard. For production, deploy your own instance (see below).
-
Get your Productboard API token from Settings > Integrations > API Keys in your workspace (
https://<your-workspace>.productboard.com/settings/integrations/api-keys) -
Run this in Claude Code (paste the token on a single line, no line breaks):
claude mcp add --transport http productboard "https://productboardmcp.thebrokentelephone.com/mcp" --header "Authorization: Bearer YOUR_PRODUCTBOARD_TOKEN"
- Restart Claude Code and start using the 28 Productboard tools.
Tools (28)
Full list: CLAUDE.md
| Category | Count | Key Tools |
|---|---|---|
| Entities (unified: features/products/etc.) | 8 | list_entities(entity_type="feature"), create_entity, search_entities, entity_configurations |
| Notes | 7 | list_notes, create_note, search_notes(link_ids), update_note/delete_note |
| Teams | 9 | list_teams, get_team, create_team, update_team, delete_team, get_team_members, add_team_member, delete_team_member, search_teams |
| Members | 4 | list_members, search_members, get_member, get_member_teams |
Unified Entities API
The v2 Entities API unifies features, products, components, objectives, initiatives, key results, releases, and release groups under a single set of tools. Instead of separate list_features, list_objectives, etc., you use list_entities(entity_type="feature") or list_entities(entity_type="objective").
Supported entity types: feature, subfeature, product, component, objective, initiative, keyResult, release, releaseGroup.
Notes with Advanced Search
search_notes supports filtering by linked features via link_ids, making it easy to pull all customer feedback for a specific feature:
1. search_entities(entity_type="subfeature", name="My Feature")
β Returns feature UUID
2. search_notes(link_ids="<feature-uuid>", verbose="true")
β Returns all feedback notes linked to that feature with full content
Member UUIDs for ownership
Productboard now uses member UUIDs for owner fields when writing entities and notes. Use list_members or search_members to find the correct member UUID, then pass it as owner_id to create_entity, update_entity, create_note, or update_note.
Pagination
List and search tools follow Productboard pageCursor pagination until exhaustion. Results are no longer silently truncated after a fixed number of pages.
Clients
Claude Code / Desktop
claude mcp add productboard -- uv run python -m src # Local stdio
# or
claude mcp add --transport http productboard "http://localhost:3000/mcp" --header "Authorization: Bearer $PRODUCTBOARD_API_TOKEN"
Cursor (Claude integration)
- Settings > Claude > Add MCP Server
- URL:
http://localhost:3000/mcp - Headers:
Authorization: Bearer YOUR_TOKEN
Opencode CLI (this tool)
In your project:
git clone https://github.com/darkspock/ProductBoardMCP.git .
uv sync
PRODUCTBOARD_API_TOKEN=your-token uv run python -m src
Local MCP server ready.
Quick Start
Prerequisites
- Python 3.13+
- uv (recommended) or pip
- A Productboard API token β generate one at Settings > Integrations > API Keys in your Productboard workspace (
https://<your-workspace>.productboard.com/settings/integrations/api-keys)
Install
git clone https://github.com/darkspock/ProductBoardMCP.git
cd ProductBoardMCP
uv sync
Run (stdio β local use with Claude Desktop)
PRODUCTBOARD_API_TOKEN=your-token uv run python -m src
Or create a .env file:
PRODUCTBOARD_API_TOKEN=your-token
uv run python -m src
Run (HTTP β remote deployment for Claude custom connectors)
MCP_TRANSPORT=httpStream PORT=3000 uv run python -m src
The server will listen on http://0.0.0.0:3000/mcp.
Add to Claude Code (one command)
claude mcp add --transport http productboard "https://your-host.com/mcp" \
--header "Authorization: Bearer YOUR_PRODUCTBOARD_TOKEN"
Each user runs this once with their own Productboard API token. The server proxies it to the Productboard API β no tokens are stored server-side.
Important: The token and the entire
--headervalue must be on a single line with no line breaks or extra spaces. Productboard API tokens are long JWTs β when copying from a terminal or password manager, line breaks are often introduced silently. Ifclaude mcp listshowsFailed to connect, remove and re-add the server with the token on one line:claude mcp remove productboard claude mcp add --transport http productboard "https://your-host.com/mcp" --header "Authorization: Bearer eyJ0eXAi...full_token_here"
Add to Claude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"productboard": {
"url": "https://your-host.com/mcp",
"headers": {
"Authorization": "Bearer YOUR_PRODUCTBOARD_TOKEN"
}
}
}
}
Local mode (stdio)
If you prefer running locally instead of connecting to a remote server:
claude mcp add productboard -- uv run python -m src
Set PRODUCTBOARD_API_TOKEN in your .env file.
Configuration
| Variable | Required | Default | Description |
|---|---|---|---|
PRODUCTBOARD_API_TOKEN | Yes | β | Bearer token from Productboard |
MCP_TRANSPORT | No | stdio | stdio or httpStream |
PORT | No | 3000 | HTTP port (only in httpStream mode) |
PRODUCTBOARD_API_BASE_URL | No | https://api.productboard.com/v2 | API base URL |
Deploying as a Claude Custom Connector
With Docker
docker build -t productboard-mcp .
docker run -p 3000:3000 productboard-mcp
No API token needed on the server β each user passes their own token via the Authorization header from their Claude config.
On any host
- Deploy with
MCP_TRANSPORT=httpStreamto any HTTPS host (Railway, Render, Fly.io, AWS, etc.) - In Claude, go to Organization Settings > Connectors
- Click "Add custom connector"
- Enter the server URL (e.g.,
https://your-host.com/mcp) - Click "Add"
Team members can then connect via Settings > Connectors > Productboard > Connect.
Plan Restrictions
Some Productboard features are only available on certain plans. If a tool accesses a feature not enabled on your workspace, it will return a clear error message instead of failing silently:
- Initiatives β may not be available on all plans.
- Key Results β may not be available on all plans.
Use entity_configurations(entity_type="...") to discover which entity types and fields are available in your workspace.
Acknowledgments
This project is inspired by Enreign/productboard-mcp by Stanislav Shymanskyi. The original TypeScript implementation (MIT License, v0.2.1) demonstrated that an MCP server for Productboard was viable and provided the initial inspiration. Thank you for paving the way!
