Skip to main content
Glama

MCP for Primavera P6

Latest release License: Apache 2.0 Windows 10 and 11 M8ven Score MCP for Primavera P6 MCP server

MCP for Primavera P6: Primavera P6 MCP Server

MCP for Primavera P6 is a local Model Context Protocol (MCP) server that connects Claude, ChatGPT, Cursor, VS Code and any other MCP client to your Oracle Primavera P6 Professional schedules on Windows. It reads the P6 database itself (P6 Professional standalone, SQLite) or plain XER files and answers scheduling questions with real computations: critical path and driving path, total float, the DCMA 14-point check, look-ahead, baseline and update comparison, CPM what-if and Monte Carlo schedule risk. Unlike XER-only MCP servers, it can also write changes back to the P6 database: durations, logic, constraints, actuals, units and UDFs, each one previewed in a dry run, applied only after your confirmation, backed up first and recorded in an edit log.

MCP for Primavera P6 is an independent project. It is not affiliated with, endorsed or sponsored by Oracle. Oracle, Primavera and P6 are trademarks of Oracle and/or its affiliates.

Demo, a replay of a real run on the synthetic demo project DEMO-SS225: an AI assistant traces the driving path of MS-1100 - Project completion, then runs a what-if on PRC-TR-1040

Contents: What it does · Install · Connect your MCP client · Tools · Compared with XER-only servers · Safety · Privacy · P6 skills · FAQ · Troubleshooting

What it does

Ask your assistant "what drives the finish date?", "run a DCMA health check on the March update", "what changed since the last update?" or "what happens if procurement takes four more weeks?". The server computes the answer from the schedule; the model explains it. Dates and float come from P6's last schedule run (F9).

  • Schedule analysis: projects and EPS, WBS roll-ups, activities filtered by status, float, dates, activity codes or UDFs, relationships with the project's lag calendar rule, critical path (total float or longest path), driving path, float paths, where an activity's float comes from, float distribution, look-ahead windows.

  • Schedule quality: DCMA 14-point check with the project's own P6 thresholds, logic density and a weighted grade, comparison with earlier checks, out-of-sequence progress, dangling ends, redundant links.

  • Comparisons, what-if and risk: two updates or a baseline compared activity by activity and link by link, with slip causes and float erosion; an integrity review of an update against the previous one (questions to raise, not proof); a CPM engine checked against P6's F9 (p6_cpm_validate reports the match) for what-if scenarios and Monte Carlo risk, run in memory and never written.

  • Progress and reporting: S-curves and earned value at the data date, resource and cost summaries, groups by status, WBS or code, and a one-page Excel dashboard with native charts.

  • XER files: inspect, import (new project, baseline, update), export, or analyse XER files alone in XER-only mode, without a P6 database or P6 installed.

  • Edits (off by default): durations, constraints, actual dates, physical % complete, resource assignment units, activity UDF values, relationships, schedule options, EPS, deletes, backups and restore.

Related MCP server: P6-MCP

Install

