Skip to main content
Glama
JosiahSiegel

Planview MCP Server

by JosiahSiegel

Planview MCP Server

MCP server for Planview Enterprise One with Okta passwordless authentication and automated timesheet completion.

What This Does

  • 🔐 Authenticate to Planview using Okta Verify (no passwords)

  • 📊 Access Planview API (work items, projects, users)

  • 🤖 Auto-complete timesheets with /complete-timesheets command

Related MCP server: HR System MCP Server

Quick Start

Step 1: Clone and Install

git clone <your-repo-url>
cd planview-mcp
npm install
npx playwright install chromium

Step 2: Configure

Linux/macOS:

cp .mcp.json.example .mcp.json
nano .mcp.json  # or use any text editor

Windows:

copy .mcp.json.windows.example .mcp.json
notepad .mcp.json  # or use any text editor

Edit the env section in .mcp.json with your Planview details:

  • PLANVIEW_BASE_URL: Your company's Planview URL

  • OKTA_USERNAME: Your email address

Step 3: Authenticate

npm run okta-login

This opens a browser and waits for you to approve the Okta Verify notification on your phone.

Step 4: Build and Restart Claude

npm run build

Then restart Claude Code to load the MCP server.

Usage

Available Commands

Command

Description

/complete-timesheets

Auto-fills all overdue timesheets (8h/day, 40h/week)

Available Tools

Use these directly in Claude:

  • planview_get_work_items - List work items

  • planview_get_projects - List projects

  • planview_get_current_user - Get your user info

  • planview_update_work_item - Update a work item

  • planview_execute_request - Make custom API calls

More Examples

See EXAMPLES.md for detailed usage examples including:

  • Timesheet automation workflows

  • Work item management

  • Custom API requests

  • Creating your own commands

  • Troubleshooting tips

How It Works

This setup uses two MCP servers:

  1. Planview MCP (this repo) - Handles Planview API and authentication

  2. Playwright MCP (auto-installed) - Handles browser automation for timesheets

Both are configured in your .mcp.json file. Playwright MCP downloads automatically when Claude starts.

Authentication flow:

  1. You run npm run okta-login once

  2. Creates planview-auth.json with your session

  3. Both MCP servers use this session file

  4. Re-authenticate when session expires

Troubleshooting

Problem

Solution

"Authentication error"

Run npm run okta-login

"Can't see browser during login"

Add HEADLESS=true before npm run okta-login

Windows npx warning

Use .mcp.json.windows.example (has cmd /c wrapper)

"Timesheet automation fails"

Check .mcp.json has both planview and playwright servers

"Missing PLANVIEW_BASE_URL"

Check the env section in .mcp.json

Configuration

Use .mcp.json in this repo directory.

Linux/macOS: Uses npx directly

{
  "mcpServers": {
    "planview": {
      "command": "node",
      "args": ["dist/index.js"],
      "env": {
        "PLANVIEW_BASE_URL": "https://yourcompany.pvcloud.com/planview",
        "PLANVIEW_STORAGE_STATE": "planview-auth.json",
        "OKTA_USERNAME": "your.email@company.com"
      }
    },
    "playwright": {
      "command": "npx",
      "args": ["-y", "@playwright/mcp@latest"]
    }
  }
}

Windows: Requires cmd /c wrapper

{
  "mcpServers": {
    "planview": {
      "command": "node",
      "args": ["dist/index.js"],
      "env": {
        "PLANVIEW_BASE_URL": "https://yourcompany.pvcloud.com/planview",
        "PLANVIEW_STORAGE_STATE": "planview-auth.json",
        "OKTA_USERNAME": "your.email@company.com"
      }
    },
    "playwright": {
      "command": "cmd",
      "args": ["/c", "npx", "-y", "@playwright/mcp@latest"]
    }
  }
}

Global Setup (All Projects)

Add to Claude Code MCP settings with absolute paths.

Linux/macOS:

