{"serverId":"mcp-registry/io.github.lonniev/dpyc-oracle","tools":[{"name":"check_ban_status","fixed":{"name":"check_ban_status","description":"Check whether an npub is banned from the DPYC Social Contract.\n\nLooks up the member in the community registry and checks whether\ntheir status is \"banned\".  Unknown npubs are not considered banned\n(they simply aren't members).\n\nFree, unauthenticated.  Used by operators during the cold path\n(credit purchases) to enforce community bans.","inputSchema":{"type":"object","required":["npub"],"properties":{"npub":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"Check Ban Status"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":142,"tokensAfter":142},{"name":"get_campaign","fixed":{"name":"get_campaign","description":"Retrieve a published pricing campaign.","inputSchema":{"type":"object","required":["author_npub","operator_npub","slug"],"properties":{"slug":{"type":"string","description":"The campaign slug (directory name)."},"format":{"type":"string","default":"json","description":"\"json\" for importable data, \"markdown\" for readable summary."},"author_npub":{"type":"string","description":"The campaign author's npub."},"operator_npub":{"type":"string","description":"The target operator's npub."}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"Get Campaign"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":156,"tokensAfter":156},{"name":"get_relays","fixed":{"name":"get_relays","description":"Return the DPYC Nostr relay set, best first.\n\nThe single source of truth is ``dpyc-community/relays.json``. An Operator\nseeds its relay set from here at cold start (its only fixed dependency is\nthis Oracle endpoint), then reads its own bootstrap config from Nostr using\njust its nsec — no direct GitHub access.\n\nThat file is a curated *guess*: it says which relays are worth using, not\nwhich are up this minute. Relays that an operator reported and the Oracle\nthen proved unreachable are moved to the","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"Get Relays"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":174,"tokensAfter":174},{"name":"get_rulebook","fixed":{"name":"get_rulebook","description":"Fetch the DPYC Social Contract governance document.\n\nReturns the raw markdown of GOVERNANCE.md from the dpyc-community repo.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"Get Rulebook"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":68,"tokensAfter":68},{"name":"get_tax_rate","fixed":{"name":"get_tax_rate","description":"Explain how Tollbooth certification taxation works.\n\nTaxation is ad valorem and **per-Authority** — there is no single\nnetwork-wide number, and the Oracle deliberately quotes none. The\nactual fee is the Authority's own accounting, set in its pricing model\nand reported at transaction time. This tool is a docent: it explains\nthe model and points to the live source. For the exact figure, query\nthe relevant Authority's ``check_price`` for ``certify_credits``.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"Get Tax Rate"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":162,"tokensAfter":162},{"name":"how_to_add_authority","fixed":{"name":"how_to_add_authority","description":"End-to-end guide for spinning up a new Tollbooth Authority.\n\nReturns the eight-step procedure covering identity, region selection,\nGitHub workspace, dpyc-community registry entry, Neon + BTCPay + Horizon\ndeployment, BTCPay credential delivery via Secure Courier, the\nself-registration challenge-response with the parent Authority, and\npre-funding the cert-fee balance. Fetched live from docs/how-to-add-authority.md\nin the dpyc-community repo.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"How To Add Authority"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":160,"tokensAfter":160},{"name":"list_campaigns","fixed":{"name":"list_campaigns","description":"List published pricing campaigns from the DPYC community.\n\nOptionally filter by operator or author npub.","inputSchema":{"type":"object","properties":{"author_npub":{"type":"string","default":"","description":"Filter to campaigns by this author (optional)."},"operator_npub":{"type":"string","default":"","description":"Filter to campaigns for this operator (optional)."}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"List Campaigns"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":124,"tokensAfter":124},{"name":"list_services","fixed":{"name":"list_services","description":"Enumerate the live DPYC service network with self-described summaries.\n\nReads the member roster from the dpyc-community registry, then (when\n``probe=True``) performs a lightweight MCP handshake against each\nmember's public service endpoint to fetch that service's *own*\nself-description and tool inventory. Nothing about the services is\nhardcoded here — descriptions are authored by each service, and prices\ncome from each Operator/Authority pricing model (call the service's\n``check_price``).\n\nResil","inputSchema":{"type":"object","properties":{"kind":{"type":"string","default":"all","description":"Role filter — \"all\", \"operator\", \"authority\", or \"advocate\"."},"probe":{"type":"boolean","default":true,"description":"Handshake each endpoint for a live self-description. Set\nFalse for a fast registry-only listing (no network fan-out)."}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"List Services"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":259,"tokensAfter":259},{"name":"lookup_member","fixed":{"name":"lookup_member","description":"Look up a member by their Nostr npub.\n\nCan look up any role's npub — citizen, operator, or authority.\nReturns the full member record if found, or a not-found message.","inputSchema":{"type":"object","required":["npub"],"properties":{"npub":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"Lookup Member"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":92,"tokensAfter":92},{"name":"publish_campaign","fixed":{"name":"publish_campaign","description":"Publish a pricing campaign to the DPYC community.\n\nCommits both a machine-importable JSON file and a human-readable\nMarkdown summary to the dpyc-community campaigns directory. The\nrequest must be signed with ``author_npub``'s key (NIP-98), so a\ncampaign is published only under its author's own name.","inputSchema":{"type":"object","required":["author_npub","operator_npub","campaign_json"],"properties":{"author_npub":{"type":"string","description":"The npub of the person who designed the campaign."},"campaign_json":{"type":"string","description":"The full campaign export as a JSON string."},"campaign_name":{"type":"string","default":"","description":"Optional display name. Derived from JSON if omitted."},"operator_npub":{"type":"string","description":"The npub of the operator the campaign is for."},"campaign_markdown":{"type":"string","default":"","description":"Optional pre-rendered Markdown. If omitted, the\nOracle generates a basic summary from the JSON."}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false},"title":"Publish Campaign"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: false (inferred from the name).","verify":true}],"tokensBefore":292,"tokensAfter":292},{"name":"resolve_authority_for","fixed":{"name":"resolve_authority_for","description":"Resolve the certifying Authority for an operator npub.\n\nReturns the Authority's ``{npub, url, name}`` (from the operator's\n``upstream_authority_npub``). Use this after bootstrap to learn — and\nverify — which Authority signed your config, without reading GitHub.","inputSchema":{"type":"object","required":["npub"],"properties":{"npub":{"type":"string"}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"Resolve Authority For"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":121,"tokensAfter":121},{"name":"resolve_service","fixed":{"name":"resolve_service","description":"Resolve a DPYC service by ``name`` or ``npub``.\n\nReturns ``{npub, url, name, role, purchase_mode}`` where ``purchase_mode``\nis the registry-topology fact ``\"certified\"`` or ``\"direct\"`` (not a price).\nSupply exactly one of ``name`` or ``npub``.","inputSchema":{"type":"object","properties":{"name":{"type":"string","default":""},"npub":{"type":"string","default":""}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"Resolve Service"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":125,"tokensAfter":125},{"name":"service_status","fixed":{"name":"service_status","description":"Diagnostic: report this service's software versions and runtime info.\n\nFree, unauthenticated. Use to verify deployment versions across the\nDPYC ecosystem.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"annotations":{"readOnlyHint":true},"title":"Service Status"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: true (inferred from the name).","verify":true}],"tokensBefore":77,"tokensAfter":77},{"name":"update_operator","fixed":{"name":"update_operator","description":"Update an existing Operator's registry entry.\n\nUsed when an Operator moves to a new MCP endpoint, changes its display\nname, or needs to correct a registration. Called by an Authority when its\nowner approves the operator's update request; the request must be signed\nwith that Authority's key.","inputSchema":{"type":"object","required":["operator_npub","authority_npub"],"properties":{"service_url":{"type":"string","default":"","description":"New MCP endpoint URL (leave empty to keep current)."},"display_name":{"type":"string","default":"","description":"New display name (leave empty to keep current)."},"operator_npub":{"type":"string","description":"Nostr npub of the Operator to update."},"authority_npub":{"type":"string","description":"npub of the requesting Authority (must be a\nregistered authority or prime_authority)."}},"additionalProperties":false},"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true},"title":"Update Operator"},"changes":[{"kind":"annotations","detail":"Added readOnlyHint: false, destructiveHint: false, idempotentHint: true (inferred from the name).","verify":true}],"tokensBefore":253,"tokensAfter":253}],"toolsChanged":14,"tokensSaved":0,"todo":[{"tool":"cast_ban_vote","params":["npub","vote","election_id"]},{"tool":"check_ban_status","params":["npub"]},{"tool":"confirm_citizenship","params":["npub","challenge_id","signed_event_json"]},{"tool":"initiate_ban_election","params":["reason","target_npub"]},{"tool":"lookup_member","params":["npub"]},{"tool":"renounce_membership","params":["npub"]},{"tool":"request_citizenship","params":["npub","display_name"]},{"tool":"resolve_authority_for","params":["npub"]},{"tool":"resolve_service","params":["name","npub"]}],"note":"Deterministic fixes. Changes marked verify need a human look before shipping (renames, inferred annotations, inferred types, removed text). Parameter descriptions in `todo` need to be written by someone who knows the API."}