Skip to main content
Glama
olgasafonova

productplan-mcp-server

by olgasafonova

ProductPlan MCP Server

CI lint CodeScene Average Code Health

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'"

"Color every eFormidling bar with the Customer satisfaction legend"

"Move these ten bars to the Platform lane and tag them Q3"

The AI fetches your real ProductPlan data and responds in seconds. Changes to many bars go through one validated call: every bar is checked before anything is written, and you can ask for a dry run first.

Related MCP server: plane-mcp-server

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.


Quick start (5 minutes)

Step 1: Get your ProductPlan API token

  1. Log into ProductPlan

  2. Go to Settings → API (or visit this link directly)

  3. Copy your API token

Step 2: Download the app

Go to the Releases page and download the right file for your computer:

Your Computer

Download This

Mac (M1, M2, M3, M4)

productplan-darwin-arm64

Mac (Intel)

productplan-darwin-amd64

Windows

productplan-windows-amd64.exe

Linux

productplan-linux-amd64

On Mac/Linux, open Terminal and run these two commands (replace the filename with what you downloaded):

chmod +x ~/Downloads/productplan-darwin-arm64
sudo mv ~/Downloads/productplan-darwin-arm64 /usr/local/bin/productplan

You'll be asked for your password. This is normal.

On Windows:

  1. Create a folder for the binary (if it doesn't exist):

    mkdir C:\Tools
  2. Move the downloaded .exe to that folder and rename it:

    move %USERPROFILE%\Downloads\productplan-windows-amd64.exe C:\Tools\productplan.exe
  3. Use the full path C:\Tools\productplan.exe in your AI assistant config (shown in Step 3)

Note: You can skip adding to PATH. Just use the full file path in your configuration.

Step 3: Connect to your AI assistant

Pick the tool you use:

  1. Find your config file:

    • Mac: ~/Library/Application Support/Claude/claude_desktop_config.json

    • Windows: %APPDATA%\Claude\claude_desktop_config.json

  2. Open it in any text editor and add this (replace your-token with your actual API token):

Mac/Linux:

{
  "mcpServers": {
    "productplan": {
      "command": "/usr/local/bin/productplan",
      "env": {
        "PRODUCTPLAN_API_TOKEN": "your-token"
      }
    }
  }
}

Windows:

{
  "mcpServers": {
    "productplan": {
      "command": "C:\\Tools\\productplan.exe",
      "env": {
        "PRODUCTPLAN_API_TOKEN": "your-token"
      }
    }
  }
}
  1. Restart Claude Desktop

Add to your config file:

  • Mac/Linux: ~/.claude.json

  • Windows: %USERPROFILE%\.claude.json

Mac/Linux:

{
  "mcpServers": {
    "productplan": {
      "command": "/usr/local/bin/productplan",
      "env": {
        "PRODUCTPLAN_API_TOKEN": "your-token"
      }
    }
  }
}

Windows:

{
  "mcpServers": {
    "productplan": {
      "command": "C:\\Tools\\productplan.exe",
      "env": {
        "PRODUCTPLAN_API_TOKEN": "your-token"
      }
    }
  }
}
  1. Open Cursor

  2. Go to Settings → MCP Servers

  3. Add this configuration:

Mac/Linux:

{
  "productplan": {
    "command": "/usr/local/bin/productplan",
    "env": {
      "PRODUCTPLAN_API_TOKEN": "your-token"
    }
  }
}

Windows:

{
  "productplan": {
    "command": "C:\\Tools\\productplan.exe",
    "env": {
      "PRODUCTPLAN_API_TOKEN": "your-token"
    }
  }
}

Windows users: Use double backslashes (\\) in the path. This is required because backslash is an escape character in JSON.

  1. Install the Cline extension

  2. Open VS Code settings (JSON) and add:

Mac/Linux:

{
  "cline.mcpServers": {
    "productplan": {
      "command": "/usr/local/bin/productplan",
      "env": {
        "PRODUCTPLAN_API_TOKEN": "your-token"
      }
    }
  }
}

Windows:

{
  "cline.mcpServers": {
    "productplan": {
      "command": "C:\\Tools\\productplan.exe",
      "env": {
        "PRODUCTPLAN_API_TOKEN": "your-token"
      }
    }
  }
}
  1. Install the Continue extension

  2. Add to your config file:

    • Mac/Linux: ~/.continue/config.json

    • Windows: %USERPROFILE%\.continue\config.json

Mac/Linux:

{
  "mcpServers": [
    {
      "name": "productplan",
      "command": "/usr/local/bin/productplan",
      "env": {
        "PRODUCTPLAN_API_TOKEN": "your-token"
      }
    }
  ]
}

Windows:

{
  "mcpServers": [
    {
      "name": "productplan",
      "command": "C:\\Tools\\productplan.exe",
      "env": {
        "PRODUCTPLAN_API_TOKEN": "your-token"
      }
    }
  ]
}
  1. Set environment variable on your n8n instance:

    N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true
  2. Add an MCP Client node to your workflow

  3. Configure:

    • Command:

      • Mac/Linux: /usr/local/bin/productplan

      • Windows: C:\Tools\productplan.exe

    • Environment Variables: PRODUCTPLAN_API_TOKEN=your-token

  4. Connect to an AI Agent node

Example workflow: Slack Trigger → AI Agent (with MCP Client) → Slack Response

Step 4: Start asking questions

Open your AI assistant and try:

  • "List my ProductPlan roadmaps"

  • "What bars are on roadmap [name]?"

  • "Show me our OKRs"

  • "What ideas are in discovery?"


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?

Feature

View

Create

Edit

Delete

Roadmaps

Yes

-

-

-

Roadmap Comments

Yes

-

-

-

Bars (roadmap items)

Yes

Yes

Yes

Yes

Bulk bar edits (up to 100 per call)

-

Yes

Yes

Yes

Bar Comments

Yes

-

-

-

Bar Connections

Yes

Yes

-

Yes

Bar Links

Yes

Yes

-

Yes

Lanes (categories)

Yes

Yes

Yes

Yes

Legends (bar colors)

Yes

-

Assign to bars

-

Milestones

Yes

Yes

Yes

Yes

Ideas (Discovery)

Yes

Yes

Yes

-

Idea Customers

Yes

-

-

-

Idea Tags

Yes

-

-

-

Opportunities

Yes

Yes

Yes

-

Idea Forms

Yes

-

-

-

Objectives (OKRs)

Yes

Yes

Yes

Yes

Key Results

Yes

Yes

Yes

Yes

Launches

Yes

Yes

Yes

Yes

Launch Sections

Yes

Yes

Yes

Yes

Launch Tasks

Yes

Yes

Yes

Yes

Users

Yes

-

-

-

Teams

Yes

-

-

-

List tools take filters, so you can ask for exactly what you need: bars by name, dates, lane, legend or tag, and ideas, opportunities, launches and roadmaps by name or status.

Some things the ProductPlan API itself does not allow, so no tool can do them: creating legends, setting lane colors, writing comments, removing a bar from its container once nested, and creating Azure DevOps or Jira integration links (links made through the API are plain web links).


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.

Skill

Audience

Focus

productplan-workflows

General

Core patterns and tool reference

productplan-pm

Product Managers

Full toolkit: roadmaps, OKRs, ideas, launches

productplan-leadership

Executives

Portfolio health, cross-roadmap views

productplan-customer-facing

Sales & CS

Customer-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"


Troubleshooting

"Command not found" or "spawn ENOENT"

Your AI assistant can't find the binary. This means:

  • Mac/Linux: The file isn't at /usr/local/bin/productplan, or you forgot to run chmod +x

  • Windows: The path in your config doesn't match where you saved the .exe

Fix: Verify the binary exists at the path in your config. Run ls -la /usr/local/bin/productplan (Mac/Linux) or check if C:\Tools\productplan.exe exists (Windows).

Windows path issues

Common mistakes on Windows:

Wrong

Correct

/usr/local/bin/productplan

C:\\Tools\\productplan.exe

C:\Tools\productplan.exe (single backslash in JSON)

C:\\Tools\\productplan.exe

productplan (no path)

C:\\Tools\\productplan.exe

Missing .exe extension

Include .exe in the path

Windows uses backslashes (\) for paths, but JSON treats backslash as an escape character. You must double them (\\) in your config file.

"Invalid API token"

Double-check your token at ProductPlan Settings → API. Tokens can expire or be regenerated. Make sure you copied the full token without extra spaces.

"No roadmaps found"

Your API token only accesses data you have permission to see in ProductPlan. Check that your account has access to the roadmaps you're looking for.

AI assistant doesn't see ProductPlan tools

MCP servers load when your AI assistant starts, not when configs change. After editing your config file, fully quit and restart the application. On Mac, use Cmd+Q (not just closing the window).

A bar's color didn't change

Colors are set by legend name (for example "Committed"), not by an ID. Ask your assistant to list the roadmap's legends first. Versions before 6.0.0 sent a legend_id, which ProductPlan treats as "remove the color"; upgrade if colors keep disappearing.

"unknown argument" errors

Since 6.0.0 the server refuses arguments a tool doesn't have, and suggests the closest valid one ("did you mean legend?"). That usually means the assistant guessed a parameter name; it can retry with the suggestion.

"Permission denied" on Mac/Linux

The binary needs execute permission. Run:

chmod +x /usr/local/bin/productplan

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

Optional setting: PRODUCTPLAN_CACHE_TTL controls how long read results are cached in memory (default 60s; 0 turns the cache off). Any change you make through the server clears the cache immediately.


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

productplan-mcp-server/
├── cmd/productplan/main.go      # Entry point: token check, then MCP server or CLI
├── internal/
│   ├── api/                     # ProductPlan API client
│   │   ├── client.go            # HTTP client: auth, rate limiting, error wrapping
│   │   ├── transport.go         # Tuned HTTP transport
│   │   ├── cache.go             # In-process TTL read cache (singleflight, write invalidation)
│   │   ├── list.go              # Paged collection GETs and Ransack query encoding
│   │   ├── ids.go               # Typed resource IDs (BarID, RoadmapID, ...), each validated into a path segment
│   │   ├── path.go              # Routes and request paths built only from typed IDs
│   │   ├── safeseg.go           # Path-segment validation for user-supplied IDs
│   │   ├── endpoints*.go        # Endpoint methods (roadmaps, bars, ideas, launches, OKRs)
│   │   ├── bars_read.go         # Roadmap bars with lane enrichment and client-side filters
│   │   ├── bar_schema.go        # Roadmap legends/lanes/custom fields for bar writes
│   │   └── formatters.go        # Response projection for AI
│   ├── mcp/                     # MCP wiring over the official go-sdk
│   │   ├── sdk_server.go        # Serves the registry via go-sdk (stdio)
│   │   ├── sdk.go               # Converts local Tool -> SDK tool
│   │   ├── handler.go           # Registry: dispatch and panic recovery
│   │   ├── argkeys.go           # Rejects undeclared argument keys (did-you-mean)
│   │   ├── editdistance.go      # Levenshtein distance for suggestions
│   │   └── types.go             # Tool-authoring types
│   ├── tools/                   # Tool definitions and handlers
│   │   ├── registry.go          # Tool registration (name -> handler)
│   │   ├── definitions*.go      # Tool schemas and descriptions
│   │   ├── helpers.go           # typedHandler, manage-action dispatch
│   │   ├── filters.go           # List-tool filters -> Ransack predicates
│   │   ├── formatter.go         # List/item/action response summaries
│   │   ├── item_type.go         # Item nouns for summaries
│   │   ├── bar_planner.go       # Validates bar writes against the roadmap
│   │   ├── bar_names.go         # Legend/lane/custom field name resolution
│   │   ├── bulk_bars.go         # bulk_update/create/delete_bars
│   │   ├── roadmaps.go, bars.go, ideas.go, objectives.go, launches.go, utility.go  # handlers
│   │   └── types*.go            # Typed argument structs for handlers
│   ├── cli/                     # CLI commands (status, roadmaps, etc.)
│   │   └── cli.go
│   └── logging/                 # slog JSON handler setup (ts/level/msg)
│       └── logger.go
├── pkg/productplan/             # Reusable utilities
│   ├── retry.go                 # Exponential backoff with jitter
│   ├── ratelimit.go             # Adaptive rate limiting
│   ├── batch.go                 # Batched operations
│   ├── health.go                # Health reporting
│   ├── requestid.go             # Request tracing
│   ├── validation.go            # ID validation (Field.RequireID)
│   └── errors.go                # APIError and error suggestions
└── evals/                       # LLM evaluation test suite
    ├── runner.go, types.go
    ├── tool_selection.json
    ├── confusion_pairs.json
    └── argument_correctness.json

Requires Go 1.26 or newer.

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

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 (measured 24-09-2026, go test ./... -cover):

Package

Coverage

internal/logging

100%

pkg/productplan

94.5%

internal/mcp

92.5%

internal/cli

92.3%

evals

89.5%

internal/api

87.4%

internal/tools

82.3%

cmd/productplan

34.9%

Every production file scores 10.0 in CodeScene Code Health (two type-only files can't be scored).

50 tools available: 35 READ tools and 15 WRITE tools (12 action-based manage_* plus 3 bulk_* bar tools):

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

  • Bulk bars: bulk_update_bars, bulk_create_bars, bulk_delete_bars (up to 100 bars per call, validated up front, dry_run supported)

  • 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": "Backend", "name": "New feature", "legend": "Committed"}}
{"tool": "bulk_update_bars", "arguments": {"set": {"legend": "Committed"}, "items": [{"bar_id": "901"}, {"bar_id": "902"}], "dry_run": true}}
{"tool": "manage_idea", "arguments": {"action": "create", "name": "Mobile app improvements"}}

The server uses a clean layered architecture:

┌──────────────────────────────────────────────────────────────┐
│                        cmd/productplan                        │
│                     (entry point, DI)                         │
└──────────────────────────────────────────────────────────────┘
                              │
        ┌─────────────────────┼─────────────────────┐
        ▼                     ▼                     ▼
┌───────────────┐    ┌───────────────┐    ┌───────────────┐
│  internal/cli │    │  internal/mcp │    │internal/tools │
│  (CLI cmds)   │    │  (MCP / SDK)  │    │  (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)
}

// Logging (internal/logging): a *slog.Logger with a JSON handler on stderr
logger := logging.New(slog.LevelInfo)

Logging format:

{"ts":"2026-09-24T10:30:00.123456789Z","level":"debug","msg":"API response","endpoint":"/roadmaps/5","status_code":200,"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:

Server

Description

Stars

gleif-mcp-server

Access GLEIF LEI database. Look up company identities, verify legal entities.

GitHub stars

mediawiki-mcp-server

Connect AI to any MediaWiki wiki. Search, read, edit wiki content.

GitHub stars

miro-mcp-server

Control Miro whiteboards with AI. Boards, diagrams, mindmaps, and more.

GitHub stars

nordic-registry-mcp-server

Access Nordic business registries. Look up companies across Norway, Denmark, Finland, Sweden.

GitHub stars

tilbudstrolden-mcp

Nordic grocery deal hunting. Find offers, plan meals, track spending.

GitHub stars


License

MIT License - see LICENSE

Available Tools

50 tools
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.

ParametersJSON Schema
NameRequiredDescriptionDefault
setNoFields applied to every item unless the item sets them itself
itemsYesBars to create: [{name, lane or lane_id, ...fields}]. Fields are the same as manage_bar create.
dry_runNoTrue to validate and return the payloads without writing
roadmap_idYesRoadmap to create the bars on

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Even though annotations exist, the description adds substantial behavior beyond them: atomic all-or-nothing validation ("one invalid item means nothing is sent"), dry_run semantics, parking inheritance rules, rate limiting ("Writes run 4 at a time"), partial-failure error semantics, and explicit retry guidance with the duplicate-warning. No contradiction with annotations — readOnlyHint=false and idempotentHint=false align with the warning that resending the whole call duplicates created bars.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every block earns its place: USE WHEN, single-bar alternative, item requirements, set semantics, atomicity, dry_run, parking, rate limits, return format, retry guidance, and FAILS WHEN. Clear structural markers make it scannable, and the core purpose is front-loaded in the first sentence. Slightly dense, but no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex bulk-write tool with nested objects, no output schema, and 4 parameters, the description is remarkably complete. It covers the return value explicitly (per-item result objects and summary string) since there is no output schema, plus error semantics, validation behavior, retry strategy, and failure conditions. Nothing an agent needs to call this safely and correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds real meaning: it clarifies the lane resolution rule (lane from the item OR from set, and by name or lane_id), gives a concrete set example, states the 100-item cap, and cross-references fields to manage_bar create. The dry_run parameter gains precision ("returns the exact POST payloads") beyond the schema's wording.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb, resource, and scope: "Create many bars on one roadmap in one call." It names the sibling it is routing away from (manage_bar) and is unmistakably distinct from the other sibling alternatives (bulk_update_bars, bulk_delete_bars). An agent can tell exactly what this tool does without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides an explicit USE WHEN block with concrete natural-language triggers ("Add these 20 features to the roadmap", "Import this list as bars") and a direct exclusion: "For a single bar, use manage_bar instead." It also implies when NOT to use it vs. the update/delete bulk siblings by naming the operation as create-only. Routing guidance is fully explicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bulk_delete_barsA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bar_idsYesBar IDs to delete
confirmNoMust be true to delete
dry_runNoTrue to look the bars up and list them without deleting

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (destructiveHint=true, readOnlyHint=false), the description discloses rich behavioral details: it verifies each delete by reading the bar back expecting 404, runs deletions 4 at a time under the client's rate limiter, reports per-item results, and returns an error only when no bar was deleted. It also warns that deletion is permanent and cannot be undone, which aligns with and expands on the destructiveHint annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is thorough but well-organized with labeled sections (USE WHEN, FAILS WHEN, WARNING) and front-loaded purpose. Every sentence adds value, covering usage, constraints, verification, concurrency, and error reporting. While it is long, the complexity of a destructive bulk operation justifies the detail; it is not padded with fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive bulk operation with no output schema, the description is exceptionally complete: it explains when to use it, parameters, failure modes, return format (per-item {index, bar_id, ok, error} and summary example), concurrency, rate limiting, and verification behavior. An agent has all the information needed to call it correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already describes all three parameters, but the description adds critical semantics: it clarifies that confirm is mandatory for actual deletion (even though not marked required in the schema), explains the dry_run behavior in detail (looks up bars and returns names without deleting), and imposes constraints on bar_ids (up to 100, each once). This goes beyond the schema's basic descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Permanently delete many bars in one call, verifying each delete.' It specifies the verb (delete), resource (bars), and scope (many bars in one call). It also distinguishes from the single-bar alternative by explicitly naming manage_bar action=delete, so an agent can immediately tell them apart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance with a 'USE WHEN' section listing example user intents and a direct exclusion: 'For a single bar, use manage_bar action=delete instead.' It also explains when confirm and dry_run are appropriate, and describes failure conditions under 'FAILS WHEN.' This leaves no ambiguity about when to select this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

bulk_update_barsA
Destructive

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
setNoFields applied to every item unless the item sets them itself, e.g. {"legend":"Committed"}. Same fields as items
itemsYesBars to update: [{bar_id, ...fields}]. Fields are the same as manage_bar update: name, lane, lane_id, legend, clear_legend, starts_on, ends_on, description, percent_done, is_container, container_bar_id, parked, strategic_value, notes, tags, custom_text_fields, custom_dropdown_fields. Optional per-item roadmap_id.
dry_runNoTrue to validate and return the payloads without writing
roadmap_idNoRoadmap all bars are on; skips one bar lookup per item when names need validating

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description reveals behaviors beyond annotations (which only signal destructiveHint=true): validation before any write ('One invalid item means nothing is sent'), dry_run returning exact payloads without writing, 4-at-a-time writes under the client's rate limiter, per-item result format, and the nuance that an error only occurs when no bar is updated (partial failures are normal results with retry guidance). It also flags unsupported fields (legend_id, effort) routed to manage_bar. This is comprehensive behavioral disclosure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than typical but front-loads the purpose and use cases before the detailed operation semantics. Every sentence contributes to operational correctness — override logic, validation, dry run, rate limiting, failure handling. It is dense but not padded; slightly tighter could be achieved without losing value, but the length is justified by the bulk-write complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers usage, validation, error semantics, retry behavior, dry run, concurrency, capacity limits, and return format. With no output schema present, it explicitly states the per-item result structure and summary format. It also addresses rate limiting and the optimization via roadmap_id. No critical gap remains for an agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Though the schema documents all 4 parameters (100% coverage), the description adds critical semantics: set vs items override behavior ('an item's own fields override set'), the capacity limit (up to 100 items) and uniqueness constraint (each bar_id may appear once), and how roadmap_id skips per-bar roadmap lookups. It also clarifies dry_run and the per-item roadmap_id field. These are material additions beyond the schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Update many bars in one call') with concrete operation examples (recolor, move lanes, retag, reschedule, set progress). It explicitly distinguishes itself from the single-bar sibling manage_bar and from other bulk tools in the sibling list. The purpose is unambiguous and uniquely identifiable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It includes a 'USE WHEN' block with example user phrases and explicitly routes single-bar cases to manage_bar. It also enumerates 'FAILS WHEN' conditions, giving clear operational boundaries. This is explicit when-to-use, when-not-to-use, and alternative tool guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_statusA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is known. The description adds meaningful context by specifying that this checks both connectivity status and authentication, and clarifies the boundary against health_check. With no destructive behavior and an output schema present, the description sufficiently covers behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, followed by concise usage triggers and a clear pointer to the alternative. Every line earns its place with no redundant detail.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless status-check tool with an output schema and readOnlyHint annotation, this description is fully complete. It tells the agent what the tool does, when to use it, and when to choose health_check instead, leaving no critical gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, and schema description coverage is 100%, so there is nothing for the description to add about parameter meanings. The baseline for a no-parameter tool is 4, and the description does not need to compensate for any schema gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action—checking ProductPlan API status and authentication—on a clear resource. It also names the sibling health_check as a different tool for server internals, distinguishing this tool from the most likely confusable alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly provides USE WHEN examples ('Is ProductPlan connected?', 'Check API') and a clear exclusion: for MCP server internals like cache stats and rate limits, use health_check instead. This gives an agent unambiguous routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_barA
Read-only

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
bar_idYesBar ID from get_roadmap_bars

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the call read-only; the description adds the failure mode for a missing bar_id and directs the agent to fetch valid IDs from get_roadmap_bars. It also explicitly lists the returned data, giving useful behavioral context beyond the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured with USE WHEN and FAILS WHEN sections. It loses a point because 'including description, links, custom fields' is largely redundant with the fuller return-field list that follows.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only lookup with an output schema and 100% schema coverage, the description covers the trigger phrases, the input source, the failure mode, and the returned fields. Nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema description coverage, the schema already documents bar_id as 'Bar ID from get_roadmap_bars'. The description repeats this same source hint, reinforcing it but adding no new format, validation, or behavioral detail, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies a specific verb and resource ('Get bar details') and enumerates the returned fields (name, dates, links, custom fields, percent_done, lane info), making the tool's purpose obvious. It does not explicitly contrast this tool with nearby getter siblings like get_bar_children or get_roadmap_bars, so it lacks full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'USE WHEN' section gives concrete user intents and phrases that should route an agent here, and 'FAILS WHEN' identifies the main error condition. It also points to get_roadmap_bars as the source of valid IDs, but it does not state when a sibling getter should be preferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_bar_childrenA
Read-only

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
bar_idYesParent bar ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is known. The description adds valuable behavior beyond annotations: it returns an empty list for non-container bars and fails when bar_id is not found. This is useful, though it doesn't discuss auth or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: one core sentence, then USE WHEN and FAILS WHEN sections. No filler or repetition. Every sentence contributes actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with one parameter and an output schema, the description covers the essential selection cues, failure behavior, and empty-result edge case. Nothing critical for calling this tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single parameter, with bar_id already described as 'Parent bar ID.' The description does not add extra parameter-level meaning, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Get child bars nested under a parent bar.' This clearly distinguishes it from sibling tools like get_bar, get_bar_links, and get_bar_comments. The scope is immediately understandable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The USE WHEN section gives concrete trigger phrases like 'Show sub-tasks' and 'Break down this feature,' which helps an agent select this tool. It also notes a failure mode. It does not explicitly name alternatives or when not to use it, but the usage context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_bar_commentsA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bar_idYesBar ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds a valuable behavioral detail: the tool fails when bar_id is not found, which is not captured in annotations or schema. This extra failure mode disclosure goes beyond the structured metadata, though it doesn't detail return format or pagination (likely covered by output schema).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, with a one-line purpose, a clear 'USE WHEN' block, and a 'FAILS WHEN' block. No wasted words. The main purpose is front-loaded, and the usage guidance is immediately actionable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with one parameter and an output schema, the description covers all necessary aspects: what it does, when to use it, what to use instead, and a known failure condition. The output schema handles return format, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (bar_id has a description 'Bar ID'), so the schema already documents the parameter. The description does not add additional meaning about bar_id, but given the high coverage, the baseline of 3 is appropriate. The tool name and description context make the parameter's role clear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb and resource: 'Get comments on a bar.' It also distinguishes itself from the closely related sibling get_roadmap_comments by explicitly saying to use that tool for roadmap-level comments. This makes the purpose unmistakable and differentiates it from similar get_* tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit 'USE WHEN' triggers with example user phrases and names the alternative tool for a different scenario (roadmap-level comments). It also includes a 'FAILS WHEN' condition (bar_id not found). This gives clear, actionable guidance on when to choose this tool over siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_bar_connectionsA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bar_idYesBar ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, indicating a safe read operation. The description adds that it returns an empty list when no connections exist and fails when bar_id is not found, which are useful behavioral details beyond the annotation. It does not contradict annotations and adds practical context for error handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: a one-line purpose followed by USE WHEN and FAILS WHEN sections. Every word serves a purpose, and the key information is front-loaded. There is no fluff or redundancy, making it easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with a single parameter and an output schema present, the description covers the essential points: what it does, when to use it, and failure behavior. It does not explain the exact structure of the returned dependencies, but since an output schema exists, that is not required. It is sufficiently complete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents bar_id with description 'Bar ID' and 100% coverage, so the baseline is 3. The description does not add any further detail about the parameter's format or meaning, but it doesn't need to since the schema is sufficient. No extra value provided beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Get bar dependencies (what blocks what).' It clearly distinguishes the tool from siblings like get_bar (which fetches a bar), get_bar_children (which gets children), and get_bar_links (which gets links), making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes 'USE WHEN' cues with example user intents ('What depends on this?', 'Show dependencies'), providing clear context for when to invoke it. It also notes failure behavior (bar_id not found) and empty-list return, which helps agents decide if this is the right call. It does not explicitly list alternative tools to avoid, but the usage cues are adequate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_ideaA
Read-only

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
idea_idYesIdea ID from list_ideas

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as readOnlyHint=true, and the description adds useful failure behavior ('FAILS WHEN: idea_id not found'). With an output schema present, no return-format disclosure is needed. It could add more detail about metadata contents, but the core behavioral context is clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: purpose first, then explicit use and failure guidance. No filler or redundant restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read tool, the description covers what it does, when to use it, and how to avoid failure. Combined with the output schema and readOnlyHint annotation, nothing essential is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with idea_id already documented as 'Idea ID from list_ideas'. The description reinforces this source but adds no additional parameter semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource ('Get idea details including description and metadata') and is clearly distinguishable from sibling tools like get_idea_form or manage_idea. It tells an agent exactly what object is being retrieved.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit USE WHEN triggers ('Tell me about this idea', 'Full request details') and a FAILS WHEN condition. It also routes to list_ideas for valid IDs, though it does not contrast with similar getters like get_idea_form.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_idea_formA
Read-only

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
form_idYesForm ID from list_idea_forms

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, so the description does not need to restate that it's read-only. The description adds context about typical user queries (showing form fields) and failure conditions, which is useful. However, it does not disclose details about the response structure or potential errors beyond the mention in FAILS WHEN, which is acceptable given the output schema exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very brief and front-loaded with the core purpose. The USE WHEN and FAILS WHEN sections are tersely phrased and each sentence adds value. No fluff or unnecessary details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple with one parameter, an output schema, and read-only annotation. The description covers the essential use case and failure handling. It could mention that the returned data includes form fields, but the description already says 'with fields'. Given the simplicity, it is nearly complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 100% coverage; the only parameter 'form_id' is well-described as 'Form ID from list_idea_forms' in both schema and description. The description adds a hint about obtaining valid IDs from list_idea_forms, which is slightly redundant but confirms the origin. The description adds minimal extra meaning beyond the schema, so a 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool retrieves idea form details with fields, indicating a read operation. It is distinct from sibling 'list_idea_forms' which likely lists forms, but the description does not explicitly differentiate from other get_* tools. However, the specific resource and action are clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes an explicit 'USE WHEN' section listing example user queries, and a 'FAILS WHEN' section that tells the agent what to do if the form_id is not found, directing to list_idea_forms for valid IDs. This provides clear guidance on when to use and how to handle failure.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_key_resultA
Read-only

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
objective_idYesParent objective ID
key_result_idYesKey result ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds the failure condition (not found) and the alternative, which is useful context beyond the annotations. It doesn't describe response format or edge cases, but for a simple read operation, this is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: a single sentence plus two labeled lines for USE WHEN and FAILS WHEN. It front-loads the purpose and provides actionable guidance with zero waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is a simple read operation with an output schema. The description covers usage, failure modes, and alternative sourcing of IDs. Given the annotations and output schema, nothing critical is missing. It lacks explicit mention of return format, but the output schema likely covers that.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%: both objective_id and key_result_id are described as 'Parent objective ID' and 'Key result ID' respectively. The description adds no additional parameter semantics beyond what the schema already provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'Get key result details,' which is a specific verb+resource. It clearly indicates retrieving details of a key result, distinguishing it from list_key_results (which lists) and manage_key_result (which mutates). However, it doesn't explicitly name the sibling it is not, though the resource is distinct from get_objective.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit USE WHEN phrases ('Tell me about this KR', 'KR progress') and FAILS WHEN conditions, directing the agent to list_key_results for valid IDs. This fully covers when to use and what to do if it fails, and implicitly excludes alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_launchA
Read-only

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
launch_idYesLaunch ID from list_launches

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnlyHint=true, so the description does not need to restate safety. It adds useful behavioral context beyond the schema by disclosing the failure mode when launch_id is not found and directing the agent to list_launches for valid IDs. This is meaningful added value for a read-only tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: a one-line purpose statement, followed by USE WHEN and FAILS WHEN triggers. Every sentence earns its place, and there is no fluff or redundant elaboration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only tool with an output schema, the description covers the essential context: what the tool returns, when to invoke it, and what to do when the ID is invalid. The agent has enough information to call this tool correctly without consulting additional documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is only one parameter and the schema already describes it as 'Launch ID from list_launches' with 100% coverage. The description repeats the same ID-source guidance without adding format, constraints, or additional behavioral meaning, so it does not exceed the schema baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb and resource: 'Get launch details with checklist.' It is clearly a launch-level read operation, but it does not explicitly contrast itself with sibling tools like get_launch_sections or get_launch_tasks, so some sibling differentiation is left to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The USE WHEN section gives concrete natural-language triggers ('Tell me about this launch', 'Launch readiness'), and FAILS WHEN warns about invalid IDs while pointing to list_launches as the ID source. It provides clear usage context but does not mention when to prefer an alternative tool, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_launch_sectionA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
launch_idYesLaunch ID
section_idYesSection ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safe read behavior is covered. The description adds a useful behavioral detail beyond annotations: the tool fails when launch_id or section_id is not found. This is meaningful context for error handling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and well-structured with USE WHEN and FAILS WHEN sections. The quoted use case is slightly redundant with the opening sentence, but the sibling routing and failure disclosure earn their place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a 100% documented schema, an output schema, readOnlyHint annotation, and explicit sibling differentiation, nothing essential is missing. The agent knows what the tool does, when to use it, when it fails, and where to route for the plural case.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both launch_id and section_id are already documented in the schema. The description only repeats the 'by ID' concept and the failure condition; it does not add new parameter-level meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Get a specific checklist section by ID.' It also explicitly distinguishes this tool from the sibling get_launch_sections, making its scope unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides an explicit USE WHEN condition, names the alternative for fetching all sections (get_launch_sections), and gives a FAILS WHEN condition. An agent can confidently decide between this and its sibling without extra inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_launch_sectionsA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
launch_idYesLaunch ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already mark the tool as readOnlyHint=true; the description adds the behavioral disclosure that the call fails when launch_id is not found. This goes beyond the schema and annotations by warning the agent about a non-empty error case rather than assuming an empty result.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Every line earns its place: the purpose, trigger phrases, alternative routing, and failure condition. It is compact, front-loaded, and contains no filler or redundant restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only listing tool with an output schema and explicit alternative routing, the description covers what an agent needs: what to call it for, when to use it, when it makes sense to call the sibling, and the primary failure mode. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the only parameter, launch_id, is described as 'Launch ID'. The main description adds no new meaning beyond that, which is acceptable since the schema already fully documents the parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Get checklist sections for a launch.' It explicitly distinguishes itself from get_launch_section by noting that the singular tool is for one specific section, so an agent can immediately tell the two apart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit USE WHEN trigger phrases ('Show sections', 'Checklist categories'), names the alternative (get_launch_section), and states the condition under which it should be used instead. It also documents a failure condition, leaving little to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_launch_taskA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYesTask ID
launch_idYesLaunch ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description adds a concrete failure mode (not found) beyond the structured data. While it doesn't discuss output or edge cases further, the safe read-only behavior is already covered; the description contributes the failure condition and the scoping distinction, which is sufficient for a simple getter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and structured with labeled sections (USE WHEN, FAILS WHEN). The core purpose is front-loaded in the first sentence, and every sentence earns its place by either clarifying usage or warning about failure. No redundant content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter getter with an output schema and readOnlyHint, the description covers purpose, usage, sibling routing, and failure conditions. Nothing an agent needs to invoke it correctly is missing—the output schema handles return details, and annotations handle safety profile.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already documented as 'Task ID' and 'Launch ID'. The description adds no additional semantics (e.g., relationship, format, or required combination). Given full schema coverage, the baseline of 3 is appropriate—the description doesn't need to compensate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the specific action ('Get') and resource ('launch task'), and explicitly differentiates from the sibling get_launch_tasks by saying 'For all tasks, use get_launch_tasks.' This leaves no ambiguity about which tool to select for a single task lookup.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit USE WHEN triggers (single task by ID, check assignment/status) and directly routes the agent to the sibling get_launch_tasks for all-tasks queries. The FAILS WHEN clause also sets expectations for error conditions, giving clear context on when not to rely on this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_launch_tasksA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
launch_idYesLaunch ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the agent knows this is a safe read operation. The description adds the failure condition (launch_id not found) and the collection-level scope, which is useful context. However, it doesn't disclose what happens on failure (error message? empty list?) or whether the response is ordered/paginated. With annotations covering the safety profile, a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the core purpose is in the first sentence, followed by structured USE WHEN and FAILS WHEN sections. Every sentence earns its place, and the formatting makes the guidance scannable for an agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list tool with one parameter, an output schema, and annotations covering safety, the description is nearly complete. It covers purpose, usage context, alternative, and failure condition. The only minor gap is not describing the return format, but the output schema presumably handles that, so the description doesn't need to.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% — the only parameter launch_id is documented in the schema as 'Launch ID'. The description doesn't add meaning beyond that, but it doesn't need to since the schema fully covers the single parameter. Baseline 3 is correct when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Get all tasks for a launch.' It clearly identifies the collection-level operation and distinguishes it from the sibling get_launch_task by noting the single-task alternative. It doesn't explicitly name the sibling in the main description, but the USE WHEN/FAILS WHEN structure provides enough differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage guidance: USE WHEN with example user queries ('Show tasks', 'What needs to be done?'), a clear alternative for a different case ('For one specific task, use get_launch_task'), and a failure condition ('FAILS WHEN: launch_id not found'). This is exactly the kind of when-to-use vs alternatives guidance that helps an agent select correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_objectiveA
Read-only

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
objective_idYesObjective ID from list_objectives

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds the failure behavior when objective_id is not found, which is useful. However, it does not disclose other behaviors such as response structure or potential pagination, but given annotations, the added failure info earns a 3.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with a front-loaded purpose statement followed by clearly labeled USE WHEN and FAILS WHEN sections. Every line adds value without redundancy, making it easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only tool with an output schema (indicated), the description covers the purpose, usage triggers, failure mode, and ID sourcing. It doesn't explain return format, but the output schema handles that, so the description is adequately complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with 'Objective ID from list_objectives' in the parameter description. The tool description essentially repeats this in the FAILS WHEN note, adding no new semantics beyond the schema. Baseline of 3 applies since the schema fully documents the parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves objective details including key results, which specifies the verb and resource. It differentiates from sibling tools like get_key_result by mentioning 'objective details with key results', making its scope clear even without listing every sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit USE WHEN examples ('Tell me about objective X', 'OKR progress') and a FAILS WHEN condition for invalid objective_id, pointing to list_objectives for valid IDs. This gives clear usage context and a fallback source, though it doesn't explicitly exclude alternative tools like get_key_result.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_opportunityA
Read-only

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
opportunity_idYesOpportunity ID from list_opportunities

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the description's 'Get' aligns with that. The description adds the failure mode (opportunity_id not found) and suggests sourcing valid IDs, which is useful context beyond the annotations, but it doesn't describe other behavioral traits like response format or any side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: two sentences plus a USE WHEN and FAILS WHEN clause. Every element serves a purpose, and the main purpose is front-loaded. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple single-parameter getter with an output schema, the description covers the essential usage context and failure condition. It lacks details on what 'linked ideas' means or what the response contains, but the output schema presumably covers that. It is adequately complete for a tool of this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema already describes opportunity_id as 'Opportunity ID from list_opportunities'. The description doesn't add additional semantics beyond what the schema provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get' and the resource 'opportunity details', and adds 'with linked ideas' which distinguishes it from generic getters. However, it doesn't explicitly differentiate from siblings like get_idea or get_launch, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit USE WHEN and FAILS WHEN clauses, including guidance to get valid IDs from list_opportunities. This gives clear context on when to invoke the tool, though it doesn't mention alternative tools for comparison.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_roadmapA
Read-only

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
roadmap_idYesRoadmap ID from list_roadmaps

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description explains what the call returns and that the returned vocabulary (legends, lanes, custom fields) is exactly what manage_bar and bulk_*_bars tools validate against. It also discloses the failure mode for missing roadmap IDs, adding genuinely useful behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured into clear sections with no filler. The core purpose is front-loaded, and each section—USE WHEN, alternative, return content, FAILS WHEN—earns its place without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only settings/metadata tool with a single fully-documented parameter and an output schema, the description covers everything an agent needs: purpose, usage context, sibling differentiation, failure behavior, and prerequisite. Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already fully documents roadmap_id with 100% coverage, so the baseline is 3. The description adds value by explicitly instructing the agent to obtain valid IDs from list_roadmaps first and by stating the failure condition when the ID is not found, reinforcing the parameter's provenance and validation expectations.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Get roadmap settings and metadata,' a specific verb and resource. It differentiates from the sibling get_roadmap_complete by explicitly limiting scope to settings/metadata, and the USE WHEN examples make the tool's purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit USE WHEN examples and names the alternative get_roadmap_complete for cases needing all data in one call. The FAILS WHEN section identifies the prerequisite of getting valid IDs from list_roadmaps first, giving clear selection and sequencing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_roadmap_barsA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoOnly bars carrying this tag (client-side, case-insensitive)
laneNoOnly bars in this lane, by name or lane ID (client-side, case-insensitive)
sortNoSort as "field" or "field asc|desc" (server-side). Fields: id, name, starts_on, ends_on, is_container, created_at, updated_at
legendNoOnly bars with this legend name (client-side, case-insensitive; names from get_roadmap_legends)
ends_afterNoOnly bars ending on or after this date, YYYY-MM-DD (server-side)
roadmap_idYesRoadmap ID
ends_beforeNoOnly bars ending on or before this date, YYYY-MM-DD (server-side)
is_containerNotrue for container bars only, false to exclude containers (server-side)
starts_afterNoOnly bars starting on or after this date, YYYY-MM-DD (server-side)
name_containsNoOnly bars whose name contains this text (case-insensitive, server-side)
starts_beforeNoOnly bars starting on or before this date, YYYY-MM-DD (server-side)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint annotation, the description discloses behavior an agent could not infer: the 50-item cap, that client-side filters apply 'to every fetched bar, before the 50-item cap,' that date filters are inclusive, that client-side filters are exact and case-insensitive, and the exact no-results message. These are genuine behavioral disclosures that materially affect how the agent should invoke the tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but every section earns its place: purpose first, then USE WHEN triggers, then filter semantics grouped by execution site, then return fields, then FAILS WHEN. The labeled sections (USE WHEN / FAILS WHEN) make it scannable, and for an 11-parameter tool with complex filter behavior, the density is justified rather than padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 11-parameter complexity, this description is complete: it covers failure modes, alternative routing for both more detail (get_bar) and roadmap discovery (list_roadmaps), filter semantics, ordering with the 50-item cap, and return fields — even though an output schema exists so return-value explanation wasn't required. Nothing an agent needs to invoke correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real semantic value: it groups the 11 parameters into server-side vs client-side filters and explains the practical consequence of that split (where they are applied, ordering with the 50-item cap, exactness). This explains the sort pattern's meaning, the allowed field list, and date inclusivity, which goes beyond what the schema's per-parameter descriptions state.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Get bars (features/items) on a roadmap, optionally filtered.' It distinguishes itself from siblings by explicitly routing detail lookups to get_bar ('For a bar's description and custom fields, use get_bar'), and the sibling list shows get_roadmap_bars sits apart from get_bar, get_bar_children, and get_roadmap_complete. An agent can tell exactly what this tool does and what it does not do.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'USE WHEN' section gives concrete user-intent examples ('What's on the roadmap?', 'What's starting in Q2?', 'Bars in the Mobile lane tagged urgent'). The 'FAILS WHEN' section names failure triggers and routes to alternatives ('roadmap_id not found (use list_roadmaps)'). This is explicit when-to-use guidance with exclusion and alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_roadmap_commentsA
Read-only

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
roadmap_idYesRoadmap ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnlyHint=true, so the description need not restate read-only behavior. It adds a failure condition (roadmap_id not found) and suggests list_roadmaps, plus specifies the return array shape (author, body, timestamp). No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-structured: a clear primary statement, usage trigger, alternative, return format, and failure mode. Every sentence adds value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With only one parameter, a read-only annotation, an existing output schema, and clear sibling differentiation, the description covers usage, alternative, failure, and return shape. No critical information is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for roadmap_id, so the schema already documents its meaning. The description adds no new parameter semantics beyond the failure condition, which is more behavioral than semantic. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get' and the resource 'roadmap-level comments', and explicitly contrasts with bar comments, distinguishing it from the sibling get_bar_comments. This gives an unambiguous purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit trigger phrases like 'Show roadmap comments' and 'Roadmap discussion', and names the exact alternative (get_bar_comments) for bar-level comments, making the selection criteria unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_roadmap_completeA
Read-only

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
roadmap_idYesRoadmap ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description adds meaningful behavioral context beyond that: it is a combined aggregation call, it returns multiple data categories in one response, and it fails when the roadmap_id is missing. This is useful complementary transparency, though auth and rate-limit details are not mentioned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded and compact, with clear USE WHEN and FAILS WHEN sections. However, the opening sentence and the later sentence both repeat the same combined-return information, creating minor redundancy that prevents a perfect score.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter, read-only tool with an output schema, the description covers the essential context: what it returns, when to use it, when not to use it, and what happens on failure. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the only parameter, roadmap_id, is already documented as 'Roadmap ID'. The description does not add additional semantic detail about the parameter, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Get'), names the exact resource ('complete roadmap'), and clarifies that it combines details, bars, lanes, and milestones. It distinguishes itself from get_roadmap, so an agent can tell them apart without needing to inspect schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'USE WHEN' section gives concrete example queries ('Full roadmap overview', 'Summarize roadmap X'), explicitly directs the agent to get_roadmap for settings/metadata only, and provides a failure fallback ('use list_roadmaps' when roadmap_id is not found). This leaves no ambiguity about when to select this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_roadmap_lanesA
Read-only

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
roadmap_idYesRoadmap ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true, so the read-only nature is covered. The description adds valuable behavioral detail beyond annotations: it specifies the returned fields, confirms the API exposes no lane color, and documents the failure mode for an invalid roadmap_id.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, front-loaded with the core purpose, and uses clear labeled sections ('USE WHEN', 'FAILS WHEN'). Every sentence contributes either selection guidance, return shape, or failure behavior without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only getter with one required parameter, 100% schema coverage, an output schema, and relevant annotations, the description covers purpose, usage conditions, returned data, and failure handling. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the description does not need to compensate. The description does add helpful context about roadmap_id being the identifier whose absence causes failure, but it does not add new parameter-level semantics beyond the schema's 'Roadmap ID' definition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource ('Get lanes on a roadmap') and immediately clarifies the domain concept: 'Lanes organize bars into rows.' This clearly distinguishes it from sibling tools like get_roadmap_milestones or get_roadmap_legends.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It includes explicit 'USE WHEN' example queries ('What lanes are on the roadmap?', 'Show categories') and a concrete failure-handling instruction with the alternative tool ('use list_roadmaps'). This gives an agent clear conditions for selection and fallback.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_roadmap_legendsA
Read-only

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
roadmap_idYesRoadmap ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description builds on that by revealing the API limitation: legends are name-only, with no ID or hex color. It also explains how the returned names are consumed by manage_bar and bulk tools. No contradiction with annotations; adds behavioral nuance beyond the read-only flag.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is structured with clear sections (USE WHEN, returns, usage, alternatives, FAILS WHEN), and every sentence contributes value. It is slightly longer than the absolute minimum, but the length is justified by the routing and usage details, and it remains front-loaded with the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only tool with a well-documented schema and output schema, the description covers everything an agent needs: purpose, usage cues, alternative tools, failure handling, and how to apply the results. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is only one parameter, roadmap_id, and the schema description 'Roadmap ID' fully covers its meaning. The tool description adds no extra semantics for this parameter, but with 100% schema coverage, the baseline of 3 is appropriate and no further clarification is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns legend names (bar colors) for a roadmap, specifying the exact resource and action. It also explicitly distinguishes itself from get_roadmap (custom field definitions) and get_roadmap_bars (finding bars by legend), making it unambiguous among siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes a dedicated 'USE WHEN' section with concrete example queries, and a 'FAILS WHEN' section with fallback guidance (use list_roadmaps). It also names two alternative tools and the conditions for choosing them, giving agents explicit routing instructions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_roadmap_milestonesA
Read-only

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
roadmap_idYesRoadmap ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the description doesn't need to restate that. It adds value by disclosing the return shape (array of milestones with ID, title, date) and the failure condition when the roadmap_id is invalid. This goes beyond the annotations and helps an agent anticipate outcomes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three concise segments: purpose, when to use, and failure handling. Everything is front-loaded and directly actionable, with no filler or redundant phrasing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only tool with an output schema, the description covers the essential context: what it returns, when to use it, when it fails, and how to recover. No significant gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema only says 'Roadmap ID', which is minimal. The description adds that the ID must correspond to an existing roadmap (otherwise it fails) and suggests using list_roadmaps to discover valid IDs. This gives practical meaning beyond the bare parameter label.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves milestones (key dates) on a roadmap, which is a specific verb and resource. It is distinct from siblings like get_roadmap and get_roadmap_bars because it focuses on milestones only, and there is no other get_milestone tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'USE WHEN' conditions ('What are the key dates?', 'Show milestones') guide when to invoke this tool. The 'FAILS WHEN' section names the failure mode (roadmap_id not found) and directs to list_roadmaps as an alternative for finding a valid ID.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

health_checkA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
deepNoAlso verify API connectivity (~500ms)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, and the description adds failure conditions (FAILS WHEN deep=true and API is unreachable) and clarifies that basic health always succeeds when the server runs. This provides behavioral context beyond annotations, though it does not detail the return format (mitigated by an output schema being present).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and uses labeled sections (USE WHEN, FAILS WHEN) to structure information efficiently. It is slightly longer than the minimal two-sentence example but every sentence adds value and is well front-loaded with the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (one optional parameter), the presence of an output schema, and annotations covering read-only behavior, the description is complete. It covers when to use, when not to use, failure modes, and the difference from the sibling tool, leaving nothing critical unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes the deep parameter at 100% coverage, but the description adds the failure condition tied to deep=true, which enriches the parameter's semantics. This goes beyond the schema's 'Also verify API connectivity (~500ms)' by specifying the consequence of that verification.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Check' and the resource 'MCP server health and cache stats', making the tool's purpose unmistakable. It also explicitly differentiates from the sibling check_status by noting that check_status is for API connectivity only, so an agent can distinguish between them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit USE WHEN scenarios ('Server status', 'Rate limits', 'Diagnose issues') and gives a direct alternative ('For API connectivity only, use check_status instead'). This leaves no ambiguity about when to select this tool over its sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_all_customersA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it read-only, and the description adds useful behavioral context: it returns customer names and linked idea counts, and it fails when the API token is invalid. This goes beyond the annotation-provided safety profile without contradicting it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded with purpose, then uses compact USE WHEN / FAILS WHEN lines for additional guidance. Every sentence contributes value with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only list operation with an output schema, the description covers purpose, usage context, return content, and a failure condition. Nothing needed to invoke the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the description has no parameter documentation burden. Baseline 4 is appropriate since there is nothing for the schema or description to clarify.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List all customers') plus the scope ('across ideas') and what is returned. This clearly differentiates it from sibling list tools like list_users and list_teams.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit USE WHEN cues ('Who are our customers?', 'All feedback sources') that help an agent decide when to select it. It does not name specific alternatives or exclusion conditions, but the context is clear enough that this is not a gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_all_tagsA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only, and the description adds useful behavior beyond that: it aggregates tags across all ideas, returns usage counts, and explicitly states a failure condition for invalid API tokens. This is meaningful operational context beyond the annotation fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core action, then supplemented by clearly labeled USE WHEN and FAILS WHEN sections. Every line carries useful information without unnecessary elaboration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only listing tool with an existing output schema and annotations, the description covers operation, scope, return semantics, and a failure mode. Nothing essential is missing for an agent to select and invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the input schema is empty, so there is no parameter behavior to explain. The baseline of 4 applies because the description cannot and need not add parameter-level detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('List all tags') and further scopes it to tags 'used across ideas' with usage counts. This clearly distinguishes it from sibling list/get tools that operate on ideas, customers, launches, or roadmaps.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The USE WHEN section gives concrete user-intent triggers like 'What tags exist?' and 'Show categories', making it easy to know when to invoke this tool. It does not explicitly name alternatives or when-not-to-use cases, but no sibling tool covers tags, so the guidance is sufficiently clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_idea_formsA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, and the description adds return format (array with ID and name) and a failure condition (invalid API token). This goes beyond annotations, though it doesn't disclose other traits like pagination or ordering, which are likely unnecessary for a simple list.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short lines: main action, when to use, failure condition. No fluff, and the primary action is front-loaded. Every sentence serves a purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless list tool with an output schema and read-only annotation, the description covers the essential usage triggers and failure mode. Nothing critical is missing for an agent to decide and call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the description correctly omits parameter details. With schema coverage at 100% (no params), the baseline of 4 applies and the description adds no unnecessary param info.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List idea submission forms' with a specific verb and resource. It also specifies the return type (array with ID and name) and is easily distinguishable from siblings like get_idea_form (singular) and list_ideas (different resource).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit USE WHEN examples ('Show feedback forms', 'What forms exist?') that trigger this tool, giving clear context. It doesn't explicitly exclude alternatives, but sibling tools are distinct resources, so the intended usage is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_ideasA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort as "field" or "field asc|desc" (server-side). Fields: id, name, description, channel, customer, opportunities_count, source_name, source_email, location_status
channelNoOnly ideas from this channel, exact match (server-side)
name_containsNoOnly ideas whose name contains this text (case-insensitive, server-side)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only, and description adds failure modes (invalid token, invalid sort field), empty-list behavior, and server-side filtering semantics. This goes well beyond the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, uses labeled sections, and front-loads the entry-point guidance. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 3 optional well-documented params, an output schema, and read-only annotations, the description covers return fields, filter semantics, and failure conditions. Nothing essential is missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 100% of parameters, but the description adds practical semantics: case-insensitive name matching, exact channel matching, and a sort example. It clarifies the optionality and server-side execution.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description opens with 'List all ideas in discovery pipeline,' a specific verb-resource pair that identifies this as the collection retrieval tool. The 'START HERE' marker and 'List all' clearly distinguish it from singular get_idea and mutating manage_idea siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'USE WHEN' examples ('Show customer feedback', 'What ideas do we have?') that tell an agent when to invoke it. It doesn't explicitly name alternatives or when-not-to-use, but the context is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_key_resultsA
Read-only

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
objective_idYesObjective ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=false. The description adds the failure mode (objective_id not found) and the return structure, which are useful behavioral details beyond annotations. No contradiction; the description does not claim mutation or idempotency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, with a clear purpose statement followed by labeled sections (USE WHEN, Returns, FAILS WHEN). Every sentence earns its place, and the most critical information (purpose) is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists (and the description already lists the return fields), plus annotations covering read-only behavior, the description is nearly complete. The only minor gap is the lack of explicit pagination or ordering details, but for a per-objective key result list, that is likely acceptable and the failure condition is well handled.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (objective_id is described as 'Objective ID'), so the baseline is 3. The description's reference to 'for an objective' and the failure condition slightly clarifies the parameter's role, but does not add syntax or format details beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List') and resource ('key results') with a clear scope ('for an objective'). It distinguishes from sibling tools like 'get_key_result' (singular) and 'list_objectives' (different resource), and explicitly mentions the return fields (ID, name, target_value, current_value).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'USE WHEN' conditions ('What are the KRs?', 'Show metrics') and a 'FAILS WHEN' clause that names the condition (objective_id not found) and the alternative tool (list_objectives). This gives clear routing guidance beyond inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_launchesA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort as "field" or "field asc|desc" (server-side). Fields: id, name, description, launch_date, status, user_id
statusNoOnly launches with this status, exact match (server-side)
launch_afterNoOnly launches on or after this date, YYYY-MM-DD (server-side)
launch_beforeNoOnly launches on or before this date, YYYY-MM-DD (server-side)
name_containsNoOnly launches whose name contains this text (case-insensitive, server-side)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the read-only nature is covered. The description adds valuable failure conditions (invalid token, date format, sort field) and explicitly states the empty-list behavior. This goes beyond the annotations by clarifying error handling and return expectations. It doesn't cover rate limits or pagination, but that's minor given the tool's simplicity.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded: it opens with the core purpose, then usage triggers, then filter details, then return shape, then failure cases. Every sentence serves a distinct function, and there is no redundant or filler content. The formatting (caps, line breaks) aids readability. This is a model of concise, complete documentation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (5 optional params, no nested objects) and the presence of an output schema, the description covers all necessary aspects: purpose, filters, return fields, and failure modes. It doesn't mention pagination or result limits, which could be relevant for a 'list all' operation, but this is not explicitly required and may not apply. The description is sufficiently complete for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides 100% coverage with descriptions for all five parameters. The description summarizes filters (name_contains, status, dates, sort) but doesn't add information beyond what the schema already specifies. The mention of 'inclusive' for dates mirrors the schema's 'on or after' phrasing. Thus, the description adds no net semantic value over the schema, aligning with the baseline 3 for high coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'List all launches' with a specific verb and resource. It adds 'START HERE for launches' to indicate it's the primary entry point, distinguishing it from get_launch (singular) and manage_launch (modification). This is a strong purpose statement with clear sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit USE WHEN examples ('Show launches', 'Release schedule', 'Launches this quarter') and marks it as the starting point. It doesn't explicitly state when not to use it or name alternatives, but the context and sibling names make it clear that get_launch is for single records and manage_launch for writes. The guidance is strong but could be enhanced with explicit exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_objectivesA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as read-only, and the description goes further by disclosing the return shape (fields included), the empty-list behavior, and the specific failure mode for invalid API tokens. This adds meaningful behavioral context beyond the structured annotations with no contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is tightly organized into labeled sections: purpose, use-when, return shape, and failure mode. Every sentence contributes a distinct fact, with no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter list tool, the description covers the essential agent-facing context: what is returned, when it fails, and what happens when there are no objectives. The presence of an output schema covers the detailed return structure, so nothing important is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters and schema description coverage is 100%, so there are no parameter semantics left unexplained. Per the baseline for zero-parameter tools, this is appropriately handled.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'List all OKR objectives' — a specific verb plus resource with explicit scope. The 'START HERE for OKRs' marker and inclusion of key_results_count signal that this is the collection-level entry point, clearly distinguishing it from siblings like get_objective and manage_objective.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'USE WHEN' section provides concrete user intents ('Show OKRs', 'What are our objectives?') that map directly to agent invocations. It does not explicitly list when-not-to-use or name alternatives like get_objective, but 'START HERE' and the sibling list imply the boundary sufficiently.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_opportunitiesA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort as "field" or "field asc|desc" (server-side). Fields: id, problem_statement, workflow_status, location_status, description, user_id, ideas_count, bars_count
workflow_statusNoOnly opportunities in this workflow status, exact match (server-side)
problem_containsNoOnly opportunities whose problem statement contains this text (case-insensitive, server-side)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, and the description adds value by detailing return contents (array with ID, problem_statement, workflow_status, linked idea count), empty-list behavior, and two specific failure modes (invalid token, sort field outside allowed list). This goes beyond the annotation's binary safety signal, though it doesn't mention rate limits or pagination.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-organized into labeled sections (USE WHEN, filters, returns, FAILS WHEN). It front-loads the core purpose and avoids redundancy, though the 'USE WHEN' examples and filter details could be trimmed slightly without losing meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list tool with three optional parameters and an output schema, the description covers the essential call context: what is returned, when it fails, and how filters behave. It does not mention pagination or result limits, but these are not critical for a list endpoint of this simplicity, and the output schema fills remaining gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage, so the schema already documents each parameter's meaning and constraints. The description merely restates the filter semantics (case-insensitive, exact match) and gives one sort example, adding marginal value. Baseline 3 applies because the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the resource ('opportunities') and the verb ('List'), making the purpose unambiguous. It also adds a 'START HERE for discovery' hint that signals its role as an entry point, but it does not explicitly name any sibling tool (e.g., get_opportunity) to differentiate, so it misses the top score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides concrete USE WHEN examples ('Show opportunities', 'Discovery pipeline') and explains failure conditions (invalid token, invalid sort field). It does not explicitly exclude alternative tools or mention when to prefer a sibling, but the triggers are clear enough for an agent to decide.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_roadmapsA
Read-only

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoSort as "field" or "field asc|desc" (server-side). Fields: id, name, is_version, created_at, updated_at
name_containsNoOnly roadmaps whose name contains this text (case-insensitive, server-side)

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds significant behavioral context beyond the annotations: it specifies the return fields (ID, name, updated_at), the exact failure conditions (invalid/expired API token, sort field outside allowed list), and that filters are server-side. The annotations only declare readOnlyHint=true, which is not contradicted; the description enriches the agent's understanding of edge cases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections: purpose, use-when, filters, returns, and fails-when. It is front-loaded with the primary purpose and uses line breaks for readability. Every sentence contributes actionable information with zero fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a list tool with two optional parameters and an output schema present, the description covers all essential aspects: use cases, filter semantics, return fields, and failure modes. The agent has everything needed to decide when to call it and what to expect, including how to handle errors.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description adds value by noting that name_contains is case-insensitive and providing example values for sort ('name asc', 'updated_at desc'). These details clarify usage beyond the schema's formal definitions, earning a 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'List all roadmaps' and 'START HERE to get roadmap IDs', which is a specific verb+resource that clearly distinguishes this tool from get_roadmap (which fetches a single roadmap). It also states the primary use case for obtaining IDs, making its purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly lists trigger phrases ('Show my roadmaps', 'What roadmaps do I have?', 'Find the Mobile roadmap') and describes optional filters. However, it does not explicitly state when to use an alternative (e.g., get_roadmap for a specific roadmap), though 'START HERE' implies it is the entry point. Slight gap in naming alternatives, but the usage context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_teamsA
Read-only

List all teams in account.

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

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the read-only nature is covered structurally. The description adds the account-level scope, which is useful, but does not disclose additional behavioral details such as pagination, ordering, or response size. The description does not contradict annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, well-structured, and front-loads the core purpose before the usage guidance. Every sentence earns its place with no redundant content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters, a read-only annotation, an output schema, and a clear distinction from list_users, the description fully equips an agent to select and invoke this tool correctly. Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there are no parameter semantics for the description to clarify. The baseline of 4 applies because parameter documentation is unnecessary here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('List all teams in account') with a clear scope, and explicitly distinguishes itself from list_users. An agent can immediately understand what this tool does and how it differs from the sibling for individual user details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides concrete USE WHEN triggers ('What teams exist?', 'Team structure') and explicitly names the alternative tool (list_users) for individual user details. This gives clear routing guidance with no ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_usersA
Read-only

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
dataYesThe ProductPlan payload (object or array) returned by the API, passed through verbatim
summaryYesHuman-readable summary of the result (e.g. "Found 3 roadmaps")

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds that it returns an array with ID, name, email, and role, which is useful but partially redundant with the output schema. It does not disclose pagination, ordering, or authentication requirements, but for a simple read-only list with annotations, this is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, followed by a practical usage trigger and return-format note. Every sentence adds value, and there is no fluff or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless read-only list tool with an output schema and annotations, the description is complete. It states the scope, return fields, and a direct integration use case with manage_launch_task, leaving no critical gaps for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there are no parameter semantics to clarify. The schema coverage is 100% and the description correctly implies no inputs are needed. Baseline 4 is appropriate for a parameterless tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'List all users in account.' It clearly identifies the scope (account-wide) and distinguishes this from sibling tools like list_teams and list_all_customers by focusing on users.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'USE WHEN' section provides concrete trigger phrases ('Who has access?', 'Team members') and explicitly connects this tool to manage_launch_task by telling agents to use its user IDs for assignment. It lacks explicit when-not-to-use or alternative tool names, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_barA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
laneNoLane NAME (see get_roadmap lanes). Use this or lane_id
nameNoBar name
tagsNoTag strings; REPLACES the bar's tag list. [] clears it
notesNoAdditional notes
actionYescreate, update, or delete
bar_idNoBar ID (for update/delete)
effortNoDEPRECATED and rejected: not a ProductPlan bar field (the API ignores it). Use a custom field
legendNoLegend NAME that colors the bar (from get_roadmap_legends). Empty string clears the color
parkedNoTrue parks the bar (off the timeline, kept on the roadmap). Must match the container's when nested
ends_onNoEnd date YYYY-MM-DD
lane_idNoLane ID from get_roadmap_lanes. Use this or lane
containerNoDEPRECATED alias for is_container
legend_idNoDEPRECATED and rejected: the API reads legend_id as 'clear the color'. Use legend (name)
parent_idNoDEPRECATED alias for container_bar_id
starts_onNoStart date YYYY-MM-DD
roadmap_idNoRoadmap ID (required for create; optional on update to skip looking up the bar's roadmap)
descriptionNoDescription (markdown)
clear_legendNoTrue to remove the bar's color (same as legend:"")
is_containerNoTrue to make the bar a container for child bars
percent_doneNoProgress 0-100
strategic_valueNoFree-text strategic importance note
container_bar_idNoNumeric ID of the container bar to nest under. Requires starts_on and ends_on on the bar; cannot be removed once set
custom_text_fieldsNo[{label,value}] using labels from get_roadmap custom_text_fields
custom_dropdown_fieldsNo[{label,value}]; value must be one of the field's allowed_values from get_roadmap

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare destructiveHint=true, but the description goes far beyond that: it discloses omitted fields are never sent, new bars are parked by default, names are canonicalized case-insensitively, legend_id is rejected to prevent color wiping, bars cannot be un-nested, and delete is permanent. This is substantial behavioral context that directly informs how the agent invokes the tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-structured with USE WHEN, Actions, and FAILS WHEN sections. Every section adds operational value, and front-loading the core action makes the tool's purpose immediately clear despite the large parameter surface.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 24-parameter mutation tool with no output schema, the description covers invocation intents, alternative routing, failure conditions, return values for create/update, default behaviors, naming rules, deprecation traps, and permanence of deletion. This is as complete as an agent needs for correct selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although schema coverage is 100%, the description adds critical semantic constraints not derivable from the schema alone: legend names must come from get_roadmap_legends, nested bars must match the container's parked state, container_bar_id requires both dates and cannot be removed, and effort/legend_id are rejected. This meaningfully improves parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Create, update, or delete a bar on a roadmap.' It also differentiates itself from bulk siblings by explicitly naming single-bar actions and pointing to bulk_create_bars, bulk_update_bars, and bulk_delete_bars for multi-bar scenarios.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'USE WHEN' section lists concrete user intents like 'Add feature', 'Update dates', and 'Delete item', and explicitly directs agents to bulk_* tools when handling many bars at once. The 'FAILS WHEN' section further clarifies invalid usage conditions, leaving little ambiguity about when this tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_bar_connectionA
Destructive

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYescreate or delete
bar_idYesSource bar ID
connection_idNoConnection ID (for delete)
target_bar_idNoTarget bar (for create)

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as destructive and non-idempotent. The description adds valuable behavioral detail beyond that: it specifies exactly which parameters cause failures and directs the agent to get IDs from get_bar_connections. This helps the agent anticipate failure modes without contradicting the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, followed by use cases, actions, and failure conditions. Every sentence carries useful information, and the structure makes it easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description covers the essential context: what it does, when to use it, which parameters are needed per action, and where to obtain IDs. It does not describe return values, but that is less critical for a create/delete operation and no output schema is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaningful parameter semantics by mapping action values to their required parameters (create → target_bar_id, delete → connection_id) and explaining the failure conditions. This goes beyond the schema's individual field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Create or delete dependency between bars.' This clearly identifies the tool's function and distinguishes it from read-only siblings like get_bar_connections. The action list further clarifies the two modes of operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'USE WHEN' section explicitly lists triggering intents ('Link features', 'Add dependency', 'Remove dependency'), and 'FAILS WHEN' gives concrete error conditions. It does not explicitly name alternatives or exclusion cases, but the guidance is clear enough for an agent to select this tool appropriately.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_ideaA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNoIdea title
actionYescreate or update
statusNoIdea workflow status
idea_idNoIdea ID (for update)
descriptionNoDescription (markdown)

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds several behavioral facts not visible in annotations: create requires title, update requires idea_id, the operation returns the created/updated idea object, and delete is unsupported. It also gives the failure conditions and the archival workaround. The destructiveHint=true annotation is not contradicted; it is consistent with updates potentially overwriting existing data, and the description actually narrows that destructiveness by ruling out deletion.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is organized with labeled sections (USE WHEN, Actions, Returns, FAILS WHEN) and front-loads the core purpose in the first sentence. The only flaw is that the 'delete not available' note appears twice, adding minor redundancy without new information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the moderate parameter count, two enums, and no output schema, the description covers what is needed to invoke correctly: the action-dependent requirements, return object, and failure modes. It does not detail the structure of the returned idea object, but the high-level 'idea object' plus existing schema descriptions is sufficient for selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes all five parameters (100% coverage), so the baseline is 3. The description adds action-dependent semantics by stating that create uses title and update uses idea_id, and by naming the failure conditions for missing those fields. This clarifies how to combine the action enum with the other parameters beyond the schema's property-level descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-plus-resource statement, 'Create or update an idea,' and goes on to enumerate the exact actions and their required fields, making the tool's role unmistakable. The explicit 'delete not available via API' sets the perimeter and helps distinguish it from other manage_* siblings. The purpose is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit use triggers via 'USE WHEN: "Add idea", "Update idea status"' which map to common agent intents. It also states when not to use it (delete) and the alternative 'archive ideas by updating status instead'. This is explicit enough to route an agent to the correct tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_key_resultA
Destructive

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoKey result name
actionYescreate, update, or delete
objective_idYesParent objective ID
target_valueNoTarget (100, 50%, $1M)
current_valueNoCurrent progress
key_result_idNoKey result ID (for update/delete)

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true, and the description adds concrete behavior: what actions exist, what each returns, and the conditions under which calls fail. It does not over-explain, but it goes beyond the annotation by describing return behavior and required preconditions per action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and scannable, using labeled sections (USE WHEN, Actions, Returns, FAILS WHEN) that front-load the most important operational info. Every line carries information; there is no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter CRUD tool with no output schema, the description covers action selection, required arguments, return values, and failure modes. It is complete enough for an agent to call the tool correctly without additional documentation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema has 100% parameter coverage, the description adds action-specific meaning the schema does not: create requires name+target_value, update/delete require key_result_id, and omitting these causes failure. This materially reduces ambiguity around which parameters matter for which action.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Create, update, or delete a key result,' a clear verb-resource pair that defines the tool's CRUD scope. It distinguishes itself from read-only siblings like get_key_result and list_key_results by explicitly naming its write actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit 'USE WHEN' triggers ('Add KR', 'Update progress', 'Delete KR') and a 'FAILS WHEN' section that routes the agent to list_key_results when an ID is missing. This gives both inclusion and exclusion criteria with an alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_laneA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoLane name
colorNoDEPRECATED and rejected: lanes have no color field in the ProductPlan API, so it was never applied
actionYescreate, update, or delete
lane_idNoLane ID (for update/delete)
positionNoPosition of the lane in the roadmap
roadmap_idYesRoadmap ID
descriptionNoWhat the lane represents

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate destructive behavior, but the description adds valuable specifics: deletion removes the lane and unassigns all bars in it, update requires a lane_id, and color is rejected. It also states what the tool returns per action, which is especially useful since there is no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with clear sections: summary, USE WHEN, Actions, Returns, FAILS WHEN, and WARNING. Every section adds operational value, and there is no filler or repetition beyond what is necessary.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter CRUD tool with three action modes and no output schema, the description is operationally complete. It covers when to use it, per-action parameter requirements, return behavior, failure conditions, and the destructive consequence of deletion.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents each parameter. The description adds meaningful conditional semantics beyond that: create requires name, update requires lane_id plus any mutable fields, delete requires lane_id, and color is always invalid.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb phrase, 'Create, update, or delete a lane on a roadmap,' which names both the action set and the exact resource. This clearly differentiates it from sibling tools like manage_bar or manage_milestone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'USE WHEN' section provides concrete natural-language triggers such as 'Add Backend lane' and 'Delete lane,' making it easy for an agent to know when to select this tool. It also points to get_roadmap_lanes for obtaining IDs, though it does not explicitly discuss when-not-to-use or all alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_launchA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoYYYY-MM-DD
nameNoLaunch name
actionYescreate, update, or delete
launch_idNoLaunch ID (for update/delete)
descriptionNoDescription

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint annotation, the description explicitly warns that delete removes the launch and all its sections and tasks, and lists exact failure conditions such as missing launch_id or invalid date format. This adds meaningful behavioral context that annotations alone do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured with labeled sections: USE WHEN, Actions, Returns, FAILS WHEN, and WARNING. It is front-loaded with the core action and every sentence carries useful information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating tool with no output schema, the description covers actions, required parameters, return behavior, failure conditions, and the destructive consequence of deletion. An agent has enough context to call the tool correctly and understand the impact.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents all parameters with descriptions, so the bar is higher. The description adds value by mapping actions to required parameters: create needs name+date, update/delete need launch_id. This clarifies parameter relationships beyond the schema's individual property descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Create, update, or delete a launch.' It distinguishes itself from sibling tools like get_launch and manage_launch_section by making the object of the action explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'USE WHEN' section provides concrete trigger phrases like 'Create launch', 'Update date', and 'Delete launch', which gives clear context for when to invoke the tool. It does not explicitly name alternatives or exclusions, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_launch_sectionA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoSection name
actionYescreate, update, or delete
launch_idYesLaunch ID
section_idNoSection ID (for update/delete)

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructive intent, but the description adds crucial specifics: delete removes the section and all tasks in it, and invalid action/parameter combos fail. It also describes return behavior. This is genuinely valuable beyond the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely compact and well-structured: core description, use-when examples, action mapping, return behavior, failure conditions, and warning. No fluff, and critical information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers usage, failure modes, destructive consequences, and returns, making it largely complete. The only minor gap is ambiguity about whether an 'update' action requires a name parameter to rename the section, though the examples imply it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the description adds important action-to-parameter mappings (create uses name; update/delete use section_id) and the source for IDs. This exceeds the baseline but not overwhelmingly so, as the schema already documents each parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise resource ('checklist section') with explicit create/update/delete actions, and gives concrete natural-language trigger examples. It is clearly distinct from sibling tools like manage_launch_task or get_launch_sections.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'USE WHEN' examples and failure conditions, plus a pointer to get_launch_sections for obtaining IDs. It does not name alternative tools or state when not to use it, but the context is clear enough for most agent decisions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_launch_taskA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoTask name
actionYescreate, update, or delete
statusNoTask status
task_idNoTask ID (for update/delete)
due_dateNoYYYY-MM-DD
launch_idYesLaunch ID
section_idNoSection ID (for create)
descriptionNoTask description
assigned_user_idNoUser ID to assign (get from list_users)

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate destructiveHint=true, and the description aligns with that by mentioning delete. It adds context by specifying failure conditions and return behavior (created/updated task object or confirmation on delete). This goes beyond the annotations by clarifying the exact conditions under which the tool fails, which is valuable for an agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, starting with the core purpose, followed by a 'USE WHEN' list, action-parameter mapping, return info, and failure conditions. It is well-structured and front-loaded with the most critical information. No wasted words, though the layout could be slightly more compact; still efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers usage triggers, required parameters per action, failure conditions, and return types. With no output schema, it adequately describes what to expect. It also mentions how to get valid IDs, covering a common pitfall. Slightly more detail on response format for updates could be added, but overall it is complete for an agent to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema documents all parameters. The description adds semantic context by specifying which parameters are required for each action (e.g., create needs name+section_id, update/delete need task_id). It also advises using list_users for valid assigned_user_id values, which adds practical guidance not present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the verb 'Create, update, or delete' with the specific resource 'launch task'. The description explicitly enumerates the three actions and their required parameters, making the tool's purpose unambiguous and distinct from sibling manage_* tools (e.g., manage_launch, manage_launch_section).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage triggers ('Add task', 'Mark complete', 'Assign task', 'Delete task') and maps each to the appropriate action. It also tells the agent where to obtain IDs (get_launch_tasks for task_id, list_users for assigned_user_id), which is crucial for correct invocation. The 'FAILS WHEN' section clarifies error conditions, giving clear guidance on when not to use it or what is required.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_milestoneA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoYYYY-MM-DD format
titleNoMilestone title
actionYescreate, update, or delete
roadmap_idYesRoadmap ID
milestone_idNoMilestone ID (for update/delete)

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool destructive and non-idempotent; the description adds the return behavior (milestone object vs delete confirmation) and exact failure conditions as extra context. It does not contradict the annotations and reveals more operation-level behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The definition is compact and front-loaded with the core verb, then organized into USE WHEN, Actions, Returns, and FAILS WHEN. No sentence is filler; each adds operational value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-parameter mutation tool with no output schema, the description covers inputs, action-specific requirements, return values, and failure cases. The agent has enough context to select and invoke it correctly, including where to look up milestone IDs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even with 100% schema coverage, the description adds action-to-parameter mapping: create needs title and date, update/delete need milestone_id, and dates must be YYYY-MM-DD. It also tells the agent where to obtain milestone_id, which the schema alone does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a clear verb-resource pair with the full scope: create, update, or delete a milestone on a roadmap. The opening sentence distinguishes it from sibling readers like get_roadmap_milestones by making mutation explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit USE WHEN example phrasings and names get_roadmap_milestones as the source for milestone IDs. It does not fully spell out when-not-to-use versus other manage_* tools, but the context and sibling reference are clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_objectiveA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameNoObjective name
actionYescreate, update, or delete
time_frameNoQ1 2024, H1 2024, 2024
descriptionNoDescription
objective_idNoObjective ID (for update/delete)

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses that delete cascades to all key results under the objective, states the return behavior for each action, and lists failure conditions. This is valuable behavioral context that annotations alone do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded. It states the core purpose first, then organizes usage guidance into labeled sections (USE WHEN, Actions, Returns, FAILS WHEN, WARNING). Every sentence adds actionable information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating tool with no output schema, the description covers the essential context: supported actions, required parameters per action, return values, failure modes, and the destructive cascade effect. The remaining parameter semantics are already fully documented in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds meaningful action-to-parameter mapping: create requires name, while update/delete require objective_id. This clarifies conditional parameter usage beyond the schema's individual field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise verb and resource: 'Create, update, or delete an objective.' It clearly identifies the three supported actions and their target resource, making it easy to distinguish from sibling tools like manage_key_result or manage_launch.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'USE WHEN' section provides concrete trigger phrases and the 'FAILS WHEN' section gives explicit conditions to avoid. It does not explicitly name alternatives or when-not-to-use, but the action mapping and failure conditions give clear practical guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_opportunityA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYescreate or update
descriptionNoDescription
opportunity_idNoOpportunity ID (for update)
workflow_statusNoOpportunity workflow status
problem_statementNoProblem statement (title)

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate destructiveHint=true, but the description goes further by clarifying that delete is not available via API and suggesting archiving via workflow_status update. This adds behavioral nuance beyond annotations without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-organized with sections (USE WHEN, Actions, Returns, FAILS WHEN) and front-loads the core purpose. Every sentence adds value, and the format is scannable for agents.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given there is no output schema, the description mentions it returns the opportunity object. It covers usage conditions, failure modes, required parameter sources, and the delete limitation. Nothing essential is missing for an agent to use this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though schema coverage is 100%, the description adds critical usage semantics: it maps action to required parameters (create requires problem_statement, update requires opportunity_id) and specifies failure conditions. This is beyond schema descriptions and directly helps correct invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Create or update an opportunity' with a specific verb and resource, and explicitly notes that delete is not available, distinguishing it from read-only get_opportunity and other manage_ tools. It also mentions the resource context without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit 'USE WHEN' conditions ('Create opportunity', 'Update problem') and 'FAILS WHEN' clauses, and instructs to get IDs from list_opportunities. It also explains that archiving should be done via updating workflow_status, covering the alternative for deletion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

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

  1. 40 tool updatesv6.0.0
    • Addedbulk_create_bars
    • Addedbulk_delete_bars
    • Addedbulk_update_bars
    • Changedcheck_status1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_bar1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_bar_children1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_bar_comments1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_bar_connections1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_bar_links1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_idea1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_idea_form1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_key_result1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_launch1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_launch_section1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_launch_sections1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_launch_task1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_launch_tasks1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_objective1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_opportunity1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_roadmap1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_roadmap_bars11 fields changed
      • addedInput schema / properties / ends_after
        Added value: +{
        +  "description": "Only bars ending on or after this date, YYYY-MM-DD (server-side)",
        +  "examples": [
        +    "2026-01-01"
        +  ],
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / ends_before
        Added value: +{
        +  "description": "Only bars ending on or before this date, YYYY-MM-DD (server-side)",
        +  "examples": [
        +    "2026-01-01"
        +  ],
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / is_container
        Added value: +{
        +  "description": "true for container bars only, false to exclude containers (server-side)",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / lane
        Added value: +{
        +  "description": "Only bars in this lane, by name or lane ID (client-side, case-insensitive)",
        +  "type": "string"
        +}
      • addedInput schema / properties / legend
        Added value: +{
        +  "description": "Only bars with this legend name (client-side, case-insensitive; names from get_roadmap_legends)",
        +  "type": "string"
        +}
      • addedInput schema / properties / name_contains
        Added value: +{
        +  "description": "Only bars whose name contains this text (case-insensitive, server-side)",
        +  "type": "string"
        +}
      • addedInput schema / properties / sort
        Added value: +{
        +  "description": "Sort as \"field\" or \"field asc|desc\" (server-side). Fields: id, name, starts_on, ends_on, is_container, created_at, updated_at",
        +  "examples": [
        +    "name asc"
        +  ],
        +  "pattern": "^(id|name|starts_on|ends_on|is_container|created_at|updated_at)( (asc|desc))?$",
        +  "type": "string"
        +}
      • addedInput schema / properties / starts_after
        Added value: +{
        +  "description": "Only bars starting on or after this date, YYYY-MM-DD (server-side)",
        +  "examples": [
        +    "2026-01-01"
        +  ],
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / starts_before
        Added value: +{
        +  "description": "Only bars starting on or before this date, YYYY-MM-DD (server-side)",
        +  "examples": [
        +    "2026-01-01"
        +  ],
        +  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +  "type": "string"
        +}
      • addedInput schema / properties / tag
        Added value: +{
        +  "description": "Only bars carrying this tag (client-side, case-insensitive)",
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_roadmap_comments1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_roadmap_complete1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_roadmap_lanes1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_roadmap_legends1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedget_roadmap_milestones1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedhealth_check1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_all_customers1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_all_tags1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_idea_forms1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_ideas2 fields changed
      • addedInput schema / properties
        Added value: +{
        +  "channel": {
        +    "description": "Only ideas from this channel, exact match (server-side)",
        +    "type": "string"
        +  },
        +  "name_contains": {
        +    "description": "Only ideas whose name contains this text (case-insensitive, server-side)",
        +    "type": "string"
        +  },
        +  "sort": {
        +    "description": "Sort as \"field\" or \"field asc|desc\" (server-side). Fields: id, name, description, channel, customer, opportunities_count, source_name, source_email, location_status",
        +    "examples": [
        +      "name asc"
        +    ],
        +    "pattern": "^(id|name|description|channel|customer|opportunities_count|source_name|source_email|location_status)( (asc|desc))?$",
        +    "type": "string"
        +  }
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_key_results1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_launches2 fields changed
      • addedInput schema / properties
        Added value: +{
        +  "launch_after": {
        +    "description": "Only launches on or after this date, YYYY-MM-DD (server-side)",
        +    "examples": [
        +      "2026-01-01"
        +    ],
        +    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +    "type": "string"
        +  },
        +  "launch_before": {
        +    "description": "Only launches on or before this date, YYYY-MM-DD (server-side)",
        +    "examples": [
        +      "2026-01-01"
        +    ],
        +    "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        +    "type": "string"
        +  },
        +  "name_contains": {
        +    "description": "Only launches whose name contains this text (case-insensitive, server-side)",
        +    "type": "string"
        +  },
        +  "sort": {
        +    "description": "Sort as \"field\" or \"field asc|desc\" (server-side). Fields: id, name, description, launch_date, status, user_id",
        +    "examples": [
        +      "name asc"
        +    ],
        +    "pattern": "^(id|name|description|launch_date|status|user_id)( (asc|desc))?$",
        +    "type": "string"
        +  },
        +  "status": {
        +    "description": "Only launches with this status, exact match (server-side)",
        +    "type": "string"
        +  }
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_objectives1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_opportunities2 fields changed
      • addedInput schema / properties
        Added value: +{
        +  "problem_contains": {
        +    "description": "Only opportunities whose problem statement contains this text (case-insensitive, server-side)",
        +    "type": "string"
        +  },
        +  "sort": {
        +    "description": "Sort as \"field\" or \"field asc|desc\" (server-side). Fields: id, problem_statement, workflow_status, location_status, description, user_id, ideas_count, bars_count",
        +    "examples": [
        +      "problem_statement asc"
        +    ],
        +    "pattern": "^(id|problem_statement|workflow_status|location_status|description|user_id|ideas_count|bars_count)( (asc|desc))?$",
        +    "type": "string"
        +  },
        +  "workflow_status": {
        +    "description": "Only opportunities in this workflow status, exact match (server-side)",
        +    "type": "string"
        +  }
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_roadmaps2 fields changed
      • addedInput schema / properties
        Added value: +{
        +  "name_contains": {
        +    "description": "Only roadmaps whose name contains this text (case-insensitive, server-side)",
        +    "type": "string"
        +  },
        +  "sort": {
        +    "description": "Sort as \"field\" or \"field asc|desc\" (server-side). Fields: id, name, is_version, created_at, updated_at",
        +    "examples": [
        +      "name asc"
        +    ],
        +    "pattern": "^(id|name|is_version|created_at|updated_at)( (asc|desc))?$",
        +    "type": "string"
        +  }
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_teams1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedlist_users1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "properties": {
        +    "data": {
        +      "description": "The ProductPlan payload (object or array) returned by the API, passed through verbatim",
        +      "type": "object"
        +    },
        +    "summary": {
        +      "description": "Human-readable summary of the result (e.g. \"Found 3 roadmaps\")",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "summary",
        +    "data"
        +  ],
        +  "type": "object"
        +}
    • Changedmanage_bar17 fields changed
      • addedInput schema / properties / clear_legend
        Added value: +{
        +  "description": "True to remove the bar's color (same as legend:\"\")",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / container / description
        Previous value: -"Is container for children"New value: +"DEPRECATED alias for is_container"
      • addedInput schema / properties / container_bar_id
        Added value: +{
        +  "description": "Numeric ID of the container bar to nest under. Requires starts_on and ends_on on the bar; cannot be removed once set",
        +  "type": "string"
        +}
      • changedInput schema / properties / custom_dropdown_fields / description
        Previous value: -"[{name,value}] custom dropdowns"New value: +"[{label,value}]; value must be one of the field's allowed_values from get_roadmap"
      • changedInput schema / properties / custom_dropdown_fields / items / description
        Previous value: -"Custom dropdown field with name and value"New value: +"{\"label\": \"<field label>\", \"value\": \"<allowed value>\"}"
      • changedInput schema / properties / custom_text_fields / description
        Previous value: -"[{name,value}] custom text fields"New value: +"[{label,value}] using labels from get_roadmap custom_text_fields"
      • changedInput schema / properties / custom_text_fields / items / description
        Previous value: -"Custom text field with name and value"New value: +"{\"label\": \"<field label>\", \"value\": \"<text>\"}"
      • changedInput schema / properties / effort / description
        Previous value: -"Effort estimate (unitless integer, scale per team)"New value: +"DEPRECATED and rejected: not a ProductPlan bar field (the API ignores it). Use a custom field"
      • addedInput schema / properties / is_container
        Added value: +{
        +  "description": "True to make the bar a container for child bars",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / lane
        Added value: +{
        +  "description": "Lane NAME (see get_roadmap lanes). Use this or lane_id",
        +  "type": "string"
        +}
      • changedInput schema / properties / lane_id / description
        Previous value: -"Lane ID (for create; update to move)"New value: +"Lane ID from get_roadmap_lanes. Use this or lane"
      • addedInput schema / properties / legend
        Added value: +{
        +  "description": "Legend NAME that colors the bar (from get_roadmap_legends). Empty string clears the color",
        +  "type": "string"
        +}
      • changedInput schema / properties / legend_id / description
        Previous value: -"Color from get_roadmap_legends"New value: +"DEPRECATED and rejected: the API reads legend_id as 'clear the color'. Use legend (name)"
      • changedInput schema / properties / parent_id / description
        Previous value: -"Parent bar ID for nesting"New value: +"DEPRECATED alias for container_bar_id"
      • changedInput schema / properties / parked / description
        Previous value: -"True to park bar (removes from timeline, keeps on roadmap)"New value: +"True parks the bar (off the timeline, kept on the roadmap). Must match the container's when nested"
      • changedInput schema / properties / roadmap_id / description
        Previous value: -"Roadmap ID (for create)"New value: +"Roadmap ID (required for create; optional on update to skip looking up the bar's roadmap)"
      • changedInput schema / properties / tags / description
        Previous value: -"Tag strings [\"mobile\",\"urgent\"]"New value: +"Tag strings; REPLACES the bar's tag list. [] clears it"
    • Changedmanage_lane5 fields changed
      • changedInput schema / properties / color / description
        Previous value: -"Hex color (#FF5733)"New value: +"DEPRECATED and rejected: lanes have no color field in the ProductPlan API, so it was never applied"
      • removedInput schema / properties / color / examples
        Removed value: -[
        -  "#FF5733",
        -  "#4CAF50"
        -]
      • removedInput schema / properties / color / pattern
        Removed value: -"^#[0-9A-Fa-f]{6}$"
      • addedInput schema / properties / description
        Added value: +{
        +  "description": "What the lane represents",
        +  "type": "string"
        +}
      • addedInput schema / properties / position
        Added value: +{
        +  "description": "Position of the lane in the roadmap",
        +  "examples": [
        +    1
        +  ],
        +  "type": "integer"
        +}
  2. 3 tool updatesv5.1.0
    • Changedmanage_bar3 fields changed
      • changedInput schema / properties / effort / description
        Previous value: -"Effort estimate"New value: +"Effort estimate (unitless integer, scale per team)"
      • changedInput schema / properties / parked / description
        Previous value: -"Not actively scheduled"New value: +"True to park bar (removes from timeline, keeps on roadmap)"
      • changedInput schema / properties / strategic_value / description
        Previous value: -"Strategic importance"New value: +"Free-text strategic importance note"
    • Changedmanage_idea2 fields changed
      • changedInput schema / properties / status / description
        Previous value: -"new, under_review, planned"New value: +"Idea workflow status"
      • addedInput schema / properties / status / enum
        Added value: +[
        +  "new",
        +  "under_review",
        +  "planned"
        +]
    • Changedmanage_opportunity2 fields changed
      • changedInput schema / properties / workflow_status / description
        Previous value: -"draft, in_discovery, validated, invalidated, completed"New value: +"Opportunity workflow status"
      • addedInput schema / properties / workflow_status / enum
        Added value: +[
        +  "draft",
        +  "in_discovery",
        +  "validated",
        +  "invalidated",
        +  "completed"
        +]
  3. 47 tool updatesv5.0.0
    • First observedcheck_status
    • First observedget_bar
    • First observedget_bar_children
    • First observedget_bar_comments
    • First observedget_bar_connections
    • First observedget_bar_links
    • First observedget_idea
    • First observedget_idea_form
    • First observedget_key_result
    • First observedget_launch
    • First observedget_launch_section
    • First observedget_launch_sections
    • First observedget_launch_task
    • First observedget_launch_tasks
    • First observedget_objective
    • First observedget_opportunity
    • First observedget_roadmap
    • First observedget_roadmap_bars
    • First observedget_roadmap_comments
    • First observedget_roadmap_complete
    • First observedget_roadmap_lanes
    • First observedget_roadmap_legends
    • First observedget_roadmap_milestones
    • First observedhealth_check
    • First observedlist_all_customers
    • First observedlist_all_tags
    • First observedlist_idea_forms
    • First observedlist_ideas
    • First observedlist_key_results
    • First observedlist_launches
    • First observedlist_objectives
    • First observedlist_opportunities
    • First observedlist_roadmaps
    • First observedlist_teams
    • First observedlist_users
    • First observedmanage_bar
    • First observedmanage_bar_connection
    • First observedmanage_bar_link
    • First observedmanage_idea
    • First observedmanage_key_result
    • First observedmanage_lane
    • First observedmanage_launch
    • First observedmanage_launch_section
    • First observedmanage_launch_task
    • First observedmanage_milestone
    • First observedmanage_objective
    • First observedmanage_opportunity

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

Related MCP Connectors

Related MCP Servers