If you've ever opened an SSRS report definition file, you know it's 2000+ lines of XML namespace hell. This server gives Claude and other MCP clients simple tools to read and edit RDL files without touching raw XML. You get commands like update_column_header, add_column, and update_stored_procedure that work with clean JSON instead of nested Tablix elements. It handles datasets, parameters, column formatting, and stored procedure swaps. The server validates changes automatically so you don't break reports. Currently supports tablix controls only, no matrix or chart types yet. Install via uvx and you can ask Claude to modify report columns, add parameters, or swap data sources in plain English.
mcp-name: io.github.bethmaloney/rdl-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.
Read reports:
describe_rdl_report - Get report structure overviewget_rdl_datasets - View datasets, fields, and stored procedures (supports field limiting and filtering)get_rdl_parameters - List all report parametersget_rdl_columns - See column headers, widths, and bindingsModify reports:
update_column_header / update_column_width - Change columnsadd_column / remove_column - Add or remove columnsupdate_column_format - Change number/date formattingupdate_stored_procedure - Swap stored proceduresadd_dataset_field / remove_dataset_field - Manage dataset fieldsadd_parameter / update_parameter - Manage parametersvalidate_rdl - Validate XML after changesWhy it's better than editing XML:
Requirements:
Installing uv:
curl -LsSf https://astral.sh/uv/install.sh | shpowershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"pip install uv or see installation docsNote: uvx (included with uv) automatically handles the Python environment and dependencies. No manual Python package installation needed!
Edit config file:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.json~/.config/Claude/claude_desktop_config.json{
"mcpServers": {
"rdl-mcp": {
"command": "uvx",
"args": ["rdl-mcp"]
}
}
}
Add to VSCode settings (.vscode/mcp.json in your workspace or user settings):
{
"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"
Set environment variables:
RDL_MCP_LOG_LEVEL: DEBUG, INFO, WARNING, or ERRORRDL_MCP_LOG_FILE: Path to log fileJust ask your AI assistant in natural language:
The AI assistant will use the appropriate MCP tools automatically.
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")
describe_rdl_report(filepath) - Report structure summaryget_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 fieldsfield_pattern: Optional regex to filter field namesget_rdl_parameters(filepath) - All parameters with configurationsget_rdl_columns(filepath) - Column headers, widths, bindingsupdate_column_header(filepath, old_header, new_header) - Change column textupdate_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 emptyremove_column(filepath, column_index) - Remove columnupdate_stored_procedure(filepath, dataset_name, new_sproc) - Change dataset sprocadd_dataset_field(filepath, dataset_name, field_name, data_field, type_name) - Add field to datasetremove_dataset_field(filepath, dataset_name, field_name) - Remove field from datasetadd_parameter(filepath, name, data_type, prompt) - Add new parameterupdate_parameter(filepath, name, prompt?, default_value?) - Update parametervalidate_rdl(filepath) - Validate XML structureAll tools return {success: bool, message?: string, error?: string} or structured data.
Current limitations:
Planned features:
Server not appearing?
python3 --versionPermission errors?
chmod +x rdl_mcp_server.pyThis server is published to PyPI and the MCP Registry. To release a new version:
Update version numbers in both files:
pyproject.toml:
version = "0.2.0"
server.json:
{
"version": "0.2.0",
"packages": [
{
"version": "0.2.0"
}
]
}
Commit your changes:
git add .
git commit -m "Release v0.2.0: Add feature description"
Create and push a git tag:
git tag v0.2.0
git push origin main --tags
Automated publishing: The GitHub Actions workflows automatically:
uvx rdl-mcp)server.json against the MCP schemaPRs welcome! Priority areas:
Requirements: Python standard library only
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.
RDL_MCP_LOG_LEVELdefault: INFOLog level for the RDL MCP server (DEBUG, INFO, WARNING, ERROR)
RDL_MCP_LOG_FILEPath to log file for the RDL MCP server