SSRS2

Markdown to editable PowerPoint, Word, PDF; checks, edits and previews RDLC/RDL reports.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
89%
Naming quality
90%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,012Tokens (tool definitions)
~3.7 KBTypical response size
Significant attention impact (2.35% of 128k context)

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

nugetSSRS2.Mcp1.5.0stdio

Remote endpoints

https://ssrs2.net/mcpstreamable-http
https://ssrs2.net/mcp/licensedstreamable-http

What it can do

Tool inventory

Tools (6)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded6 tools