{"apiVersion":"v1","directorySlug":"reportroom-mcp-717b47901a","title":"ReportRoom — publish beautiful client decks & reports, agent","description":"One API/MCP call: a beautiful, tracked client deck or report, live on the web.","pageUrl":"https://www.mcpbundles.com/skills/reportroom-mcp-717b47901a","connectPath":"importable","connectAction":"import_server","catalogListing":false,"bundleSlug":null,"listingKind":"remote_mcp","kind":"provider","transportUrl":"https://mcp.reportroom.io/mcp","hostedMcpUrl":null,"toolCount":27,"toolInventoryStatus":"observed","refreshedAt":"2026-11-03T13:26:00.516172+00:00","registryName":"io.reportroom/reportroom-mcp-717b47901a","registryVersion":"2026.11.3","registryEligible":true,"tools":[{"name":"publish","description":"Publish or update a report/deck. Primary tool — idempotent on slug (re-publish updates in place). Provide either raw self-contained `html` (Mode A, preferred for coding agents; call get_design_system first for on-brand output) or `content` markdown with `type` (Mode B). Returns the live URL. Free-plan documents carry a small \"Published with ReportRoom\" credit; paid plans publish without it.","inputSchema":{"type":"object","properties":{"html":{"type":"string"},"slug":{"type":"string"},"type":{"enum":["deck","report"],"type":"string"},"quiet":{"type":"boolean"},"theme":{"type":"string"},"content":{"type":"string"},"visibility":{"enum":["public","team"],"type":"string"},"cover_image":{"type":"string"},"replace_slug":{"type":"string"}}},"logicalName":"publish","displayName":"publish","title":"publish","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_design_system","description":"Get ReportRoom's design tokens, component snippets, layout shells and rules for ONE theme. Call BEFORE authoring HTML so output is beautiful and on-brand — and pick the theme first: 'prose' (calm editorial serif) is the default and recommendation for reports, 'vibrant' (display styling) for decks. Omitting `theme` returns vibrant. The response lists every theme (`themes`) and the per-form defaults (`recommended`).","inputSchema":{"type":"object","properties":{"theme":{"enum":["vibrant","prose"],"type":"string"}}},"logicalName":"get_design_system","displayName":"get_design_system","title":"get_design_system","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_themes","description":"List available design themes with what each is for (e.g. prose = the calm default for markdown reports, vibrant = deck-first display styling).","inputSchema":{"type":"object","properties":{}},"logicalName":"list_themes","displayName":"list_themes","title":"list_themes","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"lint_document","description":"Pre-flight check HTML before publish: catches missing viewport/og, non-chart scripts (stripped at publish), off-brand output.","inputSchema":{"type":"object","required":["html"],"properties":{"html":{"type":"string"}}},"logicalName":"lint_document","displayName":"lint_document","title":"lint_document","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_analytics","description":"View stats for one of your published documents (7-day views + a ready-to-relay summary). Use after publish to report back to the human.","inputSchema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string"}}},"logicalName":"get_analytics","displayName":"get_analytics","title":"get_analytics","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_documents","description":"List this account's published documents (most recent first).","inputSchema":{"type":"object","properties":{"limit":{"type":"number"},"quiet":{"type":"boolean"}}},"logicalName":"list_documents","displayName":"list_documents","title":"list_documents","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_document","description":"Get one of your published documents by slug — the record plus its live URL. Use it to answer \"what's the link to X?\" without listing everything.","inputSchema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string"}}},"logicalName":"get_document","displayName":"get_document","title":"get_document","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"unpublish","description":"Retire one of your live documents: its URL starts returning 410 Gone and the slot is freed. Idempotent; republish brings it back.","inputSchema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string"}}},"logicalName":"unpublish","displayName":"unpublish","title":"unpublish","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"republish","description":"Bring a previously-unpublished document back live. Re-checks your plan quota (blocked at cap) and requires a verified email, exactly like publish.","inputSchema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string"}}},"logicalName":"republish","displayName":"republish","title":"republish","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"account_status","description":"Current account: tier, limits, your publishing handle, how to verify.","inputSchema":{"type":"object","properties":{"quiet":{"type":"boolean"}}},"logicalName":"account_status","displayName":"account_status","title":"account_status","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"upload_image","description":"Upload an image to host it on ReportRoom, then reference the returned URL/path in a document's HTML or markdown. Base64-encode the file bytes. PNG, JPEG, WebP or GIF, up to 2 MB; counts against your plan's image quota. Use `path` (host-agnostic) in document markup so it works on custom domains too. A 'team'-visibility image is served only to signed-in members of your org (for team-only documents); 'public' (default) is served to anyone.","inputSchema":{"type":"object","required":["data"],"properties":{"data":{"type":"string"},"kind":{"enum":["doc","brand"],"type":"string"},"visibility":{"enum":["public","team"],"type":"string"}}},"logicalName":"upload_image","displayName":"upload_image","title":"upload_image","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"export_pdf","description":"Export one of your live documents as a print-quality PDF (rendered headless from its published URL). Costs 5 credits, charged only when the render succeeds; pass idempotency_key to make retries charge-once. Returns a time-limited signed download URL (valid 1 hour). Public/unlisted documents only in this phase.","inputSchema":{"type":"object","required":["slug"],"properties":{"slug":{"type":"string"},"idempotency_key":{"type":"string"}}},"logicalName":"export_pdf","displayName":"export_pdf","title":"export_pdf","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_images","description":"List your hosted images with plan usage (used/cap).","inputSchema":{"type":"object","properties":{"limit":{"type":"number"}}},"logicalName":"list_images","displayName":"list_images","title":"list_images","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"delete_image","description":"Delete one of your hosted images by id (frees a quota slot).","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}}},"logicalName":"delete_image","displayName":"delete_image","title":"delete_image","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"set_handle","description":"Rename your subdomain handle (documents live at <handle>.reportroom.io/<slug>). Moves existing documents; old links redirect.","inputSchema":{"type":"object","required":["handle"],"properties":{"handle":{"type":"string"}}},"logicalName":"set_handle","displayName":"set_handle","title":"set_handle","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"create_account","description":"Create a free ReportRoom account (no auth needed). Returns an API key (shown once) the human should save. Verify your email first — check the inbox for the link — then publish (publishing is blocked until the account is verified).","inputSchema":{"type":"object","required":["email"],"properties":{"name":{"type":"string"},"email":{"type":"string"}}},"logicalName":"create_account","displayName":"create_account","title":"create_account","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"attach_domain","description":"Attach a custom domain (paid: Team/Business) and stream provisioning progress. Provisions a Cloudflare custom hostname on ReportRoom's serving zone and returns the DNS records the human must create at their registrar — a CNAME plus any ownership/certificate TXT records. Emits live progress as status advances (created → DNS records surfaced → SSL validated → active → live); certificate issuance completes only AFTER the human adds the DNS records, so the tool returns the records to create rather t","inputSchema":{"type":"object","required":["hostname"],"properties":{"hostname":{"type":"string"}}},"logicalName":"attach_domain","displayName":"attach_domain","title":"attach_domain","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"create_data_room","description":"Create a data room — a named, access-controlled bundle of your documents shared with identified external viewers at one URL. Business plan only. Returns the room (id + slug). Follow with add_documents_to_room, then grant_room_access.","inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"slug":{"type":"string"},"passcode":{"type":"string"},"settings":{"type":"object"},"access_mode":{"enum":["public","email","passcode","allowlist"],"type":"string"}}},"logicalName":"create_data_room","displayName":"create_data_room","title":"create_data_room","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"add_documents_to_room","description":"Set a room's ordered document set (replaces any existing set). Pass document_ids in the order they should appear. Documents stay first-class and standalone — this never unpublishes or moves them.","inputSchema":{"type":"object","required":["room_id","document_ids"],"properties":{"room_id":{"type":"string"},"document_ids":{"type":"array","items":{"type":"string"}}}},"logicalName":"add_documents_to_room","displayName":"add_documents_to_room","title":"add_documents_to_room","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"set_room_access","description":"Update a room's access controls: access_mode, passcode (string sets/rotates, null clears), and/or settings (NDA text, expiry, download/watermark, sidebar index). Returns the updated room.","inputSchema":{"type":"object","required":["room_id"],"properties":{"room_id":{"type":"string"},"passcode":{"type":["string","null"]},"settings":{"type":"object"},"access_mode":{"enum":["public","email","passcode","allowlist"],"type":"string"}}},"logicalName":"set_room_access","displayName":"set_room_access","title":"set_room_access","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"grant_room_access","description":"Grant an external viewer access to a room by email. Returns the single-use invite token/link ONCE (never retrievable again) — email it to the viewer. Re-granting an email re-issues a fresh invite.","inputSchema":{"type":"object","required":["room_id","email"],"properties":{"email":{"type":"string"},"room_id":{"type":"string"}}},"logicalName":"grant_room_access","displayName":"grant_room_access","title":"grant_room_access","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"revoke_room_access","description":"Revoke a viewer's access to a room — instantly ends their sessions. Pass the viewer id (from list_room_viewers).","inputSchema":{"type":"object","required":["room_id","viewer_id"],"properties":{"room_id":{"type":"string"},"viewer_id":{"type":"string"}}},"logicalName":"revoke_room_access","displayName":"revoke_room_access","title":"revoke_room_access","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_room_viewers","description":"List a room's viewer roster (email + verification/NDA/revocation state). Never returns invite tokens (a capability secret).","inputSchema":{"type":"object","required":["room_id"],"properties":{"room_id":{"type":"string"}}},"logicalName":"list_room_viewers","displayName":"list_room_viewers","title":"list_room_viewers","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"update_data_room","description":"Rename a data room: change its name and/or its URL slug. WARNING: changing the slug changes the room's URL and BREAKS previously shared room links (no redirects for rooms in v1) — warn the human and re-share the returned url. Existing viewers keep their access. Access controls live in set_room_access.","inputSchema":{"type":"object","required":["room_id"],"properties":{"name":{"type":"string"},"slug":{"type":"string"},"room_id":{"type":"string"}}},"logicalName":"update_data_room","displayName":"update_data_room","title":"update_data_room","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_rooms","description":"List this account's data rooms (most recent first), each with its viewer-facing URL — use it to find a room created in an earlier session or re-share its link.","inputSchema":{"type":"object","properties":{"limit":{"type":"number"}}},"logicalName":"list_rooms","displayName":"list_rooms","title":"list_rooms","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_room","description":"Get one data room by room_id OR slug. Returns the room record plus its viewer-facing URL — hand that link to the human.","inputSchema":{"type":"object","properties":{"slug":{"type":"string"},"room_id":{"type":"string"}}},"logicalName":"get_room","displayName":"get_room","title":"get_room","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_room_analytics","description":"Read a room's per-viewer engagement: for each identified viewer and document, opens + total events + dwell — so you can decide follow-ups ('the lead spent time on pricing and skipped the deck'). Returns an empty result when analytics aren't configured on the deployment.","inputSchema":{"type":"object","required":["room_id"],"properties":{"room_id":{"type":"string"}}},"logicalName":"get_room_analytics","displayName":"get_room_analytics","title":"get_room_analytics","annotations":{"untrustedContentHint":true,"readOnlyHint":true}}],"toolSource":"directory_preview","agentAction":"both","installLinks":[{"id":"cursor","label":"Cursor","href":"cursor://anysphere.cursor-deeplink/mcp/install?name=ReportRoom-publish-beautiful-client-decks-reports-agent&config=eyJ1cmwiOiAiaHR0cHM6Ly9tY3AucmVwb3J0cm9vbS5pby9tY3AifQ%3D%3D"},{"id":"vscode","label":"VS Code","href":"vscode:mcp/install?%7B%22name%22%3A%22ReportRoom-publish-beautiful-client-decks-reports-agent%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.reportroom.io%2Fmcp%22%7D"},{"id":"vscode-insiders","label":"VS Code Insiders","href":"vscode-insiders:mcp/install?%7B%22name%22%3A%22ReportRoom-publish-beautiful-client-decks-reports-agent%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.reportroom.io%2Fmcp%22%7D"},{"id":"claude-web","label":"Claude.ai","href":"https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=ReportRoom+%E2%80%94+publish+beautiful+client+decks+%26+reports%2C+agent&connectorUrl=https%3A%2F%2Fmcp.reportroom.io%2Fmcp"},{"id":"codex","label":"Codex","copyText":"codex mcp add \"ReportRoom-publish-beautiful-client-decks-reports-agent\" --url \"https://mcp.reportroom.io/mcp\""},{"id":"chatgpt","label":"ChatGPT","href":"https://www.mcpbundles.com/docs/integrations/chatgpt"}],"catalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/reportroom-mcp-717b47901a","callUrl":"https://www.mcpbundles.com/api/directory/v1/servers/reportroom-mcp-717b47901a/tools/{tool}","mcpServerUrl":"https://mcp.reportroom.io/mcp","liveCatalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/reportroom-mcp-717b47901a?live=1"}