Skip to main content
Glama
olgasafonova

productplan-mcp-server

by olgasafonova

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
PRODUCTPLAN_API_TOKENYesYour ProductPlan API token, obtained from ProductPlan Settings → API.

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}
logging
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
bulk_create_barsA

Create many bars on one roadmap in one call.

USE WHEN: "Add these 20 features to the roadmap", "Import this list as bars", "Create a bar per epic" For a single bar, use manage_bar instead. Each item needs name and a lane (lane name or lane_id), from the item or from set. Put shared values in set (e.g. set:{"lane":"Backend","legend":"Exploring"}). Up to 100 items. All items are validated against the roadmap before anything is written; one invalid item means nothing is sent. dry_run:true returns the exact POST payloads without writing. Parking follows manage_bar: a bar given starts_on and ends_on and no parked lands on the timeline (parked:false); an undated bar is parked by ProductPlan's default; a nested bar inherits its container's parked state. Writes run 4 at a time under the client's rate limiter. Returns per-item {index, bar_id, name, ok, error} and a summary like "Created 18 of 20 bars; 2 failed". The result is an error only when no bar was created. On a partial failure, retry only the failed items: resending the whole call would duplicate the bars that were created. FAILS WHEN: roadmap_id missing, items empty or over 100, an item without name or lane, a name not on the roadmap.

bulk_delete_barsA

Permanently delete many bars in one call, verifying each delete.

USE WHEN: "Delete these bars", "Remove all the test bars I just made", "Clean up the parked duplicates" For a single bar, use manage_bar action=delete instead. Requires confirm:true. dry_run:true looks each bar up and returns its name without deleting, so the list can be checked first. Up to 100 bar_ids, each once. Each delete is verified by reading the bar back and expecting 404; a bar that still exists after a successful-looking delete is reported as failed. Deletes run 4 at a time under the client's rate limiter. Returns per-item {index, bar_id, ok, error} and a summary like "Deleted 9 of 10 bars; 1 failed". The result is an error only when no bar was deleted. FAILS WHEN: confirm is not true (and dry_run is not set), bar_ids empty, over 100, malformed, or repeated. WARNING: delete is permanent and cannot be undone.

bulk_update_barsA

Update many bars in one call: recolor, move lanes, retag, reschedule, set progress.

