SSRS2
Markdown to editable PowerPoint, Word, PDF; checks, edits and previews RDLC/RDL reports.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"ssrs2": {
"command": "uvx",
"args": [
"SSRS2.Mcp"
]
}
}
}Runnable packages
1.5.0stdioRemote endpoints
https://ssrs2.net/mcpstreamable-httphttps://ssrs2.net/mcp/licensedstreamable-httpWhat it can do
Tool inventory
Tools (6)
🟢convert_report(rdlc, markdown, pictures, format, name, ...)
Converts a report (RDL or RDLC) or Markdown (a document, or slides) with SSRS2 (Report Viewer's rules) to pptx (PowerPoint's own text boxes, tables and pictures, a slide per page: a Markdown deck becomes a deck), pdf, docx, xlsx, mhtml, tiff, png (the first page), csv or xml. It is checked first, as validate_report checks it: with errors nothing is written. Returns validate_report's answer and written: the file's name and size, url (downloaded once, within ten minutes), curl (the command that saves it), and what it holds read back as PowerPoint (slides) or Word and a PDF reader (document) get it. help: ["answers"] says more.
Input Schema
{
"type": "object",
"properties": {
"rdlc": {
"description": "The report definition's XML (RDL or RDLC). Give rdlc or markdown.",
"type": [
"string",
"null"
]
},
"markdown": {
"description": "Markdown's text: a document, or slides with marp: true. Give rdlc or markdown.",
"type": [
"string",
"null"
]
},
"pictures": {
"description": "The pictures the Markdown names, by its paths: {\"images/chart.png\": \"<base64>\"}; 5 MB each, 20 MB in all.",
"type": [
"object",
"null"
],
"additionalProperties": {
"type": [
"string",
"null"
]
}
},
"format": {
"description": "pptx (default), pdf, docx, xlsx, mhtml, tiff, png, csv or xml.",
"type": [
"string",
"null"
]
},
"name": {
"description": "The file's name, without its extension (default: the Markdown's title, else report).",
"type": [
"string",
"null"
]
},
"sampleData": {
"description": "Rows per dataset: {\"DataSet\": [{\"Field\": value}]}, dates as ISO text. Left out, made up from the fields' types."
},
"parameters": {
"description": "Report parameter values by name (a multi-value one's separated by commas).",
"type": [
"object",
"null"
],
"additionalProperties": {
"type": [
"string",
"null"
]
}
},
"culture": {
"description": "The culture of a report that names no Language (en-US, de-CH); left out, en-US.",
"type": [
"string",
"null"
]
},
"help": {
"description": "true, or topics ([\"markdown\", \"decks\"]): the reference only."
}
}
}🟢compare_reports(reports, detail)
Groups report definitions (RDL or RDLC) by structure, to plan one change across many: a group's reports have the same items, datasets, parameters and code modules and differ only in places, texts and looks, so one set of operations naming their items changes them alike. Returns groups, the largest first: structure (edit_report's structure), roles (what role:signature and the like name there), differs (how its first report differs from the first group's), places (items placed otherwise), and versions: each report and its version.
Input Schema
{
"type": "object",
"properties": {
"reports": {
"description": "The reports by name: {\"Receipt_de-CH.rdlc\": \"<the report's XML>\", ...}; 50 at most, 20 MB in all.",
"type": "object",
"additionalProperties": {
"type": "string"
}
},
"detail": {
"description": "\"full\": each group's reports listed too, beside their versions.",
"type": [
"string",
"null"
]
}
},
"required": [
"reports"
]
}🟢render_preview(rdlc, markdown, pictures, sampleData, parameters, ...)
Renders a report definition (RDL or RDLC) or Markdown (a document, or slides: a page each) with SSRS2, the Report Viewer engine, and returns its pages as PNG, as a PDF of it would show them: a JSON summary first (what validate_report answers, no need to validate first; madeUpRows; conversion for Markdown, what it approximated at its lines; text, what the pages print, page by page in reading order, where values are read exactly), then an image per page, or one image of numbered thumbnails (sheet) to see a deck or a long report whole. A report with errors is not rendered. help: ["answers"] says more.
Input Schema
{
"type": "object",
"properties": {
"rdlc": {
"description": "The report definition's XML (RDL or RDLC). Give rdlc or markdown.",
"type": [
"string",
"null"
]
},
"markdown": {
"description": "Markdown's text: a document, or slides with marp: true. Give rdlc or markdown.",
"type": [
"string",
"null"
]
},
"pictures": {
"description": "The pictures the Markdown names, by its paths: {\"images/chart.png\": \"<base64>\"}; 5 MB each, 20 MB in all.",
"type": [
"object",
"null"
],
"additionalProperties": {
"type": [
"string",
"null"
]
}
},
"sampleData": {
"description": "Rows per dataset: {\"DataSet\": [{\"Field\": value}]}, dates as ISO text. Left out, made up from the fields' types."
},
"parameters": {
"description": "Report parameter values by name (a multi-value one's separated by commas).",
"type": [
"object",
"null"
],
"additionalProperties": {
"type": [
"string",
"null"
]
}
},
"pages": {
"description": "Pages to return: 3 by default, 10 at most; with sheet, 30.",
"type": [
"integer",
"null"
]
},
"firstPage": {
"description": "The first page to return (default 1).",
"type": "integer",
"default": 1
},
"dpi": {
"description": "The images' dots per inch, 48 to 200 (default 96: an A4 page is 794 x 1123 pixels).",
"type": "integer",
"default": 96
},
"culture": {
"description": "The culture of a report that names no Language (en-US, de-CH); left out, en-US.",
"type": [
"string",
"null"
]
},
"sheet": {
"description": "One image of up to 30 pages as numbered thumbnails, too small to read: look at a page itself for that.",
"type": "boolean",
"default": false
},
"madeUpRows": {
"description": "\"all\": every made-up row in the answer, not a summary."
},
"help": {
"description": "true, or topics ([\"markdown\", \"decks\"]): the reference only."
}
}
}🟢describe_report(rdlc, item, detail, part)
Outlines a report definition (RDL or RDLC) to plan a change: its page, datasets and fields, parameters, and every item top to bottom with its kind, place and size in cm, what it shows and does (hidden, toggled, page breaks), and its role (title, table, totals, declaration, signature...), which role:signature and the like name in edit_report and validate_report whatever the report calls the item. Returns version (edit_report's baseVersion) and outline; with item, that part's XML as written, with its lines (to copy an edit's find from).
Input Schema
{
"type": "object",
"properties": {
"rdlc": {
"description": "The report definition's XML (RDL or RDLC).",
"type": "string"
},
"item": {
"description": "One part in full: a name, a role (role:signature) or a path (WorkInstructions/TablixRow[3]): its outline and XML.",
"type": [
"string",
"null"
]
},
"detail": {
"description": "\"full\": every text whole and why each role was guessed.",
"type": [
"string",
"null"
]
},
"part": {
"description": "Outline part, from 1.",
"type": "integer",
"default": 1
}
},
"required": [
"rdlc"
]
}🟢edit_report(rdlc, operations, edits, pictures, dryRun, ...)
Changes a report definition (RDL, RDLC) given as its XML by operations (the SSRS2 designer's own), all or none. The text is patched (the rest as it was), then checked: its new problems and pages said. The answer's rdlc is the changed report (past 200 KB, url and curl: a download within ten minutes). Operations ("op"): dataset, parameter, page, header, footer, code, textbox, table, matrix, list, chart, gauge, indicator, databar, sparkline, image, barcode, subreport, line, rectangle, set, remove, space, move, swap, copy, field, column, remove_column, row, total, group, sort, widths, filter. A new item goes "after" or "before" an item or a role (role:signature), "in" a container or "at":[x, y] cm. Call help: ["textbox","set"] first: their words.
Input Schema
{
"type": "object",
"properties": {
"rdlc": {
"description": "The report's XML.",
"type": [
"string",
"null"
]
},
"operations": {
"description": "The operations, in order.",
"type": [
"array",
"null"
],
"items": {}
},
"edits": {
"description": "Or exact replacements: [{find, replace, in?, all?}]."
},
"pictures": {
"description": "Pictures an image names by its file: {\"path\": \"<base64>\"}.",
"type": [
"object",
"null"
],
"additionalProperties": {
"type": [
"string",
"null"
]
}
},
"dryRun": {
"description": "The diff, not the report.",
"type": "boolean",
"default": false
},
"check": {
"description": "Check after (default true).",
"type": "boolean",
"default": true
},
"rewrite": {
"description": "Write anew a report that cannot be patched.",
"type": "boolean",
"default": false
},
"baseVersion": {
"description": "describe_report's version.",
"type": [
"string",
"null"
]
},
"sampleData": {
"description": "Rows: {DataSet: [{Field: value}]}."
},
"parameters": {
"description": "Parameter values.",
"type": [
"object",
"null"
],
"additionalProperties": {
"type": [
"string",
"null"
]
}
},
"keepPages": {
"description": "Refuse a change that would print more pages, or at fewer table rows (variants, rowCounts too).",
"type": "boolean",
"default": false
},
"maxPages": {
"description": "Refuse a report printing more pages.",
"type": [
"integer",
"null"
]
},
"fit": {
"description": "With keepPages: a block that costs rows is written in the form checked to keep them.",
"type": "boolean",
"default": false
},
"variants": {
"description": "As validate_report's; their pages said."
},
"rowCounts": {
"description": "As validate_report's: {DataSet: \"1..30\"}."
},
"detail": {
"description": "\"full\": every item, the diff whole.",
"type": [
"string",
"null"
]
},
"summary": {
"description": "Said back.",
"type": [
"string",
"null"
]
},
"help": {
"description": "Operations' names, or true."
}
}
}🟢validate_report(rdlc, markdown, pictures, sampleData, parameters, ...)
Checks a report definition (RDL or RDLC) or Markdown with SSRS2's engine (Report Viewer's rules): XML, schema, every expression compiled, then a run with rows through every page. Returns ok, a summary and diagnostics (code, severity, item, property, expression, line, message, hint); atRunTime counts what failed as it ran (#Error cells). Call it after each change until ok is true and atRunTime absent. Expressions are Visual Basic and may only compute (restrictedCode). Also layout, expect, variants, rowCounts and the report as it was (baselineRdlc): help: ["checks"].
Input Schema
{
"type": "object",
"properties": {
"rdlc": {
"description": "The report definition's XML (RDL or RDLC). Give rdlc or markdown.",
"type": [
"string",
"null"
]
},
"markdown": {
"description": "Markdown's text: a document, or slides with marp: true. Give rdlc or markdown.",
"type": [
"string",
"null"
]
},
"pictures": {
"description": "The pictures the Markdown names, by its paths: {\"images/chart.png\": \"<base64>\"}; 5 MB each, 20 MB in all.",
"type": [
"object",
"null"
],
"additionalProperties": {
"type": [
"string",
"null"
]
}
},
"sampleData": {
"description": "Rows per dataset: {\"DataSet\": [{\"Field\": value}]}, dates as ISO text. Left out, made up from the fields' types."
},
"parameters": {
"description": "Report parameter values by name (a multi-value one's separated by commas).",
"type": [
"object",
"null"
],
"additionalProperties": {
"type": [
"string",
"null"
]
}
},
"render": {
"description": "false: the definition only, no expression runs.",
"type": "boolean",
"default": true
},
"culture": {
"description": "The culture of a report that names no Language (en-US, de-CH); left out, en-US.",
"type": [
"string",
"null"
]
},
"baselineRdlc": {
"description": "The report as it was (its XML): only new warnings are said, with pages before.",
"type": [
"string",
"null"
]
},
"layout": {
"description": "true, or names and roles (role:signature): where each item printed, its page and place in cm."
},
"expect": {
"description": "Rules: {\"order\": [\"role:table\", \"Block?\", \"role:signature\"]}, samePage, page, pages, maxPages, noOverlap. An item named and not printed fails its rule, unless written Name? (a variant may hide it)."
},
"variants": {
"description": "Renders again with rows changed: [{\"name\": \"no deposit\", \"sampleData\": {\"Deposit\": null}}]."
},
"rowCounts": {
"description": "{\"Requests\": \"1..30\"}: the pages of each count and the first that adds a page."
},
"madeUpRows": {
"description": "\"all\": every made-up row in the answer, not a summary."
},
"help": {
"description": "true, or topics ([\"markdown\", \"decks\"]): the reference only."
}
}
}Community
Evidence