{
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-05",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.3",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run"
  },
  "tool": {
    "category": "payment-platforms",
    "endpoint": "https://mcp.nsgoods.org/mcp",
    "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/nsgoods-workbench-mcp.json",
    "kind": "mcp",
    "listed": "indexed",
    "liveUrl": "https://www.anchorterminal.com/api/v1/live/nsgoods-workbench-mcp.json",
    "markdownUrl": "https://www.anchorterminal.com/tools/nsgoods-workbench-mcp.md",
    "mcpTools": {
      "check": {
        "checker": "anchor-check/1.0",
        "totalTokens": 1677,
        "counts": {
          "error": 0,
          "note": 2,
          "warn": 5
        },
        "findings": [
          {
            "rule": "TC11",
            "severity": "warn",
            "tool": "drift_status",
            "message": "its one parameter, host, has no description",
            "fix": "Describe each one: format, units, an example, and what happens when it's left out."
          },
          {
            "rule": "TC11",
            "severity": "warn",
            "tool": "find_endpoints",
            "message": "none of its 4 parameters has a description",
            "fix": "Describe each one: format, units, an example, and what happens when it's left out."
          },
          {
            "rule": "TC11",
            "severity": "warn",
            "tool": "host_summary",
            "message": "its one parameter, host, has no description",
            "fix": "Describe each one: format, units, an example, and what happens when it's left out."
          },
          {
            "rule": "TC11",
            "severity": "warn",
            "tool": "payability_verdict",
            "message": "its one parameter, url, has no description",
            "fix": "Describe each one: format, units, an example, and what happens when it's left out."
          },
          {
            "rule": "TC11",
            "severity": "warn",
            "tool": "verify_signature",
            "message": "none of its 2 parameters has a description",
            "fix": "Describe each one: format, units, an example, and what happens when it's left out."
          },
          {
            "rule": "TC24",
            "severity": "note",
            "message": "8 of 8 tools have no outputSchema",
            "fix": "Declare outputSchema for tools that return structured data, and return structuredContent that matches it."
          },
          {
            "rule": "TC29",
            "severity": "note",
            "message": "about 109 tokens (6% of the definitions) are titles that repeat property or function names",
            "fix": "Strip \"title\" keys that only restate a name before listing tools."
          }
        ]
      },
      "checkedAt": "2026-10-04T22:25:41Z",
      "count": 8,
      "schemaTokens": 1677,
      "status": "ok",
      "tools": [
        {
          "name": "payability_verdict",
          "title": "Payability verdict",
          "description": "Latest payability observation for one exact resource URL (path and query included), with the\n    meaning of the verdict, remediation if it cannot be paid, and the per-network options seen.\n    last_checked_at is the last time any scan looked at the resource; verdict_since is when the current\n    verdict was first observed in the unbroken run that leads to it. A scan that did not\n    contain the resource does not break the run, so verdict_since can span weeks nobody\n    measured. How current a row is comes from last_checked_at and in_latest_scan, not from\n    verdict_since alone.",
          "inputSchema": {
            "properties": {
              "url": {
                "title": "Url",
                "type": "string"
              }
            },
            "required": [
              "url"
            ],
            "title": "payability_verdictArguments",
            "type": "object"
          },
          "annotations": {
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false,
            "readOnlyHint": true
          }
        },
        {
          "name": "find_endpoints",
          "title": "Find endpoints",
          "description": "Search the catalogue by host or URL substring. Returns up to `limit` endpoints (max 50) with their\n    latest verdict, plus the total match count. Use this first when you do not know the exact resource URL.\n    Rows with in_latest_scan=false were not in the latest full scan; read last_checked_at for when they were last probed.\n    Optional network filter (for example eip155:8453 or solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp) and\n    sort=price for the cheapest first.\n    last_checked_at is the last time any scan looked at the resource; verdict_since is when the current\n    verdict was first observed in the unbroken run that leads to it. A scan that did not\n    contain the resource does not break the run, so verdict_since can span weeks nobody\n    measured. How current a row is comes from last_checked_at and in_latest_scan, not from\n    verdict_since alone.",
          "inputSchema": {
            "properties": {
              "limit": {
                "default": 25,
                "title": "Limit",
                "type": "integer"
              },
              "network": {
                "default": "",
                "title": "Network",
                "type": "string"
              },
              "query": {
                "title": "Query",
                "type": "string"
              },
              "sort": {
                "default": "",
                "title": "Sort",
                "type": "string"
              }
            },
            "required": [
              "query"
            ],
            "title": "find_endpointsArguments",
            "type": "object"
          },
          "annotations": {
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false,
            "readOnlyHint": true
          }
        },
        {
          "name": "catalogue_stats",
          "title": "Catalogue stats",
          "description": "Size and health of the x402 catalogue as of the latest full scan: resources, hosts, verdict\n    counts, and payable endpoints per network.",
          "inputSchema": {
            "properties": {},
            "title": "catalogue_statsArguments",
            "type": "object"
          },
          "annotations": {
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": true,
            "readOnlyHint": true
          }
        },
        {
          "name": "host_summary",
          "title": "Host summary",
          "description": "Summary for a host (no time series): first/last seen, current verdict mix, n_resources, total\n    verdict changes, gone_since if absent from the latest full scan, and a small resources_sample.\n    Sample rows with in_latest_scan=false were not in the latest full scan; read last_checked_at for when they were last probed.\n    n_resources counts every resource ever seen for this host; current_verdict_mix and n_payable_last_full count only the latest full scan.\n    last_checked_at is the last time any scan looked at the resource; verdict_since is when the current\n    verdict was first observed in the unbroken run that leads to it. A scan that did not\n    contain the resource does not break the run, so verdict_since can span weeks nobody\n    measured. How current a row is comes from last_checked_at and in_latest_scan, not from\n    verdict_since alone.",
          "inputSchema": {
            "properties": {
              "host": {
                "title": "Host",
                "type": "string"
              }
            },
            "required": [
              "host"
            ],
            "title": "host_summaryArguments",
            "type": "object"
          },
          "annotations": {
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false,
            "readOnlyHint": true
          }
        },
        {
          "name": "x401_status",
          "title": "x401 status",
          "description": "Current x401 emitter adoption across the scanned catalogue (from the daily watcher).",
          "inputSchema": {
            "properties": {},
            "title": "x401_statusArguments",
            "type": "object"
          },
          "annotations": {
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false,
            "readOnlyHint": true
          }
        },
        {
          "name": "drift_status",
          "title": "Drift status",
          "description": "Verdict changes between the two latest full scans (catalogue wide, or for one host), plus the\n    declared model drift watch.",
          "inputSchema": {
            "properties": {
              "host": {
                "default": "",
                "title": "Host",
                "type": "string"
              }
            },
            "title": "drift_statusArguments",
            "type": "object"
          },
          "annotations": {
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": false,
            "readOnlyHint": true
          }
        },
        {
          "name": "verify_signature",
          "title": "Verify signature",
          "description": "Offline EIP-191 verify of a signed nsgoods response. Identifies the service from the\n    manifest (or the optional `service` arg), strips exactly that service's post-sign fields,\n    canonicalises (JCS, both ASCII modes), recovers the signer and checks it against the\n    published manifest signers. Reproduction-attestation (JCS/byte-length) and envelope\n    (signer/signature, components) shapes are reported as unsupported_shape, not verified here.\n    Refusals carry a distinct status: malformed_signature (signature is not a 65-byte 0x-prefixed\n    hex string), schema_rejected (the body carries a signed_by/signature pair but fails the required\n    field shape for every service the claimed signer covers; recovery was not attempted, checked is\n    false, reasons lists the failed candidates), signature_mismatch (well-formed but recovers a\n    different address than signed_by under every candidate service recipe of this signer),\n    no_flat_recipe (signed_by is a manifest signer but every service it covers uses an envelope shape,\n    so there is no flat recipe to check; recovery was not attempted, checked is false),\n    unknown_signer (signed_by is not a manifest signer; recovery was not attempted, checked is false),\n    unsupported_shape, or the no-signed_by/signature-pair case.\n    checked is true only when EIP-191 recovery actually ran; every other refusal reports checked false.",
          "inputSchema": {
            "properties": {
              "response_json": {
                "title": "Response Json",
                "type": "string"
              },
              "service": {
                "default": "",
                "title": "Service",
                "type": "string"
              }
            },
            "required": [
              "response_json"
            ],
            "title": "verify_signatureArguments",
            "type": "object"
          },
          "annotations": {
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": true,
            "readOnlyHint": true
          }
        },
        {
          "name": "reports",
          "title": "Weekly reports",
          "description": "Published weekly payability reports (from the signed manifest).",
          "inputSchema": {
            "properties": {},
            "title": "reportsArguments",
            "type": "object"
          },
          "annotations": {
            "destructiveHint": false,
            "idempotentHint": true,
            "openWorldHint": true,
            "readOnlyHint": true
          }
        }
      ]
    },
    "name": "nsgoods-workbench-mcp",
    "note": "Indexed from the official MCP registry: facts and our own checks, not reviewed, so no score, grade or rank.",
    "packages": null,
    "pageJsonUrl": "https://www.anchorterminal.com/tools/nsgoods-workbench-mcp.json",
    "popularity": {
      "githubStars": 2
    },
    "registryName": "org.nsgoods/nsgoods-workbench-mcp",
    "remotes": [
      {
        "type": "streamable-http",
        "url": "https://mcp.nsgoods.org/mcp"
      }
    ],
    "repository": "https://github.com/Nikoble1926/nsgoods-workbench-mcp",
    "reviewed": false,
    "slug": "nsgoods-workbench-mcp",
    "source": "the official MCP registry",
    "sourceUrl": "https://registry.modelcontextprotocol.io/v0.1/servers?search=org.nsgoods/nsgoods-workbench-mcp",
    "summary": "Read only x402 catalogue: payability verdicts, prices, drift, host status, signatures. No wallet.",
    "updatedAt": "2026-09-16T16:25:25Z",
    "url": "https://www.anchorterminal.com/tools/nsgoods-workbench-mcp",
    "vendor": "nsgoods.org",
    "vendorUrl": "https://x402.nsgoods.org/#mcp",
    "version": "1.0.0",
    "websiteUrl": "https://x402.nsgoods.org/#mcp",
    "where": "hosted",
    "why": [
      "vendor"
    ]
  }
}
