Skip to main content
Glama
norman2112

Planview Portfolios Actions MCP Server

by norman2112

Planview Portfolios MCP Server (v2)

An MCP server that connects Planview Portfolios (enterprise strategic portfolio management) to Claude Desktop or any MCP-compatible AI client. Five action-based tools covering projects, tasks, financial plans, and work hierarchy — bridging both REST and legacy SOAP APIs under a single MCP interface.

Why This Exists

Planview Portfolios is an enterprise SPM platform used by large organizations to manage project portfolios, resource capacity, and strategic funding. Its API surface is split across REST (projects, work items) and SOAP (tasks, financial plans) with different auth models and data formats.

This server unifies both API layers behind MCP so Claude can create projects, build financial plans, manage tasks, and navigate work hierarchies through conversation.

This is the second MCP server I built for Planview products (the first was AgilePlace MCP Server). Same pattern, completely different APIs — AgilePlace is a modern REST API, Portfolios mixes REST with SOAP services that require different serialization, auth, and error handling.

Related MCP server: MCP DevOps Plan Server

What Changed in v2

v1 exposed 24 tools. v2 exposes 5.

Benchmark evidence is consistent that tool count degrades LLM tool-selection accuracy, and v1's surface had a lot of near-duplicates (get_project / create_project / update_project / delete_project → one manage_project with an action parameter). v2 collapses each domain into a single action-dispatched tool.

v1

v2

get_project, create_project, update_project, delete_project, get_project_attributes, list_field_reference

manage_project (create / get / update / delete / fields)

list_work, get_work, update_work, get_work_attributes, get_project_wbs

inspect_work (wbs / get / list / update)

create_task, read_task, delete_task, batch_create_tasks, batch_delete_tasks

manage_tasks (create / read / delete, all batch-capable)

read_financial_plan, upsert_financial_plan, discover_financial_plan_info, load_financial_plan_from_reference

manage_financial_plan (read / discover / upsert / copy)

oauth_ping

test_connection (structured checks, not a bare 401)

Other v2 changes:

  • OKR tools removed. Out of scope for v2; not shipped.

  • Scope is stated inline. Every tool description opens with a [LOCAL — ...] summary of what it does and does not cover, so Claude doesn't attempt discovery this server can't perform.

  • Warnings promoted. Create responses surface Planview API warnings at the top level (warnings, has_warnings, warning_hint) instead of burying them in meta.

  • Discover returns labeled keys. manage_financial_plan action=discover returns accounts and periods as [{key, description}], so you can pick "Aug 2026" without a second call.

  • Upsert accepts both payload shapes. Flat Lines: [...] or SOAP-style Lines.FinancialPlanLineDto[...] — nested envelopes are normalized on input.

What It Does

  • Projects — full CRUD, curated writable-field catalog, live attribute lookup

  • Work hierarchy — WBS tree navigation, work-node read/update

  • Tasks (SOAP) — create, read, delete via Planview's TaskService

  • Financial plans (SOAP) — read, discover structure, upsert, copy from a reference project

  • Connection diagnostics — structured config/token/ping checks

Tech Stack

  • Runtime: Python 3.10+

  • Protocol: MCP over stdio (official mcp Python SDK)

  • APIs: Planview REST (OAuth2 client credentials) + SOAP (zeep) — TaskService, FinancialPlanService

  • Validation: Pydantic for config and input models

  • HTTP: httpx (REST), zeep (SOAP)

Architecture

Claude Desktop / MCP Client
        ↓ stdio
  Local MCP Server (Python)
    ├── Planview REST API (OAuth2 client credentials)
    │     ├── Projects
    │     └── Work Items
    └── Planview SOAP API (zeep + OAuth2)
          ├── TaskService
          └── FinancialPlanService

Scope

This server is built for acting on things you can already identify — creating projects, writing financial plans, managing tasks, updating work nodes.

It deliberately does not do discovery. There is no "list all portfolios," no project search, no strategy-tree browsing. Every tool takes an id you already have. That keeps the surface small and the behavior predictable.

In practice you'll get ids from the Planview UI, from a previous call's response, or from another tool. If you use a read-oriented Planview MCP alongside this one, that pairing works fine — but nothing here depends on it.

Before You Start — Checklist

Gather these before you touch anything. You will be stuck without them.

  • API URL — Your Planview instance URL + /polaris (e.g., https://scdemo5xx.pvcloud.com/polaris) — must be lowercase

  • Client ID — From Administration → Users → OAuth2 credentials

  • Client Secret — Shown once at OAuth credential creation. If you didn't copy it, create a new one.

  • Global Tenant ID — Not obvious in the UI. Ask your Planview admin.

  • Parent structure codes — See Work Hierarchy Setup below. You cannot create a project without one.

⚠️ Do not skip this step. You will get through the entire setup and hit a wall at the end if any of these are missing or wrong.


Work Hierarchy Setup (Required for Project Creation)

manage_project action=create requires data.parent.structureCode — the work-hierarchy ($Plan) folder one level above Primary Planning Level. This server cannot discover it, so you need to grab it once from the Planview UI.

Do this before your first create and you won't have to think about it again.

  1. In Planview, go to Menu → Administration → Architecture → Primary Structures

  2. Find Work Structure in the list and click (define levels)

  3. Screenshot the tree — each node shows its name with the structure code in parentheses

  4. Paste it to Claude: "Commit these structure codes to memory for [tenant name]"

After that, project creation just works — Claude has the codes and picks the right parent.

Requires admin access. If you don't have it, ask whoever administers your tenant for a screenshot of that page — it's a one-time ask.

Two things to know:

  • Codes are per-tenant. Nothing carries between environments. Label the tenant when you commit them.

  • Resolve by code, never by name. Duplicate folder names are common (one demo tenant has three departments named "Marketing" and two nodes named "Archived Area"). The code is the only unambiguous handle.

The layer you want is where projects hang directly — typically Department, one below Division:

PlanRoot (Enterprise)
└── Active Enterprise Area
    └── Information Technology      ← Division
        ├── Mobility                ← Department  ✅ use this code
        ├── System Development      ← Department  ✅
        └── Business Applications   ← Department  ✅
            └── [your project]

Note: portfolio entity IDs are not work-hierarchy node IDs. The same business unit can be portfolio 5964 and work node 3787. They are not interchangeable.

Also distinct from alternate structures (Region, Line of Business, etc.), which live under Administration → Attributes and Column Sets → Alternate Structures. Both use structure codes; they are different trees.


Setup — Windows

Step 1: Install Python

If you've never installed Python before, that's fine. Go to python.org/downloads and download the latest version.

When the installer opens, you'll see a checkbox at the bottom that says "Add Python to PATH". Check that box. This is the most important part of the install.

After it finishes, close any open Command Prompt windows and open a fresh one:

  1. Press the Windows key, type cmd, press Enter

  2. Type these two commands, one at a time:

python --version
pip --version

You should see version numbers for both. If you see "not recognized," go back and reinstall Python with the PATH checkbox checked.

Step 2: Download this repository

  1. On the GitHub page, click the green Code button → Download ZIP

  2. Extract the zip to C:\portfoliosMCP

⚠️ Use a simple path like C:\portfoliosMCP. Do NOT put this in OneDrive, your Desktop, or any folder with spaces in the name. It will cause problems later.

⚠️ Check for a folder-inside-a-folder. After unzipping, open C:\portfoliosMCP. If you see another folder called portfoliosMCP-main instead of files like pyproject.toml, move everything up one level so pyproject.toml sits directly inside C:\portfoliosMCP.

Step 3: Install the server

  1. Open Command Prompt (Windows key → type cmd → Enter)

  2. Run these commands one at a time:

cd C:\portfoliosMCP
python -m venv venv
venv\Scripts\activate
pip install -e .

Wait for each command to finish before running the next one. The last command will download dependencies and may take a minute or two.

ℹ️ What does this do? It creates an isolated Python environment (venv) and installs the server into it. You must use pip install -e . — running pip install -r requirements.txt alone is not enough and the server will fail to start.

Step 4: Get your Python path

While still in Command Prompt, run:

where python

Copy the line that includes venv\Scripts\python.exe. It should look something like:

C:\portfoliosMCP\venv\Scripts\python.exe

You'll need this in the next step.

Step 5: Configure Claude Desktop

  1. Open Claude Desktop

  2. Go to Settings → Developer → Edit Config

Or: press Win+R, type %APPDATA%\Claude, press Enter, and open claude_desktop_config.json in Notepad.

If the file doesn't exist, create a new text file with that exact name.

Step 6: Paste this into the config file

{
  "mcpServers": {
    "portfoliosMCP_v2": {
      "command": "C:\\portfoliosMCP\\venv\\Scripts\\python.exe",
      "args": ["-m", "planview_portfolios_mcp"],
      "env": {
        "PLANVIEW_API_URL": "https://your-instance.pvcloud.com/polaris",
        "PLANVIEW_CLIENT_ID": "your_client_id",
        "PLANVIEW_CLIENT_SECRET": "your_client_secret",
        "PLANVIEW_TENANT_ID": "your_tenant_id",
        "USE_OAUTH": "true"
      }
    }
  }
}

Replace:

  • The command path with your output from Step 4

  • All four your_... values with your actual Planview credentials from the checklist

Two critical rules for this file:

  1. Double every backslash in the path. C:\portfoliosMCP must be written as C:\\portfoliosMCP. If you don't, you'll get a "Bad escaped character" error and Claude Desktop won't start properly.

  2. API URL must be lowercase. https://scdemo508.pvcloud.com/polaris — not SCDEMO508. Uppercase can cause authentication failures.

Step 7: Restart Claude Desktop

Close Claude Desktop completely — use File → Exit or right-click the icon in the system tray and quit. Just clicking the X may not fully close it. Then reopen it.

Step 8: Test it

In Claude Desktop, type:

Use test_connection to check my Planview connection

You should get a structured result with config, token, and ping checks. If any check fails, the response tells you which one — see the troubleshooting table below.


Setup — macOS

Step 1: Install Python

brew install python3

Step 2: Clone and install

git clone https://github.com/norman2112/portfoliosMCP.git
cd portfoliosMCP
python3 -m venv venv
source venv/bin/activate
pip install -e .

Step 3: Get your Python path

which python3
# Example output: /Users/yourname/portfoliosMCP/venv/bin/python3

Step 4: Open the Claude Desktop config file

# Press Cmd+Shift+G in Finder and paste this path:
~/Library/Application Support/Claude/claude_desktop_config.json

# Or from terminal:
open ~/Library/Application\ Support/Claude/claude_desktop_config.json

If the file doesn't exist, create it.

Step 5: Paste the config

{
  "mcpServers": {
    "portfoliosMCP_v2": {
      "command": "/Users/yourname/portfoliosMCP/venv/bin/python3",
      "args": ["-m", "planview_portfolios_mcp"],
      "env": {
        "PLANVIEW_API_URL": "https://your-instance.pvcloud.com/polaris",
        "PLANVIEW_CLIENT_ID": "your_client_id",
        "PLANVIEW_CLIENT_SECRET": "your_client_secret",
        "PLANVIEW_TENANT_ID": "your_tenant_id",
        "USE_OAUTH": "true"
      }
    }
  }
}

Replace the Python path with your output from Step 3. Fill in all four credential values.

Step 6: Quit Claude Desktop (Cmd+Q) and reopen it.

Step 7: Test it

Ask Claude: "Use test_connection to check my Planview connection"


Troubleshooting

What you see

What's wrong

How to fix it

python or pip is "not recognized"

Python isn't installed or isn't on PATH

Reinstall Python from python.org — check "Add Python to PATH"

"Bad escaped character in JSON"

Single backslashes in the config file

Change every \ to \\ in the command path

"No module named planview_portfolios_mcp"

Package not installed into the venv

Run pip install -e . from the repo folder (not pip install -r requirements.txt)

test_connection: token OK, ping 401

Tenant ID is wrong or empty

Almost never a stale secret — re-check PLANVIEW_TENANT_ID first

OAuth 400 error

Bad credentials, uppercase API URL, bearer token in CLIENT_SECRET, or (rarer) endpoint not binding the grant

Run test_connection and read diagnosis.verdict / next_step. credentials_rejected → fix id/secret. request_not_bound → support ticket (not a password problem). Compare config sha256_8 fingerprints for stale values

401 after a new token

Token issued, ping rejected

Almost always PLANVIEW_TENANT_ID. Run test_connection — if the token check is OK and ping fails, fix the tenant ID

401 Unauthorized

Wrong Client ID, Secret, or Tenant ID

Re-verify all credentials. Watch for extra spaces when pasting

Tools don't show up in Claude

Claude Desktop didn't fully restart

Quit via File → Exit (not just X), then reopen

Tools vanish after an edit

Server crashed on startup

Check your terminal for a stack trace, then toggle the connector off/on

JSON syntax error on startup

Malformed config file

Copy your config into jsonlint.com to find the error

Folder has no pyproject.toml

Nested folder from GitHub zip

Look one folder deeper — move contents up so pyproject.toml is at your root path


Getting Your Planview Credentials

  1. Log into Planview as admin → AdministrationUsersOAuth2 credentials tab

  2. Click Create OAuth2 credentials

  3. Name it (e.g., "MCP Server"), select Portfolios Integration

  4. Copy the Client ID and Client Secret (⚠️ secret is only shown once)

  5. Find your Tenant ID in the admin panel or ask your Planview admin


Tools

Five tools, action-dispatched. Every description opens with a [LOCAL — ...] summary stating what the tool covers and what it can't do.

test_connection

No parameters. Runs three checks and always returns a structured result rather than throwing:

  1. Config — API URL shape, client id/secret present, tenant id present. Detects a bearer JWT pasted into PLANVIEW_CLIENT_SECRET.

  2. Token — tries multipart, then form, then JSON encoding.

  3. Ping — secured ping with that token and X-Tenant-Id.

Token succeeds but ping returns 401 → tenant ID is wrong or empty. Not a stale secret.

manage_project

Action

Notes

create

Requires data.description and data.parent.structureCode. Dates default to today and +6 months. create_default_tasks=true seeds five sample tasks via SOAP.

get

Requires project_id. Response includes parent.structureCode for reuse on later creates.

update

Partial PATCH. Field IDs are case-sensitive — call action=fields first if unsure.

delete

Destructive; removes the project and children.

fields

Curated writable-field catalog (~120 fields). Optional category filter. include_live_catalog=true fetches the live attribute list.

⚠️ Do not invent StructureCode values (Status, Region, RAG, etc.) on create. They are tenant-specific and the catalog's example values are not safe to send. Omit them and let Planview apply product defaults, then PATCH with codes you've verified.

Check has_warnings after every create. See Warnings below.

Not supported: listing the work tree, browsing $Strategy, or discovering a parent code. Bring the id.

inspect_work

Action

Notes

wbs (default)

Nested WBS tree for a known project_id. Optional max_depth.

get

One work node by work_id.

list

Work items under a known project. Prefer project_id (the filter is built for you); raw filter is a fallback, e.g. project.Id .eq 1906.

update

PATCH a work node. Returns 405 on some instances — use manage_project for project-level fields.

This is the work hierarchy ($Plan), not strategy ($Strategy). It cannot enumerate the Plan tree or list parents without an id.

manage_tasks

Action

Notes

create

Requires tasks (list; length 1 is fine). Each needs Description. FatherKey optional if project_id is set. An ekey:// is minted when Key is missing so retries don't duplicate.

read

Requires task_key or task_keys. Null fields in the response do not mean the create failed.

delete

Requires task_key or task_keys. Cascades to children. Per-key results.

Task updates are not supported. SOAP Update doesn't serialize reliably with zeep. Delete and recreate, or use the UI.

SOAP Create is not atomic — the response carries per-task success/failure. Retry only the failures.

manage_financial_plan

Action

Notes

read

Plan for project_id (or entity_key) + version_key (default Actual/Forecast key://14/1). include_entries=false by default to keep the payload small.

discover

Accounts and periods with fallback: target → reference project → config. Returns accounts / periods as [{key, description}] plus bare key lists. Source is tagged. Use this when upsert says "No editable lines."

upsert

Requires plan_data with Lines. Creates the plan if it doesn't exist.

copy

Copies account structure and values from reference_project_id onto target_project_id. Dry-run unless confirm=true. Always preview first.

Preferred upsert shape:

{
  "EntityKey": "key://2/$Plan/17696",
  "VersionKey": "key://14/1",
  "Lines": [{
    "AccountKey": "key://2/$Account/3653",
    "Unit": "Currency",
    "Entries": [
      { "PeriodKey": "key://16/183", "Value": 50000 },
      { "PeriodKey": "key://16/184", "Value": 50000 }
    ]
  }]
}

SOAP-style envelopes (Lines.FinancialPlanLineDto, Entries.EntryDto) are also accepted and normalized — so a read response can be fed back in after adding entries.

⚠️ Never build PeriodKeys by incrementing. Period ids skip across fiscal-year boundaries — one tenant runs …181, 182, 183 … 187 then jumps to 193. Only use keys returned by discover or read. Prefer the labeled periods array so you can see which month you're writing to.


Behaviors Worth Knowing

Warnings are non-fatal but real

Create responses promote Planview API warnings to top-level warnings / has_warnings / warning_hint. The project does exist — do not retry the create.

The common one is InvalidDefaultValues + InvalidStructureCode, meaning a tenant-configured attribute default points at a code Planview won't accept. The field is silently left unset. Example seen in the wild:

1020 InvalidStructureCode: (2263) is not a valid choice for Region

The attribute default is stored as a code|label pair captured when it was set (2263|North America). The label is a snapshot, not a live lookup — so a correct-looking label tells you nothing about whether the code still resolves. Fix it in Administration → Attributes and Column Sets → Alternate Structures → [attribute] → Edit Attribute, either by reactivating the code (Show Deactivated Elements) or repointing the Default list.

If nothing in your workflow reads that field, ignoring it is a legitimate choice.

SOAP echoes are incomplete

upsert routinely returns Lines: [] on success. This is normal, not a failure. Always verify with action=read. Same for tasks — null fields in a read response don't mean the write failed.

Read and upsert are shaped differently

read passes SOAP's response through as-is, so collections arrive wrapped in typed envelopes (Lines.FinancialPlanLineDto[]). That wrapper is an artifact of XML→JSON conversion — XML has no array type, so a converter keys the list by its child element name. upsert normalizes both shapes on input, so the round trip works either way.

Key URI formats

  • key://2/$Plan/12345 — direct

  • ekey://2/namespace/id — external

  • search://2/$Plan?description=Name — search

Field names in SOAP payloads are PascalCase (FatherKey, not father_key).

Known Limitations

  • No discovery. No portfolio lists, project search, or strategy browsing. Every tool needs an id you already have.

  • Parent structure codes — must come from the Planview UI. See Work Hierarchy Setup.

  • inspect_work action=update — 405 on some instances. Use manage_project for project-level items.

  • Task updates — not supported. Delete and recreate.

  • inspect_work action=list without a filter — some instances require one.

Development

python -m venv venv && source venv/bin/activate
pip install -e ".[dev]"
cp .env.example .env  # Add your credentials

# Run
python -m planview_portfolios_mcp

# Test & lint
pytest
black src/ && ruff check src/ && mypy src/

Requirements

  • Python 3.10+

  • Planview Portfolios instance with OAuth API access

  • mcp>=1.0.0 for MCP SDK (stdio transport)

  • httpx for REST, zeep for SOAP — see pyproject.toml

License

MIT

Available Tools

24 tools
batch_create_tasksA

[LOCAL — bulk write operation via SOAP. Beta MCP cannot create tasks.]

Batch create multiple tasks in a single SOAP call.

Much faster than calling create_task() multiple times. Creates all tasks in a single SOAP request, significantly reducing latency for bulk creation.

Args: tasks: List of task creation dictionaries. Each dict must contain: - Description: Task description (required) - FatherKey: Parent work entity key URI (required) Optional fields: Key, ScheduleStartDate, ScheduleFinishDate, Duration, etc. (same as create_task) options: Optional WorkOptionsDto dictionary (applies to all tasks)

Returns: Dict with per-task results (SOAP may partially succeed): - success: True only if all tasks succeeded - created: List of per-task entries in the same order as tasks: - description: task description (if available) - key: created task key (for succeeded tasks) or null (for failed tasks) - status: "success" | "failed" - error: present only for failed tasks - summary: {total, succeeded, failed} - warnings: optional list of warning messages

Raises: PlanviewValidationError: If task data is invalid PlanviewAuthError: If authentication fails PlanviewError: For other errors

Example: tasks = [ { "Description": "Task 1", "FatherKey": "key://2/$Plan/12345", "ScheduleStartDate": "2024-01-01T08:00:00", "ScheduleFinishDate": "2024-01-15T17:00:00" }, { "Description": "Task 2", "FatherKey": "key://2/$Plan/12345", "ScheduleStartDate": "2024-01-16T08:00:00", "ScheduleFinishDate": "2024-01-30T17:00:00" } ] result = await batch_create_tasks(tasks)

Notes: - All tasks are created in a single SOAP call, making this much faster than individual create_task() calls - If some tasks fail, this tool still returns the successful ones so callers can avoid retrying the already-created tasks (which would create duplicates) - Response fields may be null - this is normal SOAP API behavior - Use read_task() to verify individual tasks if needed - Recommended to use external Key (ekey://) to prevent duplicates

ParametersJSON Schema
NameRequiredDescriptionDefault
tasksYesList of task dicts (each needs Description, FatherKey).
optionsNoOptional WorkOptionsDto for all tasks.

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description fully discloses behavior: bulk write via SOAP, partial success, null fields, error types. Covers success/failure handling and warnings. Provides detailed return schema and error classes.

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?

Well-structured with Args, Returns, Raises, Example, Notes. Front-loaded key info. Slightly long but each section earns its place. Could be tightened slightly.

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?

No output schema exists, so description fully covers return values, errors, and partial success behavior. Provides enough context for correct usage, including edge cases like null fields and warnings.

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?

Schema coverage is 100% but description adds significant value: specifies required fields (Description, FatherKey), optional fields, and provides a concrete example. Options parameter is explained clearly.

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: batch create tasks via SOAP, faster than individual calls. It distinguishes from siblings like create_task and batch_delete_tasks by emphasizing bulk creation and speed.

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?

Explicitly states when to use (bulk creation for speed) and when not (Beta MCP cannot create tasks). Provides alternatives like create_task for single creation and read_task for verification. Includes caution about duplicates and external keys.

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

batch_delete_tasksA

[LOCAL — bulk write operation via SOAP. Beta MCP cannot delete tasks.]

Delete multiple tasks in bulk using the SOAP TaskService.

Planview SOAP operations are not guaranteed atomic. This tool therefore returns per-key success/failure information so callers can safely retry only the failed keys (without re-deleting ones that already succeeded).

ParametersJSON Schema
NameRequiredDescriptionDefault
task_keysYes

TDQS

A3.7/5.0
Behavior3/5

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

No annotations exist, so the description carries full burden. It discloses non-atomicity and per-key success/failure returns, which is valuable. However, it does not describe output format, error conditions, permissions, or rate limits. The behavioral disclosure is adequate but not comprehensive.

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 (3 sentences) and well-structured, starting with operational context, then action, then behavioral note. Every sentence adds value, and it avoids verbosity. Slightly more could be trimmed, but it's effective.

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

Completeness3/5

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

Given 1 parameter and no output schema, the description covers purpose and key behavioral aspects (non-atomicity, retry logic). However, it omits response structure, error handling, and prerequisites. The agent likely needs more detail to correctly invoke and interpret results, leaving gaps.

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

Parameters2/5

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

With 0% schema coverage, the description should compensate but only mentions 'task_keys' as the parameter. The name is self-explanatory, but no format, constraints, or examples are provided. The description adds minimal value beyond the parameter name, leaving the agent to infer semantics.

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 explicitly states 'Delete multiple tasks in bulk using the SOAP TaskService.' It clearly identifies the action (delete), resource (multiple tasks), and distinguishes from siblings like delete_task (singular) and batch_create_tasks. The note about Beta MCP inability to delete tasks adds operational context.

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 explains non-atomic behavior and provides retry guidance: callers can safely retry only failed keys. This helps usage decisions. However, it does not explicitly contrast with delete_task for single deletions or state when not to use this tool (e.g., if atomicity is required).

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

create_projectA

[LOCAL — write operation. Beta MCP is read-only and cannot create projects.]

Create a new project.

Creates a project using the Planview Portfolios API. The payload should match the CreateProjectDtoPublic schema from the Swagger documentation.

Projects MUST have defined start and finish dates. If dates are not provided, default dates will be set: start date = today, finish date = 6 months from today.

Args: data: Project creation payload. Minimum required fields: - description: Project name/description (required) - parent: Object with structureCode (required) Optional fields: - scheduleStart: Start date (ISO 8601 format: YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS) - scheduleFinish: Finish date (ISO 8601 format: YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS) If not provided, defaults to today and 6 months from today respectively. attributes: Optional list of attributes to return in response create_default_tasks: If True, automatically creates 5 default sample tasks (Project Setup, Requirements Gathering, Design, Development, Testing)

Returns: Created project data from API response. The response may include warnings (e.g., "InvalidStructureCode", "InvalidDefaultValues") which are non-fatal. Projects are created successfully even with these warnings - they indicate configuration issues but don't prevent project creation.

Example: { "description": "Jon's MCP Project", "parent": {"structureCode": "14170"} }

With explicit dates:
{
    "description": "My Project",
    "parent": {"structureCode": "14170"},
    "scheduleStart": "2024-01-01",
    "scheduleFinish": "2024-06-30"
}

Notes: - See your instance's Swagger docs at {PLANVIEW_API_URL}/swagger/index.html for full schema details and additional optional fields like shortName, attributes, etc. - Warnings are non-fatal: Warnings like "InvalidStructureCode" or "InvalidDefaultValues" indicate Planview configuration issues (e.g., default region code not configured) but don't prevent successful project creation. Check response for warning details.

Note: On create, you MUST provide 'description' (project name) and 'parent' (structureCode of parent work item). Optional: scheduleStart, scheduleFinish (default to today and +6 months). For available writable fields, call list_field_reference() to browse by category: core_identity, dates, progress, status_assessments, investment_scoring, strategic_classification, wsjf_safe, risk, business_case_text, lifecycle_roles, financial_metrics, agileplace_integration, swot

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesProject creation payload (CreateProjectDtoPublic).
attributesNoOptional attributes to return (comma-separated string or list of names).
create_default_tasksNoIf true, create five default sample tasks via SOAP.

TDQS

A4.7/5.0
Behavior5/5

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

No annotations are provided, but the description fully compensates. It states it's a write operation, explains default date behavior, and details warning handling ('non-fatal', 'projects are created successfully even with these warnings'). It also describes the return value (created project data with possible warnings). This is comprehensive.

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 well-structured with sections (Args, Returns, Example, Notes). It front-loads key context (local write operation). However, there is slight redundancy in warning explanations appearing twice (in Returns and Notes). Overall, it is efficient for the tool's complexity but could be tightened slightly.

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 parameter count (3), one required parameter, nested objects, and no output schema, the description is very complete. It covers input format, defaults, output behavior, warning semantics, and references external Swagger docs. Examples illustrate typical usage. No gaps are apparent.

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?

The schema covers all three parameters (data, attributes, create_default_tasks). The description adds significant value beyond the schema: it breaks down required vs optional fields for 'data', provides ISO 8601 format examples, explains the effect of 'create_default_tasks', and gives full JSON examples. This greatly aids correct usage.

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 creates a new project using the Planview Portfolios API. It distinguishes from sibling tools like update_project or delete_project by specifying 'Create a new project' and detailing the required payload. The verb+resource pairing is specific and 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 explicitly mentions that Beta MCP is read-only, so this tool is for local write operations. It provides clear instructions on required fields and defaults. However, it lacks explicit guidance on when not to use this tool versus other creation tools (e.g., create_task). The non-fat warning handling is well explained.

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

create_taskA

[LOCAL — write operation via SOAP. Beta MCP cannot create tasks.]

Create a new task using SOAP TaskService.

Creates a task (planning entity below PPL) in Planview Portfolios using the SOAP API.

Args: task_data: Task data dictionary with TaskDto2 fields. Required fields: - Description: Task description (required) - FatherKey: Parent work entity key URI (required) Optional fields: - Key: External key URI (recommended to prevent duplicates) - ScheduleStartDate: Schedule start date (ISO 8601) - ScheduleFinishDate: Schedule finish date (ISO 8601) - Duration: Duration in minutes - CalendarKey: Calendar key URI - EnterProgress: Enable manual progress entry (bool) - IsMilestone: Is this a milestone (bool) - IsTicketable: Can create tickets (bool) - IsDeliverable: Is deliverable (bool) - PercentComplete: Percent complete (0-100) - WorkId: Work ID string - WorkStatusKey: Work status key URI - LifecycleAdminUserKey: Lifecycle admin user key URI - Notes: Task notes - Place: Task place/order options: Optional WorkOptionsDto dictionary: - CopyMissingValuesFromPlanview: Copy missing values from existing record (bool) - RollupActuals: Roll up actuals to parent (bool) - ClearStagingTableAfterRun: Clear staging table after run (bool, default: True)

Returns: Dict with: - success: True if operation succeeded - data: Task DTO (may have null fields - this is normal SOAP API behavior) - warnings: List of non-fatal warnings

Note: The SOAP API may return null for many fields (e.g., ScheduleStartDate, Duration)
even though the task was created successfully with those values. This is expected behavior.
Use read_task() to verify the task was created with the correct data.

Raises: PlanviewValidationError: If task data is invalid PlanviewAuthError: If authentication fails PlanviewError: For other errors

Examples: Minimal (required fields only): {"Description": "My Task", "FatherKey": "key://2/$Plan/12345"}

With external key (recommended to prevent duplicates):
    {
        "Description": "My Task",
        "FatherKey": "key://2/$Plan/12345",
        "Key": "ekey://2/namespace/task-1"
    }

With schedule dates:
    {
        "Description": "My Task",
        "FatherKey": "key://2/$Plan/12345",
        "ScheduleStartDate": "2024-01-01T08:00:00",
        "ScheduleFinishDate": "2024-01-15T17:00:00"
    }

Notes: - Field names must use PascalCase (e.g., FatherKey, not father_key) - Date format: ISO 8601 (YYYY-MM-DDTHH:MM:SS or YYYY-MM-DD) - Fields are automatically sorted alphabetically (Planview requirement) - None values are automatically filtered - Use external key (ekey://) to prevent duplicate creation

Known SOAP API Behaviors: - Response fields may be null: The SOAP API doesn't always populate all fields in the response DTO, even though the task was created successfully with those values. This is normal. The task IS created correctly in Planview - use read_task() to verify. - Warnings are non-fatal: Warnings indicate configuration issues but don't prevent creation. Check the warnings array in the response for details.

ParametersJSON Schema
NameRequiredDescriptionDefault
optionsNoOptional WorkOptionsDto.
task_dataYesTaskDto2 fields (Description, FatherKey, ...).

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations, the description compensates fully by detailing behavioral traits: write operation, SOAP API null field behavior, suggestion to use read_task for verification, non-fatal warnings, field sorting, and auto-filtering of None values. It also lists error types.

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 lengthy but well-structured with clear sections (Args, Options, Returns, etc.) and front-loaded with key purpose. Some redundancy exists (e.g., repeating 'creates a task' in multiple sentences), but overall efficient for the 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?

Given no output schema, the description thoroughly documents return values, error types, and notable behaviors (null fields, warnings). It covers the complex nested parameters and provides real-world usage context, making the tool fully understandable.

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?

The description adds extensive meaning beyond the input schema: it lists all fields within task_data (required and optional), specifies formats (PascalCase, ISO 8601), provides examples, and notes about sorting and filtering. Schema coverage is 100% but description enriches it significantly.

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 it creates a task using the SOAP TaskService, specifying it is a write operation. This distinguishes it from sibling tools like read_task, batch_create_tasks, and delete_task.

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 usage context such as 'LOCAL — write operation' and that Beta MCP cannot create tasks, and provides examples and notes on preventing duplicates. However, it lacks explicit guidance on when to use this tool versus alternatives like batch_create_tasks.

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

delete_projectA

[LOCAL — write operation. Beta MCP is read-only and cannot delete projects. WARNING: destructive operation, deletes project and all child data.]

Delete a project by ID.

Deletes a project from Planview Portfolios using the REST API. WARNING: This is destructive and will delete the project and all its child tasks, financial plans, and other associated data.

Args: project_id: The structureCode/ID of the project to delete.

Returns: Dict with deletion status.

Raises: PlanviewNotFoundError: If the project doesn't exist. PlanviewAuthError: If authentication fails. PlanviewError: For other errors.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_idYesThe structureCode/ID of the project to delete.

TDQS

A4/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It warns that the operation deletes child data and lists specific exceptions, adding valuable behavioral context beyond the schema.

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

Conciseness3/5

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

The description is structured but contains redundancy (e.g., 'Delete a project by ID.' appears twice). It could be more concise while retaining clarity.

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?

With no annotations or output schema, the description covers purpose, parameter, return value, and errors. It is fairly complete for a simple delete operation.

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%, and the schema already describes the parameter. The description repeats the parameter info without adding new semantic insight 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 clearly states it deletes a project by ID and emphasizes the destructive nature. It distinguishes itself from sibling tools like create_project and update_project.

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 notes that Beta MCP is read-only and cannot delete projects, providing context for when the tool is usable. It includes a warning about destructive behavior but does not explicitly mention alternatives.

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

delete_taskA

[LOCAL — write operation via SOAP. Beta MCP cannot delete tasks.]

Delete a task using SOAP TaskService.

Deletes a task from Planview Portfolios using the SOAP API. Note: Deleting a task will also delete all its child tasks.

Args: task_key: Task key URI in key://, search://, or ekey:// format

Returns: Dict with deletion status

Raises: PlanviewValidationError: If task_key is invalid PlanviewNotFoundError: If task is not found PlanviewAuthError: If authentication fails PlanviewError: For other errors

ParametersJSON Schema
NameRequiredDescriptionDefault
task_keyYes

TDQS

A4.2/5.0
Behavior4/5

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

The description discloses that deleting a task will also delete all its child tasks, and lists possible error types. With no annotations provided, these behavioral details are important and adequately covered.

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 front-loaded with the main action, but it contains slight redundancy (two similar sentences about using SOAP). The Args/Returns/Raises structure is well-organized.

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 (single parameter, no output schema), the description adequately covers side effects (child deletion), parameter format, error conditions, and return type. It does not fully explain the return dict structure, but this is acceptable without an output schema.

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?

Despite the schema having 0% coverage, the description's Args section adds significant meaning: it specifies the parameter format (key://, search://, or ekey:// URIs) and describes its role beyond the schema's type 'string'.

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 explicitly states 'Delete a task using SOAP TaskService.' It clearly identifies the action (delete) and resource (task), and distinguishes itself from siblings like batch_delete_tasks and delete_project.

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

Usage Guidelines3/5

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

The description includes a note that Beta MCP cannot delete tasks, which implies when not to use it. However, it lacks explicit guidance on when to use this tool over alternatives like batch_delete_tasks or delete_project, and does not provide context for prerequisites.

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

discover_financial_plan_infoA

[LOCAL — financial plan discovery with smart fallback. No Beta MCP equivalent exists.]

Discover financial plan information with smart fallback.

Attempts to read the financial plan for the target project. If that fails (e.g., project is too new), falls back to reading a reference project's financial plan to discover available accounts and periods.

Optimized to check config data first (instant), and skip slow target reads for new projects when skip_target_read=True. Use include_entries=False (default for this tool) to avoid large EntryDto arrays and reduce payload size.

Args: entity_key: Target project entity key (e.g., "key://2/$Plan/17291") version_key: Financial plan version key (default: "key://14/1" for Actual/Forecast) reference_entity_key: Optional reference project entity key for fallback. Defaults to None - if not provided and target read fails, returns config data. skip_target_read: If True, skip reading target project's plan (much faster for new projects). Defaults to False for backward compatibility. include_entries: If False, strip EntryDto arrays from each line (default False for smaller response). summary: If True, return only account_keys and period_keys (minimal response). fields: If set, return only these top-level data fields.

Returns: Dict with financial plan data including accounts and periods, or None if unavailable. May return config-based data structure for fast path.

Example: # Fast path for new projects - skip target read, use config or reference plan_info = await discover_financial_plan_info( entity_key="key://2/$Plan/17291", reference_entity_key="key://2/$Plan/3818", skip_target_read=True # Skip slow read for new project )

# Standard path - try target first, then reference
plan_info = await discover_financial_plan_info(
    entity_key="key://2/$Plan/17291",
    reference_entity_key="key://2/$Plan/3818"
)

if plan_info:
    # Extract accounts and periods
    lines = plan_info.get("data", {}).get("Lines", {}).get("FinancialPlanLineDto", [])
ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNo
summaryNo
entity_keyYes
version_keyNokey://14/1
include_entriesNo
skip_target_readNo
reference_entity_keyNo

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description must disclose all behavioral traits. It does so by explaining fallback behavior, optimization paths, config data usage, and return types. However, it does not explicitly state that the tool is read-only or if there are side effects, though it is implied.

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 well-structured with paragraphs, parameter list, returns, and example. It is front-loaded with purpose. It is somewhat long but each sentence adds value, and the organization aids readability.

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 complexity (7 parameters, no output schema, no annotations), the description is remarkably complete: it covers behavior, parameter details, return values, and provides multiple examples. An agent would have sufficient context to use 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?

Schema description coverage is 0%, but the description compensates by thoroughly explaining each parameter in the Args section, including defaults, behavior, and examples. This adds significant value over the bare 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 clearly states the purpose: 'Discover financial plan information with smart fallback.' It explains the fallback mechanism and distinguishes from siblings like read_financial_plan and load_financial_plan_from_reference by highlighting the smart fallback and configuration data optimization.

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 detailed usage guidance: when to use the fast path (skip_target_read=True for new projects) and standard path, and how to reduce payload (include_entries=False). Examples are given. However, it does not explicitly contrast with sibling tools or state when not to use this tool.

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

get_key_results_for_objectiveA

[LOCAL — OKR key results for a single objective. No Beta MCP equivalent exists.]

Get all key results for a specific objective.

Args: objective_id: The ID of the objective

Returns: Dict with key_results array

Example: { "key_results": [ { "id": 28304, "name": "Increase NPS Score", "objective_id": 17841, ... } ] }

ParametersJSON Schema
NameRequiredDescriptionDefault
objective_idYes

TDQS

A3.9/5.0
Behavior3/5

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

No annotations provided, so description carries full burden. It describes a read operation but does not disclose safety, authentication needs, or rate limits. The example provides some return transparency, but more detail on error cases or pagination would improve score.

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?

Concise and well-structured: includes a header, a clear one-sentence purpose, parameter specification, return description, and an example. No unnecessary 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?

Given the tool's simplicity (one required param, no output schema), the description fully covers what an agent needs: parameter meaning, return format via example, and purpose. No 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?

Schema has one required integer parameter 'objective_id' with 0% coverage. The description adds 'The ID of the objective' in Args, which provides semantic meaning beyond the schema type.

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', the resource 'key results', and the context 'for a specific objective'. It distinguishes from sibling tools like list_all_objectives_with_key_results and list_objectives.

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

Usage Guidelines2/5

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

No guidance on when to use this tool versus alternatives. The description mentions no Beta MCP equivalent but does not provide explicit when-to-use or when-not-to-use context relative to siblings.

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

get_projectA

[LOCAL — single project read by ID. For listing/searching projects across a portfolio, use Beta MCP's listProjectsByPortfolioId or searchProjectByName instead.]

Get a single project by id.

ParametersJSON Schema
NameRequiredDescriptionDefault
attributesNoOptional attributes to return (comma-separated string or list of names).
project_idYesProject id.

TDQS

A4.5/5.0
Behavior4/5

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

No annotations are provided, so the description carries the full burden. It indicates a read operation ('read by ID'), which is clear. However, it does not mention potential error cases, response format, or any side effects, but given the simplicity of the tool, 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 very concise, containing only two sentences. The first sentence provides usage guidance and disambiguation, the second states the core purpose. Every word earns its place 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 simple read tool with two fully described parameters and no output schema, the description is complete. It covers what the tool does, when to use it (with ID), and when to use alternatives. No additional information is necessary for effective tool 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%, so baseline is 3. The tool description does not add any additional meaning beyond the schema's parameter descriptions, which are minimal ('Project id.' and description of attributes). No elaboration or usage context is provided for the parameters.

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 it gets a single project by ID, using specific verb+resource (Get a single project by id). The bracketed note explicitly distinguishes from listing/searching siblings, referencing listProjectsByPortfolioId and searchProjectByName. This makes the tool's 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?

The description explicitly says when to use this tool (for a single project read by ID) and when not to (listing/searching across a portfolio, pointing to alternative Beta MCP tools). This provides clear guidance on tool selection.

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

get_project_attributesA

[LOCAL — raw attribute list. For natural-language attribute search, use Beta MCP's searchAttributes instead.]

List available project attributes.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It implies a simple listing operation with no side effects, but does not explicitly state that it is read-only or describe any other behavioral traits.

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 two sentences, front-loading the key action and providing immediate usage guidance without any 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 simple list tool with no output schema, the description is complete: it identifies the resource, the action, and directs users to an alternative for different needs.

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 coverage is 100%. The description adds no parameter info, but none is needed; baseline for 0 params is 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 clearly states the tool lists project attributes ('List available project attributes') and distinguishes it from searchAttributes for natural-language search, providing a specific verb and 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 explicitly tells when to use this tool (raw list) versus the alternative searchAttributes tool for natural-language search, but does not address potential confusion with get_work_attributes among siblings.

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

get_project_wbsA

[LOCAL — nested WBS tree with schedule data. For a flat hierarchy view, Beta MCP's getWorkHierarchy is an alternative.]

Get a project's WBS as a nested, lean tree.

Calls list_work with project.Id .eq {project_id} and rebuilds the parent/child structure into a sorted tree.

Node shape (lean): structureCode, description, depth, place, isMilestone, hasChildren, scheduleStart, scheduleFinish, status, constraintDate, constraintType, and children.

ParametersJSON Schema
NameRequiredDescriptionDefault
max_depthNoOptional max tree depth.
project_idYes
include_milestonesNo

TDQS

A3.9/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It explains internal behavior (calling list_work and rebuilding tree) and lists output fields, but does not disclose safety (read-only), rate limits, or potential side effects. For a read operation, this is adequate but not fully transparent.

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 well-structured with a note, purpose, implementation detail, and output shape. It is succinct without unnecessary repetition. The local/alternative note adds context but is slightly extraneous.

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 no output schema, the description provides a detailed node shape and explains the tree reconstruction logic. Missing details like pagination or error handling, but for a tree-building tool, it covers key aspects adequately.

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 low (33%), but the description adds meaning for project_id by showing its usage in the query. max_depth has schema description. include_milestones is mentioned only in schema with a default; the description does not clarify its effect. Overall, partial compensation.

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 a project's WBS as a nested, lean tree, differentiating it from a flat hierarchy alternative. It specifies it calls list_work and rebuilds parent/child structure, making the 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 provides a clear alternative (Beta MCP's getWorkHierarchy) for flat views, implying this tool is for nested views. However, it does not explicitly compare with sibling tools like list_work or get_work, leaving some guidance implicit.

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

get_workB

[LOCAL — read any single work hierarchy node by ID (including portfolio-level nodes). For listing projects within a portfolio, use Beta MCP's listProjectsByPortfolioId.]

Get a single work item by id.

ParametersJSON Schema
NameRequiredDescriptionDefault
work_idYes
attributesNoOptional attributes to return (comma-separated string or list of names).

TDQS

B3.4/5.0
Behavior2/5

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

No annotations are present, so the description must fully convey behavioral traits. It only states 'read' but omits permissions, side effects, or return format. Basic safety is implied but insufficiently transparent.

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, using two sentences. However, the second sentence ('Get a single work item by id') is redundant with the first, slightly reducing conciseness.

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

Completeness2/5

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

Given no output schema, the description should explain what the tool returns. It fails to do so, leaving the agent uncertain about response structure. Adequate for a simple tool but incomplete.

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

Parameters2/5

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

Schema coverage is 50% with only 'attributes' described. The description adds no extra meaning beyond 'by ID' for work_id. It does not clarify the format or constraints of parameters.

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 reads a single work hierarchy node by ID, including portfolio-level nodes. It distinguishes from a sibling tool (listProjectsByPortfolioId) for listing projects, providing specific verb and 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?

Provides explicit usage guidance by directing users to an alternative tool for listing projects. However, lacks further context on when to prefer this over other siblings like get_project or list_work.

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

get_work_attributesA

[LOCAL — raw work attribute list. For natural-language attribute search, use Beta MCP's searchAttributes(entity='work').]

Get available work attributes.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It reveals no behavioral details such as permissions required, rate limits, or whether the list is static or dynamic. The phrase 'raw work attribute list' is vague.

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 two short sentences, front-loaded with the main action. No unnecessary words.

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

Completeness3/5

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

Given no parameters and no output schema, the description provides minimal context. It does not explain the return format or intended use beyond 'get attributes'. For a simple list tool, it is adequate but not complete.

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?

With 0 parameters and 100% schema coverage (empty schema), the description adds no parameter information, but baseline is 4 for zero-parameter tools. No additional meaning is needed.

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 gets available work attributes, distinguishing it from sibling tools like get_project_attributes. The mention of 'raw work attribute list' specifies the output type, but does not detail what attributes are covered (e.g., custom vs system).

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 an alternative for natural-language attribute search using Beta MCP's searchAttributes, guiding when not to use this tool. This is an excellent usage guideline.

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

list_all_objectives_with_key_resultsA

[LOCAL — OKR objectives with key results. No Beta MCP equivalent exists.]

List all objectives with their key results.

This is a convenience function that fetches all objectives and optionally includes their key results in the response.

Args: limit: Maximum number of objectives per page (default: 500, max: 500) include_key_results: If True, fetch key results for each objective (default: True)

Returns: Dict with objectives and their key results: { "total_records": 1100, "objectives": [ { "id": 17841, "name": "Increase customer satisfaction", "key_results": [...], # Only if include_key_results=True ... } ] }

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
include_key_resultsNo

TDQS

A4.5/5.0
Behavior4/5

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

No annotations are provided, so the description bears full responsibility. It discloses that the tool fetches all objectives, optionally includes key results, and supports pagination with a limit parameter. It does not mention destructive actions (none), rate limits, or authentication, but for a read-only list tool, the disclosure 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.

Conciseness4/5

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

The description is well-structured with a concise main sentence followed by clear Args and Returns sections. It is not overly verbose, though the docstring format adds some extra length. 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?

With no output schema, the description includes a sample return value showing structure and field names. It covers parameter effects and pagination. For a simple list tool, the description is complete and self-contained.

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?

The input schema has 0% description coverage, but the description fully explains both parameters: limit (default 500, max 500, min 1) and include_key_results (default True, effect on response). This adds substantial meaning 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 clearly states it lists all objectives with their key results. It distinguishes from sibling tools like 'list_objectives' (which likely does not include key results) and 'get_key_results_for_objective' (which gets key results for a single objective). The verb 'list' and resource 'objectives with key results' are specific.

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 explains it's a convenience function, implying it's for retrieving both objectives and key results in one call. It does not explicitly state when to use this vs. alternatives like 'list_objectives' or 'get_key_results_for_objective', but the intent is clear from context. Slight room for more explicit guidance.

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

list_field_referenceA

[LOCAL — field discovery for write operations. For read-side attribute discovery, use Beta MCP's searchAttributes instead.]

List available writable project fields organized by category.

Use this tool to discover which field IDs to pass to update_project or create_project.

Args: category: Optional category filter. If not provided, returns all categories. Valid categories: core_identity, dates, progress, status_assessments, investment_scoring, strategic_classification, wsjf_safe, risk, business_case_text, lifecycle_roles, financial_metrics, agileplace_integration, swot

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoOptional category filter (e.g. core_identity, dates).

TDQS

A4.8/5.0
Behavior4/5

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

No annotations provided, but the description discloses the output is organized by category with optional filtering, and that fields are writable. Does not detail return structure beyond categories, but adequate for a listing 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?

Five sentences, front-loaded with purpose and local context. No wasted words; every sentence adds information (local hint, sibling reference, parameter details, categories list).

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 no output schema, the description explains the return is categorized and lists all categories. Parameter is fully documented. Ties into sibling write tools, making it self-contained for the agent.

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?

The description adds significant value over the schema by listing all valid category values (e.g., core_identity, dates), which the schema does not provide. Schema coverage is 100%, but description enriches usage clarity.

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 lists available writable project fields for write operations, distinguishing from read-side attribute discovery via sibling tool reference.

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?

Explicitly says to use this for discovering field IDs for write operations (update_project, create_project) and directs read-side usage to Beta MCP's searchAttributes instead.

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

list_objectivesA

[LOCAL — OKR objectives list. No Beta MCP equivalent exists for OKRs.]

List all objectives from the OKRs API.

Args: ids: Optional comma-separated list of objective IDs to filter by limit: Number of results to return (default: 10, max: 500) offset: Offset for pagination (default: 0)

Returns: Dict with objectives list and total_records count

Example: { "fetch_objectives": { "total_records": 1100, "objectives": [...] } }

ParametersJSON Schema
NameRequiredDescriptionDefault
idsNoOptional comma-separated objective ids.
limitNo
offsetNo

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries full burden. It discloses that it's a read operation (no destructive behavior), covers pagination and filtering behavior, and specifies the return format. However, it does not mention authentication needs 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 concise and well-structured: a one-line purpose, followed by Args, Returns, and an Example. Every part adds value without unnecessary verbosity.

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 no output schema, the description provides a return type and example, making it fairly complete for a list tool with pagination. It lacks error handling or authentication details, but those are not critical for basic usage.

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 low (33%), but the description adds meaning for all parameters: clarifies 'ids' as comma-separated, specifies default/max for 'limit', and default for 'offset'. The example output further clarifies usage.

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 action ('List all objectives') and the resource ('from the OKRs API'). It also mentions filtering and pagination, distinguishing it from siblings like 'list_all_objectives_with_key_results'.

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

Usage Guidelines3/5

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

The description implies usage for listing objectives but does not provide explicit when-to-use or when-not-to-use guidance, nor does it mention alternatives. The mention of 'No Beta MCP equivalent' provides context but not actionable direction.

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

list_workA

[LOCAL — query work items with filter (e.g., project.Id .eq X). Limited filtering support. For portfolio-scoped project lists, use Beta MCP's listProjectsByPortfolioId instead.]

List work items using a filter string (e.g., project.Id .eq 1906).

If fields is provided, the response is trimmed per work item to reduce payload size.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNoOptional fields to include per item (trims payload).
filterYesWork API filter string (e.g. project.Id .eq 1906).
attributesNoOptional attributes to return (comma-separated string or list of names).

TDQS

A4.2/5.0
Behavior3/5

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

No annotations provided, so description carries full burden. Discloses 'limited filtering support' but lacks details on pagination, rate limits, or potential side effects. Does not contradict annotations since none exist.

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?

Relatively short (two sentences plus a bracket note). The note in brackets is slightly confusing but overall efficient. Could be more structured.

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

Completeness3/5

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

No output schema, no annotations. Description covers filter and fields well but ignores attributes. Lacks specification of response format or pagination. Moderate completeness for a list tool with three parameters.

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%, baseline 3. Description adds value with an example for filter and explains that fields trims payload. Attributes parameter is not mentioned in description, so not fully leveraged.

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 'List work items using a filter string' with a specific verb and resource. Distinguishes from sibling by mentioning 'For portfolio-scoped project lists, use Beta MCP's listProjectsByPortfolioId instead.'

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?

Explicitly provides when to use ('LOCAL — query work items with filter') and when not to use ('limited filtering support, alternative for portfolio-scoped'). Gives examples and notes on field trimming.

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

load_financial_plan_from_referenceA

[LOCAL — copy financial plan from reference project. No Beta MCP equivalent exists.]

Load a financial plan onto a project by copying the account structure and values from a reference project. Defaults to dry-run mode (confirm=False) which shows a preview without writing anything. Set confirm=True to execute.

This is a heavy operation — always preview first unless you're sure.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNoMust be true to execute copy; false returns preview only.
version_keyNokey://14/1
scale_factorNo
target_project_idYes
reference_project_idYes

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations, the description discloses the copy behavior, default dry-run mode, and heavy-operation warning. It does not detail side effects (e.g., overwrite behavior) or error handling, leaving some gaps for a mutation tool.

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 structured, front-loading the purpose. The internal developer note about local/Beta could be trimmed, but overall it's efficient and earns its place.

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

Completeness3/5

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

Given 5 parameters, no output schema, and no annotations, the description covers the main functional flow but lacks detail on return values, parameter ranges, and edge cases. It is minimally viable but not fully complete for a complex copy operation.

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

Parameters2/5

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

Only the 'confirm' parameter gets partial explanation beyond the schema. Other critical parameters like 'version_key' and 'scale_factor' are unexplained, and schema coverage is only 20%, so the description fails to compensate adequately.

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 (load) and resource (financial plan) with a specific action (copying from reference project). It distinguishes from siblings like 'discover_financial_plan_info' and 'read_financial_plan' by focusing on copying.

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 explicitly mentions the dry-run default and warns that it's a heavy operation, advising to preview first. However, it does not specify when not to use this tool or compare with alternatives like 'upsert_financial_plan'.

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

oauth_pingA

[LOCAL — auth health check for this server's connection.]

Call secured ping to verify credentials.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

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

The description indicates the tool is a read-only health check, but does not explicitly state safety (e.g., non-destructive). With no annotations, the agent must infer that 'ping' is safe. Additional details about rate limits or side effects would improve transparency.

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?

Two sentences, both front-loaded with the key context '[LOCAL — auth health check]' and the action 'Call secured ping.' No unnecessary 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 ping tool with no parameters and no output schema, the description provides sufficient context to understand its purpose and use. It could briefly mention the expected response (e.g., success/failure), but is otherwise adequate.

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?

There are no parameters; the input schema is empty with 100% coverage. The description adds no parameter details, which is acceptable as there is nothing to add 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 clearly states it is an 'auth health check' and instructs to 'Call secured ping to verify credentials.' This distinguishes it from sibling tools, which are all CRUD operations on tasks, projects, etc.

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 explicitly marks it as LOCAL and for auth health checking, implying it is used to verify the server's connection credentials. While no alternatives are mentioned, the context is clear given that no sibling tool serves a similar function.

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

read_financial_planA

[LOCAL — SOAP financial plan read. No Beta MCP equivalent exists for financial plans.]

Read a financial plan for a project using SOAP FinancialPlanService.

This tool reads the financial plan structure including all account lines, entries, and periods. Use this to discover available accounts before adding new lines with upsert_financial_plan.

Args: entity_key: Project entity key (e.g., "key://2/$Plan/17288") version_key: Financial plan version key (e.g., "key://14/1" for Actual/Forecast) include_entries: If True, include EntryDto arrays for each line. Defaults to False. summary: If True, return only account_keys and period_keys (minimal response). fields: If set, return only these top-level data fields (e.g. ["EntityKey", "VersionKey", "Lines"]).

Returns: Dict with financial plan data including: - EntityKey: Project entity key - VersionKey: Version key - Lines: Array of FinancialPlanLineDto objects with account details (unless summary=True) - ModelDescription: Financial model name - VersionDescription: Version name

Raises: PlanviewValidationError: If entity_key or version_key is invalid PlanviewNotFoundError: If financial plan is not found PlanviewAuthError: If authentication fails PlanviewError: For other errors

Example: # Read financial plan for project 17288, Actual/Forecast version result = await read_financial_plan( entity_key="key://2/$Plan/17288", version_key="key://14/1" )

# Extract available accounts
lines = result.get("data", {}).get("Lines", {}).get("FinancialPlanLineDto", [])
accounts = {}
for line in lines:
    account_key = line.get("AccountKey")
    if account_key:
        accounts[account_key] = {
            "description": line.get("AccountDescription"),
            "parent": line.get("AccountParentDescription"),
            "unit": line.get("Unit"),
        }
ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNoOptional top-level fields to keep.
summaryNo
entity_keyYes
version_keyYes
include_entriesNo

TDQS

A4.7/5.0
Behavior5/5

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

No annotations exist, so description carries full burden. It openly describes it uses SOAP service, reads structure, returns specific data, and lists possible exceptions. No hidden side effects are relevant for a read operation.

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?

Well-structured with summary, args, returns, raises, and example. Every sentence adds value. No redundancy, and the length is appropriate for the complexity.

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 return values in detail despite no output schema, and explains errors. Minor ambiguity about interaction between fields and summary parameters, but overall complete.

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?

Schema coverage is only 20%, but description provides detailed explanations for all 5 parameters, including examples for keys and behavior of boolean flags like include_entries and summary.

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 it reads a financial plan for a project, specifying the resource and action. It explicitly distinguishes itself from the sibling tool upsert_financial_plan by advising to use this to discover available accounts before adding lines.

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 clear guidance: use to discover accounts before upserting. Includes example usage. Lacks explicit when-not scenarios, but the workflow is well-implied.

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

read_taskA

[LOCAL — SOAP task read by key. For reading tasks with custom attributes by project or task ID, Beta MCP's getTasksByProjectIds or getTasksByTaskIds may be richer.]

Read a task by key using SOAP TaskService.

Reads a task from Planview Portfolios using the SOAP API.

Args: task_key: Task key URI in key://, search://, or ekey:// format

Returns: Dict with task data (full TaskDto2)

Raises: PlanviewValidationError: If task_key is invalid PlanviewNotFoundError: If task is not found PlanviewAuthError: If authentication fails PlanviewError: For other errors

Example: task_key: "key://2/$Plan/12345" or: "ekey://2/namespace/task-1" or: "search://2/$Plan?description=Task Name"

ParametersJSON Schema
NameRequiredDescriptionDefault
task_keyYeskey://, search://, or ekey://

TDQS

A4.9/5.0
Behavior5/5

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

Without annotations, the description fully discloses the behavior: it uses SOAP API, reads by key, returns a TaskDto2 dict, and raises specific errors (PlanviewValidationError, PlanviewNotFoundError, etc.). No destructive action implied.

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?

Description is front-loaded with context and alternatives, then explains usage and errors. While thorough, it is slightly verbose with the full error list and example block; could be tightened slightly but still effective.

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 tool with one parameter and no output schema, the description covers purpose, usage guidelines, parameter semantics, error handling, and return type. Nothing essential is missing.

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?

Schema coverage is 100% with one parameter (task_key). The description adds significant value by providing the exact formats (key://, search://, ekey://) and concrete examples, going beyond the schema's minimal description.

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 it reads a task by key using SOAP API, with a specific verb ('read') and resource ('task'). It distinguishes itself from siblings by noting that for richer queries with custom attributes, other tools should be used.

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?

Explicitly provides when to use this tool (reading by key) and when to use alternatives (getTasksByProjectIds or getTasksByTaskIds for custom attributes). Also notes the SOAP nature and key formats.

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

update_projectA

[LOCAL — write operation. Beta MCP is read-only and cannot update projects.]

Update an existing project (partial payload).

Send only the fields you want to change. Field IDs are case-sensitive. Planview business rules may override some values (e.g., dates get calendar-aligned).

IMPORTANT CONSTRAINTS:

  • Duration is calculated from start/finish — don't send it directly

  • Lifecycle-controlled Work Status cannot be overridden via API

  • StructureCode fields: send {"structureCode": "CODE"} or {"structureCode": "CODE", "description": "LABEL"}

  • Fields marked PPL-only only work at Primary Planning Level (projects), not sub-tasks

For available writable fields, call list_field_reference() to browse by category: core_identity, dates, progress, status_assessments, investment_scoring, strategic_classification, wsjf_safe, risk, business_case_text, lifecycle_roles, financial_metrics, agileplace_integration, swot

ParametersJSON Schema
NameRequiredDescriptionDefault
updatesYesFields to patch (partial JSON object).
attributesNoOptional attributes to return (comma-separated string or list of names).
project_idYes

TDQS

A4.3/5.0
Behavior4/5

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

No annotations provided, so description carries full burden. Discloses write operation, partial updates, case sensitivity, business rule overrides, duration calculation, lifecycle constraints, StructureCode format, and PPL-only fields. Comprehensive for a mutation tool.

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 detailed but well-structured with bullet points for important constraints. Front-loaded with purpose. Every sentence adds value, though slightly verbose. Good organization aids readability.

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 tool complexity (3 params, nested objects, many constraints) and no output schema, the description covers numerous behavioral aspects and constraints. Lacks explanation of return value, but otherwise thorough.

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 67%. The description adds significant value for the 'updates' parameter: field ID case sensitivity, duration calculation, lifecycle constraints, StructureCode format, and reference to list_field_reference(). For 'project_id' and 'attributes', minimal extra info, but overall adds meaning beyond 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 clearly states 'Update an existing project (partial payload)', with a specific verb and resource. It distinguishes from sibling tools like create_project, delete_project, and multiple read-only tools.

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 guidance on when to use (partial updates), constraints (case-sensitive fields, business rules), and suggests list_field_reference() for writable fields. Does not explicitly contrast with all siblings but gives clear context.

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

update_workA

[LOCAL — write operation. Beta MCP is read-only and cannot update work items.]

Update an existing work item (partial payload).

Useful for updating phase/task fields like ExecType (execution type) on work items via PATCH /public-api/v1/work/{id}.

Note: Some instances reject PATCH on /work/{id} with HTTP 405. In that case, this tool returns a clear limitation message.

ParametersJSON Schema
NameRequiredDescriptionDefault
updatesYesFields to PATCH on the work item.
work_idYes
attributesNoOptional attributes to return (comma-separated string or list of names).

TDQS

A3.9/5.0
Behavior3/5

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

Without annotations, the description partially fulfills the burden by noting it is a write operation, uses PATCH for partial updates, and may fail with HTTP 405. But it lacks details on side effects, permissions, 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 concise, front-loaded with critical context (LOCAL, write), and efficiently covers purpose, usage, and a caveat. Every sentence adds value.

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

Completeness3/5

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

Given no output schema and 3 parameters, the description explains the operation and potential failure but does not describe the successful response format. It could be more complete for a mutation tool.

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 67%, so baseline is 3. The description adds an example field (ExecType) but does not augment parameter descriptions beyond what the schema provides for 'updates' and 'attributes'.

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 'Update' and the resource 'work item', and specifies it handles partial payloads via PATCH. It distinguishes from sibling tools like update_project by focusing on work items.

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 important context: the tool is a local write operation, not available in Beta MCP. It also notes that some instances reject PATCH and that the tool returns a clear error. However, no explicit alternatives or when-not-to-use guidance is given.

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

upsert_financial_planA

[LOCAL — SOAP financial plan write. No Beta MCP equivalent exists.]

Upsert (create or update) a financial plan using SOAP FinancialPlanService.

Creates or updates a financial plan in Planview Portfolios using the SOAP API. This is a single-line update tool optimized for simple use cases.

Args: plan_data: Financial plan data dictionary. Required fields: - Key: Financial plan key URI (e.g., "ekey://12/MyPlan") OR - EntityKey: Entity key URI (e.g., "key://2/$Plan/17286") AND - VersionKey: Version key URI (e.g., "key://14/57") - Lines: List of FinancialPlanLineDto dictionaries Each FinancialPlanLineDto requires: - AccountKey: Account key URI (e.g., "key://2/$Account/13607") - Unit: Unit type ("Currency", "Units", "Unit Cost", "Unit Price", "FTE", "Hours") - Entries: List of EntryDto dictionaries - CurrencyKey: Currency key URI (defaults to "key://1/USD" if not provided) - Attributes: Optional list of LineAttributeDto dictionaries Each EntryDto requires: - PeriodKey: Period key URI (e.g., "key://16/197") - Value: Numeric value

Returns: Dict with: - success: True if operation succeeded - data: Financial plan DTO (may have empty Lines array - this is normal SOAP API behavior) - warnings: List of non-fatal warnings (e.g., "InvalidStructureCode", "InvalidDefaultValues")

Note: The SOAP API may return empty Lines array in the response even though data was persisted.
This is expected behavior - use read_financial_plan() to verify the data was saved.

Raises: PlanviewValidationError: If plan data is invalid PlanviewAuthError: If authentication fails PlanviewError: For other errors

Examples: Minimal (single line, single period): { "EntityKey": "key://2/$Plan/17286", "VersionKey": "key://14/57", "Lines": [{ "AccountKey": "key://2/$Account/13607", "Unit": "Currency", "CurrencyKey": "key://1/USD", "Entries": [{ "PeriodKey": "key://16/197", "Value": 10000 }] }] }

Using existing plan Key:
    {
        "Key": "ekey://12/MyPlan",
        "Lines": [{
            "AccountKey": "key://2/$Account/13607",
            "Unit": "Currency",
            "Entries": [{
                "PeriodKey": "key://16/197",
                "Value": 10000
            }]
        }]
    }

Notes: - Field names must use PascalCase (e.g., AccountKey, not account_key) - Only changed or added lines must be sent - AccountKey and PeriodKey must match Planview configuration - Unit types: "Currency", "Units", "Unit Cost", "Unit Price", "FTE", "Hours" - For new projects, the financial plan may not exist yet - upsert will create it

Common Errors and Solutions: - "No editable lines were provided": The account/period keys don't match the model. Solution: Use discover_financial_plan_info() or read_financial_plan() to find valid keys. - "Account not found in model": The specified account doesn't exist for this version. Solution: Use discover_financial_plan_info() with a reference project to discover valid accounts. - "Unable to find the requested Financial Plan": Plan doesn't exist (common for new projects). Solution: Use upsert_financial_plan() directly - it creates the plan if needed.

Known SOAP API Behaviors: - Response may show empty Lines array: The SOAP API doesn't always echo back the full payload. This is normal - the data IS persisted. Use read_financial_plan() to verify. - Warnings are non-fatal: Warnings like "InvalidStructureCode" or "InvalidDefaultValues" indicate configuration issues but don't prevent successful creation. Check the warnings array in the response for details.

ParametersJSON Schema
NameRequiredDescriptionDefault
plan_dataYesFinancialPlanDto-style payload with Lines.

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description fully discloses behaviors: SOAP API may return empty Lines array but data is persisted, warnings are non-fatal, field names must be PascalCase, and lists known SOAP API behaviors. 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.

Conciseness3/5

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

The description is very thorough but excessively long (~800 words). While well-structured with sections, it could be more concise. The core message is front-loaded, but the length may hinder quick parsing.

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 tool with nested objects and no output schema, the description covers all aspects: parameters, return values, errors, examples, common errors with solutions, and known SOAP behaviors. It is complete and self-contained.

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?

The schema only describes 'plan_data' as an object, but the description adds extensive semantic detail: required fields, optional fields, examples for minimal usage and Key-based usage, notes on PascalCase, and detailed structure for FinancialPlanLineDto and EntryDto.

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 name and description clearly state 'upsert (create or update) a financial plan' using SOAP FinancialPlanService. It distinguishes itself from siblings like read_financial_plan and discover_financial_plan_info by explicitly mentioning verification and key discovery.

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 guidance on when to use alternatives: 'Use read_financial_plan() to verify' and 'Use discover_financial_plan_info() to find valid keys.' Includes common errors and solutions, and states that for new projects, the tool creates the plan if it doesn't exist.

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. 24 tool updatesv0.1.0
    • First observedbatch_create_tasks
    • First observedbatch_delete_tasks
    • First observedcreate_project
    • First observedcreate_task
    • First observeddelete_project
    • First observeddelete_task
    • First observeddiscover_financial_plan_info
    • First observedget_key_results_for_objective
    • First observedget_project
    • First observedget_project_attributes
    • First observedget_project_wbs
    • First observedget_work
    • First observedget_work_attributes
    • First observedlist_all_objectives_with_key_results
    • First observedlist_field_reference
    • First observedlist_objectives
    • First observedlist_work
    • First observedload_financial_plan_from_reference
    • First observedoauth_ping
    • First observedread_financial_plan
    • First observedread_task
    • First observedupdate_project
    • First observedupdate_work
    • First observedupsert_financial_plan

TDQS

A3.7/5.0

Scored across 24 tools

Disambiguation3/5

Tools are mostly distinct, but there is overlap between get_work and read_task (both retrieve work items/tasks) and between list_objectives and list_all_objectives_with_key_results. The descriptions provide some guidance, but an agent may struggle to choose the right tool for reading a specific task or objective.

Naming Consistency3/5

The naming follows a verb_noun pattern, but verbs are inconsistent: get, read, list, discover, load, upsert. For example, get_project uses 'get' while read_task uses 'read', and list_objectives is a 'list' while list_all_objectives_with_key_results is also a list but with a qualifier. oauth_ping does not follow the pattern.

Tool Count4/5

With 24 tools, the server covers multiple domains (projects, tasks, financial plans, OKRs) without being excessive. The count is reasonable for the complexity of Planview Portfolios, though a few tools could be merged (e.g., list_objectives into list_all_objectives_with_key_results).

Completeness3/5

The tool set covers core CRUD for projects and tasks (though task update is not explicit, only update_work), reading for OKRs, and financial plan operations. However, there are gaps: no create/update/delete for objectives, no delete for financial plans, and no search or portfolio-level operations. References to Beta MCP alternatives suggest intentional gaps.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Enables comprehensive management of OpenProject work packages, projects, comments, and relations through natural language. Supports creating, updating, and organizing tasks with assignees, watchers, hierarchies, and inter-task relationships.
    21
    -
  • A
    license
    A
    quality
    D
    maintenance
    Enables work item management in DevOps Plan systems, allowing users to create, retrieve, filter, and delete work items, as well as manage applications, projects, components, and work item types through natural language.
    14
    55 npm
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables management of PMO entities such as actions, risks, issues, projects, deliverables, decisions, KPIs, and objectives through natural language from any MCP-compatible agent.
    66 npm
    Server Side Public , v 1
  • A
    license
    A
    quality
    C
    maintenance
    Enables natural language control of OmniPlan 4 on macOS, allowing creation and manipulation of tasks, resources, dependencies, and project metadata through MCP-compatible agents.
    22
    MIT