USE WHEN: "Color all these bars Committed", "Move these 12 bars to the Backend lane", "Set percent_done on every Q3 bar" For a single bar, use manage_bar instead. Put values shared by every bar in set (e.g. set:{"legend":"Committed"}) and per-bar values in items; an item's own fields override set. Up to 100 items; each bar_id may appear once. Every item is validated before anything is written: legend, lane, custom field labels, and dropdown values are checked against each bar's roadmap (one roadmap fetch per distinct roadmap; pass roadmap_id to skip looking up each bar's roadmap). One invalid item means nothing is sent, and the error lists every problem with the valid options. dry_run:true returns the exact PATCH payload per bar without writing. Writes run 4 at a time under the client's rate limiter. Returns per-item {index, bar_id, ok, error} and a summary like "Updated 28 of 30 bars; 2 failed". The result is an error only when no bar was updated. A partial failure is a normal result whose summary counts the failures; retry only the failed items. FAILS WHEN: items empty or over 100, a bar_id missing or repeated, a name not on the roadmap, legend_id or effort passed (see manage_bar).

check_statusA

Check ProductPlan API status and authentication.

USE WHEN: "Is ProductPlan connected?", "Check API" For MCP server internals (cache stats, rate limits), use health_check instead.

get_barA

Get bar details including description, links, custom fields.

USE WHEN: "Tell me about this feature", "Bar details" Returns bar name, dates, description, links, custom fields, percent_done, and lane info. FAILS WHEN: bar_id not found (get valid IDs from get_roadmap_bars).

get_bar_childrenA

Get child bars nested under a parent bar.

USE WHEN: "Show sub-tasks", "Child items", "Break down this feature" FAILS WHEN: bar_id not found. Returns empty list if bar has no children (not all bars are containers).

get_bar_commentsA

Get comments on a bar.

USE WHEN: "Show comments", "What's the feedback on this bar?" For roadmap-level comments, use get_roadmap_comments instead. FAILS WHEN: bar_id not found.

get_bar_connectionsA

Get bar dependencies (what blocks what).

USE WHEN: "What depends on this?", "Show dependencies" FAILS WHEN: bar_id not found. Returns empty list if bar has no connections.

get_bar_linksA

Get external links on a bar (Jira, docs, designs).

USE WHEN: "What's linked?", "Show Jira tickets" FAILS WHEN: bar_id not found. Returns empty list if bar has no external links.

get_ideaA

Get idea details including description and metadata.

USE WHEN: "Tell me about this idea", "Full request details" FAILS WHEN: idea_id not found (get valid IDs from list_ideas).

get_idea_formA

Get idea form details with fields.

USE WHEN: "Show form fields", "What does this form collect?" FAILS WHEN: form_id not found (get valid IDs from list_idea_forms).

get_key_resultA

Get key result details.

USE WHEN: "Tell me about this KR", "KR progress" FAILS WHEN: objective_id or key_result_id not found (use list_key_results to get valid KR IDs).

get_launchA

Get launch details with checklist.

USE WHEN: "Tell me about this launch", "Launch readiness" FAILS WHEN: launch_id not found (get valid IDs from list_launches).

get_launch_sectionA

Get a specific checklist section by ID.

USE WHEN: "Show one specific checklist section by ID" For all sections, use get_launch_sections. FAILS WHEN: launch_id or section_id not found.

get_launch_sectionsA

Get checklist sections for a launch.

USE WHEN: "Show sections", "Checklist categories" For one specific section, use get_launch_section. FAILS WHEN: launch_id not found.

get_launch_taskA

Get a specific launch task by ID.

USE WHEN: "Show one specific task by ID", "Check task assignment or status" For all tasks, use get_launch_tasks. FAILS WHEN: launch_id or task_id not found.

get_launch_tasksA

Get all tasks for a launch.

USE WHEN: "Show tasks", "What needs to be done?" For one specific task, use get_launch_task. FAILS WHEN: launch_id not found.

get_objectiveA

Get objective details with key results.

USE WHEN: "Tell me about objective X", "OKR progress" FAILS WHEN: objective_id not found (get valid IDs from list_objectives).

get_opportunityA

Get opportunity details with linked ideas.

USE WHEN: "Tell me about this opportunity" FAILS WHEN: opportunity_id not found (get valid IDs from list_opportunities).

get_roadmapA

Get roadmap settings and metadata.

USE WHEN: "Tell me about roadmap X", "Roadmap settings", "What custom fields does this roadmap have?" For all data in one call (bars, lanes, milestones), use get_roadmap_complete. Returns roadmap name, date range, sharing settings, and metadata, including the vocabulary bar writes must use: legends (names), lanes (names), custom_text_fields [{label}], and custom_dropdown_fields [{label, allowed_values}]. manage_bar and the bulk_*_bars tools validate against exactly these. FAILS WHEN: roadmap_id not found (get valid IDs from list_roadmaps first).

get_roadmap_barsA

Get bars (features/items) on a roadmap, optionally filtered.

USE WHEN: "What's on the roadmap?", "Show planned features", "What's starting in Q2?", "Bars in the Mobile lane tagged urgent" Server-side filters (sent to ProductPlan): name_contains, starts_after/starts_before, ends_after/ends_before (YYYY-MM-DD, inclusive), is_container, sort ("starts_on asc"). Client-side filters (applied here to every fetched bar, before the 50-item cap): lane (name or ID), legend (name), tag. Exact, case-insensitive. Returns bars with ID, name, starts_on/ends_on, lane_name and lane_id, legend, tags, percent_done, is_container, and parked. For a bar's description and custom fields, use get_bar. FAILS WHEN: roadmap_id not found (use list_roadmaps); a date is not YYYY-MM-DD; sort names a field outside the allowed list (the error lists them). Says "No bars matched the filters" when filters exclude everything.

get_roadmap_commentsA

Get roadmap-level comments (not bar comments).

USE WHEN: "Show roadmap comments", "Roadmap discussion" For bar-level comments, use get_bar_comments instead. Returns array of comments with author, body, and timestamp. FAILS WHEN: roadmap_id not found (use list_roadmaps).

get_roadmap_completeA

Get complete roadmap in one call. Details, bars, lanes, milestones combined.

USE WHEN: "Full roadmap overview", "Summarize roadmap X" For settings/metadata only, use get_roadmap. Returns combined roadmap details, bars, lanes, and milestones in one response. FAILS WHEN: roadmap_id not found (use list_roadmaps).

get_roadmap_lanesA

Get lanes (categories) on a roadmap. Lanes organize bars into rows.

USE WHEN: "What lanes are on the roadmap?", "Show categories" Returns array of lanes with ID, name, description, and position (the API exposes no lane color). FAILS WHEN: roadmap_id not found (use list_roadmaps).

get_roadmap_legendsA

Get the legend names (bar colors) for a roadmap.

USE WHEN: "What colors are available?", "Show the legend", "Which legend can I color bars with?" Returns an array of legend names. The ProductPlan API exposes legends by name only: there is no legend ID or hex color to return. Pass a name as legend on manage_bar, bulk_update_bars, or bulk_create_bars to color a bar. For custom field definitions (labels, dropdown allowed_values), use get_roadmap instead. To find bars by legend, use get_roadmap_bars with legend. FAILS WHEN: roadmap_id not found (use list_roadmaps).

get_roadmap_milestonesA

Get milestones (key dates) on a roadmap.

USE WHEN: "What are the key dates?", "Show milestones" Returns array of milestones with ID, title, and date. FAILS WHEN: roadmap_id not found (use list_roadmaps).

health_checkA

Check MCP server health and cache stats.

USE WHEN: "Server status", "Rate limits", "Diagnose issues" For API connectivity only, use check_status instead. FAILS WHEN: deep=true and API is unreachable. Basic health (deep=false) always succeeds if server is running.

list_all_customersA

List all customers across ideas. Returns customer names and linked idea counts.

USE WHEN: "Who are our customers?", "All feedback sources" FAILS WHEN: API token invalid.

list_all_tagsA

List all tags used across ideas. Returns tag names and usage counts across ideas.

USE WHEN: "What tags exist?", "Show categories" FAILS WHEN: API token invalid.

list_idea_formsA

List idea submission forms.

USE WHEN: "Show feedback forms", "What forms exist?" Returns array of forms with ID and name. FAILS WHEN: API token invalid.

list_ideasA

List all ideas in discovery pipeline. START HERE for ideas.

USE WHEN: "Show customer feedback", "What ideas do we have?", "Ideas mentioning SSO" Optional server-side filters: name_contains (case-insensitive), channel (exact); sort ("name asc"). Returns ideas with ID, name, channel, and opportunities_count. FAILS WHEN: API token invalid; sort names a field outside the allowed list (the error lists them). Returns empty list if no ideas exist.

list_key_resultsA

List key results for an objective.

USE WHEN: "What are the KRs?", "Show metrics" Returns array of key results with ID, name, target_value, and current_value. FAILS WHEN: objective_id not found (use list_objectives).

list_launchesA

List all launches. START HERE for launches.

USE WHEN: "Show launches", "Release schedule", "Launches this quarter" Optional server-side filters: name_contains (case-insensitive), status (exact), launch_after/launch_before (YYYY-MM-DD, inclusive); sort ("launch_date asc"). Returns array of launches with ID, name, launch_date, status, and progress. FAILS WHEN: API token invalid; a date is not YYYY-MM-DD; sort names a field outside the allowed list (the error lists them). Returns empty list if no launches exist.

list_objectivesA

List all OKR objectives. START HERE for OKRs.

USE WHEN: "Show OKRs", "What are our objectives?" Returns array of objectives with ID, name, risk_status, start_date, end_date, and key_results_count. FAILS WHEN: API token invalid. Returns empty list if no objectives exist.

list_opportunitiesA

List all opportunities. START HERE for discovery.

USE WHEN: "Show opportunities", "Discovery pipeline", "Opportunities about onboarding" Optional server-side filters: problem_contains (case-insensitive), workflow_status (exact); sort ("ideas_count desc"). Returns array of opportunities with ID, problem_statement, workflow_status, and linked idea count. FAILS WHEN: API token invalid; sort names a field outside the allowed list (the error lists them). Returns empty list if no opportunities exist.

list_roadmapsA

List all roadmaps. START HERE to get roadmap IDs.

USE WHEN: "Show my roadmaps", "What roadmaps do I have?", "Find the Mobile roadmap" Optional server-side filters: name_contains (case-insensitive); sort ("name asc", "updated_at desc"). Returns roadmaps with ID, name, and updated_at. FAILS WHEN: API token invalid or expired (check PRODUCTPLAN_API_TOKEN env var); sort names a field outside the allowed list (the error lists them).

list_teamsA

List all teams in account.

USE WHEN: "What teams exist?", "Team structure" For individual user details, use list_users instead.

list_usersA

List all users in account.

USE WHEN: "Who has access?", "Team members" Returns array of users with ID, name, email, and role. Use user IDs from this tool when assigning launch tasks via manage_launch_task.

manage_barA

Create, update, or delete a bar on a roadmap.

USE WHEN: "Add feature", "Update dates", "Delete item", "Change color", "Nest this bar under that one" For many bars at once (e.g. "color these 30 bars"), use bulk_update_bars, bulk_create_bars, or bulk_delete_bars instead. Actions: create (roadmap_id + name + lane or lane_id), update (bar_id + any fields), delete (bar_id) Color a bar with legend (a legend NAME from get_roadmap_legends); legend:"" or clear_legend:true removes the color. Omitted fields are never sent, so an update only touches what you pass. New bars are parked (off the timeline) by ProductPlan's default. When you give starts_on and ends_on on create and leave parked unset, the bar defaults to parked:false so it lands on the timeline; a nested bar inherits its container's parked state. Names (legend, lane, custom field labels, dropdown values) are checked against the roadmap before writing, matched case-insensitively, and sent in canonical spelling. Returns: create gives the new bar's id plus the bar read back; update gives the exact fields sent. FAILS WHEN: create without roadmap_id, name, or a lane; update/delete without bar_id; a legend, lane, or custom field name is not on the roadmap (the error lists the valid ones); container_bar_id on a bar without both dates, or a parked state that differs from the container's. legend_id and effort are rejected with an explanation (legend_id would wipe the bar's color). A bar cannot be un-nested via the API once container_bar_id is set. WARNING: delete is permanent and cannot be undone.

manage_bar_connectionA

Create or delete dependency between bars.

USE WHEN: "Link features", "Add dependency", "Remove dependency" Actions: create (target_bar_id), delete (connection_id) FAILS WHEN: create without target_bar_id, delete without connection_id (get IDs from get_bar_connections).

manage_bar_linkA

Create or delete external link on a bar.

USE WHEN: "Link Jira ticket", "Add design doc", "Remove link" Actions: create (url), delete (link_id) FAILS WHEN: create without url, delete without link_id (get IDs from get_bar_links). Note: update not available via API; delete and re-create instead.

manage_ideaA

Create or update an idea. Note: delete not available via API.

USE WHEN: "Add idea", "Update idea status" Actions: create (title), update (idea_id) Returns the created/updated idea object. FAILS WHEN: create without title, update without idea_id. Note: delete is not available via the ProductPlan API; archive ideas by updating status instead.

manage_key_resultA

Create, update, or delete a key result.

USE WHEN: "Add KR", "Update progress", "Delete KR" Actions: create (name+target), update (key_result_id), delete (key_result_id) Returns the created/updated key result, or confirmation on delete. FAILS WHEN: create without name or target_value, update/delete without key_result_id (use list_key_results).

manage_laneA

Create, update, or delete a lane on a roadmap.

USE WHEN: "Add Backend lane", "Rename Mobile lane", "Move lane to the top", "Delete lane" Actions: create (name; optional description, position), update (lane_id plus any of name, description, position), delete (lane_id) Returns the created/updated lane object, or confirmation on delete. FAILS WHEN: create without name, update/delete without lane_id (get IDs from get_roadmap_lanes), color passed (lanes have no settable color in the API). WARNING: delete removes the lane and unassigns all bars in it.

manage_launchA

Create, update, or delete a launch.

USE WHEN: "Create launch", "Update date", "Delete launch" Actions: create (name+date), update (launch_id), delete (launch_id) Returns the created/updated launch object, or confirmation on delete. FAILS WHEN: create without name or date, update/delete without launch_id, date not in YYYY-MM-DD format. WARNING: delete removes the launch and all its sections and tasks.

manage_launch_sectionA

Create, update, or delete a checklist section.

USE WHEN: "Add Marketing section", "Rename section", "Delete section" Actions: create (name), update (section_id), delete (section_id) Returns the created/updated section object, or confirmation on delete. FAILS WHEN: create without name, update/delete without section_id (get IDs from get_launch_sections). WARNING: delete removes the section and all tasks in it.

manage_launch_taskA

Create, update, or delete a launch task.

USE WHEN: "Add task", "Mark complete", "Assign task", "Delete task" Actions: create (name+section_id), update (task_id), delete (task_id) Returns the created/updated task object, or confirmation on delete. FAILS WHEN: create without name or section_id, update/delete without task_id (get IDs from get_launch_tasks). Use list_users to get valid assigned_user_id values.

manage_milestoneA

Create, update, or delete a milestone on a roadmap.

USE WHEN: "Add launch milestone", "Move demo date", "Delete milestone" Actions: create (title+date), update (milestone_id), delete (milestone_id) Returns the created/updated milestone object, or confirmation on delete. FAILS WHEN: create without title or date, update/delete without milestone_id (get IDs from get_roadmap_milestones), date not in YYYY-MM-DD format.

manage_objectiveA

Create, update, or delete an objective.

USE WHEN: "Add Q1 objective", "Update objective", "Delete OKR" Actions: create (name), update (objective_id), delete (objective_id) Returns the created/updated objective, or confirmation on delete. FAILS WHEN: create without name, update/delete without objective_id. WARNING: delete also removes all key results under this objective.

manage_opportunityA

Create or update an opportunity. Note: delete not available via API.

USE WHEN: "Create opportunity", "Update problem" Actions: create (problem_statement), update (opportunity_id) Returns the created/updated opportunity object. FAILS WHEN: create without problem_statement, update without opportunity_id (get IDs from list_opportunities). Note: delete is not available via the ProductPlan API; archive opportunities by updating workflow_status instead.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A4.1/5.0

Scored across 50 tools

Disambiguation5/5

Each tool pairs a distinct resource with a clear read/write action, and the get_/list_/manage_/bulk_ prefixes make intent obvious. Plural-versus-singular pairs like get_launch_sections and get_launch_section are explicitly annotated so an agent can reliably choose the right one.

Naming Consistency5/5

The set follows a consistent convention: list_* for collections, get_* for single objects/details, manage_* for create/update/delete, and bulk_*_bars for multi-bar operations. Minor exceptions such as check_status and health_check are still self-describing and do not break the overall pattern.

Tool Count2/5

Fifty tools is far beyond the typical well-scoped MCP surface and forces agents to consider a very long list for any task. The tools are individually justified, but the sheer count makes the server feel heavy and increases selection cost.

Completeness4/5

The server covers nearly every lifecycle needed for ProductPlan work: bars, lanes, milestones, launches, sections, tasks, objectives, key results, ideas, opportunities, links, and dependencies all have appropriate read/write tools. The main gaps are that roadmaps themselves cannot be created/updated/deleted and comments are read-only, though these are likely API constraints rather than design oversights.

Maintenance

ActivityActive
ResponsivenessResponsive