RDL MCP Server

io.github.bethmaloneyPublished by GitHub account bethmaloneyv0.1.0Updated Oct 24, 2026

Edit SSRS reports using AI - simple tools to read and modify RDL files

VerifiedSTDIODesktop onlyDeveloper ToolsData & Analytics

Overview

AI-generated overview

A local MCP server that lets an AI assistant read and edit SSRS report definition (RDL) files through structured tools instead of hand-editing XML.

What you can do
Inspect a report: describe its structure, list datasets with fields and stored procedures, list parameters, and view column headers, widths and bindings, with optional field limits and regex filtering. Edit columns: change headers, widths and number/date formats, and add or remove columns including footer expressions. Manage datasets: swap stored procedures and add or remove dataset fields. Manage parameters: add new parameters and update prompts or default values. Validate the RDL XML after changes.
When to use it
Useful when you maintain SSRS reports and want an assistant to make targeted changes to RDL files, such as resizing a column, reformatting amounts, adding a parameter or switching a dataset to a new stored procedure, without editing thousands of lines of XML by hand.
Requirements
Runs locally over stdio as a PyPI package launched with uvx, so Python 3.8 or higher and uv are needed. Configure it in the client (for example Claude Desktop or VS Code with Copilot Chat). Optional environment variables RDL_MCP_LOG_LEVEL and RDL_MCP_LOG_FILE control logging. No authentication is declared.
Before you install
Editing tools write to the RDL files you point them at, including adding and removing columns, fields and parameters and changing stored procedures; keep backups or version control and run validate_rdl afterwards. The server needs read/write permission on those files. Logging can be written to a file path you choose via RDL_MCP_LOG_FILE.

Installation

In SourceWeft

  1. Open RDL MCP Server in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

RDL MCP Server

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

[PyPI] [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

Requirements:

  • Python 3.8 or higher
  • uv (Python package manager and tool runner)

Installing uv:

  • macOS/Linux: curl -LsSf https://astral.sh/uv/install.sh | sh
  • Windows: powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
  • Alternative (all platforms): pip install uv or see installation docs

Note: uvx (included with uv) automatically handles the Python environment and dependencies. No manual Python package installation needed!

Quick Start

Claude Desktop

Edit config file:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json
  • Linux: ~/.config/Claude/claude_desktop_config.json
json
{  "mcpServers": {    "rdl-mcp": {      "command": "uvx",      "args": ["rdl-mcp"]    }  }}
GitHub Copilot (VSCode)

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

json
{  "servers": {    "rdlMcp": {      "type": "stdio",      "command": "uvx",      "args": ["rdl-mcp"]    }  }}

Note: Requires VSCode with Copilot Chat extension installed.

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

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):

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):

python
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 PyPI and the MCP Registry. To release a new version:

  1. Update version numbers in both files:

    pyproject.toml:

    toml
    version = "0.2.0"

    server.json:

    json
    {  "version": "0.2.0",  "packages": [    {      "version": "0.2.0"    }  ]}
  2. Commit your changes:

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

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

    • Build and publish to PyPI (users can install via uvx rdl-mcp)
    • Validate server.json against the MCP schema
    • Publish to the MCP Registry (server appears in registry search)
    • Update downstream registries (like GitHub's MCP marketplace)

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.

Source: README.md at commit ed2b981

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v0.1.0LatestSep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts