{"name":"GraphSheets","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.","supportedInterfaces":[{"url":"https://mcp.graphsheets.ai/a2a","protocolBinding":"JSONRPC","protocolVersion":"1.0"}],"provider":{"organization":"GraphSheets","url":"https://graphsheets.ai/"},"version":"0.1.0","documentationUrl":"https://graphsheets.ai/api/v1/docs#a2a","iconUrl":"https://mcp.graphsheets.ai/apple-touch-icon.png","capabilities":{"streaming":false,"pushNotifications":false,"extendedAgentCard":false},"securitySchemes":{"graphsheets":{"oauth2SecurityScheme":{"description":"OAuth 2.1 with PKCE and dynamic client registration. Ask for the token with resource=https://mcp.graphsheets.ai/mcp; the same connection serves MCP and A2A.","oauth2MetadataUrl":"https://graphsheets.ai/.well-known/oauth-authorization-server","flows":{"authorizationCode":{"authorizationUrl":"https://graphsheets.ai/api/v1/oauth/authorize","tokenUrl":"https://graphsheets.ai/api/v1/oauth/token","refreshUrl":"https://graphsheets.ai/api/v1/oauth/token","scopes":{"models:read":"Read the models you can open, and keep your own private scenarios on them","models:write":"Create models and make changes, which land marked for your review","data:fetch":"Fetch market prices and company filings through GraphSheets"},"pkceRequired":true}}}}},"securityRequirements":[{"schemes":{"graphsheets":{"list":["models:read"]}}}],"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\": {…}}; 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\": {…}}; the arguments are the `model_overview` tool's.","tags":["models","overview"],"examples":["{\"skill\":\"model-overview\",\"arguments\":{\"model\":\"model_…\"}}"],"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\": {…}}; the arguments are the `model_search` tool's.","tags":["models","search"],"examples":["{\"skill\":\"search-model\",\"arguments\":{\"model\":\"model_…\",\"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\": {…}}; the arguments are the `values_get` tool's.","tags":["values","figures","forecast"],"examples":["{\"skill\":\"read-values\",\"arguments\":{\"model\":\"model_…\",\"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 — 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\": {…}}; the arguments are the `explain` tool's.","tags":["explain","audit","trace"],"examples":["{\"skill\":\"explain-figure\",\"arguments\":{\"model\":\"model_…\",\"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` — 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 — 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\": {…}}; the arguments are the `verify` tool's.","tags":["checks","lint","verify"],"examples":["{\"skill\":\"verify-model\",\"arguments\":{\"model\":\"model_…\",\"onlyFailing\":true}}"],"inputModes":["application/json"],"outputModes":["application/json"]}]}