MCP for Primavera P6 runs on Windows 10 or 11, next to P6 Professional. Nothing else to install: Python is bundled.

  1. Download P6MCP-Setup-<version>.exe from Releases and check it against SHA256SUMS.txt (certutil -hashfile P6MCP-Setup-2.0.0.exe SHA256).

  2. Run it. It installs for your Windows user only (no administrator rights) and, on its last page, offers to register the server with every MCP client it finds (Claude Desktop, Claude Code, Cursor, VS Code, LM Studio, Cline). Untick the ones you do not want.

  3. MCP for Primavera P6 Settings opens. Under Database, pick your P6 database (suggestions come from P6's own connection list), click Test connection (read only), then Use this database, and Save. The server never picks a database by itself: until you do this, every tool answers "No database configured".

  4. Restart your MCP client completely.

Release builds are not code signed yet: Windows SmartScreen may warn on first launch ("More info", "Run anyway"). Check the SHA-256 first. Other packages on the release page: a portable zip (no installation) and an MCP bundle (.mcpb, server only) that Claude Desktop installs in one click; it is also the package listed in the official MCP Registry as io.github.nizarhamza/p6-mcp.

Connect your MCP client

The installer and Settings > MCP clients write the client configuration for you: they add (or repair, or remove) only the p6mcp entry, after a timestamped backup, keeping every other entry, comment and the file's formatting. The manual steps below are for reference. In every snippet, replace <you> with your Windows user name (or copy the snippet from Settings > MCP clients > Other clients, which fills in the real path).

Claude Desktop

Either let the installer register it, or double-click the .mcpb bundle (Settings > Extensions shows it; pick the database there), or edit %APPDATA%\Claude\claude_desktop_config.json:

{
  "mcpServers": {
    "p6mcp": {
      "command": "C:\\Users\\<you>\\AppData\\Local\\Programs\\P6 MCP\\p6mcp-server.exe",
      "args": []
    }
  }
}

Quit Claude Desktop completely (also from the notification area) and start it again. The P6 skills appear as prompts in the + menu.

Cursor

The installer registers it in %USERPROFILE%\.cursor\mcp.json, or add the same mcpServers entry as Claude Desktop above to that file. Cursor lists the tools under Settings > MCP.

VS Code (GitHub Copilot agent mode)

The installer registers it in %APPDATA%\Code\User\mcp.json (VS Code Insiders: ...\Code - Insiders\User\mcp.json). By hand, run MCP: Open User Configuration and add:

{
  "servers": {
    "p6mcp": {
      "type": "stdio",
      "command": "C:\\Users\\<you>\\AppData\\Local\\Programs\\P6 MCP\\p6mcp-server.exe",
      "args": []
    }
  }
}

Then open Copilot Chat in Agent mode and pick the tools from the tools menu.

ChatGPT

ChatGPT cannot start a program on your PC, so there are two routes. Neither is tested by the maintainer yet: please report how it goes in an issue.

  • Codex (in the ChatGPT desktop app, or the Codex CLI) starts local MCP servers from %USERPROFILE%\.codex\config.toml:

    [mcp_servers.p6mcp]
    command = 'C:\Users\<you>\AppData\Local\Programs\P6 MCP\p6mcp-server.exe'
    args = []
  • ChatGPT chat reaches MCP servers over HTTPS only. OpenAI's Secure MCP Tunnel runs a small client on your PC that starts the server (stdio command above) and forwards ChatGPT's requests to it, without opening an inbound port; you then add a custom MCP server in ChatGPT with Tunnel as the connection. It needs an OpenAI platform API key and a ChatGPT plan or workspace that allows custom MCP servers. The tool results then pass through OpenAI's service, like any ChatGPT conversation.

Claude Code, LM Studio, Cline and other clients

The installer registers Claude Code (%USERPROFILE%\.claude.json), LM Studio (%USERPROFILE%\.lmstudio\mcp.json) and Cline as well. For Claude Code by hand:

claude mcp add --scope user p6mcp -- "$env:LOCALAPPDATA\Programs\P6 MCP\p6mcp-server.exe"

Any other client that starts stdio servers takes the mcpServers snippet above. Clients that need HTTP can use the local HTTP transport. From the command line (the installer uses the same commands):

& "$env:LOCALAPPDATA\Programs\P6 MCP\p6mcp-server.exe" clients list
& "$env:LOCALAPPDATA\Programs\P6 MCP\p6mcp-server.exe" clients register cursor

Settings: MCP clients

Tools

58 tools: 37 read-only (11 of them in the Basic profile), 2 that write a file, 18 write tools (off by default; a dry run, then your confirmation; a backup first) and 1 that changes the app's own settings. Generated from the code by tools/gen_docs.py.

Projects and structure

Tool

What it does

Access

Basic

p6_list_projects

Projects with data date, start, finish, status, baseline and EPS; filter by EPS

Read

yes

p6_list_eps

EPS tree with depth, path and project counts

Read

p6_project_summary

One-call overview: dates, activity counts, critical counts, % complete by units, physical and duration, baseline variance and SPI

Read

yes

p6_list_wbs

WBS tree in P6 order with roll-ups: activities, dates, float, units % and baseline planned %

Read

yes

p6_list_calendars

Calendars with work week, hours per day and holiday exceptions

Read

p6_list_udfs

User defined fields (UDF columns) with how much each one is used

Read

p6_schedule_options

Schedule options of a project, of an XER file, or both side by side

Read

Activities and relationships

Tool

What it does

Access

Basic

p6_query_activities

Search activities by name, Activity ID, WBS, status, total float, dates, activity code or UDF, with chosen columns

Read

yes

p6_get_activity

Everything about one activity: dates, durations, float, constraints, logic, resources, codes, UDFs, notebooks

Read

yes

p6_get_relationships

Predecessors and successors of an activity, lags in hours and days

Read

yes

p6_lookahead

What starts, finishes or is in progress in the next weeks, critical work flagged

Read

yes

p6_milestones

Milestones against the baseline: variance in working and calendar days, float, critical

Read

Critical path and float

Tool

What it does

Access

Basic

p6_critical_path

Critical activities as the project defines them (total float or longest path)

Read

yes

p6_driving_path

The chain of driving predecessors behind an activity's dates, back to its root cause

Read

p6_float_paths

Float paths of the last P6 schedule run, in P6 order

Read

p6_float_origin

Where an activity's total float comes from: the successor chain that sets its late dates

Read

p6_float_analysis

Total and free float distribution by range

Read

yes

Schedule quality

Tool

What it does

Access

Basic

p6_health_check

DCMA 14-point check (the project's own P6 thresholds when set), critical path test, CPLI, BEI and a weighted score

Read

yes

p6_health_check_compare

Health check now against an earlier run: what got better or worse

Read

p6_dangling

Open starts and open finishes, each with a suggested link to close it

Read

p6_redundant_links

Links that are candidates for removal (transitive, duplicate, to completed work)

Read

p6_progress_check

Out-of-sequence progress and status inconsistencies

Read

Progress and reporting

Tool

What it does

Access

Basic

p6_progress_curve

S-curve by month or week (units or cost) against the baseline, earned value at the data date

Read

p6_group_summary

Activities, units and dates grouped by status, type, WBS level or activity code

Read

p6_resource_summary

Units and costs per resource, and activities per status

Read

p6_export_dashboard

Excel project controls dashboard: one A3 page with charts, plus detail sheets

Writes a file

Comparison, what-if and risk

Tool

What it does

Access

Basic

p6_compare_projects

Two updates or a baseline compared activity by activity and link by link, with slip causes and float erosion

Read

p6_update_integrity

Review of an update against the previous one: changes a reviewer should question

Read

p6_cpm_validate

Runs the built-in CPM engine and compares it with P6's last F9, activity by activity

Read

p6_schedule_whatif

What-if in memory: add or remove links, change durations or constraints, see the new finish

Read

p6_schedule_risk

Monte Carlo schedule risk in memory: finish percentiles, on-time probability, criticality index

Read

XER files

Tool

What it does

Access

Basic

p6_inspect_xer

Reads an XER file without importing it and runs the import pre-flight checks

Read

p6_import_xer

Imports an XER as a new project, a baseline or an update of an existing project

Write

p6_export_xer

Exports a project to an XER file, schedule options included

Writes a file

Edits (off by default)

Tool

What it does

Access

Basic

p6_update_activity

Edits an activity: name, durations, constraint, actual dates, physical % complete

Write

p6_update_assignment

Sets budgeted, actual or remaining units of one resource assignment

Write

p6_update_assignments

Sets the units of many assignments in one all-or-nothing change

Write

p6_update_udf

Sets or clears one activity UDF value

Write

p6_update_udfs

Sets or clears many activity UDF values in one change

Write

p6_add_relationship

Adds a relationship (FS, SS, FF, SF, with lag)

Write

p6_add_relationships

Adds many relationships in one all-or-nothing change

Write

p6_update_relationship

Changes the type or lag of a relationship

Write

p6_update_relationships

Changes many relationships in one change

Write

p6_delete_relationship

Deletes a relationship

Write

p6_delete_relationships

Deletes many relationships in one change

Write

p6_set_schedule_options

Writes a project's schedule options, or copies them from an XER file

Write

p6_create_eps

Creates an EPS node

Write

p6_delete_activity

Deletes an activity and everything attached to it, as P6 does

Delete or replace

p6_delete_project

Deletes one or more projects, as P6 does

Delete or replace

Backups, log and diagnostics

Tool

What it does

Access

Basic

p6_backup_database

Takes a backup of the P6 database now

Write

p6_list_backups

Lists the backups, automatic (before writes) and manual

Read

p6_restore_backup

Puts a backup back in place, after a safety backup of the current database

Delete or replace

p6_edit_log

Every confirmed write, with its parameters, before and after values

Read

p6_diagnose

Configuration, database, P6 version and P6 running state at a glance

Read

yes

p6_sql_select

Read-only SQL on the P6 database, as a last resort

Read

Skill shop

Tool

What it does

Access

Basic

p6_shop_search

Searches the skill shop (ready-made P6 workflows shared on GitHub)

Read

p6_shop_get

Shows one skill of the shop in full

Read

p6_shop_install

Installs or updates a skill from the shop, after your confirmation

App settings

Compared with XER-only MCP servers

Several MCP servers read Primavera P6 XER files; some can also edit an XER and export a new one to import back into P6. MCP for Primavera P6 works on the P6 Professional database itself, and reads XER files too.

MCP for Primavera P6

Typical XER-file MCP server

Reads XER files

Yes: inspect, import, export, XER-only mode

Yes

Reads the P6 Professional database directly (every project, baselines, EPS, codes, UDFs, schedule options)

Yes

No: export an XER first

Writes changes back to P6

Yes, into the database: open P6 and press F9

No, or edits an XER you import again

Preview, confirmation token, backup before each write, restore, edit log

Yes

Not applicable, or varies

Refuses to write while P6 is running, or on an untested P6 schema

Yes

Not applicable

CPM engine checked against P6's own F9 dates (p6_cpm_validate), used for what-if and Monte Carlo risk

Yes

Varies

DCMA 14-point check with the thresholds set in P6

Yes, DCMA defaults when none are set

Varies

Excel dashboard, P6 skills (ready-made workflows)

Yes

Varies

Installation

Windows installer with a Settings window; registers your MCP clients

Usually a Python package (pip, uvx)

Runs on macOS or Linux

No: Windows only, like P6 Professional

Usually yes

P6 EPPM, or P6 on SQL Server or Oracle

No

No (XER only)

"Varies" means some XER servers do it and others do not: check the one you are looking at.

Safety

Settings: tools and safety

  • Tool profiles: Basic (11 read-only tools, suited to small local models) or Full (all 58).

  • Writes are off by default. With the Full profile and "Allow write operations", every write takes two calls: a dry run that shows the plan and returns a single-use confirmation token, then, after your explicit yes, the same call with that token. Deleting a project or an activity and restoring a backup also need a confirmation text. If the database changed in between, the write is refused.

  • A backup is taken before every write (with a retention you choose), writes are refused while P6 is running, and every write goes to the edit log with its parameters.

  • Writes are refused on a P6 schema version the server was not tested with, unless you trust it explicitly.

  • These rules are enforced by the server itself on every call, not only by the Settings window.

Writes go straight to the database and bypass P6's own application logic. The server updates the audit fields (update_date, update_user, create_*) the way P6 does and never writes planned, early or late dates or float: close P6 before writing, then open it and press F9. See SECURITY.md for the list of what the write tools can change.

Privacy

The server runs only on your PC: no cloud component, no telemetry. Its only network requests go to GitHub: the updates (releases of this repository), which you can turn off under Logs and updates, and the skill shop (reads of its public catalog when you open the Skill shop page or ask for it, at the first start of the Settings app for the core set, on Restore core skills, and with automatic updates on for newer skill versions), which you can turn off under Tools and safety (the core set then comes from the copy shipped with the app).

The data returned by the tools goes to the AI model your MCP client uses, which may be a cloud service. For confidential schedules, use a local model (for example in LM Studio).

P6 skills

P6 skills are ready-made workflows that chain the tools into one fixed report: weekly update review, schedule quality audit, safe update import, update integrity audit, schedule risk, delay what-if, baseline variance, Excel dashboard and more. They all come from the skill shop. At its first start the Settings app installs the core set from the shop (when GitHub cannot be reached, from the copy of the core set shipped with the app, updated from the shop later). Restore core skills (Skills or Skill shop page) installs the core set again: missing skills come back and edited ones get the shop's version. With automatic updates on (Logs and updates), the tray app also installs newer shop versions of your shop skills, except the ones you edited here: those show Update available on the Skill shop page, and Update asks before replacing your changes.

Most skills need the Full tool profile (the import also needs writes). MCP clients > Install skills writes each one as an Agent Skills folder p6-<name> (a SKILL.md and its reference files); the client's AI uses a skill when your request matches its description, and Claude Code also runs it as /p6-<name>:

Client

Skills folder

Claude Code, Cursor, VS Code / VS Code Insiders

%USERPROFILE%\.claude\skills (one folder read by all three)

Cline

%USERPROFILE%\.cline\skills

Update skills refreshes them after an update or a change of the tool settings; Remove skills (and uninstalling) deletes only the files the app wrote. From the command line:

& "$env:LOCALAPPDATA\Programs\P6 MCP\p6mcp-server.exe" clients skills install --detected

The server also offers them as MCP prompts: Claude Desktop lists them in the + menu, VS Code as /mcp.p6mcp.<name>, Claude Code as /mcp__p6mcp__<name>. Claude Desktop has no skills folder: export a skill as a zip file (Skills > Export) and upload it in Claude Desktop's settings to add it as a skill.

The Skills page of the Settings app lists them with whether the current tool settings offer them and where they come from (Shop, Shop edited here, Yours). Turn a skill off, edit it, or add your own (New, or Copy to my skills to start from a shop skill): a name, a title, a description that says what it does and when to use it (clients pick a skill by it), inputs written as {input} in the instructions, the P6 tools to use, and up to 5 text reference files (checklists, thresholds, examples; never scripts). The P6 rules are appended to your instructions. The Instructions page shows the instructions every client receives when it connects; turn built-in lines off (the two-step write rule stays on) or add your own, such as "When you show an activity, write it as Activity ID - Activity name". Click Save, then Update skills on the MCP clients page, and restart the MCP client for the prompts.

Skill shop

The Skill shop page lists the P6 skills of the public catalog nizarhamza/p6-mcp-shop: the core set maintained with the app and the skills other users shared. Reading it needs no account; the app reads it only when you open the page or ask your AI client (tools p6_shop_search, p6_shop_get and p6_shop_install, Full profile; an install shows the whole skill first and needs your confirmation). Read a skill before installing it: it is instructions for the AI, and a skill that uses write tools can change your schedule once you confirm the change. Turn the shop off under Tools and safety.

To share one of your skills, select it on the Skills page and click Share on GitHub: the app copies the skill to the clipboard and your browser opens the GitHub share form; sign in if asked (a free GitHub account is needed), paste the skill in the Skill field and click Create (nothing is sent by the app itself). The maintainer reviews it and, once approved, a GitHub Action checks it and publishes it in the catalog under the Apache-2.0 license. Without a GitHub account, Export the skill to a zip file and send it; Import adds a zip (or any skill folder with a SKILL.md and text files) after you review it.

Local HTTP transport

By default each client starts its own server (stdio). Under Server you can switch to a local HTTP server, hosted by the notification area app, for clients that need HTTP or to share one server:

  • listens on 127.0.0.1 only (http://127.0.0.1:<port>/mcp), with a port check;

  • every request needs Authorization: Bearer <token>; the token lives in the Windows Credential Manager (shown masked, copy, regenerate);

  • Host and Origin headers are checked to block DNS rebinding.

Excel dashboard

Ask for example "export the dashboard of DEMO-A to D:\Reports\DEMO-A.xlsx" (Full profile). The template is built into the server: p6_export_dashboard reads the last F9 and writes a finished workbook (values and native Excel charts, no formulas), so press F9 in P6 first. An existing file is replaced only when you say so (overwrite).

Sheet

Content

Dashboard

One A3 landscape page, protected (no password) with its charts fixed: 7 cards (overall progress, critical and delayed activities, schedule variance, forecast completion, remaining duration, late milestones); S-curve; finish variance by level 1 WBS in working days; WBS progress (level 1) and level 2 progress, actual against baseline planned; milestones; critical and delayed activities

Schedule Overview

Every activity under a band per WBS (opens folded to level 2): baseline, current and actual dates, % complete, labor units, original, remaining and actual durations

Critical Path

The P6 float paths of the last F9, a bold line between paths (without stored paths: the activities with total float up to near_critical_days)

Reports

DCMA 14 checks, sources, settings and definitions

Options: baseline (default the project baseline), baseline_dates (planned or current), milestones (Activity IDs), near_critical_days (10: Delayed beyond it, At risk up to it), period (month or week), prepared_by, revision, and for this export only company (shown in the sidebar) and colors ("primary,accent" in hex). Slip and variance are in working days, as P6 variance columns.

XER-only mode

Under Database > Data source, choose XER files only, add one or more XER files and click Load and check. The files are read into a private read-only copy; every read tool works on it. Load two updates of the same schedule to compare them: a Project ID already used by the first file gets a ~2 suffix.

FAQ

What is an MCP server for Primavera P6? MCP (Model Context Protocol) is the open standard AI assistants use to call tools. This server gives an assistant 58 tools that read and analyse Primavera P6 schedules, so you can ask questions in plain language and get answers computed from the schedule rather than guessed by the model.

Can the AI change my schedule? Only if you allow it. Writes are off by default; when on, each one is previewed in a dry run and applied only with a single-use token after your explicit yes, a backup is taken first, and P6 must be closed. Planned dates and float are never written: P6 computes them when you press F9.

Does my schedule leave my PC? The server runs locally and sends nothing anywhere. What the tools return goes to the AI model of your MCP client; with a cloud model that means its provider. For confidential projects use a local model, for example in LM Studio.

Which P6 versions and databases are supported? P6 Professional standalone (SQLite), tested with 25.12; other versions are read only until tested or trusted. XER files from P6 Professional 24.12 and from the server's own export. P6 EPPM and P6 Professional on SQL Server or Oracle are not supported.

Do I need P6 installed? Not for XER files: XER-only mode analyses them without P6 or a P6 database.

How does the DCMA 14-point check work? p6_health_check runs the 14 DCMA checks on the last F9, with the thresholds set in P6's schedule check settings for the project when they exist, else the DCMA defaults. The critical path test delays an activity in the server's CPM engine and runs only when that engine matches P6's dates. See the DCMA 14-point check guide.

Are the dates computed by the AI? No. Dates and float come from P6's last schedule run. What-if and risk use the server's CPM engine, and p6_cpm_validate shows how closely it matches P6's own dates on your project before you rely on it.

Which AI clients work? Claude Desktop, Claude Code, Cursor, VS Code, LM Studio and Cline are registered automatically; any MCP client that starts stdio servers or speaks Streamable HTTP works too. ChatGPT works through Codex or OpenAI's Secure MCP Tunnel (see ChatGPT).

Does it run on macOS or Linux? No. P6 Professional is a Windows program and the server is built for Windows 10 and 11.

Is it free? Yes, under the Apache License 2.0.

Tested versions

Component

Tested

Windows

Windows 11

P6 Professional standalone (SQLite)

25.12 (schema fingerprint in p6mcp/schema.py); other versions are read only until tested or trusted

XER files

written by P6 Professional 24.12, and by the server's own export

MCP clients

registration tested on sample configuration files of every client listed above; stdio and HTTP tested with the MCP Python SDK client; end-to-end use with each client is in the release checklist. Codex and the ChatGPT tunnel are not tested yet

MCP SDK

mcp 2.3 (1.8 or later supported)

Troubleshooting

  • "No database configured": open MCP for Primavera P6 Settings, select a database, Test connection, Use this database, Save.

  • A tool is "not available in the Basic profile": switch to Full under Tools and safety, Save, restart the client.

  • The client does not show the tools: restart it completely (also from the notification area), then check MCP clients: the entry may need Repair. Ask the assistant to run p6_diagnose.

  • "P6 (PM.exe) is running": close P6 before a write.

  • "Unknown P6 schema": your P6 version was not tested; reads work. You can trust the schema under Database (after a backup).

  • HTTP server error: Server shows the last error (often a port in use: pick another one).

  • Logs: Logs and updates > Open log folder (%LOCALAPPDATA%\P6MCP\logs). Settings live in %APPDATA%\P6MCP\config.json; backups, edit log and XER copies in %LOCALAPPDATA%\P6MCP.

Versions 1.x were called P6 MCP: the install folder, the program names and the settings folders keep that name, so updates and client registrations carry over.

Uninstall

Windows Settings > Apps > MCP for Primavera P6. The uninstaller removes the program, the p6mcp entries from your MCP clients and the startup entry. Your settings, backups and logs are kept.

Development

python -m venv .venv
.venv\Scripts\pip install -e .[dev]
.venv\Scripts\python -m pytest -q
.venv\Scripts\python -m p6mcp.settings_app      # Settings window
.venv\Scripts\python tools\gen_docs.py          # tool tables of README.md and site/llms.txt
.venv\Scripts\python tools\build_site.py        # landing site pages from site-src/pages
.venv\Scripts\python tools\serve_site.py        # preview site/ with its headers on http://127.0.0.1:8642

Tests run on a synthetic P6 database and synthetic XER files built by the tests (tests/fixtures/make_db.py). Never commit a real schedule, database, XER file or log. Building the installer and releasing: docs/RELEASING.md. The landing site in site/ is generated from site-src/pages by tools/build_site.py (a test fails when the two are out of step): edit the sources, never the generated pages.

To contribute, start with an issue: see CONTRIBUTING.md and the code of conduct. Accessibility: ACCESSIBILITY.md.

License

Apache License 2.0. Copyright 2026 Nizar Hamza. See NOTICE.

Primavera and P6 are trademarks of Oracle. This project is not affiliated with or endorsed by Oracle.

Available Tools

11 tools
p6_critical_pathA
Read-onlyIdempotent

Critical activities of the last P6 schedule run (F9), one page: {total, offset, returned, next_offset, rows, definition, mode_used, threshold_h, counts, schedule_state, note}. mode: project (default) follows the project setting (total float <= its hours threshold, or longest path); total_float uses that hours threshold; longest_path uses P6's driving path flag. float_threshold_days forces total float <= that many days (not with longest_path); min_float_days keeps only total float > that many days (days of each activity's calendar, not with longest_path): min_float_days=0 with float_threshold_days=10 lists the near critical activities. LOE and WBS summary activities are left out (even when P6 flags them), completed ones too unless include_completed=True. Order: total float then start, or float path order for the longest path. counts (open activities except LOE and WBS summary, any page): open, total_float, longest_path, negative_float; excluded_summary = LOE and WBS summary activities that meet the definition and the status filter but are not listed. fields= as in p6_query_activities.

NameRequiredDescriptionDefault
modeNoproject
limitNoRows per page (max 200).
fieldsNo
offsetNoRows to skip: pass next_offset from the previous page.
projectYesProject ID as shown in P6 (p6_list_projects).
min_float_daysNo
include_completedNo
float_threshold_daysNo

TDQS

A4.2/5.0
Behavior5/5

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

Goes well beyond the annotations: it discloses that LOE and WBS summary activities are excluded even when P6 flags them, that completed activities are dropped unless include_completed=True, the exact ordering (total float then start, or float path order), and the precise semantics of each counts bucket including excluded_summary. That is exactly the kind of behavior an agent cannot infer from readOnlyHint/idempotentHint.

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?

Dense but nearly every clause carries operational meaning, and the purpose is front-loaded before the mode rules. The mode paragraph is a long run-on of semicolons and parentheticals that costs some readability, but trimming it would lose real constraints.

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 an 8-parameter, no-output-schema tool it documents the return envelope, paging, ordering, exclusions and counts semantics, which is most of what an agent needs to call it correctly. Remaining gaps are the unexplained envelope keys (schedule_state, note, definition) and no mention of failure behavior for an unknown project.

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 only 38% schema coverage, the description carries the load and mostly does: mode, float_threshold_days, min_float_days, include_completed and fields (deferred to p6_query_activities) all get meaning, while limit/offset/project are already described in the schema. A few envelope keys (definition, note, schedule_state) are named but never explained, so it falls just short of fully compensating.

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?

States a specific resource and scope: critical activities of the last P6 schedule run, paged, with a named mode axis. An agent can tell it apart from p6_query_activities and p6_float_analysis by the critical-path framing, though the boundary with p6_float_analysis is only implied rather than stated.

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?

Gives clear guidance on the main variation axis: what 'project' (default), 'total_float' and 'longest_path' each mean, that the day-based thresholds cannot be combined with longest_path, and a worked example (min_float_days=0 with float_threshold_days=10 for near-critical). It does not, however, say when to prefer this tool over p6_float_analysis or p6_query_activities.

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

p6_diagnoseA
Read-onlyIdempotent

Start here when a tool reports a configuration problem. Shows the server settings in force (database, tool profile, writes allowed, restart needed), the P6 schema and version detected, whether P6 is running, the backup and edit log folders. Works without a database.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false and openWorldHint=false, so safety is covered structurally. The description adds genuinely new behavioral context: it operates without a database connection and enumerates the specific diagnostic fields it inspects, which tells the agent what evidence the call produces.

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, front-loaded with the trigger condition before the enumeration of returned fields. The parenthetical list is dense but every item is informative rather than filler.

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

Completeness5/5

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

There is no output schema, but the description compensates by listing the contents of the diagnostic report, and annotations cover the safety profile. Nothing an agent needs in order to decide to call this and interpret the result is missing.

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

Parameters4/5

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

Zero parameters, so there is nothing for the description to disambiguate; the 4 baseline applies. No parameter-level confusion is possible for this tool.

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

Purpose5/5

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

Specific verb+resource (diagnose the P6 server configuration) with an explicit enumeration of what it reports: server settings in force, P6 schema/version, running state, backup and edit-log folders. This is clearly distinct from the data-retrieval siblings (p6_list_projects, p6_query_activities, etc.), so an agent can separate it without opening a schema.

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?

"Start here when a tool reports a configuration problem" gives a concrete triggering condition, and "Works without a database" adds a precondition-free usage context. It does not, however, address the nearest sibling p6_health_check, so the boundary between diagnostics and health checking is left to inference.

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

p6_float_analysisA
Read-onlyIdempotent

Total and free float distribution of the open activities (not completed, LOE and WBS summary left out) of the last F9, in days of each activity's calendar. Buckets from edges_days (default -20, -10, -5, 0, 5, 10, 20, 44; 0 is always added): below the first edge, [a, b) below zero, exactly 0, (a, b] above zero, above the last edge, so every value falls in exactly one bucket (compared in hours, never rounded). Each bucket: total_float and free_float counts, their % of the activities, and samples (the sample_size lowest floats). no_value counts activities without a float; all_ranges_covered checks that bucket counts plus no_value equal the activities. stats: min, max, mean and median in days, total floats that are not whole days, negative, zero, critical (project definition). include_milestones=False leaves milestones out; wbs_name_contains and code_type / code_value / include_child_codes filter as in p6_query_activities (code_filter in the result, as there).

NameRequiredDescriptionDefault
projectYesProject ID as shown in P6 (p6_list_projects).
code_typeNo
code_valueNo
edges_daysNo
sample_sizeNoSample rows per check (max 50).
wbs_name_containsNo
include_milestonesNo
include_child_codesNo

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description nonetheless adds substantive behavior: exclusions (completed, LOE, WBS summary), bucket semantics including the guarantee that every value lands in exactly one bucket, the wrinkle that comparison happens in hours and is never rounded, and the internal consistency checks (no_value, all_ranges_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 purpose is front-loaded and nearly every clause carries functional information about bucket boundaries, output fields, or filters. It is a dense single paragraph with no visual structure, which hurts scanability for a long definition, but there is little filler to cut.

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 analytical tool with no output schema and low schema description coverage, the description is thorough: it defines the output shape (per-bucket total_float/free_float counts, percentages, samples), the stats block, and the integrity fields. An agent can interpret the result and call the tool correctly without further documentation.

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 only 25%, so the description must compensate. It explains edges_days bucketing in detail, restates sample_size's effect ('the sample_size lowest floats'), clarifies include_milestones, and covers wbs_name_contains / code_type / code_value / include_child_codes by delegating to p6_query_activities. The delegation rather than inline explanation keeps it short of a 5, since the agent must open another tool to fully understand the code filters.

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?

Names a specific computation (total and free float distribution) on a precisely scoped resource (open activities of the last F9), and explicitly excludes completed, LOE and WBS-summary activities. It also names the sibling whose filter semantics it mirrors (p6_query_activities), giving the agent a concrete anchor, though it never contrasts with p6_critical_path, the most adjacent tool.

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?

Usage is implied (analyze float distribution of an activity set) and the filter parameters are explicitly delegated to p6_query_activities, which is useful routing. However, there is no explicit statement of when this tool is preferable to p6_query_activities or p6_critical_path, nor any stated prerequisites.

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

p6_get_activityA
Read-onlyIdempotent

Full detail of one activity: the list fields (see p6_query_activities), secondary constraint, remaining, expected, suspend and resume dates, calendar (hours_per_day converts hours to days), WBS (wbs_code as in p6_list_wbs, wbs_path names), predecessors and successors (first 50 of each, with predecessor_count / successor_count; page further with p6_get_relationships), assignments (resource and role, quantities and costs as stored), activity codes, UDFs and notebooks (first 50 of each), lag_rule and schedule_state.

NameRequiredDescriptionDefault
projectYesProject ID as shown in P6 (p6_list_projects).
task_codeYesActivity ID (task_code).

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the safety annotations by disclosing result-shaping behavior: predecessors/successors and UDFs/notebooks are truncated to the first 50 with count fields, pagination is available via p6_get_relationships, and hours_per_day converts hours to days. This is exactly the kind of context annotations cannot provide.

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?

Front-loads the core purpose then lists field groups in one dense sentence; every clause maps to a returned element, so little is wasted, though the run-on list is heavy for a single sentence.

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 carries the burden of explaining returns and does so thoroughly, covering list fields, dates, calendar, WBS, relationships, assignments, codes and UDFs, plus truncation limits. An agent knows what to expect before calling.

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?

Both parameters are fully documented in the schema (100% coverage) with enough detail (Project ID per p6_list_projects, Activity ID task_code). The description adds no parameter-level syntax or format detail, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Full detail of one activity') and enumerates the exact field groups returned. It is clearly distinguishable from p6_query_activities (list fields it references) and p6_get_relationships (paging path it references).

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?

Implied usage is clear ('full detail of one activity', with list fields delegated to p6_query_activities), and it explicitly routes the agent to p6_get_relationships when the capped predecessor/successor lists need more. No explicit 'do not use when' or prerequisites, so it falls 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.

p6_get_relationshipsB
Read-onlyIdempotent

Relationships of an activity, one page: {total, offset, returned, next_offset, rows, lag_rule}. direction: pred, succ or both. Lag in hours (lag_h) and days (lag_d); lag_rule tells which calendar converts lag days (project schedule option, predecessor calendar by default).

NameRequiredDescriptionDefault
limitNoRows per page (max 200).
offsetNoRows to skip: pass next_offset from the previous page.
projectYesProject ID as shown in P6 (p6_list_projects).
directionNoboth
task_codeYesActivity ID (task_code).

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description rightly focuses elsewhere: it discloses the pagination contract (page shape with total/offset/returned/next_offset) and the non-obvious lag_rule calendar-conversion behavior. That is real behavioral context beyond structured fields, though it does not cover errors or empty-result behavior.

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?

Dense and front-loaded: the resource and page shape come first, then parameter semantics. Every clause carries information, though the return-field list and the lag sentences could be labeled more clearly (they read like fragments rather than an organized parameter/return block).

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?

With no output schema, the description usefully enumerates the page fields and explains lag_rule, and annotations carry the safety profile. However, it never says what each row contains (relationship type, successor ID), whether direction=both duplicates rows, or that task_code alone may be ambiguous across projects.

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 80%, so limit/offset/project/task_code are already documented and the baseline is 3. The description adds meaning only for direction (pred/succ/both), and even there it restates the enum literals without expanding the pred/succ abbreviations, so it barely exceeds the schema.

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?

States the resource precisely ("Relationships of an activity") and scopes it ("one page"), which clearly separates it from siblings like p6_get_activity or p6_query_activities. It never explicitly contrasts itself with those siblings, but the resource is unambiguous.

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

Usage Guidelines2/5

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

The description never says when to call this tool versus p6_get_activity, p6_critical_path, or p6_float_analysis, nor does it state prerequisites (e.g., that an activity's task_code is needed). The only guidance is indirect, via the direction parameter values.

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

p6_health_checkA
Read-onlyIdempotent

DCMA 14 point assessment of the last P6 schedule run (F9). checks: logic, leads, lags, long_lags, fs_links, hard_constraints, high_float, negative_float, high_duration, invalid_dates, resources, missed_tasks, critical_path_test (this server's CPM engine: the earliest lowest-float open task delayed 100 working days must move the project finish as much; not run when the engine does not match the F9, see p6_cpm_validate), cpli, bei; each {count, denominator, pct, threshold, pass, sample (15)}; then key_dates (information only: constraint dates against the must finish date, the work after them and each other; count = issues, pct = constraints with an issue). Open = not completed; LOE and WBS summary activities are left out, also as either end of a link; relationship checks count links whose successor is open. pct must stay at most the threshold, except fs_links (at least), cpli and bei (value at least), compared before rounding; pass is None when not evaluated. Thresholds: the project's Check Schedule settings (PROJPROP schedule_check, limits in hours) when stored, else DCMA defaults (limits 44 d of each calendar; resources has none: not evaluated unless thresholds= sets it); threshold_source says which. thresholds= overrides by check name (not critical_path_test); high_float_days sets the high float limit. lags and fs_links also give ladder_pairs (SS + FF between the same activities with the same lag) and their values without them (information). Logic exempts only the project start and finish milestones (listed); dangling starts and finishes (milestones left out, see p6_dangling) are information only. missed_tasks and bei need a baseline: baseline= (Project ID), else the project baseline; baseline_dates 'current' (actual, else early finish) or 'planned' (its planned finish); a task is missed when not finished or finished on a later day. duration_basis: remaining or original. cpli: working days of the project calendar (calendar days beside it). check= returns that check's full list of items as a page {total, offset, returned, next_offset, rows} with result (the check) instead of the whole report. A full run saves a snapshot for p6_health_check_compare (snapshot.id; save_snapshot=False skips it). The earlier top keys stay: no_predecessor, no_successor, hard_constraints, high_float, negative_float {count, sample}; leads_negative_lag, positive_lags, non_fs_links (links whose successor is open). checks.logic_density (after logic): links whose successor is open / open activities, value at least 1.5 (not in summary or score, which stay the DCMA 14). negative_float.worst and high_float.worst: the open activity with the lowest / highest total float {task_code, task_name, total_float_d}. weighted_score {points, grade, earned, max, checks {name: {weight, status pass / warn / fail / not_evaluated, earned}}}: logic_density 20, logic 20, critical_path_test 15, negative_float 15, high_float 10, hard_constraints 10, high_duration 5, leads 5, lags 5, fs_links 5; pass = the weight, warn = half (a failed at most check up to 2 x its threshold, a failed at least check down to 0.9 x it; no band for a zero threshold), fail = 0, not evaluated left out; points = earned / weight of the evaluated checks x 100; grade A >= 90, B >= 80, C >= 70, D >= 55, else F. engine_version: the CPM engine of the critical path test.

NameRequiredDescriptionDefault
checkNo
limitNoRows per page (max 200).
offsetNoRows to skip: pass next_offset from the previous page.
projectYesProject ID as shown in P6 (p6_list_projects).
baselineNo
thresholdsNo
save_snapshotNo
baseline_datesNocurrent
duration_basisNoremaining
high_float_daysNo

TDQS

A3.8/5.0
Behavior4/5

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

Adds substantial behavior beyond the annotations: threshold resolution order (stored PROJPROP settings -> DCMA defaults -> thresholds= override), the pass/warn/fail banding rules, weighted_score arithmetic and grading, and the 'pass is None when not evaluated' convention. It also discloses the side effect that a full run saves a snapshot and how to skip it (save_snapshot=False) — something no annotation conveys. Minor gap: nothing says what happens when the project has no schedule run or the check name is invalid.

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

Conciseness2/5

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

Front-loaded with the purpose, but the body is a single semicolon-chained block of several hundred words with no headings, lists or paragraph breaks, mixing output structure, scoring rules and parameter semantics. Very little could be cut without losing information, but the chosen format makes the information expensive to parse — the opposite of what good structure should do.

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 10-parameter, no-output-schema, high-complexity tool, the description covers the returned keys (checks, key_dates, weighted_score, engine_version, legacy top keys) and the paging contract, so an agent knows what comes back. What is missing is edge-case behavior (no baseline present, empty schedule, invalid check name) and error signaling.

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?

With only 30% schema coverage, the description carries the burden and does so thoroughly: it defines baseline (Project ID, else project baseline), baseline_dates 'current' vs 'planned', duration_basis remaining vs original, thresholds= override semantics (by check name, not critical_path_test), high_float_days, and check= returning a paged list with result. Essentially every one of the 10 parameters gains meaning absent from the schema.

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?

Opens with a specific verb+resource+scope: 'DCMA 14 point assessment of the last P6 schedule run (F9)', then enumerates every check performed. It distinguishes itself from siblings by naming p6_cpm_validate, p6_dangling and p6_health_check_compare in context. The density of the enumeration makes the core purpose harder to extract than it should be, keeping it below a 5.

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

Usage Guidelines3/5

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

Usage is implied rather than stated: the critical_path_test is 'not run when the engine does not match the F9, see p6_cpm_validate', and snapshot saving points to p6_health_check_compare. However there is no explicit statement of when to pick this tool over p6_critical_path, p6_diagnose or p6_float_analysis, which is the primary selection decision an agent faces.

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

p6_list_projectsA
Read-onlyIdempotent

Projects, one page: {total, offset, returned, next_offset, rows}. Row: Project ID, name, data date, planned start, scheduled finish, status (of the project WBS node), baseline_of, and the EPS node holding it: eps_id, eps_name, eps_path (EPS names from the top, joined with ' > '); all three None for a project outside every EPS node. EPS nodes are never listed; baselines only with include_baselines=True (baseline_of is set); exclude_templates=True leaves out the P6 template projects (status WS_Template, or no EPS node). eps= an EPS ID: the projects of that EPS node and of every EPS below it. order: 'project' (Project ID) or 'eps' (EPS tree order as p6_list_eps order='tree', then Project ID; projects outside every EPS node last).

NameRequiredDescriptionDefault
epsNo
limitNoRows per page (max 200).
orderNoproject
offsetNoRows to skip: pass next_offset from the previous page.
exclude_templatesNo
include_baselinesNo

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already cover read-only/idempotent safety, and the description adds substantial behavior the annotations cannot convey: the pagination contract with next_offset, the exact template-project definition (status WS_Template or no EPS node), and the null-handling rule for projects outside every EPS node. These are the details that prevent wrong calls and misinterpreted results.

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?

It is front-loaded with the response envelope before the field list and parameters, and nearly every clause adds information. It is a dense, run-on block with heavy parenthetical nesting that would scan better as short bullets, but there is little wasted text.

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 takes on the return-shape burden and does so explicitly, down to the page envelope and every row field including the three EPS columns. All six parameters are accounted for, so an agent has everything needed to call it and interpret the result.

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 only 33% (limit and offset only), so the description must carry eps, order, exclude_templates and include_baselines — and it does, including what 'eps' recurses into and what 'order=eps' means (EPS tree order as p6_list_eps order='tree', then Project ID, projects outside EPS last). This fully compensates for the schema gap.

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 opens by naming the resource and the exact return envelope ('Projects, one page: {total, offset, returned, next_offset, rows}') and enumerates the row fields, so an agent knows precisely what it gets. It also differentiates itself from p6_list_eps by stating 'EPS nodes are never listed'. The verb is only implied by the tool name rather than stated, which keeps it just short of a 5.

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

Usage Guidelines4/5

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

It gives concrete conditions for each optional filter: 'eps= an EPS ID: the projects of that EPS node and of every EPS below it', 'baselines only with include_baselines=True', 'exclude_templates=True leaves out the P6 template projects'. It does not state when to reach for this tool over p6_project_summary or p6_query_activities, so alternative-selection guidance is incomplete.

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

p6_list_wbsA
Read-onlyIdempotent

WBS tree in P6 order (each node before its children), one page: {total, offset, returned, next_offset, rows, root}. Row: wbs_id, parent_wbs_id, depth (project node 0), wbs_code (as P6 shows it, e.g. 'PRJ.5.1'), wbs_short_name, wbs_name, children (direct), and with rollups=True the rollup of its whole subtree: activities, open (not completed, LOE and WBS summary left out), not_started, in_progress, completed, min_tf_d and negative_float (open activities, days of each calendar), start, finish (actual, else early), budget_units, actual_units (labor plus nonlabor), units_pct (actual / at completion, as P6 Units % Complete) and bl_planned_pct: baseline planned units at the data date / baseline budget units of the subtree, x 100 (the baseline's labor and nonlabor assignments placed by the Activity ID of the current activities, linear between their planned dates as p6_progress_curve and the dashboard; None without a baseline, a data date or baseline units). baseline= a Project ID (default: the project baseline); the result says which one (baseline). parent= starts at that WBS code, full or relative to the project node ('5.1'); max_depth counts levels below the start node. root repeats the start node (unplaced = activities outside the tree, when it is the project node).

NameRequiredDescriptionDefault
limitNoRows per page (max 200).
offsetNoRows to skip: pass next_offset from the previous page.
parentNo
projectYesProject ID as shown in P6 (p6_list_projects).
rollupsNo
baselineNo
max_depthNo

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real behavioral context on top: pagination via next_offset, rollups=True expands each row to subtree totals, and explicit null conditions ('None without a baseline, a data date or baseline units') plus fallbacks ('actual, else early', 'open = not completed, LOE and WBS summary left out'). This is above what the annotations convey.

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 summary sentence is correctly front-loaded, but the rest collapses row-field definitions, parameter semantics and edge cases into one dense run-on block with inconsistent labeling. Nearly all the content is relevant, yet the wall-of-text form makes it hard to scan for the one detail an agent needs.

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 output schema, the description carries the full return contract (envelope keys total/offset/returned/next_offset/rows/root, per-row fields, rollup fields) and covers the tricky cases such as unplaced activities and bl_planned_pct nullability. It is thorough for a 7-parameter tool, though a short note on which sibling to prefer for flat activity queries would close the remaining gap.

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 only 43%, so the description must compensate, and it largely does: baseline is described as a Project ID defaulting to the project baseline with the chosen one echoed in the result, parent accepts a full or relative WBS code like '5.1', max_depth counts levels below the start node, and rollups is defined by its effect. limit/offset are left to the schema, which documents them adequately.

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 first clause states a specific verb and resource: 'WBS tree in P6 order (each node before its children), one page'. That is unmistakably a WBS-hierarchy listing rather than an activity/project tool. It never explicitly contrasts itself with siblings like p6_project_summary or p6_query_activities, so it falls short of full sibling differentiation.

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

Usage Guidelines3/5

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

Usage is only implied. The description explains what parent and max_depth do ('starts at that WBS code', 'counts levels below the start node'), which hints at when to narrow the walk, but there is no explicit 'use this when you need X, use Y for Z' guidance and no mention of any sibling tool.

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

p6_lookaheadA
Read-onlyIdempotent

Look-ahead of a project, one page: {total, offset, returned, next_offset, rows, window, weeks, data_date, counts, critical_definition, schedule_state, note}. The window starts at the data date (or from_date; a date alone starts at 00:00), lasts days= (default 14) or weeks= calendar days and is half-open [from, to). Listed: not started activities starting in it, open ones finishing in it, not started ones spanning it (start before, finish after), every in-progress activity (include_in_progress=False keeps those finishing in the window) and, with include_completed=True, completed ones whose actual dates overlap it. Open activities use their remaining dates (early when empty) of the last F9. LOE and WBS summary activities are left out. Each row has window: the categories it meets (in_progress, starting, finishing, spanning, completed), critical (open and critical under the project definition, as p6_critical_path), fcst_start (actual start, else remaining start), fcst_finish (actual finish when completed, else remaining finish) and start_week / finish_week: the week of the window holding that date (1 = the first 7 days from the window start, None outside the window; weeks lists each one's from and to). critical_only=True lists the critical ones only. counts gives the categories and critical over all pages. wbs_name_contains, code_type / code_value / include_child_codes and fields= as in p6_query_activities. Order: start, finish, Activity ID.

NameRequiredDescriptionDefault
daysNo
limitNoRows per page (max 200).
weeksNo
fieldsNo
offsetNoRows to skip: pass next_offset from the previous page.
projectYesProject ID as shown in P6 (p6_list_projects).
code_typeNo
from_dateNo
code_valueNo
critical_onlyNo
include_completedNo
wbs_name_containsNo
include_child_codesNo
include_in_progressNo

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, and the description still adds substantial behavior: LOE and WBS summary activities are omitted, open activities use remaining dates with early-date fallback from the last F9, counts are computed over all pages while rows are paged, and results are ordered by start, finish, Activity ID. Missing only edge behavior such as what happens with an empty window or invalid dates.

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 lead sentence front-loads the return keys and the rest of the paragraph is dense but every clause carries behavior an agent would otherwise have to guess. Minor waste in listing the return keys twice (once as a brace list, then again in prose).

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 must carry the return shape and it does: it names every top-level key (total, offset, returned, next_offset, rows, window, weeks, data_date, counts, critical_definition, schedule_state, note) and explains per-row fields like fcst_start/fcst_finish and start_week/finish_week. For a 14-parameter, paginated, read-only tool this is sufficient to call it correctly.

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

Parameters4/5

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

Schema coverage is only 21% across 14 parameters, so the description must compensate and largely does: from_date time defaults to 00:00, days/weeks are mutually exclusive window lengths, critical_only and include_completed/include_in_progress filter categories, and code_type/code_value/include_child_codes/fields/wbs_name_contains are explicitly delegated to p6_query_activities. limit and offset semantics are left to the schema, which covers them 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 opens with a specific verb+resource ('Look-ahead of a project') and immediately enumerates the returned payload, so an agent knows exactly what this tool produces. It is clearly distinct from p6_query_activities and p6_critical_path, which it references only for parameter and definition conventions.

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 defines the selection window precisely (starts at data date or from_date, days= or weeks=, half-open interval) and spells out exactly which activity categories are listed or excluded. What it does not do is state explicitly when to choose this over p6_query_activities or p6_float_analysis; the routing is implied by the 'look-ahead' framing rather than stated.

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

p6_project_summaryB
Read-onlyIdempotent

One-call overview of a project (values of the last F9): project (name, calendar), dates (data date, planned start, must finish by, scheduled finish, last schedule run, first start and last finish of the activities, scheduled finish minus must finish by in calendar days and in working days of the project calendar (None when it is unreadable)), activities (by status, by type, open, open milestones), relationships (successor in the project; from and to other projects), critical (counts of open activities, LOE and WBS summary left out, as p6_critical_path), percent_complete (primary = units: actual / at completion units, labor plus nonlabor, P6 Units % Complete as p6_list_wbs; p6_progress_curve gives % of the budget instead; physical: physical % weighted by budget units; duration; activities completed; units_vs_physical_mismatch: activities with units whose physical % and units % differ by more than 0.01 point), baseline (the project baseline, baselines attached, the one used: baseline= else the project baseline, its scheduled finish and data date; every key present, null without a baseline; finish variance = scheduled finish minus the baseline's scheduled finish in calendar days and in working days of the project calendar, baseline planned units % at the data date and spi_units = earned units / baseline planned units, earned value and linear spread as p6_progress_curve), counts (WBS, assignments, resources, calendars, code assignments) and schedule_state.

NameRequiredDescriptionDefault
projectYesProject ID as shown in P6 (p6_list_projects).
baselineNo

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent and non-destructive, so the safety profile is free. The description earns credit beyond that by disclosing null/edge behavior with no output schema present: dates "None when it is unreadable", baseline keys "every key present, null without a baseline", and the explicit 0.01-point threshold for units_vs_physical_mismatch. It does not cover performance characteristics or pagination/size limits for what is clearly a heavy aggregate call.

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

Conciseness2/5

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

A single run-on block of deeply nested parentheses enumerating every returned key. Key operational facts (what it does, what the baseline argument does) are not front-loaded and are hard to extract; a reader must parse the whole wall to find the parameter behavior. Not under-specified, but structurally poor and far longer than needed.

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?

With no output schema, describing return contents is necessary and the description does that thoroughly, including derived-metric definitions (physical vs units %, SPI units, finish variance). However, it omits what an agent most needs for a heavy aggregate on a complex schema: prerequisites (project ID from p6_list_projects), expected size/latency, and clear selection guidance versus the narrower sibling tools.

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 50%: `project` is documented in the schema, but `baseline` (anyOf string/null) has no schema description. The text does convey the override logic – "the one used: baseline= else the project baseline" – which partially compensates, but the phrasing is ambiguous and buried inside a parenthetical about return fields rather than clearly stating that the `baseline` argument selects the comparison baseline. Partial compensation, not full.

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?

"One-call overview of a project" gives a specific verb+resource and scope. It also implicitly distinguishes itself from siblings by naming the equivalents it mirrors (p6_critical_path, p6_list_wbs, p6_progress_curve), so an agent can see this is the umbrella tool versus the single-concern ones. The remainder of the description is a field inventory rather than purpose statement, which dilutes but does not obscure the intent.

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?

Usage is only implied by "one-call overview" – i.e. reach for this when you want everything at once. There is no explicit when-to-use/when-not, no statement of cost or latency (which matters for a tool returning this many structures), and no routing advice such as "use p6_list_projects first to obtain the project ID". The sibling references describe semantic equivalence of returned values, not tool selection.

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

p6_query_activitiesA
Read-onlyIdempotent

Search activities, one page: {total, offset, returned, next_offset, rows}, ordered by start (actual, else early) then Activity ID. status: TK_NotStart, TK_Active or TK_Complete. Dates as YYYY-MM-DD (finish_before includes that day). wbs_name_contains matches the name of the activity's own WBS node only, not its parents: for a whole branch use p6_list_wbs, or an activity code filter. Durations and float in days of each activity's calendar. code_type (activity code type name, e.g. 'Discipline'; the project's own type wins over an EPS or global one) keeps activities with a code of that type; code_value narrows it to a code by path ('CON.MEC'), short name ('MEC': every match) or name, with its child codes unless include_child_codes=False; code_filter tells what was matched. fields= keeps task_code plus the fields named, e.g. ['task_name', 'early_start_date', 'early_end_date', 'total_float_d'], for smaller pages. UDFs (user defined columns, p6_list_udfs): udf_filter = [{udf: label, op, value}], all to hold; op eq (default), ne, lt, le, gt, ge, contains (text), empty, not_empty; a date alone covers the whole day; udf_filter (info) tells what was used. udfs = labels added to each row as udfs {label: value} (None when empty).

NameRequiredDescriptionDefault
udfsNo
limitNoRows per page (max 200).
fieldsNo
offsetNoRows to skip: pass next_offset from the previous page.
statusNo
projectYesProject ID as shown in P6 (p6_list_projects).
code_typeNo
code_valueNo
udf_filterNo
code_prefixNo
start_afterNo
finish_beforeNo
name_containsNo
wbs_name_containsNo
include_child_codesNo
max_total_float_daysNo

TDQS

A4.2/5.0
Behavior5/5

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

Beyond the read-only and idempotent annotations, the description discloses the pagination envelope ({total, offset, returned, next_offset, rows}), row ordering, date-bound inclusivity, UDF filter conjunction behavior, and what code_filter/udf_filter report back. That is substantial behavioral context for an agent invoking a complex query 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 definition is dense but front-loads the core action, result shape and ordering before moving into filters. For a 16-parameter tool with low schema coverage, most clauses earn their place, though the single-block parenthetical style makes it harder to scan.

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

Completeness4/5

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

It explains the return envelope, paging, ordering, common filters, WBS caveat, code matching and UDF behavior, which is appropriate given no output schema and sparse schema descriptions. Completeness is reduced because a few schema parameters, notably name_contains, code_prefix and max_total_float_days, are not described anywhere.

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 only 19%, so the description must carry parameter meaning, and it does for many important filters: status values, date format/inclusivity, wbs_name_contains scope, code_type/code_value matching, include_child_codes, fields projection, and UDF ops/output. It still leaves code_prefix, name_contains, and max_total_float_days unexplained, so it is strong but not complete.

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 opens with a specific verb and resource: 'Search activities, one page', and it defines the result envelope and ordering. It differentiates one sibling path by saying WBS-branch searches should use p6_list_wbs, but it does not explicitly contrast against other siblings such as p6_get_activity or p6_critical_path.

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 gives clear usage context for paging, status filtering, date filters, code filters and UDF filters. It also names an explicit alternative for whole-WBS-branch queries ('use p6_list_wbs'), but it does not comprehensively explain when to choose this tool over the broader sibling set.

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. 5 tool updatesv2.0.0
    • Changedp6_critical_path1 field changed
      • addedInput schema / properties / min_float_days
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Min Float Days"
        +}
    • Changedp6_health_check2 fields changed
      • changedInput schema / properties / check / anyOf
        Previous value: -[
        -  {
        -    "enum": [
        -      "logic",
        -      "leads",
        -      "lags",
        -      "long_lags",
        -      "fs_links",
        -      "hard_constraints",
        -      "high_float",
        -      "negative_float",
        -      "high_duration",
        -      "invalid_dates",
        -      "resources",
        -      "missed_tasks",
        -      "critical_path_test",
        -      "cpli",
        -      "bei",
        -      "key_dates"
        -    ],
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "enum": [
        +      "logic",
        +      "logic_density",
        +      "leads",
        +      "lags",
        +      "long_lags",
        +      "fs_links",
        +      "hard_constraints",
        +      "high_float",
        +      "negative_float",
        +      "high_duration",
        +      "invalid_dates",
        +      "resources",
        +      "missed_tasks",
        +      "critical_path_test",
        +      "cpli",
        +      "bei",
        +      "key_dates"
        +    ],
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / thresholds / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": {
        -      "type": "number"
        -    },
        -    "description": "Threshold per check, e.g. {'hard_constraints': 1}.",
        -    "propertyNames": {
        -      "enum": [
        -        "logic",
        -        "leads",
        -        "lags",
        -        "long_lags",
        -        "fs_links",
        -        "hard_constraints",
        -        "high_float",
        -        "negative_float",
        -        "high_duration",
        -        "invalid_dates",
        -        "resources",
        -        "missed_tasks",
        -        "cpli",
        -        "bei"
        -      ]
        -    },
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {
        +      "type": "number"
        +    },
        +    "description": "Threshold per check, e.g. {'hard_constraints': 1}.",
        +    "propertyNames": {
        +      "enum": [
        +        "logic",
        +        "logic_density",
        +        "leads",
        +        "lags",
        +        "long_lags",
        +        "fs_links",
        +        "hard_constraints",
        +        "high_float",
        +        "negative_float",
        +        "high_duration",
        +        "invalid_dates",
        +        "resources",
        +        "missed_tasks",
        +        "cpli",
        +        "bei"
        +      ]
        +    },
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
    • Changedp6_list_projects3 fields changed
      • addedInput schema / properties / eps
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Eps"
        +}
      • addedInput schema / properties / exclude_templates
        Added value: +{
        +  "default": false,
        +  "title": "Exclude Templates",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / order
        Added value: +{
        +  "default": "project",
        +  "enum": [
        +    "project",
        +    "eps"
        +  ],
        +  "title": "Order",
        +  "type": "string"
        +}
    • Changedp6_list_wbs1 field changed
      • addedInput schema / properties / baseline
        Added value: +{
        +  "anyOf": [
        +    {
        +      "description": "Project ID as shown in P6 (p6_list_projects).",
        +      "minLength": 1,
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Baseline"
        +}
    • Changedp6_lookahead1 field changed
      • addedInput schema / properties / critical_only
        Added value: +{
        +  "default": false,
        +  "title": "Critical Only",
        +  "type": "boolean"
        +}
  2. 1 tool updatev1.5.1
    • Changedp6_query_activities3 fields changed
      • addedInput schema / $defs
        Added value: +{
        +  "UdfFilter": {
        +    "description": "Activities whose UDF value matches: op (default eq) against value (not for empty / not_empty).",
        +    "properties": {
        +      "op": {
        +        "enum": [
        +          "eq",
        +          "ne",
        +          "lt",
        +          "le",
        +          "gt",
        +          "ge",
        +          "contains",
        +          "empty",
        +          "not_empty"
        +        ],
        +        "title": "Op",
        +        "type": "string"
        +      },
        +      "udf": {
        +        "title": "Udf",
        +        "type": "string"
        +      },
        +      "value": {
        +        "anyOf": [
        +          {
        +            "type": "string"
        +          },
        +          {
        +            "type": "number"
        +          }
        +        ],
        +        "title": "Value"
        +      }
        +    },
        +    "required": [
        +      "udf"
        +    ],
        +    "title": "UdfFilter",
        +    "type": "object"
        +  }
        +}
      • addedInput schema / properties / udf_filter
        Added value: +{
        +  "anyOf": [
        +    {
        +      "description": "UDF conditions, all must hold.",
        +      "items": {
        +        "$ref": "#/$defs/UdfFilter"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Udf Filter"
        +}
      • addedInput schema / properties / udfs
        Added value: +{
        +  "anyOf": [
        +    {
        +      "description": "UDF labels (as in P6 columns) to add to each row under 'udfs'.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Udfs"
        +}
  3. 11 tool updatesv0.1.0
    • First observedp6_critical_path
    • First observedp6_diagnose
    • First observedp6_float_analysis
    • First observedp6_get_activity
    • First observedp6_get_relationships
    • First observedp6_health_check
    • First observedp6_list_projects
    • First observedp6_list_wbs
    • First observedp6_lookahead
    • First observedp6_project_summary
    • First observedp6_query_activities

TDQS

A3.9/5.0

Scored across 11 tools

Disambiguation5/5

Each tool has a clearly distinct role: project/WBS listing, activity search/detail, relationship drilldown, critical path listing, float distribution, lookahead, project summary, DCMA health check, and diagnosis. Although several tools deal with schedules and float, their boundaries are explicit and unlikely to cause misselection.

Naming Consistency4/5

All tools use the p6_ prefix and snake_case, making them predictable and readable. Most are verb_noun or resource_action style, while a few analytic/report tools are noun phrases such as p6_critical_path and p6_float_analysis, which is a minor deviation from a strict verb_noun pattern.

Tool Count5/5

Eleven tools is well-scoped for a P6 scheduling analytics server. Each tool covers a meaningful slice of the domain without obvious filler or excessive breadth.

Completeness3/5

Core scheduling analysis is well covered, but the surface has notable gaps and dead references: p6_query_activities mentions p6_list_udfs, p6_health_check references p6_health_check_compare and p6_cpm_validate, and p6_list_projects mentions p6_list_eps, none of which are exposed. Resource, calendar, and baseline-focused listing tools are also absent.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Enables AI assistants to analyze Primavera P6 XER files for insights into critical paths, schedule health, and project performance. It provides 23 specialized tools for managing schedule data, resources, and earned value through local or remote interfaces.
    29
    29 PyPI
    16
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables MCP-compatible AI clients to query, analyze, and mutate Oracle Primavera P6 schedules from XER files or live P6 EPPM, with tools for critical path, DCMA compliance, earned value, resources, baselines, and exports.
    35 PyPI
    1
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables assistants to read and analyze construction schedules like a scheduler: CPM, float, critical paths, DCMA 14-point, logic checks, update-to-update comparison, baseline variance, and S-curves from P6 XER and MS Project files.
    17
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables Claude and other AI agents to build, edit, and analyze Microsoft Project desktop schedules on Windows through natural language, covering tasks, WBS, dependencies, resources, calendars, baselines, critical path, resource leveling, and earned value, with live changes in Project and single-step undo. It also exports results to PDF or CSV and reads project health and time-phased data for S-curves and histograms.
    MIT