{
  "markdown": "# RDL MCP Server\n\nmcp-name: io.github.bethmaloney/rdl-mcp\n\n[![PyPI](https://img.shields.io/pypi/v/rdl-mcp.svg)](https://pypi.org/project/rdl-mcp/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)\n[![MCP](https://img.shields.io/badge/MCP-Compatible-green.svg)](https://modelcontextprotocol.io)\n\nEdit SSRS reports using AI assistants instead of wrestling with 2000+ lines of XML. This [Model Context Protocol (MCP)](https://modelcontextprotocol.io) server gives Claude, Copilot, and other AI tools simple commands to read and modify RDL files.\n\n## What It Does\n\n**Read reports:**\n- `describe_rdl_report` - Get report structure overview\n- `get_rdl_datasets` - View datasets, fields, and stored procedures (supports field limiting and filtering)\n- `get_rdl_parameters` - List all report parameters\n- `get_rdl_columns` - See column headers, widths, and bindings\n\n**Modify reports:**\n- `update_column_header` / `update_column_width` - Change columns\n- `add_column` / `remove_column` - Add or remove columns\n- `update_column_format` - Change number/date formatting\n- `update_stored_procedure` - Swap stored procedures\n- `add_dataset_field` / `remove_dataset_field` - Manage dataset fields\n- `add_parameter` / `update_parameter` - Manage parameters\n- `validate_rdl` - Validate XML after changes\n\n**Why it's better than editing XML:**\n- AI sees clean JSON instead of verbose XML namespaces\n- One-line commands instead of error-prone string manipulation\n- Automatic validation catches errors before they break reports\n- No dependencies - just Python 3.8+ standard library\n\n## Installation\n\n**Requirements:**\n- Python 3.8 or higher\n- [uv](https://docs.astral.sh/uv/) (Python package manager and tool runner)\n\n**Installing uv:**\n- **macOS/Linux:** `curl -LsSf https://astral.sh/uv/install.sh | sh`\n- **Windows:** `powershell -ExecutionPolicy ByPass -c \"irm https://astral.sh/uv/install.ps1 | iex\"`\n- **Alternative (all platforms):** `pip install uv` or see [installation docs](https://docs.astral.sh/uv/getting-started/installation/)\n\n**Note:** `uvx` (included with `uv`) automatically handles the Python environment and dependencies. No manual Python package installation needed!\n\n### Quick Start\n\n<details>\n<summary><b>Claude Desktop</b></summary>\n\nEdit config file:\n- **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`\n- **Windows:** `%APPDATA%\\Claude\\claude_desktop_config.json`\n- **Linux:** `~/.config/Claude/claude_desktop_config.json`\n\n```json\n{\n  \"mcpServers\": {\n    \"rdl-mcp\": {\n      \"command\": \"uvx\",\n      \"args\": [\"rdl-mcp\"]\n    }\n  }\n}\n```\n</details>\n\n<details>\n<summary><b>GitHub Copilot (VSCode)</b></summary>\n\nAdd to VSCode settings (`.vscode/mcp.json` in your workspace or user settings):\n\n```json\n{\n  \"servers\": {\n    \"rdlMcp\": {\n      \"type\": \"stdio\",\n      \"command\": \"uvx\",\n      \"args\": [\"rdl-mcp\"]\n    }\n  }\n}\n```\n\n**Note:** Requires VSCode with Copilot Chat extension installed.\n</details>\n\n\n**After installation:** Restart your AI assistant and try: `\"Describe the structure of my report.rdl file\"`\n\n<details>\n<summary>Optional: Enable debug logging</summary>\n\nSet environment variables:\n- `RDL_MCP_LOG_LEVEL`: `DEBUG`, `INFO`, `WARNING`, or `ERROR`\n- `RDL_MCP_LOG_FILE`: Path to log file\n</details>\n\n## Usage\n\nJust ask your AI assistant in natural language:\n\n- \"What datasets does this report use?\"\n- \"Make the Account Number column 2 inches wide\"\n- \"Format the Amount column as currency with 2 decimals\"\n- \"Add a new Amount column that shows the sum in the footer\"\n- \"Add a Status column but leave the footer blank\"\n- \"Update the main dataset to use the V2 stored procedure and add the TaxAmount field\"\n- \"Remove the obsolete Status column\"\n- \"Add a Year parameter to filter the report\"\n\nThe AI assistant will use the appropriate MCP tools automatically.\n\n## Example: Editing vs. XML\n\n**Without MCP** (manually editing XML):\n```xml\n<!-- Find this in 2000+ lines -->\n<TablixCell><CellContents><Textbox><Paragraphs>\n  <Paragraph><TextRuns><TextRun>\n    <Value>Old Header</Value>\n  </TextRun></TextRuns></Paragraph>\n</Paragraphs></Textbox></CellContents></TablixCell>\n```\n\n**With MCP** (one command):\n```python\nupdate_column_header(filepath=\"report.rdl\",\n                     old_header=\"Old Header\",\n                     new_header=\"New Header\")\n```\n\n## API Reference\n\n<details>\n<summary>View all available tools</summary>\n\n### Reading Tools\n\n- **`describe_rdl_report(filepath)`** - Report structure summary\n- **`get_rdl_datasets(filepath, field_limit?, field_pattern?)`** - Datasets with fields and stored procedures\n  - `field_limit`: 0 = counts only (default), -1 = all fields, N = limit to N fields\n  - `field_pattern`: Optional regex to filter field names\n- **`get_rdl_parameters(filepath)`** - All parameters with configurations\n- **`get_rdl_columns(filepath)`** - Column headers, widths, bindings\n\n### Editing Tools\n\n- **`update_column_header(filepath, old_header, new_header)`** - Change column text\n- **`update_column_width(filepath, column_index, new_width)`** - Modify width (e.g. \"2.5in\")\n- **`update_column_format(filepath, column_index, format_string)`** - Change format (e.g. \"#,0.00\", \"dd/MM/yyyy\", \"C2\")\n- **`add_column(filepath, column_index, header_text, field_binding, width?, format_string?, footer_expression?)`** - Add column\n  - `footer_expression`: Optional expression for footer/total row - e.g. \"=Sum(Fields!Amount.Value)\", \"=Count(Fields!ID.Value)\", \"Total:\", or leave empty\n- **`remove_column(filepath, column_index)`** - Remove column\n- **`update_stored_procedure(filepath, dataset_name, new_sproc)`** - Change dataset sproc\n- **`add_dataset_field(filepath, dataset_name, field_name, data_field, type_name)`** - Add field to dataset\n- **`remove_dataset_field(filepath, dataset_name, field_name)`** - Remove field from dataset\n- **`add_parameter(filepath, name, data_type, prompt)`** - Add new parameter\n- **`update_parameter(filepath, name, prompt?, default_value?)`** - Update parameter\n- **`validate_rdl(filepath)`** - Validate XML structure\n\nAll tools return `{success: bool, message?: string, error?: string}` or structured data.\n\n</details>\n\n## Limitations & Roadmap\n\n**Current limitations:**\n- Tablix (table) controls only - no Matrix or Chart support yet\n- Works best with standard report layouts\n- Some complex RDL features may still need manual XML editing\n\n**Planned features:**\n- Column reordering, grouping, and sorting configuration\n- Expression builder helpers\n- Dataset field management\n\n## Troubleshooting\n\n**Server not appearing?**\n- Check absolute path in config is correct\n- Verify Python 3.8+: `python3 --version`\n- Restart your MCP client\n\n**Permission errors?**\n- Make script executable: `chmod +x rdl_mcp_server.py`\n- Check RDL file read/write permissions\n\n\n\n## Releasing a New Version\n\nThis server is published to [PyPI](https://pypi.org/project/rdl-mcp/) and the [MCP Registry](https://registry.modelcontextprotocol.io/). To release a new version:\n\n1. **Update version numbers** in both files:\n\n   `pyproject.toml`:\n   ```toml\n   version = \"0.2.0\"\n   ```\n\n   `server.json`:\n   ```json\n   {\n     \"version\": \"0.2.0\",\n     \"packages\": [\n       {\n         \"version\": \"0.2.0\"\n       }\n     ]\n   }\n   ```\n\n2. **Commit your changes**:\n   ```bash\n   git add .\n   git commit -m \"Release v0.2.0: Add feature description\"\n   ```\n\n3. **Create and push a git tag**:\n   ```bash\n   git tag v0.2.0\n   git push origin main --tags\n   ```\n\n4. **Automated publishing**: The GitHub Actions workflows automatically:\n   - Build and publish to PyPI (users can install via `uvx rdl-mcp`)\n   - Validate `server.json` against the MCP schema\n   - Publish to the MCP Registry (server appears in registry search)\n   - Update downstream registries (like GitHub's MCP marketplace)\n\n## Contributing\n\nPRs welcome! Priority areas:\n- Better column detection for complex layouts\n- More editing operations (reordering, grouping, etc.)\n\nRequirements: Python standard library only\n\n1. Fork repo\n2. Create feature branch\n3. Make changes + tests\n4. Submit PR\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\nThis means you're free to use, modify, and distribute this software for any purpose, commercial or non-commercial.\n",
  "bytes": 8358,
  "sha": "f48035f7ef2ab88fbbed6f01f6212d145413a46267502507bf44d37380564aa1",
  "repo_slug": "bethmaloney/rdl-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_bethmaloney_rdl_mcp_fd26ea8c/readme"
}