Skip to main content
Glama

Sato Hub: Build Onchain & Crypto Agents

Fetch one Sato Hub record

fetch
Read-onlyIdempotent

USE WHEN you hold an id that search returned and want that record from Sato Hub, the daily-rebuilt index of what onchain and crypto AI agents are built from, as plain text to quote. Not for token prices, trading or investment advice. NOT FOR a directory slug (use onchain_agent_get_resource instead) or an id you made up (call search first).

RETURNS (json): { id, title, text, url, metadata: { as_of, kind, sato_score?, source } }. text is plain prose to quote: for a listing, what it is, its category and chains, its Sato Score with the date (how open, active and verifiable it is — not a safety or returns grade), its last observed activity, and whether Sato Hub reproduced its install; for an answer, number or wiki page, the answer with its date. url is the canonical satohub.ai page to cite. An id without a prefix is read as the record with that exact slug, or a listing it names exactly (the same name written differently, a recorded alias, the listing's own name); such an answer is labelled { interpreted_as, requested, rule, note } and its text starts with the note. Anything else is a miss that serves nothing (not an error: { miss, candidates, suggestions } beside an empty record whose text says so): it lists the ids search ranks for it as candidates ({ candidates: [{ id, title, url }] }), each an exact fetch to make. Read-only.

Example: { id: "resource:coinbase-agentkit" }

Input Schema

NameRequiredDescriptionDefault
idYesAn id returned by `search`: resource:<slug>, answer:<slug>, number:<slug> or wiki:<slug>.

Output Schema

NameRequiredDescriptionDefault
idYes
urlYesThe canonical satohub.ai page to cite.
missNoOnly when no record has the id: nothing was served (the record's text says so); candidates are the ids `search` ranks for it.
noteNoOnly with interpreted_as: one sentence saying what was served and why. Not an exact match.
ruleNoOnly with interpreted_as: which reading (other-kind, template-placeholder, search).
textYesPlain text to quote: the facts, each with its date, and the source URL.
titleYes
metadataYes
requestedNoOnly with interpreted_as: the id that was sent.
candidatesNoWith miss: the ids to fetch instead, best first. Candidates, never matches.
needs_inputNoOnly when the call lacked its required argument: nothing was served; note says what to send.
suggestionsNoWhere to go next (a tool to call, or a candidate id to fetch). Suggestions, never matches.
example_callsNoWith needs_input: exact calls that would work.
interpreted_asNoOnly when the id was interpreted: the id of the record served instead (e.g. resource:coinbase-agentkit).
interpretationsNoOnly when more than one reading applied: every label, the first being interpreted_as / rule.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / suggestions / items / properties / pointer
      Added value: +{
      +  "const": true,
      +  "type": "boolean"
      +}
  2. Changed6 schema fields changed
    • addedOutput schema / properties / candidates
      Added value: +{
      +  "description": "With miss: the ids to fetch instead, best first. Candidates, never matches.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "id": {
      +        "type": "string"
      +      },
      +      "title": {
      +        "type": "string"
      +      },
      +      "url": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "title",
      +      "url"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / example_calls
      Added value: +{
      +  "description": "With needs_input: exact calls that would work.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "args": {
      +        "additionalProperties": {},
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "tool": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "tool",
      +      "args"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / interpretations
      Added value: +{
      +  "description": "Only when more than one reading applied: every label, the first being interpreted_as / rule.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "interpreted_as": {
      +        "type": "string"
      +      },
      +      "note": {
      +        "type": "string"
      +      },
      +      "requested": {
      +        "type": "string"
      +      },
      +      "rule": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "rule",
      +      "requested",
      +      "interpreted_as",
      +      "note"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / miss
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Only when no record has the id: nothing was served (the record's text says so); candidates are the ids `search` ranks for it.",
      +  "properties": {
      +    "id": {
      +      "type": "string"
      +    },
      +    "kind": {
      +      "const": "fetch",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "kind",
      +    "id"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / needs_input
      Added value: +{
      +  "description": "Only when the call lacked its required argument: nothing was served; note says what to send.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / suggestions
      Added value: +{
      +  "description": "Where to go next (a tool to call, or a candidate id to fetch). Suggestions, never matches.",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "args": {
      +        "additionalProperties": {},
      +        "propertyNames": {
      +          "type": "string"
      +        },
      +        "type": "object"
      +      },
      +      "kind": {
      +        "type": "string"
      +      },
      +      "name": {
      +        "type": "string"
      +      },
      +      "score": {
      +        "type": "number"
      +      },
      +      "slug": {
      +        "type": "string"
      +      },
      +      "tool": {
      +        "type": "string"
      +      },
      +      "why": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "kind",
      +      "name",
      +      "tool",
      +      "why"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  3. Changed4 schema fields changed
    • addedOutput schema / properties / interpreted_as
      Added value: +{
      +  "description": "Only when the id was interpreted: the id of the record served instead (e.g. resource:coinbase-agentkit).",
      +  "type": "string"
      +}
    • addedOutput schema / properties / note
      Added value: +{
      +  "description": "Only with interpreted_as: one sentence saying what was served and why. Not an exact match.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / requested
      Added value: +{
      +  "description": "Only with interpreted_as: the id that was sent.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / rule
      Added value: +{
      +  "description": "Only with interpreted_as: which reading (other-kind, template-placeholder, search).",
      +  "type": "string"
      +}
  4. Changed2 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  5. Added

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, and the description adds real context beyond them: unprefixed ids are reinterpreted via slug/alias/name rules and labelled { interpreted_as, requested, rule, note }; misses are explicitly not errors and return { miss, candidates, suggestions } with an empty record. That is precisely the failure-mode behavior an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded and clearly sectioned with USE WHEN / NOT FOR / RETURNS / Example, so the routing information comes first. The RETURNS block is long and partly duplicates the output schema, and the nested parentheticals make it dense, but nearly every sentence carries operational information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read tool with full schema coverage, annotations, and an output schema, this is close to complete: it covers intent, alternatives, interpretation edge cases, and miss semantics. The main redundancy is re-specifying the return shape when an output schema already exists.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already lists the four id prefixes, so baseline is 3. The description goes further by defining what happens with an unprefixed id and what counts as a miss, which the schema does not say. Slightly short of 5 only because the prefix enumeration is restated from the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Fetch one Sato Hub record") and defines what Sato Hub is ("the daily-rebuilt index of what onchain and crypto AI agents are built from"). It also distinguishes itself from both siblings by name: `search` for discovering ids and onchain_agent_get_resource for slugs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit USE WHEN clause names the precondition (you hold an id that `search` returned) and the goal (quote as plain text). NOT FOR covers two exclusions with the correct alternative for each: directory slugs go to onchain_agent_get_resource, invented ids go to `search` first.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.