← Files Report Numbers CheckerARCHIVED FILE
plugin.json
16 KB · Nov 3, 2026 · 19:17 UTC
{
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
"name": "reportcheck",
"version": "0.1.3",
"description": "Use this when you need to check report totals, ratios and growth claims against a supplied table, with traceable references and unresolved-data handling.",
"author": {
"name": "Sun Ryse Software LLC"
},
"homepage": "https://reportcheck-mcp.sunrysetech.com/",
"keywords": [
"report",
"arithmetic",
"metrics"
],
"extensions": {
"com.openai": {
"interface": {
"displayName": "Report Numbers Checker",
"shortDescription": "Check totals and growth claims",
"longDescription": "Use this when you need to check report totals, ratios and growth claims against a supplied table, with traceable references and unresolved-data handling. Up to 12 metrics, 12 periods, 144 supplied cells and 20 claims. Absolute tolerance must be explicitly set from 0 through 1. Missing/null inputs and zero or negative growth baselines remain unresolved. No analytics account or source verification is performed. Inputs are temporary; no customer-account access or stored progress. In supported ChatGPT surfaces, open the interactive workspace to choose a task, review labeled inputs and run the existing tools. Examples are public or synthetic, not saved customer records. The public website provides a labeled example, usage steps and prompts. The interface adds no account access or persistence.",
"developerName": "Sun Ryse Software LLC",
"category": "Productivity",
"capabilities": [
"Check report arithmetic against supplied data",
"Compare two supplied periods",
"Open a guided interactive workspace"
],
"websiteURL": "https://reportcheck-mcp.sunrysetech.com/",
"supportURL": "https://reportcheck-mcp.sunrysetech.com/support",
"privacyPolicyURL": "https://reportcheck-mcp.sunrysetech.com/privacy",
"termsOfServiceURL": "https://reportcheck-mcp.sunrysetech.com/terms",
"defaultPrompt": [
"Open Report Numbers Checker so I can choose a task and review its inputs.",
"Check these report totals, ratios and growth claims against my supplied aggregate table and source references."
],
"brandColor": "#345ce3",
"logo": "./assets/icon.png",
"composerIcon": "./assets/icon.png"
},
"review": {
"test_cases": {
"positive": [
{
"description": "Open the interactive workspace, then p1: check a total, a growth mismatch and a rounded percentage ratio",
"prompt": "Open Report Numbers Checker's interactive workspace. Then Audit these three synthetic report claims against the supplied aggregate table. Use each claim's explicit absolute tolerance and preserve source and report references.\n\nUse only this synthetic input:\n{\n \"table\": {\n \"metrics\": [\n {\n \"id\": \"orders\",\n \"label\": \"Synthetic orders\",\n \"unit\": \"count\"\n },\n {\n \"id\": \"visits\",\n \"label\": \"Synthetic visits\",\n \"unit\": \"count\"\n }\n ],\n \"periods\": [\n {\n \"id\": \"before\",\n \"label\": \"Prior period\"\n },\n {\n \"id\": \"after\",\n \"label\": \"Current period\"\n }\n ],\n \"cells\": [\n {\n \"metricId\": \"orders\",\n \"periodId\": \"before\",\n \"value\": 100,\n \"sourceRef\": \"table A1\"\n },\n {\n \"metricId\": \"orders\",\n \"periodId\": \"after\",\n \"value\": 120,\n \"sourceRef\": \"table A2\"\n },\n {\n \"metricId\": \"visits\",\n \"periodId\": \"before\",\n \"value\": 300,\n \"sourceRef\": \"table B1\"\n },\n {\n \"metricId\": \"visits\",\n \"periodId\": \"after\",\n \"value\": 400,\n \"sourceRef\": \"table B2\"\n }\n ]\n },\n \"claims\": [\n {\n \"id\": \"total\",\n \"lineRef\": \"report line 1\",\n \"kind\": \"total\",\n \"metricId\": \"orders\",\n \"periodIds\": [\n \"before\",\n \"after\"\n ],\n \"claimedValue\": 220,\n \"absoluteTolerance\": 0\n },\n {\n \"id\": \"growth\",\n \"lineRef\": \"report line 2\",\n \"kind\": \"percentage_change\",\n \"metricId\": \"orders\",\n \"fromPeriodId\": \"before\",\n \"toPeriodId\": \"after\",\n \"claimedValue\": 25,\n \"absoluteTolerance\": 0.05\n },\n {\n \"id\": \"ratio\",\n \"lineRef\": \"report line 3\",\n \"kind\": \"ratio\",\n \"numerator\": {\n \"metricId\": \"orders\",\n \"periodId\": \"before\"\n },\n \"denominator\": {\n \"metricId\": \"visits\",\n \"periodId\": \"before\"\n },\n \"scale\": \"percent\",\n \"claimedValue\": 33.3,\n \"absoluteTolerance\": 0.05\n }\n ]\n}",
"tools_triggered": "open_app, audit_report",
"expected_behavior": "Call open_app with no arguments. It returns ready for reportcheck and the host can display the associated interactive workspace with task selection, labeled inputs and clearly identified sample inputs. Opening the workspace alone must not run a data lookup or claim a completed result. Run audit_report only for the explicit request and supplied inputs that follow. Returns two matches and one mismatch. Total 220 matches; growth is 20 percent rather than the claimed 25, a difference of 5 percentage points; the 33.3 percent ratio matches within the supplied 0.05 absolute tolerance. Growth preserves report line 2 and source refs table A1/table A2. Identifies inputs as caller_provided without verifying their source. Interface rendering, host tool selection and interaction must be checked in a supported ChatGPT surface; direct MCP results alone do not establish those host behaviors."
},
{
"description": "P2: Distinguish an explicit null from a missing cell without inventing a total",
"prompt": "Check this synthetic total while preserving the difference between an explicit null and an omitted cell. Do not substitute zero for missing data.\n\nUse only this synthetic input:\n{\n \"table\": {\n \"metrics\": [\n {\n \"id\": \"orders\",\n \"label\": \"Synthetic orders\",\n \"unit\": \"count\"\n }\n ],\n \"periods\": [\n {\n \"id\": \"before\",\n \"label\": \"Prior period\"\n },\n {\n \"id\": \"after\",\n \"label\": \"Current period\"\n }\n ],\n \"cells\": [\n {\n \"metricId\": \"orders\",\n \"periodId\": \"before\",\n \"value\": null,\n \"sourceRef\": \"table A1\"\n }\n ]\n },\n \"claims\": [\n {\n \"id\": \"total\",\n \"lineRef\": \"report line 1\",\n \"kind\": \"total\",\n \"metricId\": \"orders\",\n \"periodIds\": [\n \"before\",\n \"after\"\n ],\n \"claimedValue\": 220,\n \"absoluteTolerance\": 0\n }\n ]\n}",
"tools_triggered": "audit_report",
"expected_behavior": "Returns one unverifiable claim with reason missing_or_null_input and expectedValue/difference null. The first input has state null_value and sourceRef table A1; the second has state missing_cell and sourceRef null. Does not invent a total or classify either absent value as zero."
},
{
"description": "P3: Keep a ratio with a zero denominator unresolved",
"prompt": "Audit this synthetic percentage ratio with its supplied zero denominator. Report whether the claim can be verified without dividing by zero.\n\nUse only this synthetic input:\n{\n \"table\": {\n \"metrics\": [\n {\n \"id\": \"orders\",\n \"label\": \"Synthetic orders\",\n \"unit\": \"count\"\n },\n {\n \"id\": \"visits\",\n \"label\": \"Synthetic visits\",\n \"unit\": \"count\"\n }\n ],\n \"periods\": [\n {\n \"id\": \"current\",\n \"label\": \"Current period\"\n }\n ],\n \"cells\": [\n {\n \"metricId\": \"orders\",\n \"periodId\": \"current\",\n \"value\": 10,\n \"sourceRef\": \"table A1\"\n },\n {\n \"metricId\": \"visits\",\n \"periodId\": \"current\",\n \"value\": 0,\n \"sourceRef\": \"table B1\"\n }\n ]\n },\n \"claims\": [\n {\n \"id\": \"ratio\",\n \"lineRef\": \"report line 1\",\n \"kind\": \"ratio\",\n \"numerator\": {\n \"metricId\": \"orders\",\n \"periodId\": \"current\"\n },\n \"denominator\": {\n \"metricId\": \"visits\",\n \"periodId\": \"current\"\n },\n \"scale\": \"percent\",\n \"claimedValue\": 100,\n \"absoluteTolerance\": 0\n }\n ]\n}",
"tools_triggered": "audit_report",
"expected_behavior": "Returns one unverifiable claim with reason zero_denominator, expectedValue null and unit percent. Retains the denominator value as a supplied zero with state provided. Does not return infinity, 100 percent or a fabricated ratio."
},
{
"description": "P4: Compare two complete aggregate metrics across distinct periods",
"prompt": "Compare absolute and relative changes for these two synthetic aggregate metrics between before and after. Use the supplied values only and make no causal claim.\n\nUse only this synthetic input:\n{\n \"table\": {\n \"metrics\": [\n {\n \"id\": \"orders\",\n \"label\": \"Synthetic orders\",\n \"unit\": \"count\"\n },\n {\n \"id\": \"visits\",\n \"label\": \"Synthetic visits\",\n \"unit\": \"count\"\n }\n ],\n \"periods\": [\n {\n \"id\": \"before\",\n \"label\": \"Prior period\"\n },\n {\n \"id\": \"after\",\n \"label\": \"Current period\"\n }\n ],\n \"cells\": [\n {\n \"metricId\": \"orders\",\n \"periodId\": \"before\",\n \"value\": 100,\n \"sourceRef\": \"table A1\"\n },\n {\n \"metricId\": \"orders\",\n \"periodId\": \"after\",\n \"value\": 120,\n \"sourceRef\": \"table A2\"\n },\n {\n \"metricId\": \"visits\",\n \"periodId\": \"before\",\n \"value\": 200,\n \"sourceRef\": \"table B1\"\n },\n {\n \"metricId\": \"visits\",\n \"periodId\": \"after\",\n \"value\": 250,\n \"sourceRef\": \"table B2\"\n }\n ]\n },\n \"metricIds\": [\n \"orders\",\n \"visits\"\n ],\n \"fromPeriodId\": \"before\",\n \"toPeriodId\": \"after\"\n}",
"tools_triggered": "compare_periods",
"expected_behavior": "Returns orders absoluteChange 20 and relativePercentChange 20; visits absoluteChange 50 and relativePercentChange 25. Both relativeStatus values are computed, all source references are retained, and inputSource is caller_provided. Does not infer causes or claim connected analytics verification."
},
{
"description": "P5: Expose absolute changes while distinguishing zero and negative baselines",
"prompt": "Compare these synthetic metrics with zero and negative prior values. Report absolute changes but keep unsupported relative percentage changes unresolved.\n\nUse only this synthetic input:\n{\n \"table\": {\n \"metrics\": [\n {\n \"id\": \"launch\",\n \"label\": \"Synthetic launch orders\",\n \"unit\": \"count\"\n },\n {\n \"id\": \"balance\",\n \"label\": \"Synthetic aggregate balance\",\n \"unit\": \"USD\"\n }\n ],\n \"periods\": [\n {\n \"id\": \"before\",\n \"label\": \"Prior period\"\n },\n {\n \"id\": \"after\",\n \"label\": \"Current period\"\n }\n ],\n \"cells\": [\n {\n \"metricId\": \"launch\",\n \"periodId\": \"before\",\n \"value\": 0,\n \"sourceRef\": \"table A1\"\n },\n {\n \"metricId\": \"launch\",\n \"periodId\": \"after\",\n \"value\": 20,\n \"sourceRef\": \"table A2\"\n },\n {\n \"metricId\": \"balance\",\n \"periodId\": \"before\",\n \"value\": -20,\n \"sourceRef\": \"table B1\"\n },\n {\n \"metricId\": \"balance\",\n \"periodId\": \"after\",\n \"value\": 120,\n \"sourceRef\": \"table B2\"\n }\n ]\n },\n \"metricIds\": [\n \"launch\",\n \"balance\"\n ],\n \"fromPeriodId\": \"before\",\n \"toPeriodId\": \"after\"\n}",
"tools_triggered": "compare_periods",
"expected_behavior": "Returns launch absoluteChange 20, relativeStatus zero_baseline and relativePercentChange null. Returns balance absoluteChange 140, relativeStatus negative_baseline and relativePercentChange null. Does not present undefined relative changes as growth rates."
}
],
"negative": [
{
"description": "N1: Do not claim access to a connected analytics account",
"prompt": "Use Report Numbers Checker to log into our analytics account at https://analytics.example.test, fetch last month's conversions and certify the live source data. I have not supplied a table.",
"tools_triggered": "None",
"expected_behavior": "No plugin tool invocation. Explain that the plugin cannot connect to analytics accounts, fetch live records or certify sources. Ask for a caller-supplied aggregate table with metric IDs, period IDs, cells and source references; do not claim account access or data retrieval."
},
{
"description": "N2: Do not infer causation from a before-and-after count",
"prompt": "Synthetic orders rose from 100 before to 120 after. Use Report Numbers Checker to prove our advertising campaign caused all 20 extra orders. Do not calculate the growth rate; I only want proof of causation.",
"tools_triggered": "None",
"expected_behavior": "No plugin tool invocation. Explain that arithmetic comparisons cannot establish causation and this plugin does not perform causal inference. Do not claim that the campaign caused the change or invent experiment or attribution evidence."
},
{
"description": "N3: Do not modify source documents or email a corrected report",
"prompt": "Use Report Numbers Checker to edit the synthetic report at https://reports.example.test/monthly.pdf, change its growth claim from 25 percent to 20 percent, publish the replacement PDF and email it to board@example.test.",
"tools_triggered": "None",
"expected_behavior": "No plugin tool invocation. State that fetching, editing, publishing PDFs and sending email are unsupported. Do not claim that a document or source system was changed or a report was sent; checking supplied aggregate values is the supported capability."
}
]
},
"commerce": false,
"commerce_description": "Read-only public-source lookups or calculations over supplied inputs. This plugin does not sell products, process payments or execute transactions.",
"demo_recording_url": "https://reportcheck-mcp.sunrysetech.com/review-demo.mp4"
},
"publication": {
"release_notes": "0.1.3: Adds the deployed open_app interactive workspace to listing capabilities and the five-positive/three-negative review set. Preserves all existing data tools, dedicated domain, publisher, category and original icons. Updates the listing color and public usage guidance to navy/blue. Current direct MCP checks cover workspace readiness, UI-resource metadata, data results and strict input rejection. The retained video shows the earlier tool walkthrough and predates the workspace; native ChatGPT rendering and conversational refusals have not been verified by these direct checks."
},
"apps": "./.app.json"
}
}
}
SHA-256: 6d60e67548280836dde90e4dc5fa437d7f7996c2d8bd387d8ed4ad2e288495b5