Bill Ballou d6a79bf24a feat: add direct database access for scripts (v0.2.0)
Implement persistent SQLite database feature that allows scripts to
query schedule data directly via SQL after loading XER files through MCP.

Key changes:
- Extend load_xer with db_path parameter for persistent database
- Add get_database_info tool to retrieve database connection details
- Add schema introspection with tables, columns, primary/foreign keys
- Support WAL mode for concurrent read access
- Use atomic write pattern to prevent corruption

New features:
- db_path=None: in-memory database (default, backward compatible)
- db_path="": auto-generate path from XER filename (.sqlite extension)
- db_path="/path/to/db": explicit persistent database path

Response includes complete DatabaseInfo:
- db_path: absolute path (or :memory:)
- is_persistent: boolean
- source_file: loaded XER path
- loaded_at: ISO timestamp
- schema: tables with columns, primary keys, foreign keys, row counts

Closes: User Story 1, 2, 3 from 002-direct-db-access spec
2026-01-08 12:54:56 -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%