Labsco
olgasafonova logo

ProductPlan MCP Server

β˜… 2

from olgasafonova

Query ProductPlan roadmaps with AI. Access OKRs, ideas, launches, and timeline data through natural language.

πŸ”₯πŸ”₯πŸ”₯βœ“ VerifiedAccount requiredAdvanced setup

ProductPlan MCP Server

Go Report Card

Talk to your roadmaps using AI. Ask questions, create ideas, check OKR progress, and manage launches through natural conversation with Claude, Cursor, or other AI assistants.

What can you do with this?

Instead of clicking through ProductPlan's interface, just ask:

"What's on our Q1 roadmap?"

"Show me all objectives that are behind schedule"

"Create a new idea for mobile app improvements"

"What launches are coming up this month?"

"List all ideas tagged 'customer-request'"

The AI fetches your real ProductPlan data and responds in seconds.

Who is this for?

  • Product Managers who want faster access to roadmap data
  • Team leads who need quick status updates without context-switching
  • Anyone using AI assistants (Claude, Cursor, etc.) who wants ProductPlan integrated into their workflow

No coding required. You'll copy a file and paste some settings.


Real-world use cases

Morning standup prep

"Summarize what changed on our Product Roadmap in the last week"

Stakeholder updates

"List all Q1 objectives and their progress"

Idea triage

"Show me all ideas tagged 'enterprise' that don't have a priority set"

Launch coordination

"What tasks are still incomplete for the January launch?"

Quick lookups

"When is the 'Mobile App v2' bar scheduled to start?"


What ProductPlan data can you access?

FeatureViewCreateEditDelete
RoadmapsYes---
Roadmap CommentsYes---
Bars (roadmap items)YesYesYesYes
Bar CommentsYes---
Bar ConnectionsYesYes-Yes
Bar LinksYesYes-Yes
Lanes (categories)YesYesYesYes
Legends (bar colors)Yes---
MilestonesYesYesYesYes
Ideas (Discovery)YesYesYes-
Idea CustomersYes---
Idea TagsYes---
OpportunitiesYesYesYes-
Idea FormsYes---
Objectives (OKRs)YesYesYesYes
Key ResultsYesYesYesYes
LaunchesYesYesYesYes
Launch SectionsYesYesYesYes
Launch TasksYesYesYesYes
UsersYes---
TeamsYes---

How it works

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      spawns       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      API calls     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   AI Assistant  β”‚ ───────────────── β”‚   MCP Server    β”‚ ─────────────────▢ β”‚   ProductPlan   β”‚
β”‚ (Claude, Cursor)β”‚ ◀───────────────▢ β”‚   (this binary) β”‚ ◀───────────────── β”‚      API        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   stdin/stdout    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     JSON data      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
      your computer                        your computer                         cloud

Why does this need to run on your computer?

MCP (Model Context Protocol) works through a subprocess model. Your AI assistant doesn't connect to a remote server; it spawns the binary as a local process and communicates via stdin/stdout. This architecture means:

  1. The binary must exist locally because your AI assistant runs it as a child process
  2. Your API token stays on your machine, never passing through third-party servers
  3. Real-time, synchronous communication without network latency between AI and the MCP server
  4. Works offline for cached data (though ProductPlan API calls still need internet)

When you ask "What's on our Q1 roadmap?", here's what happens:

  1. Your AI assistant recognizes it needs ProductPlan data
  2. It sends a structured request to the MCP server process
  3. The binary translates this into ProductPlan API calls
  4. ProductPlan returns JSON data
  5. The binary formats and returns results to your AI
  6. Your AI presents the answer in natural language

Agent Skills

Pre-built workflow guides that teach AI assistants how to use ProductPlan tools effectively. Each skill targets a specific persona with tailored workflows.

SkillAudienceFocus
productplan-workflowsGeneralCore patterns and tool reference
productplan-pmProduct ManagersFull toolkit: roadmaps, OKRs, ideas, launches
productplan-leadershipExecutivesPortfolio health, cross-roadmap views
productplan-customer-facingSales & CSCustomer-ready roadmap timelines

Shared Principles

All skills follow these output conventions:

  • No raw JSON - Format responses as readable text and tables
  • Human-readable dates - Use "March 2025" or "Q1 2025", not "2025-03-15"
  • Summarize large lists - Don't overwhelm with 50 items; offer to expand

Persona-specific variations:

  • PM includes bar_id for follow-up actions
  • Leadership leads with executive summary, hides implementation details
  • Customer-facing omits internal IDs, lane names, and OKRs entirely

To use a skill, copy the SKILL.md file to your Claude Code skills directory:

# Copy a skill (example: PM skill)
cp skills/productplan-pm/SKILL.md ~/.claude/skills/productplan-pm.md

Or reference skills directly in your prompts:

"Use the productplan-pm workflow to show me our Q1 roadmap"


Command line (optional)

You can also use this tool directly in Terminal without an AI assistant:

# First, set your token
export PRODUCTPLAN_API_TOKEN="your-token"

# Then run commands
productplan status           # Check connection
productplan roadmaps         # List all roadmaps
productplan bars 12345       # List bars in roadmap #12345
productplan objectives       # List all OKRs
productplan ideas            # List all ideas
productplan opportunities    # List all opportunities
productplan launches         # List all launches

Background info

What is MCP?

Model Context Protocol (MCP) is an open standard that lets AI assistants connect to external tools. Anthropic created it; other AI providers are adopting it. This server implements MCP so your AI assistant can read and write ProductPlan data.

What is ProductPlan?

ProductPlan is roadmap software used by 4,000+ product teams. It handles roadmaps, OKRs, idea discovery, and launch coordination.


For Developers

Project structure
productplan-mcp-server/
β”œβ”€β”€ cmd/productplan/main.go      # Entry point (~100 lines)
β”œβ”€β”€ internal/
β”‚   β”œβ”€β”€ api/                     # ProductPlan API client
β”‚   β”‚   β”œβ”€β”€ client.go            # HTTP client with caching, retry, rate limiting
β”‚   β”‚   β”œβ”€β”€ endpoints.go         # 40+ API endpoint methods
β”‚   β”‚   └── formatters.go        # Response enrichment for AI
β”‚   β”œβ”€β”€ mcp/                     # MCP protocol implementation
β”‚   β”‚   β”œβ”€β”€ server.go            # JSON-RPC server, stdio I/O
β”‚   β”‚   β”œβ”€β”€ handler.go           # Tool dispatch via registry
β”‚   β”‚   └── types.go             # Protocol types
β”‚   β”œβ”€β”€ tools/                   # Tool definitions and handlers
β”‚   β”‚   β”œβ”€β”€ registry.go          # Tool registration and dispatch
β”‚   β”‚   └── types.go             # Typed argument structs for handlers
β”‚   β”œβ”€β”€ cli/                     # CLI commands (status, roadmaps, etc.)
β”‚   β”‚   └── cli.go
β”‚   └── logging/                 # Structured JSON logging
β”‚       └── logger.go
β”œβ”€β”€ pkg/productplan/             # Reusable utilities
β”‚   β”œβ”€β”€ cache.go                 # LRU cache with TTL
β”‚   β”œβ”€β”€ retry.go                 # Exponential backoff with jitter
β”‚   β”œβ”€β”€ ratelimit.go             # Adaptive rate limiting
β”‚   β”œβ”€β”€ registry.go              # ToolBuilder for schema generation
β”‚   β”œβ”€β”€ requestid.go             # Request tracing
β”‚   └── errors.go                # Error suggestions
└── evals/                       # LLM evaluation test suite
    β”œβ”€β”€ tool_selection.json
    β”œβ”€β”€ confusion_pairs.json
    └── argument_correctness.json
Build from source
git clone https://github.com/olgasafonova/productplan-mcp-server.git
cd productplan-mcp-server
go build -o productplan ./cmd/productplan

Build for all platforms:

# macOS Apple Silicon
GOOS=darwin GOARCH=arm64 go build -o dist/productplan-darwin-arm64 ./cmd/productplan

# macOS Intel
GOOS=darwin GOARCH=amd64 go build -o dist/productplan-darwin-amd64 ./cmd/productplan

