Read-only P6 / MS Project schedule analysis: CPM, float, DCMA 14-point, logic checks, S-curves.
Runs on your machine from its package; the steps are below.
At most: creates or changes data: records, files, settings.
Odel charges nothing per call. The publisher may charge for its own service.
Runs locally over stdio
This server isn't hosted — your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).
Run
uvx longpath
MCP client config
{
"mcpServers": {
"longpath": {
"command": "uvx",
"args": [
"longpath"
]
}
}
}An MCP server that lets an assistant (Claude Code, GitHub Copilot agent mode, any MCP client) read and analyze construction / project schedules the way a scheduler would: its own CPM engine, float, critical and driving paths, the DCMA 14-point assessment, logic-quality checks, update-to-update comparison, baseline variance and S-curve data.
| Format | How |
|---|---|
Primavera P6 .xer | native parser (multi-project files, Windows-1252 or UTF-8, optional tables) |
| MS Project XML (MSPDI) | native parser |
MS Project .mpp / .mpt / .mpx | MPXJ converts to MSPDI (optional: longpath[mpp] + Java 11+) |
| Primavera P6 XML | MPXJ converts to XER (optional: longpath[mpp] + Java 11+) |
Schedule files are only ever read. .xer and MS Project XML need nothing but Python; without the optional extra
and Java, a .mpp fails with a message saying exactly what to install.
| Area | Tools |
|---|---|
| Setup | check_setup — version, config file, whether Java + MPXJ were found |
| Overview | schedule_summary (start here) · list_calendars · wbs_tree · list_resources |
| Activities & logic | list_activities (WBS / code / status / type / text / float filters) · activity_detail · list_relationships |
| CPM | run_cpm (engine vs the float stored in the file) · critical_path (longest path or total float) · driving_path |
| Quality | dcma_assessment (14 points, thresholds, offenders) · logic_check (17 checks) |
| Change | compare_schedules (update vs previous update) · baseline_variance · s_curve (cost / units / activity counts) |
| Export | export_csv — any list above, in full, to a new .csv (the only write; see safety) |
Every tool takes the schedule's absolute path. Every list returns count plus the top limit rows (default 25) and
says when it truncated. Durations and float are working days on each activity's own calendar unless a field ends
in _h.
pip install longpath # or run it without installing: uvx longpath
Needs Python 3.11+. That is all .xer and MS Project XML files need.
MS Project .mpp and P6 XML (optional). These go through MPXJ, a Java library:
mpxj package for its bundled jars: pip install "longpath[mpp]"
(with uvx: uvx --from "longpath[mpp]" longpath).java_home in longpath.toml, then JAVA_HOME, then java on PATH.Run check_setup to see what was found. The MPXJ jars can also come from a folder of your own (mpxj_classpath).
Without Java, MS Project's File > Save As > XML produces a file longpath reads natively.
Claude Code
claude mcp add --scope user longpath -- uvx longpath
# with .mpp support:
claude mcp add --scope user longpath -e JAVA_HOME=/path/to/jdk -- uvx --from "longpath[mpp]" longpath
VS Code / Copilot. Add to the user-level mcp.json (MCP: Open User Configuration), so it works in every
window:
"longpath": {
"type": "stdio",
"command": "uvx",
"args": ["--from", "longpath[mpp]", "longpath"],
"env": { "JAVA_HOME": "C:\\path\\to\\jdk-21" }
}
(Drop --from longpath[mpp] and the env block if you only read .xer / XML: "args": ["longpath"].)
Every setting is optional. Copy longpath.example.toml
to one of these (first match wins):
LONGPATH_CONFIGlongpath.toml in the server's working folderlongpath.toml in LONGPATH_HOME, default %LOCALAPPDATA%\longpath\ on Windows, ~/.local/share/longpath/ elsewhere| Key | Default | Meaning |
|---|---|---|
java_home | JAVA_HOME, then java on PATH | Folder containing bin/java (Java 11+), for .mpp / P6 XML |
mpxj_classpath | jars bundled in the mpxj package | Folder of MPXJ jars (or one jar) to use instead |
java_timeout_seconds | 180 | Limit per MPXJ conversion |
max_rows | 25 | Default top-N for list outputs |
allow_writes | false | Let export_csv write files (it only previews otherwise) |
Unknown keys are rejected with the list of allowed ones. No secrets are involved and nothing is sent anywhere: the server makes no network calls.
export_csv carry readOnlyHint.export_csv is the only write. It creates a new .csv file (UTF-8 with BOM for Excel) and refuses existing
files, non-.csv paths and relative paths. It is a dry run by default (row count, columns, first rows) and writes
only with dry_run=false and allow_writes = true in the config. Undo = delete the file.P6 rules, computed from the logic in the file (not copied from its stored dates):
.mpp → MS Project XML, and the XER MPXJ
writes): all load and every tool runs on every file. Computed total float matched the slack MS Project stored for
about 96% of activities (3,910 of 4,065 via XER; 3,880 of 4,047 via .mpp). Every remaining difference traced so far
is an MS Project vs P6 rule difference (see limits); the same file read both ways gives identical floats.scripts/make_big_xer.py): open + CPM about 0.8 s, DCMA about 1 s.scripts/sweep_samples.py <folder> re-runs the stored-float comparison over any folder of schedules.run_cpm disagrees with the float P6 stored in your file,
an issue with the comparison_with_file output is very welcome..mpp files cannot be read.src/longpath/ — xer.py / mspdi.py / mpxj_bridge.py → model.py (one normalized model) → calendars.py
(work-time timeline) → cpm.py → checks.py (DCMA + logic) / compare.py (updates, baseline) / curves.py (S-curve)
→ analysis.py (shared row shaping) → server.py (the tools). tests/xerbuild.py builds known-answer XERs.
git clone https://github.com/S-CurveLabs/longpath; cd longpath
python -m venv .venv
.venv\Scripts\pip install -e .[mpp,dev]
.venv\Scripts\pytest
The tests that go through MPXJ run only when Java is found (JAVA_HOME or PATH) and skip otherwise. The fixtures in
tests/fixtures/ are synthetic; scripts/make_fixtures.py rebuilds them (see tests/fixtures/README.md).
MIT. The optional mpxj package is a separate LGPL library that longpath runs as a converter; it is not bundled.