Skip to main content

Edit SSRS reports using AI - MCP server for RDL files

Project description

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.

Project details


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.

Supported by

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