# Linux
GOOS=linux GOARCH=amd64 go build -o dist/productplan-linux-amd64 ./cmd/productplan

# Windows
GOOS=windows GOARCH=amd64 go build -o dist/productplan-windows-amd64.exe ./cmd/productplan
Testing

Run all tests:

go test ./...

Run with coverage:

go test ./... -cover

Run benchmarks:

go test ./internal/... -bench=. -benchmem

Run evaluation suite:

./scripts/run-evals.sh

Coverage targets:

PackageCoverage
internal/mcp97%
internal/logging97%
internal/api95%
internal/cli95%
internal/tools90%
MCP tool reference

47 tools available: 35 READ tools and 12 WRITE tools (action-based):

Read tools:

  • Roadmaps: list_roadmaps, get_roadmap, get_roadmap_bars, get_roadmap_lanes, get_roadmap_milestones, get_roadmap_legends, get_roadmap_comments, get_roadmap_complete
  • Bars: get_bar, get_bar_children, get_bar_comments, get_bar_connections, get_bar_links
  • OKRs: list_objectives, get_objective, list_key_results, get_key_result
  • Discovery: list_ideas, get_idea, list_all_customers, list_all_tags, list_opportunities, get_opportunity, list_idea_forms, get_idea_form
  • Launches: list_launches, get_launch, get_launch_sections, get_launch_section, get_launch_tasks, get_launch_task
  • Admin: check_status, health_check, list_users, list_teams

Write tools:

  • Roadmaps: manage_bar, manage_lane, manage_milestone
  • Bar relationships: manage_bar_connection, manage_bar_link
  • OKRs: manage_objective, manage_key_result
  • Discovery: manage_idea, manage_opportunity
  • Launches: manage_launch, manage_launch_section, manage_launch_task

Example:

{"tool": "list_roadmaps", "arguments": {}}
{"tool": "manage_bar", "arguments": {"action": "create", "roadmap_id": "123", "lane_id": "456", "name": "New feature"}}
{"tool": "manage_idea", "arguments": {"action": "create", "name": "Mobile app improvements"}}
Architecture

The server uses a clean layered architecture:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        cmd/productplan                        β”‚
β”‚                     (entry point, DI)                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                              β”‚
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β–Ό                     β–Ό                     β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  internal/cli β”‚    β”‚  internal/mcp β”‚    β”‚internal/tools β”‚
β”‚  (CLI cmds)   β”‚    β”‚ (JSON-RPC IO) β”‚    β”‚  (handlers)   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                              β”‚                     β”‚
                              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                         β–Ό
                              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                              β”‚   internal/api    β”‚
                              β”‚  (HTTP client)    β”‚
                              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                         β”‚
                                         β–Ό
                              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                              β”‚  ProductPlan API  β”‚
                              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Key interfaces:

// Tool handler interface (internal/mcp)
type Handler interface {
    Handle(ctx context.Context, args map[string]any) (json.RawMessage, error)
}

// Logger interface (internal/logging)
type Logger interface {
    Debug(msg string, fields ...Field)
    Info(msg string, fields ...Field)
    Warn(msg string, fields ...Field)
    Error(msg string, fields ...Field)
}

Logging format:

{"ts":"2024-12-26T10:30:00Z","level":"info","req_id":"ab12","op":"get_roadmap_bars","dur_ms":245}

Changelog

See CHANGELOG.md for release history and detailed changes.


Like This Project?

If this server saved you time, consider giving it a ⭐ on GitHub. It helps others discover the project.


More MCP Servers

Check out my other MCP servers:

ServerDescriptionStars
gleif-mcp-serverAccess GLEIF LEI database. Look up company identities, verify legal entities.
mediawiki-mcp-serverConnect AI to any MediaWiki wiki. Search, read, edit wiki content.
miro-mcp-serverControl Miro whiteboards with AI. Boards, diagrams, mindmaps, and more.
nordic-registry-mcp-serverAccess Nordic business registries. Look up companies across Norway, Denmark, Finland, Sweden.
tilbudstrolden-mcpNordic grocery deal hunting. Find offers, plan meals, track spending.