{
  "mcpServers": {
    "planview": {
      "command": "node",
      "args": ["/full/path/to/planview-mcp/dist/index.js"],
      "env": {
        "PLANVIEW_BASE_URL": "https://yourcompany.pvcloud.com/planview",
        "PLANVIEW_STORAGE_STATE": "/full/path/to/planview-mcp/planview-auth.json",
        "OKTA_USERNAME": "your.email@company.com"
      }
    },
    "playwright": {
      "command": "npx",
      "args": ["-y", "@playwright/mcp@latest"]
    }
  }
}

Windows:

{
  "mcpServers": {
    "planview": {
      "command": "node",
      "args": ["C:\\full\\path\\to\\planview-mcp\\dist\\index.js"],
      "env": {
        "PLANVIEW_BASE_URL": "https://yourcompany.pvcloud.com/planview",
        "PLANVIEW_STORAGE_STATE": "C:\\full\\path\\to\\planview-mcp\\planview-auth.json",
        "OKTA_USERNAME": "your.email@company.com"
      }
    },
    "playwright": {
      "command": "cmd",
      "args": ["/c", "npx", "-y", "@playwright/mcp@latest"]
    }
  }
}

Why Clone Instead of Direct Install?

This MCP requires cloning because:

  • Authentication creates planview-auth.json locally

  • Both MCP servers need access to the same auth file

  • Each company has different Planview URLs

  • Configuration is set in .mcp.json (committed to repo)

Direct GitHub URL installation won't work due to these local file requirements.

Development

npm run dev    # Watch mode (auto-rebuild)
npm run build  # Build once
npm start      # Run server manually

API Documentation

View Planview API docs at: https://yourcompany.pvcloud.com/planview/swagger/index.html

Security

Never commit these files (already in .gitignore):

  • .mcp.json - Your configuration with credentials

  • planview-auth.json - Your session

License

MIT

Available Tools

7 tools
planview_execute_requestB

Execute a custom API request to Planview. Useful for advanced operations not covered by other tools.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataNoOptional request body data
methodYesHTTP method (GET, POST, PUT, PATCH, DELETE)
endpointYesAPI endpoint path (e.g., "/public-api/v1/work")

TDQS

B3.4/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the burden of behavioral disclosure. It only says 'custom API request' without mentioning that this tool can issue GET, POST, PUT, PATCH, or DELETE calls, may mutate or delete data, requires authentication, or can have side effects. The phrase 'advanced operations' hints at risk but does not meaningfully disclose behavior.

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

Conciseness5/5

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

The description is two short sentences with no filler. The core action is front-loaded and the usage hint is concise. Every word earns its place.

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?

For a raw API execution tool with no output schema and no annotations, the description is under-specified. It does not clarify response format, error behavior, endpoint base URL conventions, authentication expectations, or the destructive potential of methods like DELETE. An agent would have too little context to safely invoke this tool compared to the specialized siblings.

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 the input schema already documents method, endpoint, and optional data. The description adds no parameter-specific meaning beyond calling the request 'custom,' which is acceptable but not additive. This warrants the baseline score of 3.

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

Purpose4/5

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

The description clearly identifies the action ('Execute a custom API request to Planview') and distinguishes it from the sibling tools by positioning it for advanced operations not covered elsewhere. It is slightly generic because it does not specify what kinds of requests or outcomes are involved, but it is sufficient for a generic gateway tool.

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 says this tool is 'useful for advanced operations not covered by other tools,' which gives clear when-to-use context and implies that the specialized sibling tools should be preferred when applicable. It does not explicitly name alternatives or state hard exclusion criteria, so it falls just short of a 5.

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

planview_get_current_userA

Get information about the currently authenticated user

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

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 carries the full burden and does disclose the core read-only behavior via 'Get information'. It does not mention response contents, authentication requirements, or failure modes, but for a simple no-parameter getter these omissions are less impactful.

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?

A single sentence with no filler; the core action and target are front-loaded. Nothing extraneous is included.

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 current-user getter with no parameters and no output schema, the description is nearly complete for invoking the tool. It could add what fields are returned or clarify that the result is the authenticated caller's profile, but the current wording is enough to select and call it.

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

Parameters4/5

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

