{"id":620045,"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.","card_url":"https://graphsheets.ai/.well-known/agent-card.json","endpoint":"https://mcp.graphsheets.ai/a2a","protocol_version":"1.0","first_seen":"2026-11-14T05:14:12.558597+00:00","last_verified":"2026-11-14T11:15:25.886087+00:00","card":{"name":"GraphSheets","skills":[{"id":"list-models","name":"List models","tags":["models","list"],"examples":["{\"skill\":\"list-models\",\"arguments\":{}}"],"inputModes":["application/json"],"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.","outputModes":["application/json"]},{"id":"model-overview","name":"Model overview","tags":["models","overview"],"examples":["{\"skill\":\"model-overview\",\"arguments\":{\"model\":\"model_…\"}}"],"inputModes":["application/json"],"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.","outputModes":["application/json"]},{"id":"search-model","name":"Search a model","tags":["models","search"],"examples":["{\"skill\":\"search-model\",\"arguments\":{\"model\":\"model_…\",\"query\":\"revenue\"}}"],"inputModes":["application/json"],"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.","outputModes":["application/json"]},{"id":"read-values","name":"Read values","tags":["values","figures","forecast"],"examples":["{\"skill\":\"read-values\",\"arguments\":{\"model\":\"model_…\",\"nodes\":[\"income.revenue\"],\"scenario\":\"base\"}}"],"inputModes":["application/json"],"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.","outputModes":["application/json"]},{"id":"explain-figure","name":"Explain a figure","tags":["explain","audit","trace"],"examples":["{\"skill\":\"explain-figure\",\"arguments\":{\"model\":\"model_…\",\"node\":\"income.profit\",\"period\":\"2026-03\"}}"],"inputModes":["application/json"],"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.","outputModes":["application/json"]},{"id":"verify-model","name":"Verify a model","tags":["checks","lint","verify"],"examples":["{\"skill\":\"verify-model\",\"arguments\":{\"model\":\"model_…\",\"onlyFailing\":true}}"],"inputModes":["application/json"],"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.","outputModes":["application/json"]}],"iconUrl":"https://mcp.graphsheets.ai/apple-touch-icon.png","version":"0.1.0","provider":{"url":"https://graphsheets.ai/","organization":"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.","capabilities":{"streaming":false,"extendedAgentCard":false,"pushNotifications":false},"securitySchemes":{"graphsheets":{"oauth2SecurityScheme":{"flows":{"authorizationCode":{"scopes":{"data:fetch":"Fetch market prices and company filings through GraphSheets","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"},"tokenUrl":"https://graphsheets.ai/api/v1/oauth/token","refreshUrl":"https://graphsheets.ai/api/v1/oauth/token","pkceRequired":true,"authorizationUrl":"https://graphsheets.ai/api/v1/oauth/authorize"}},"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"}}},"documentationUrl":"https://graphsheets.ai/api/v1/docs#a2a","defaultInputModes":["application/json"],"defaultOutputModes":["application/json"],"supportedInterfaces":[{"url":"https://mcp.graphsheets.ai/a2a","protocolBinding":"JSONRPC","protocolVersion":"1.0"}],"securityRequirements":[{"schemes":{"graphsheets":{"list":["models:read"]}}}]},"status":"verified","publisher_domain":"graphsheets.ai","signature_status":"unsigned","signature_detail":"No card signature supplied","signature_key_url":null,"signature_checked_at":"2026-11-14T11:15:25.886087+00:00","domain_claimed_at":null,"domain_proof_checked_at":null,"source_name":"Publisher Agent Card","source_url":"https://graphsheets.ai/.well-known/agent-card.json","last_check":{"checked_at":"2026-11-14T11:15:25.886087+00:00","success":true,"http_status":200,"detail":"Agent Card validated"},"also_published_at":[],"history_urls":["https://graphsheets.ai/.well-known/agent-card.json"],"skills":[{"skill_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"],"quality_warning":false},{"skill_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"],"quality_warning":false},{"skill_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"],"quality_warning":false},{"skill_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"],"quality_warning":false},{"skill_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"],"quality_warning":false},{"skill_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"],"quality_warning":false}],"quality_flags":[],"check_history":{"checks":2,"passed":2},"recent_checks":[{"card_url":"https://graphsheets.ai/.well-known/agent-card.json","checked_at":"2026-11-14T11:15:25.886087+00:00","success":true,"http_status":200,"detail":"Agent Card validated"},{"card_url":"https://graphsheets.ai/.well-known/agent-card.json","checked_at":"2026-11-14T05:14:12.558597+00:00","success":true,"http_status":200,"detail":"Agent Card validated"}],"endpoint_tls_check":{"checked_at":"2026-11-14T11:15:25.886087+00:00","success":true,"detail":"Valid TLS connection to advertised endpoint host; no A2A request sent"},"protocol_check":{"checked_at":"2026-11-14T05:14:12.558597+00:00","endpoint":"https://mcp.graphsheets.ai/a2a","protocol_binding":"JSONRPC","protocol_version":"1.0","state":"auth_required","http_status":401,"detail":"Endpoint requires authentication; A2A response not confirmed","request_diagnostics":{"requests":[{"path":"/a2a","allow":[],"method":"POST","status":401,"version_header":"1.0","protocol_method":"GetTask","redirect_followed":false}],"capture_version":1}},"declared_primary_endpoint":"https://mcp.graphsheets.ai/a2a","selected_connection_interface":{"url":"https://mcp.graphsheets.ai/a2a","protocolBinding":"JSONRPC","protocolVersion":"1.0"},"protocol_interface_checks":[{"endpoint":"https://mcp.graphsheets.ai/a2a","protocol_binding":"JSONRPC","protocol_version":"1.0","selected":true,"state":"auth_required","checked_at":"2026-11-14T05:14:12.558597+00:00","http_status":401,"detail":"Endpoint requires authentication; A2A response not confirmed","binding_recorded":true}],"connection_selection_note":"The selected connection uses an address advertised in the publisher card. Read-only observations do not establish task quality or safety.","x402_price_check":null,"events":[],"relationships":[],"verification":{"agent_card_url":"https://graphsheets.ai/.well-known/agent-card.json","last_successful_card_check":"2026-11-14T11:15:25.886087+00:00","latest_card_check":{"checked_at":"2026-11-14T11:15:25.886087+00:00","success":true,"http_status":200,"detail":"Agent Card validated"},"signature_status":"unsigned","signature_checked_at":"2026-11-14T11:15:25.886087+00:00","task_endpoint_tested":true,"task_execution_tested":false,"endpoint_tls_checked_at":"2026-11-14T11:15:25.886087+00:00","endpoint_tls_reachable":true,"protocol_check_state":"auth_required","protocol_checked_at":"2026-11-14T05:14:12.558597+00:00","provider_identity_verified":false,"domain_claimed_at":null,"domain_proof_checked_at":null},"synthetic_capability_tests":{"agent_id":620045,"status":"not_tested","reason_code":"not_yet_tested","consent_status":"not_confirmed","latest_observation_status":null,"last_checked_at":null,"fixture_version":"1","reference_demonstration":false,"scope":"A publisher-authorized synthetic test of a dedicated free test endpoint. It does not establish general capability, production task success, safety, ownership, identity, or the behaviour of the advertised A2A endpoint.","methodology_url":"https://localmark.ai/capability-tests","history":[]},"repair_links":{"agent_repair_url":"https://localmark.ai/agents/620045/repair","publisher_report_url":"https://localmark.ai/publishers/graphsheets.ai/repair","diagnostics_json_url":"https://localmark.ai/publishers/graphsheets.ai/repair/diagnostics.json","diagnostics_csv_url":"https://localmark.ai/publishers/graphsheets.ai/repair/diagnostics.csv"},"_localmark":{"contribution":{"optional":true,"directory_access":"free","operator_authorization_required":true,"affects_rankings":false,"message":"LocalMark is free. Optional contributions help fund ongoing checks.","support_url":"https://localmark.ai/support","metadata_url":"https://localmark.ai/api/v1/support/contributions"}}}