Skip to main content

RDL MCP Server

mcp-name: io.github.bethmaloney/rdl-mcp

License: MIT Python 3.8+ MCP

Edit SSRS reports using AI assistants instead of wrestling with 2000+ lines of XML. This Model Context Protocol (MCP) server gives Claude, Copilot, and other AI tools simple commands to read and modify RDL files.

What It Does

Read reports:

  • describe_rdl_report - Get report structure overview
  • get_rdl_datasets - View datasets, fields, and stored procedures (supports field limiting and filtering)
  • get_rdl_parameters - List all report parameters
  • get_rdl_columns - See column headers, widths, and bindings

Modify reports:

  • update_column_header / update_column_width - Change columns
  • add_column / remove_column - Add or remove columns
  • update_column_format - Change number/date formatting
  • update_stored_procedure - Swap stored procedures
  • add_dataset_field / remove_dataset_field - Manage dataset fields
  • add_parameter / update_parameter - Manage parameters
  • validate_rdl - Validate XML after changes

Why it's better than editing XML:

  • AI sees clean JSON instead of verbose XML namespaces
  • One-line commands instead of error-prone string manipulation
  • Automatic validation catches errors before they break reports
  • No dependencies - just Python 3.8+ standard library

Installation

1. Get the server:

git clone https://github.com/yourusername/rdl-mcp.git
cd rdl-mcp

2. Configure your MCP client:

Claude Desktop

Edit config file (~/Library/Application Support/Claude/claude_desktop_config.json on macOS, %APPDATA%\Claude\claude_desktop_config.json on Windows, ~/.config/Claude/claude_desktop_config.json on Linux):

{
  "mcpServers": {
    "rdl-mcp": {
      "command": "python3",
      "args": ["/absolute/path/to/rdl_mcp_server.py"]
    }
  }
}
GitHub Copilot (VSCode)

Add to VSCode settings (.vscode/settings.json in your workspace or user settings):

{
  "github.copilot.chat.mcp.servers": {
    "rdl-mcp": {
      "command": "python3",
      "args": ["/absolute/path/to/rdl_mcp_server.py"]
    }
  }
}

Note: MCP support in GitHub Copilot requires VSCode with Copilot Chat extension installed.

3. Restart your AI assistant and try: "Describe the structure of my report.rdl file"

Requirements: Python 3.8+ (no other dependencies)

Optional: Enable debug logging

Set environment variables:

  • RDL_MCP_LOG_LEVEL: DEBUG, INFO, WARNING, or ERROR
  • RDL_MCP_LOG_FILE: Path to log file

Usage

Just ask your AI assistant in natural language:

  • "What datasets does this report use?"
  • "Make the Account Number column 2 inches wide"
  • "Format the Amount column as currency with 2 decimals"
  • "Add a new Amount column that shows the sum in the footer"
  • "Add a Status column but leave the footer blank"
  • "Update the main dataset to use the V2 stored procedure and add the TaxAmount field"
  • "Remove the obsolete Status column"
  • "Add a Year parameter to filter the report"

The AI assistant will use the appropriate MCP tools automatically.

Example: Editing vs. XML

Without MCP (manually editing XML):

<!-- Find this in 2000+ lines -->
<TablixCell><CellContents><Textbox><Paragraphs>
  <Paragraph><TextRuns><TextRun>
    <Value>Old Header</Value>
  </TextRun></TextRuns></Paragraph>
</Paragraphs></Textbox></CellContents></TablixCell>

With MCP (one command):

update_column_header(filepath="report.rdl",
                     old_header="Old Header",
                     new_header="New Header")

API Reference

View all available tools

Reading Tools

  • describe_rdl_report(filepath) - Report structure summary
  • get_rdl_datasets(filepath, field_limit?, field_pattern?) - Datasets with fields and stored procedures
    • field_limit: 0 = counts only (default), -1 = all fields, N = limit to N fields
    • field_pattern: Optional regex to filter field names
  • get_rdl_parameters(filepath) - All parameters with configurations
  • get_rdl_columns(filepath) - Column headers, widths, bindings