The tool has zero parameters, so the schema fully covers parameter semantics vacuously. The description does not need to explain parameters, and the baseline for zero-parameter tools applies.

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

Purpose4/5

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

The description uses a specific verb ('Get') and a specific resource ('information about the currently authenticated user'), making the tool's purpose immediately clear. It is naturally distinct from sibling tools focused on work items, projects, and requests, though it does not explicitly call out that distinction.

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 phrase 'currently authenticated user' implies the tool is used when the agent needs the identity or profile of the caller, but no explicit when-to-use or when-not-to-use guidance is provided. There are no sibling user-focused tools to contrast with, so the implied usage is reasonably clear.

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

planview_get_projectA

Get details of a specific project by ID

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe project ID

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden. 'Get details' indicates a read operation and implies no destructive side effects, but it does not disclose error behavior, authorization requirements, or return format. This is acceptable for a simple read but not rich.

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?

A single front-loaded sentence with no redundant words or filler. Every piece of information in the description is necessary.

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 one-parameter read-only lookup tool, the description gives enough to invoke it correctly. It could mention what kind of details are returned, but the low complexity and lack of an output schema make the current text adequate.

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?

Scheme coverage is 100% because the only parameter 'id' is documented as 'The project ID'. The description adds little beyond confirming the lookup is by ID, so it stays at the baseline for well-covered schemas.

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

Purpose5/5

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

The description uses a specific verb and resource ('Get details of a specific project') and explicitly scopes the call to a project by ID, distinguishing it from the sibling planview_get_projects. An agent can clearly tell this is the singular lookup tool.

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 'by ID' qualifier provides clear context: use this when you have a project ID and need a single project record. It does not explicitly name alternatives or exclusion criteria, but the intended use is evident.

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

planview_get_projectsC

Get a list of projects from Planview with optional filters

ParametersJSON Schema
NameRequiredDescriptionDefault
filtersNoOptional filters to apply

TDQS

C2.8/5.0
Behavior2/5

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

With no annotations, the description carries the full burden for behavioral disclosure. It communicates a basic read operation but does not mention pagination, result shape, default behavior, auth requirements, or whether filters are required for large datasets. This is a minimal disclosure for a list 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?

The description is one short, direct sentence with no filler or unnecessary clauses. It is front-loaded with the core operation and is as concise as possible at this level of detail.

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?

The tool has one nested object parameter, no output schema, and no annotations, so the description must explain enough about expected behavior and return values. It does not clarify what filters are valid, what the returned list contains, or how it differs from sibling tools, leaving the agent without enough context to invoke it confidently.

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?

Although schema description coverage is reported as high, the only parameter's schema description is a tautology ('Optional filters to apply') and the tool description merely repeats that filters are optional. Neither source defines what filter keys, operators, or value types are supported, so an agent cannot understand how to populate the parameter.

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

Purpose4/5

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

The description clearly states the action ('Get a list') and the resource ('projects'), and the plural form helps distinguish it from the singular 'get_project' sibling. However, it does not explicitly address why a caller would choose this over related tools like get_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 Guidelines2/5

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

There is no guidance about when to use this tool versus alternatives. The description only hints that filters are optional, but does not say when filtering is needed, how to structure filters, or when to prefer a sibling tool.

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

planview_get_work_itemA

Get details of a specific work item by ID

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe work item ID

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are provided, so the description must convey safety and side effects. The verb 'Get' implies a read operation, but the description does not explicitly confirm it has no side effects, does not require authorization, or describe error behavior. It is adequate but minimal.

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?

One short sentence carrying precisely the essential information: the action, the object, and the selection key. No filler, no repetition of what the schema already says.

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

Completeness4/5

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

For a simple single-parameter getter tool, the description covers the core call: what it acts on, the identifying input, and the result (details). It does not document response structure or errors, but the lack of an output schema and the simplicity of the tool make the description adequate.

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 single id parameter is already described as 'The work item ID'. The description merely repeats the 'by ID' concept without adding format, source, or behavioral expectations, so it adds no real value beyond the schema.

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

Purpose5/5

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

