{
  "name": "describe.net",
  "version": "2.0.0",
  "serverInfo": {
    "name": "describe.net",
    "version": "2.0.0"
  },
  "description": "Global ERC-8004 reputation index over every chain we read, as MCP tools. Decomposes a counterparty's reputation into the counterparties that wrote it: how many distinct raters, how many times each one spoke, on what, and when. Thirteen tools (twelve verified 2026-08-21, describe_resolve added 2026-08-23): five are priced like the routes behind them; the other eight never charge — describe_pricing explains the metered ones, describe_check_wallet tells you whether a wallet has anything worth paying for before you spend on it, and describe_resolve tells you what a bare string even IS (wallet, agent id, or both at once) before you pay to look one up on the wrong chain. Leaderboard and facets also have free variants (first page / no wallet), which is why ten entries below carry price_usd \"0\": eight unconditional, two with a conditional price_note. Two transports, one code: a hosted Streamable HTTP endpoint (`url` / `remotes`) and a local stdio launcher (`stdio`).",
  "url": "https://api.describe.net/mcp",
  "serverUrl": "https://api.describe.net/mcp",
  "transport": "streamable-http",
  "stdio": {
    "type": "stdio",
    "command": "python",
    "args": [
      "/absolute/path/to/describe-net/mcp/server.py"
    ],
    "env": {
      "DESCRIBENET_API_URL": "https://api.describe.net"
    }
  },
  "remotes": [
    {
      "type": "streamable-http",
      "url": "https://api.describe.net/mcp",
      "description": "The same thirteen tools, hosted. Stateless: every JSON-RPC message is one POST; the server issues no mcp-session-id and answers application/json (no SSE). GET answers 405 — there are no server-initiated messages. Metered tools relay the x402 402 of the route behind them; you pay with your own signature via the `payment` argument, exactly as over stdio. No key, token or account is needed to connect."
    }
  ],
  "capabilities": {
    "tools": true,
    "resources": true,
    "prompts": false
  },
  "pricing_note": "price_usd values below were re-verified on 2026-08-21 against the live table at https://api.describe.net/pricing. They are a courtesy copy and can go stale: the authoritative price for one concrete call is the 402 challenge that call returns when made without payment — which costs nothing to request. The server itself never hardcodes prices; it probes the live 402. describe_resolve was added on 2026-08-23, after that run; its 0 was not read back from it.",
  "tools": [
    {
      "name": "describe_pricing",
      "title": "What everything costs and how big the index is (FREE)",
      "readOnlyHint": true,
      "price_usd": "0",
      "endpoint": "GET /pricing + GET /health"
    },
    {
      "name": "describe_resolve",
      "title": "The finder: what this string is and which chains it is on (FREE)",
      "readOnlyHint": true,
      "price_usd": "0",
      "endpoint": "GET /search/{query}"
    },
    {
      "name": "describe_check_wallet",
      "title": "Does this wallet have reputation, and on which chains? (FREE)",
      "readOnlyHint": true,
      "price_usd": "0",
      "endpoint": "GET /wallets/{wallet}/chains"
    },
    {
      "name": "describe_chains",
      "title": "Every indexed chain side by side, or one in full detail (FREE)",
      "readOnlyHint": true,
      "price_usd": "0",
      "endpoint": "GET /chains, or GET /chains/{network}"
    },
    {
      "name": "describe_feed",
      "title": "The index's pulse: the newest ratings, in chain order (FREE)",
      "readOnlyHint": true,
      "price_usd": "0",
      "endpoint": "GET /feed"
    },
    {
      "name": "describe_index_status",
      "title": "How alive and how complete the index is (FREE)",
      "readOnlyHint": true,
      "price_usd": "0",
      "endpoint": "GET /health"
    },
    {
      "name": "describe_types",
      "title": "Self-declared type coverage, with its gap in plain sight (FREE)",
      "readOnlyHint": true,
      "price_usd": "0",
      "endpoint": "GET /stats/types"
    },
    {
      "name": "describe_manifesto",
      "title": "What this service believes, wired to the code that enforces it (FREE)",
      "readOnlyHint": true,
      "price_usd": "0",
      "endpoint": "GET /manifesto"
    },
    {
      "name": "describe_leaderboard",
      "title": "Wallets ranked by evidence, not by bare average",
      "readOnlyHint": true,
      "price_usd": "0",
      "price_note": "First page is free (GET /leaderboard, no parameters). Paging with offset or filtering by type goes to GET /leaderboard/page and costs 0.01 per call.",
      "endpoint": "GET /leaderboard · GET /leaderboard/page"
    },
    {
      "name": "describe_lookup_wallet",
      "title": "Reputation of a wallet on every chain we read, with its composition",
      "readOnlyHint": false,
      "price_usd": "0.01",
      "price_note": "snapshot=true costs 0.05 and WRITES a durable, citable receipt row. That write is why readOnlyHint is false.",
      "endpoint": "GET /reputation/wallet/{wallet}"
    },
    {
      "name": "describe_rater_profile",
      "title": "The wallet as RATER: what it emitted, decomposed (no score)",
      "readOnlyHint": true,
      "price_usd": "0.01",
      "endpoint": "GET /reputation/rater/{wallet}"
    },
    {
      "name": "describe_lookup_agent",
      "title": "One agent, its score, and EVERY rating with its transaction",
      "readOnlyHint": true,
      "price_usd": "0.02",
      "endpoint": "GET /reputation/agent/{network}/{agent_id}"
    },
    {
      "name": "describe_history",
      "title": "How a wallet's reputation moved over time",
      "readOnlyHint": true,
      "price_usd": "0.03",
      "endpoint": "GET /reputation/wallet/{wallet}/history"
    },
    {
      "name": "describe_facets",
      "title": "Reputation by area (facet), against the index mean",
      "readOnlyHint": true,
      "price_usd": "0",
      "price_note": "Free without a wallet argument (index-wide facet table). With a wallet it reads the wallet profile and costs 0.01.",
      "endpoint": "GET /stats/facets, or GET /reputation/wallet/{wallet}"
    }
  ],
  "resources": [
    {
      "uri": "describe://pricing",
      "name": "pricing",
      "mimeType": "application/json",
      "description": "Every tier with its price and the reason it costs that — GET /pricing as a resource. Free."
    },
    {
      "uri": "describe://health",
      "name": "health",
      "mimeType": "application/json",
      "description": "Agents, ratings, chains and the policy versions in force, live — GET /health as a resource. Free."
    },
    {
      "uri": "describe://manifesto",
      "name": "manifesto",
      "mimeType": "application/json",
      "description": "Principles wired to the code that enforces them, each with its check — GET /manifesto as a resource. Free."
    }
  ],
  "websiteUrl": "https://describe.net",
  "documentation": [
    "https://docs.describe.net/",
    "https://describe.net/skill.md",
    "https://describe.net/api.html"
  ],
  "links": {
    "openapi": "https://api.describe.net/openapi.json",
    "swaggerUi": "https://api.describe.net/docs",
    "redoc": "https://api.describe.net/redoc",
    "docsHub": "https://docs.describe.net/",
    "llmsTxt": "https://describe.net/llms.txt"
  },
  "discovery": {
    "skillManifest": "https://describe.net/skill.md",
    "apiCatalog": "https://describe.net/.well-known/api-catalog"
  },
  "authentication": {
    "type": "x402",
    "description": "No accounts, no API keys, no OAuth, no tokens. Metered tools relay an HTTP 402 challenge from api.describe.net; you sign an EIP-3009 USDC authorization and repeat the same tool call with the payment argument. This server never signs, never holds keys, and cannot move your funds.",
    "documentation": "https://describe.net/auth.md",
    "published_treasury": "0xe4dc963c56979E0260fc146b87eE24F18220e545"
  },
  "_meta": {
    "verified": "2026-08-21, by running an MCP initialize handshake against mcp/server.py (12 tools listed, protocol 2025-11-25) and by curl against the live API (/pricing, /health). 2026-08-23: the hosted endpoint verified IN PRODUCTION with the official TypeScript SDK client (@modelcontextprotocol/sdk StreamableHTTPClientTransport) against both https://api.describe.net/mcp and https://describe.net/mcp: connect OK, tools/list = 12, resources/list = 3, ping, tools/call on a free tool, unknown tool → JSON-RPC -32602. 2026-08-23, later the same day: describe_resolve added as the thirteenth tool and verified against this build — tools/list = 13 over both transports (tests/test_mcp.py, tests/test_mcp_remote.py). The two production runs quoted above ran before it existed and counted 12; the count they observed is the fact they recorded, so it stays as written.",
    "remote_endpoint": "https://api.describe.net/mcp is MCP Streamable HTTP mounted INSIDE the API (describenet/api.py, route POST /mcp; the server code is describenet/mcp_server.py, shared with the stdio launcher). It runs stateless and JSON-only because it lives in AWS Lambda: requests may land on different containers, so nothing is kept in memory between two calls, and the runtime cannot stream. Inside the API the tools call the endpoints in-process (httpx ASGITransport over the same app), through the same paywall — one toll booth, not two. There is no /sse endpoint. https://describe.net/mcp is a CloudFront proxy to the same origin (same server, same behaviour); do not construct other URLs.",
    "versioning": "Since 2026-08-23 the server declares its own version: describenet/mcp_server.py sets the low-level Server version to 2.0.0 (SERVER_VERSION), the version of the `describe-net` package (pyproject.toml); a test pins the three to the same string. Before that, serverInfo.version reported the installed `mcp` SDK version (observed 1.23.3), which described the SDK, not this server.",
    "distribution": "Hosted at `url` (no install). Source is public: https://github.com/0xultravioleta/describe-net — the stdio launcher is mcp/server.py; `pip install -r mcp/requirements.txt`, then point your MCP client at the `stdio` command above. The `describe-net` package (console script `describe-net`, the same stdio server) is built for PyPI; this card will name the index URL once it is published.",
    "capabilities_note": "Tools and resources are implemented: tools/list returns 13 tools and resources/list returns 3 read-only resources (describe://pricing, describe://health, describe://manifesto — verified 2026-08-23). Prompts are not implemented: prompts/list is empty, which is why prompts is declared false here. Until 2026-08-23 this note said resources were empty and declared false; that stopped being true when the three resources were added. That count read 12 until describe_resolve was added on 2026-08-23.",
    "protocol_version_observed": "2025-11-25",
    "thin_client": "No scoring rule lives in this server. Every tool calls the canonical HTTP endpoint, so a consumer cannot produce a different number by coming through another door. It does not talk to any chain and does not touch the database.",
    "spec_note": "SEP-1649's normative schema (modelcontextprotocol/experimental-ext-server-card) models remote HTTP servers — `remotes[].type` is limited to sse or streamable-http, which is the shape `remotes` uses here — and its discovery document explicitly rejects /.well-known/mcp/server-card.json as a location. The stdio launcher cannot be expressed in it, so this card uses the widely scanned server-card.json shape and declares both; no $schema is claimed, since the document knowingly does not conform to that schema. Since 2026-08-23 the card also carries the flat fields most scanners read first (name, version, url/serverUrl, transport as a string — the shape published by servers that pass the Ora/is-agentic MCP check), alongside `remotes`; the stdio launcher moved to `stdio`."
  }
}