Editing Tools

  • update_column_header(filepath, old_header, new_header) - Change column text
  • update_column_width(filepath, column_index, new_width) - Modify width (e.g. "2.5in")
  • update_column_format(filepath, column_index, format_string) - Change format (e.g. "#,0.00", "dd/MM/yyyy", "C2")
  • add_column(filepath, column_index, header_text, field_binding, width?, format_string?, footer_expression?) - Add column
    • footer_expression: Optional expression for footer/total row - e.g. "=Sum(Fields!Amount.Value)", "=Count(Fields!ID.Value)", "Total:", or leave empty
  • remove_column(filepath, column_index) - Remove column
  • update_stored_procedure(filepath, dataset_name, new_sproc) - Change dataset sproc
  • add_dataset_field(filepath, dataset_name, field_name, data_field, type_name) - Add field to dataset
  • remove_dataset_field(filepath, dataset_name, field_name) - Remove field from dataset
  • add_parameter(filepath, name, data_type, prompt) - Add new parameter
  • update_parameter(filepath, name, prompt?, default_value?) - Update parameter
  • validate_rdl(filepath) - Validate XML structure

All tools return {success: bool, message?: string, error?: string} or structured data.

Limitations & Roadmap

Current limitations:

  • Tablix (table) controls only - no Matrix or Chart support yet
  • Works best with standard report layouts
  • Some complex RDL features may still need manual XML editing

Planned features:

  • Column reordering, grouping, and sorting configuration
  • Expression builder helpers
  • Dataset field management

Troubleshooting

Server not appearing?

  • Check absolute path in config is correct
  • Verify Python 3.8+: python3 --version
  • Restart your MCP client

Permission errors?

  • Make script executable: chmod +x rdl_mcp_server.py
  • Check RDL file read/write permissions

Releasing a New Version

This server is published to the MCP Registry. To release a new version:

  1. Update version number in server.json:

    {
      "version": "0.2.0"
    }
    
  2. Commit your changes:

    git add .
    git commit -m "Release v0.2.0: Add feature description"
    
  3. Create and push a git tag:

    git tag v0.2.0
    git push origin main --tags
    
  4. Automated publishing: The GitHub Actions workflow automatically:

    • Validates server.json against the MCP schema
    • Authenticates with GitHub
    • Publishes to the MCP Registry
    • Updates downstream registries (like GitHub's)

Contributing

PRs welcome! Priority areas:

  • Better column detection for complex layouts
  • More editing operations (reordering, grouping, etc.)

Requirements: Python standard library only

  1. Fork repo
  2. Create feature branch
  3. Make changes + tests
  4. Submit PR

License

MIT License - see LICENSE file for details.

This means you're free to use, modify, and distribute this software for any purpose, commercial or non-commercial.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rdl_mcp-0.1.0.tar.gz (17.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

rdl_mcp-0.1.0-py3-none-any.whl (18.0 kB view details)

Uploaded Python 3

File details

Details for the file rdl_mcp-0.1.0.tar.gz.

File metadata

  • Download URL: rdl_mcp-0.1.0.tar.gz
  • Upload date:
  • Size: 17.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rdl_mcp-0.1.0.tar.gz
Algorithm Hash digest
SHA256 f05c781b6c26a704a3d41595feba1c09c042780d0306c5d94d3e8d37cb888b71
MD5 daea2d70c2aabcb025d5b8ea3119a0cc
BLAKE2b-256 abc9a44cf2f148518debd792e4b449acec3c5a454cab5959d0deb1ba7cfe6130

See more details on using hashes here.

Provenance

The following attestation bundles were made for rdl_mcp-0.1.0.tar.gz:

Publisher: publish-pypi.yml on bethmaloney/rdl-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rdl_mcp-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: rdl_mcp-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 18.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rdl_mcp-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8ec3e862938515d5734ba79fcbea2d728b99f62d62e873455d737da937b68b19
MD5 ff72790f7694cc3dbf9243f942e6e56d
BLAKE2b-256 d0a62858d9c510fd5de2b56bdd93bf85f2715a7d614be8a89b756f6e55fd6cd3

See more details on using hashes here.

Provenance

The following attestation bundles were made for rdl_mcp-0.1.0-py3-none-any.whl:

Publisher: publish-pypi.yml on bethmaloney/rdl-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page