# RDL MCP Server (pypi · rdl-mcp)

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

- Trust score: 39/100 (low)
- Change this week: −8
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- pypi · `rdl-mcp`: 39/100 (this document), [markdown](https://verifymcp.io/servers/bethmaloney-rdl-mcp/rdl-mcp.md), [page](https://verifymcp.io/servers/bethmaloney-rdl-mcp/rdl-mcp)

## Channel facts

- Registry: `pypi`
- Package: `rdl-mcp`
- Version: `0.1.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs setuptools.build_meta at install time, a recognised native-build step with no shell scripting around it.
  - No production dependencies, so there is no dependency health to assess.
- **Provenance & Transparency**: 44/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 253 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 0/100
  - Schema quality not yet verified: our sandbox run of this package did not complete, so we have no schema to assess.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: our sandbox run of this package did not complete, so we have no schema to compare.
- **Tool Coverage**: 0/100
  - Tool coverage not yet verified: our sandbox run of this package did not complete, so we have no tool definitions to assess.
- **Capabilities**: 0/100
  - Protocol version not yet verified: our sandbox run of this package did not complete, so we never saw its MCP handshake.

**Unverified: 4 categories.** Categories scored 0 because our sandbox run of this package has not given us the schema these checks need to read. That is a gap on our side rather than a finding about the package, and we only credit what we can confirm, so the score stands at 0 until the capture succeeds. We are working through the fleet, so this normally clears without any action from you.

## Install

### Claude

```bash
claude mcp add bethmaloney-rdl-mcp -- uvx rdl-mcp
```

### Codex

```bash
codex mcp add bethmaloney-rdl-mcp -- uvx rdl-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "bethmaloney-rdl-mcp": {
      "type": "local",
      "command": [
        "uvx",
        "rdl-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add bethmaloney-rdl-mcp --command uvx --arg rdl-mcp
```

### Hermes

```yaml
mcp_servers:
  bethmaloney-rdl-mcp:
    command: "uvx"
    args: ["rdl-mcp"]
```

### Other

```json
{
  "mcpServers": {
    "bethmaloney-rdl-mcp": {
      "command": "uvx",
      "args": [
        "rdl-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-02 (score 39, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-07-31 (score 24, −5)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 29, −18)

- [security regression] Malware scan: pass → unverified

### 2026-07-28 (score 47, 0)

- [functional] Tool coverage: Tool coverage not yet verified: our sandbox run of this package did not complete, so we have no tool definitions to assess.
- [functional] Schema quality: Schema quality not yet verified: our sandbox run of this package did not complete, so we have no schema to assess.

### 2026-07-26 (score 47)

First indexed and scored.

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

## MCP tools (15)

### `describe_rdl_report` (~43 tokens)

Get a high-level summary of the RDL report structure including datasets, parameters, and table layout

Input parameters:

- `filepath` (string, required): Path to the RDL file

### `get_rdl_datasets` (~116 tokens)

Get all datasets in the report with their fields, queries, and stored procedures. By default returns only field counts; use field_limit to get field details.

Input parameters:

- `field_limit` (integer): Number of fields to return per dataset: 0 = no field details (only count, default), -1 = all fields, positive number = limit to that many fields
- `field_pattern` (string): Optional regex pattern to filter field names (case-insensitive)
- `filepath` (string, required): Path to the RDL file

### `get_rdl_parameters` (~37 tokens)

Get all report parameters with their types, prompts, and valid values

Input parameters:

- `filepath` (string, required): Path to the RDL file

### `get_rdl_columns` (~38 tokens)

Get table columns with their headers, widths, field bindings, and formatting

Input parameters:

- `filepath` (string, required): Path to the RDL file

### `update_column_header` (~56 tokens)

Update a column header text in the report table

Input parameters:

- `filepath` (string, required): Path to the RDL file
- `new_header` (string, required): New header text
- `old_header` (string, required): Current header text to find

### `update_column_width` (~66 tokens)

Update a column width in the report table

Input parameters:

- `column_index` (integer, required): Zero-based column index
- `filepath` (string, required): Path to the RDL file
- `new_width` (string, required): New width (e.g., '2.5in', '3cm')

### `update_stored_procedure` (~61 tokens)

Update the stored procedure name/path for a dataset

Input parameters:

- `dataset_name` (string, required): Name of the dataset to update
- `filepath` (string, required): Path to the RDL file
- `new_sproc` (string, required): New stored procedure name

### `add_parameter` (~66 tokens)

Add a new report parameter

Input parameters:

- `data_type` (string, required): Data type (String, Integer, DateTime, Boolean)
- `filepath` (string, required): Path to the RDL file
- `name` (string, required): Parameter name
- `prompt` (string, required): User-facing prompt text

### `update_parameter` (~57 tokens)

Update an existing report parameter

Input parameters:

- `default_value` (string): New default value
- `filepath` (string, required): Path to the RDL file
- `name` (string, required): Parameter name
- `prompt` (string): New prompt text

### `add_column` (~189 tokens)

Add a new column to the report table at a specified position

Input parameters:

- `column_index` (integer, required): Position to insert column (0-based, -1 for end)
- `field_binding` (string, required): Field binding expression (e.g., '=Fields!Amount.Value')
- `filepath` (string, required): Path to the RDL file
- `footer_expression` (string): Optional expression for footer/total row. Examples: '=Sum(Fields!Amount.Value)', '=Count(Fields!ID.Value)', 'Total:', or leave empty for blank footer
- `format_string` (string): Optional format string (e.g., '#,0.00' for numbers or 'dd/MM/yyyy' for dates)
- `header_text` (string, required): Header text for the column
- `width` (string): Column width (e.g., '1.5in', '3cm'). Defaults to '1in'

### `remove_column` (~43 tokens)

Remove a column from the report table

Input parameters:

- `column_index` (integer, required): Zero-based column index to remove
- `filepath` (string, required): Path to the RDL file

### `update_column_format` (~88 tokens)

Update the format string for a column (e.g., date format, number format)

Input parameters:

- `column_index` (integer, required): Zero-based column index
- `filepath` (string, required): Path to the RDL file
- `format_string` (string, required): Format string (e.g., '#,0.00' for numbers, 'dd/MM/yyyy' for dates, 'C2' for currency)

### `add_dataset_field` (~118 tokens)

Add a new field to a dataset (useful when stored procedure returns new columns)

Input parameters:

- `data_field` (string, required): Name of the column from the data source
- `dataset_name` (string, required): Name of the dataset to modify
- `field_name` (string, required): Name of the field (how it appears in expressions)
- `filepath` (string, required): Path to the RDL file
- `type_name` (string, required): Data type (e.g., 'System.String', 'System.Int32', 'System.Decimal', 'System.DateTime')

### `remove_dataset_field` (~57 tokens)

Remove a field from a dataset

Input parameters:

- `dataset_name` (string, required): Name of the dataset to modify
- `field_name` (string, required): Name of the field to remove
- `filepath` (string, required): Path to the RDL file

### `validate_rdl` (~33 tokens)

Validate the RDL XML structure and report any issues

Input parameters:

- `filepath` (string, required): Path to the RDL file

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/bethmaloney-rdl-mcp/rdl-mcp#diagnostics

## Score history

- 2026-08-03: 39
- 2026-08-02: 39
- 2026-08-01: 24
- 2026-07-31: 24
- 2026-07-30: 29
- 2026-07-28: 47
- 2026-07-27: 47
- 2026-07-26: 47

## Links

- PyPI project: https://pypi.org/project/rdl-mcp/
- Socket report: https://socket.dev/pypi/package/rdl-mcp
- Repository: https://github.com/bethmaloney/rdl-mcp
- Changelog RSS feed: https://verifymcp.io/servers/bethmaloney-rdl-mcp/rdl-mcp/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/bethmaloney-rdl-mcp/rdl-mcp/changelog.json
- HTML version of this page: https://verifymcp.io/servers/bethmaloney-rdl-mcp/rdl-mcp
