Skip to content
Back to GraphSheets

Card snapshot

mcp.graphsheets.ai · 2026-11-14 01:16:14 UTC · fe4ac1571c65afcb8f927b01b8b149ab8903985f07efe7e33f865f6f18d07cb4

This is a frozen copy of the agent's agent-card.json as we observed it at the timestamp above. We capture a new snapshot every time the card's content hash changes. Useful for: forensic drift analysis, verifying downstream callers see the right version, reproducing routing decisions made historically.

{
  "name": "GraphSheets",
  "url": "https://mcp.graphsheets.ai/a2a",
  "description": "Reads financial models kept in GraphSheets: lists them, gives an overview, finds rows, returns evaluated values, explains how a figure is worked out and runs the model's checks. Read-only; answers are immediate.",
  "version": "0.1.0",
  "documentationUrl": "https://graphsheets.ai/api/v1/docs#a2a",
  "iconUrl": "https://mcp.graphsheets.ai/apple-touch-icon.png",
  "defaultInputModes": [
    "application/json"
  ],
  "defaultOutputModes": [
    "application/json"
  ],
  "skills": [
    {
      "id": "list-models",
      "name": "List models",
      "description": "The models this token can see: uid, title, head hash, when last changed, and the verification rung each is on. Send a data part {\"skill\": \"list-models\", \"arguments\": {\u2026}}; the arguments are the `model_list` tool's.",
      "tags": [
        "models",
        "list"
      ],
      "examples": [
        "{\"skill\":\"list-models\",\"arguments\":{}}"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "model-overview",
      "name": "Model overview",
      "description": "The model at a glance: title, axis, scenarios, sections with node counts, ledgers, whether uncertainty is declared, the verification rung, check status per scenario and lint counts. Call this first. Send a data part {\"skill\": \"model-overview\", \"arguments\": {\u2026}}; the arguments are the `model_overview` tool's.",
      "tags": [
        "models",
        "overview"
      ],
      "examples": [
        "{\"skill\":\"model-overview\",\"arguments\":{\"model\":\"model_\u2026\"}}"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "search-model",
      "name": "Search a model",
      "description": "Find nodes by a word in their name, title, description, source, unit or formula, optionally restricted to a kind (input, calculated, constant, check, ledger). Returns declarations, not values. A kind with no query lists every node of that kind. Send a data part {\"skill\": \"search-model\", \"arguments\": {\u2026}}; the arguments are the `model_search` tool's.",
      "tags": [
        "models",
        "search"
      ],
      "examples": [
        "{\"skill\":\"search-model\",\"arguments\":{\"model\":\"model_\u2026\",\"query\":\"revenue\"}}"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "read-values",
      "name": "Read values",
      "description": "Evaluated values for named nodes across the axis in a scenario, actuals overriding where present. Errors appear as their code (#REF, #DIV/0). A node whose title carries references (`{{fiscal.royalty_threshold}}`) has it worked out in that scenario under `titles`, as the reader sees it. Ask for the nodes you need, not the model. Send a data part {\"skill\": \"read-values\", \"arguments\": {\u2026}}; the arguments are the `values_get` tool's.",
      "tags": [
        "values",
        "figures",
        "forecast"
      ],
      "examples": [
        "{\"skill\":\"read-values\",\"arguments\":{\"model\":\"model_\u2026\",\"nodes\":[\"income.revenue\"],\"scenario\":\"base\"}}"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "explain-figure",
      "name": "Explain a figure",
      "description": "Why a value is what it is: the evaluation trace behind one node in one period \u2014 its formula, each input's value and whether it came from a formula, an input, an actual override or an error. `depth` follows the trail further. Send a data part {\"skill\": \"explain-figure\", \"arguments\": {\u2026}}; the arguments are the `explain` tool's.",
      "tags": [
        "explain",
        "audit",
        "trace"
      ],
      "examples": [
        "{\"skill\":\"explain-figure\",\"arguments\":{\"model\":\"model_\u2026\",\"node\":\"income.profit\",\"period\":\"2026-03\"}}"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    },
    {
      "id": "verify-model",
      "name": "Verify a model",
      "description": "Run the verification ladder on the model as it stands: validation issues, every lint finding with its rule and node, every check per scenario with its failing periods, the rung, and `connectivity` \u2014 the inputs nothing reads, the inputs with no values, the calculated rows nothing reads or shows, the ledger columns no formula reads, and the rows of reported history nothing reads \u2014 which is whether the graph runs from inputs through formulas to outputs. `severalRates` lists any IRR whose cashflows have more than one rate, with every rate and the one the row shows. A row named as the model's answer, one `risk_set` reports, one a statistic asks about and one a scoped check covers are all read or shown, so none of them is listed. The authoritative answer to 'what is wrong'. Send a data part {\"skill\": \"verify-model\", \"arguments\": {\u2026}}; the arguments are the `verify` tool's.",
      "tags": [
        "checks",
        "lint",
        "verify"
      ],
      "examples": [
        "{\"skill\":\"verify-model\",\"arguments\":{\"model\":\"model_\u2026\",\"onlyFailing\":true}}"
      ],
      "inputModes": [
        "application/json"
      ],
      "outputModes": [
        "application/json"
      ]
    }
  ],
  "capabilities": {
    "streaming": false,
    "pushNotifications": false,
    "stateTransitionHistory": false,
    "extensions": null
  },
  "protocolVersion": "1.0",
  "provider": {
    "organization": "GraphSheets",
    "url": "https://graphsheets.ai/"
  }
}