Bill Ballou bf2f85813e fix: include finish milestones (TT_FinMile) in milestone queries
The list_milestones tool was only returning start milestones (TT_Mile)
and missing all finish milestones. P6 uses two task types for milestones:
- TT_Mile = Start Milestone
- TT_FinMile = Finish Milestone

Changes:
- Update query_milestones() to include both TT_Mile and TT_FinMile
- Derive milestone_type from task_type when not explicitly set:
  - TT_Mile -> 'start'
  - TT_FinMile -> 'finish'
- Add unit tests for milestone_type derivation from task_type

This fixes the E-J Electric schedule returning 5 milestones instead of 62.
2026-01-08 11:55:43 -05:00

XER MCP Server

An MCP (Model Context Protocol) server for parsing Primavera P6 XER files and exposing schedule data to AI assistants.

Features

  • Parse Primavera P6 XER export files
  • Query activities, relationships, milestones, and critical path
  • Pagination support with configurable limits
  • Multi-project file support
  • In-memory SQLite database for fast queries

Installation

Requires Python 3.12+

# Clone the repository
git clone https://git.prettyhefty.com/Bill/xer-mcp.git
cd xer-mcp

# Install with uv
uv sync

# Or install with pip
pip install -e .

Configuration

Claude Desktop

Add to your Claude Desktop configuration (~/.config/claude/claude_desktop_config.json on Linux, ~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "xer-mcp": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/xer-mcp", "python", "-m", "xer_mcp"]
    }
  }
}

Other MCP Clients

Run the server directly:

uv run python -m xer_mcp

The server communicates via stdio using the MCP protocol.

Available Tools

load_xer

Load a Primavera P6 XER file for querying.

Parameters:

  • file_path (required): Absolute path to the XER file
  • project_id (optional): Project ID to select (required for multi-project files)

Example:

{
  "file_path": "/path/to/schedule.xer"
}

list_activities

List activities with optional filtering and pagination.

Parameters:

  • start_date (optional): Filter activities starting on or after (YYYY-MM-DD)
  • end_date (optional): Filter activities ending on or before (YYYY-MM-DD)
  • wbs_id (optional): Filter by WBS element ID
  • activity_type (optional): Filter by type (TT_Task, TT_Mile, TT_LOE, TT_WBS, TT_Rsrc)
  • limit (optional): Maximum results (default: 100, max: 1000)
  • offset (optional): Number of results to skip (default: 0)

Returns: List of activities with pagination metadata

get_activity

Get detailed information for a specific activity.

Parameters:

  • activity_id (required): The task_id of the activity

Returns: Activity details including WBS name and relationship counts

list_relationships

List all activity relationships (dependencies) with pagination.

Parameters:

  • limit (optional): Maximum results (default: 100, max: 1000)
  • offset (optional): Number of results to skip (default: 0)

Returns: List of relationships with predecessor/successor info

get_predecessors

Get predecessor activities for a given activity.

Parameters:

  • activity_id (required): The task_id of the activity

Returns: List of predecessor activities with relationship type and lag

get_successors

Get successor activities for a given activity.

Parameters:

  • activity_id (required): The task_id of the activity

Returns: List of successor activities with relationship type and lag

get_project_summary

Get a summary of the loaded project.

Parameters: None

Returns:

  • project_name: Name of the project
  • plan_start_date: Planned start date
  • plan_end_date: Planned end date
  • activity_count: Total number of activities
  • milestone_count: Number of milestones
  • critical_activity_count: Number of activities on critical path

list_milestones

List all milestone activities in the project.

Parameters: None

Returns: List of milestone activities with dates and status

get_critical_path

Get all activities on the critical path.

Parameters: None

Returns: List of critical path activities ordered by start date

Usage Example

  1. First, load an XER file:

    Use the load_xer tool with file_path: "/path/to/my-schedule.xer"
    
  2. Get a project overview:

    Use the get_project_summary tool
    
  3. List upcoming milestones:

    Use the list_milestones tool
    
  4. View critical path:

    Use the get_critical_path tool
    
  5. Query specific activities:

    Use list_activities with start_date: "2026-01-01" and end_date: "2026-03-31"
    

Error Handling

All query tools return a NO_FILE_LOADED error if called before loading an XER file:

{
  "error": {
    "code": "NO_FILE_LOADED",
    "message": "No XER file is loaded. Use the load_xer tool first."
  }
}

Relationship Types

The server supports all P6 relationship types:

  • FS (Finish-to-Start): Successor starts after predecessor finishes
  • SS (Start-to-Start): Successor starts when predecessor starts
  • FF (Finish-to-Finish): Successor finishes when predecessor finishes
  • SF (Start-to-Finish): Successor finishes when predecessor starts

Development

# Run tests
uv run pytest

# Run with coverage
uv run pytest --cov=xer_mcp

# Lint
uv run ruff check src/ tests/

# Format
uv run ruff format src/ tests/

License

MIT

Description
MCP server for parsing Primavera P6 XER files and exposing schedule data through MCP tools
Readme 320 KiB
Languages
Python 79%
Shell 21%