Edit SSRS reports using AI - simple tools to read and modify RDL files
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):
<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.
Source-derived launch command. Check the maintainer’s required arguments and credentials before running:
uvx rdl-mcpMerge this template into ~/Library/Application Support/Claude/claude_desktop_config.json. Keep existing servers. Add any arguments, credentials, and permissions required by the maintainer; this template has not been install-tested.
{
"mcpServers": {
"io-github-bethmaloney-rdl-mcp": {
"command": "uvx",
"args": [
"rdl-mcp"
]
}
}
}Restart Claude Desktop completely for changes to take effect. Confirm the server appears connected in the client’s tool list, then try a read-only example from its documentation.
Claude Desktop setup referenceRDL MCP Server works with any MCP-compatible client. Copy the config snippet from the Configuration section above and add it to the file shown for your client, then restart the application.
~/Library/Application Support/Claude/claude_desktop_config.jsonRestart Claude Desktop completely for changes to take effect.~/.cursor/mcp.jsonRestart Cursor for changes to take effect..vscode/mcp.jsonReload VS Code window for changes to take effect.~/.codeium/windsurf/mcp_config.jsonRestart Windsurf for changes to take effect..mcp.jsonSave at the project root, then start Claude Code in that project and review the MCP server approval prompt. Keep real credentials out of shared files.