The description uses a specific verb ('Get') and resource ('details of a specific work item'), and explicitly scopes by ID, making it clear this is a singular fetch operation. This distinguishes it from the plural sibling planview_get_work_items without requiring the schema.

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

Usage Guidelines3/5

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

The description implies the tool should be used when you have a specific ID and need its details, and the sibling names suggest alternatives like update or list. But it does not explicitly state when not to use it or contrast it with alternatives, leaving usage guidance mostly implied.

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

planview_get_work_itemsA

Get a list of work items from Planview with optional filters

ParametersJSON Schema
NameRequiredDescriptionDefault
filtersNoOptional filters to apply (e.g., {"status": "Active"})

TDQS

A3.7/5.0
Behavior3/5

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

No annotations are present, so the description must carry behavioral information. 'Get a list' implies a read-only retrieval that returns multiple work items, and 'optional filters' implies result scoping. However, it does not disclose defaults when no filters are supplied, pagination, limits, or response shape.

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?

One short sentence that leads with the verb and object. It contains no filler and is appropriately sized for a simple endpoint with a single optional parameter.

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?

For a tool with one optional parameter and no output schema, the description gives the essential call shape. But it does not state what happens when no filters are provided, how results are returned, or when to prefer the singular variant, leaving some information for the agent to infer.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already documents the optional filters object with a concrete example. The description only repeats 'optional filters' and adds no new 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 states a specific operation—getting a list of work items—and the plural 'list' distinguishes it from the sibling tool planview_get_work_item. It also mentions optional filters as part of the operation.

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?

No explicit guidance is given about when to use this tool versus planview_get_work_item or planview_update_work_item. The plural vs singular naming implies this is for bulk retrieval, but the description leaves that inference to the agent.

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

planview_update_work_itemC

Update a work item with new data

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesThe work item ID
dataYesThe data to update (e.g., {"status": "Completed", "notes": "Task finished"})

TDQS

C2.9/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 behavioral disclosure burden. It only restates the mutation ('Update a work item') and adds no context about side effects, idempotency, permissions, response behavior, or error cases.

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 a single concise sentence and is easy to scan. The phrase 'with new data' is somewhat redundant since an update inherently involves new data, but it is not misleading or verbose.

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?

For a simple two-parameter update tool, the schema covers the inputs adequately and the purpose is clear. However, with no annotations, no output schema, and no behavioral explanation, the description leaves the agent without expectations about return values or side effects.

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

Parameters3/5

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

Schema description coverage is 100%, and the schema already documents both parameters including an example for data. The description adds no additional meaning beyond what the schema provides, so the baseline of 3 applies.

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

Purpose4/5

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

The description states a specific verb, 'update', and a clear resource, 'work item'. It is distinguishable from the get_* siblings by the update verb, though it does not explicitly differentiate itself from planview_execute_request.

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?

There is no guidance on when to use this tool versus getting a work item or executing a generic request. No conditions, prerequisites, or exclusions are provided.

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. 7 tool updatesv1.0.0
    • First observedplanview_execute_request
    • First observedplanview_get_current_user
    • First observedplanview_get_project
    • First observedplanview_get_projects
    • First observedplanview_get_work_item
    • First observedplanview_get_work_items
    • First observedplanview_update_work_item

TDQS

A3.6/5.0

Scored across 7 tools

Disambiguation5/5

Each tool targets a distinct resource or action: work items, projects, current user, and a catch-all custom request tool that is explicitly positioned for operations not otherwise covered. There is no meaningful overlap between the specific get/update tools.

Naming Consistency5/5

All tools follow a consistent planview_ prefix and use clear verb_noun naming: get_work_items, get_work_item, update_work_item, get_projects, get_project, execute_request, get_current_user. The pattern is predictable and easy to navigate.

Tool Count5/5

Seven tools is a well-scoped size for a project management server. Each tool serves a clear purpose, and the set is neither bloated nor too thin.

Completeness3/5

The server covers listing, reading, and updating work items, plus reading projects, but lacks direct create/delete operations for common resources. The custom execute_request tool can fill some gaps, but the dedicated surface is incomplete for full lifecycle management.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers