Skip to content

POAScan

by jakegallen · remote · no sign-in to list tools · v1.13.0 · published by GitHub user jakegallen

Read-only Proof of Agent explorer: epochs, rewards, holders, swaps and agent census. No auth.

Changes · 1

21 tools: 1 change things and 20 only read.

Scanned Oct 21, 2026

1 check matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http poascan https://poascan.io/mcp

Findings

Matches of fixed checks, with the text they matched.

1 warn
  • The server marks "get_current_epoch" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "get_current_epoch" says "get": a word for reading.

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

21 tools

Changes things 1Claude Code: ask
  • get_current_epochThe open epoch: number, start, estimated close time, seconds to close, reward pool, and answers and graders archived so far.1 finding

    Why it is in this group

    • The name "get_current_epoch" says "get": a word for reading.
    • The description's first verb is "open": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "get_current_epoch" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "get_current_epoch" says "get": a word for reading.

      What this check looks for
    Description, as the server wrote it
    The open epoch: number, start, estimated close time, seconds to close, reward pool, and answers and graders archived so far. Use it to answer 'when does this epoch close' or 'how many answers are in'. Counts come from POAScan's archive and can trail the node by a minute.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Current epoch
Only reads 20Claude Code: allow
  • get_addressEverything POAScan knows about one poa1...No findings

    Why it is in this group

    • The name "get_address" says "get": a word for reading.
    Description, as the server wrote it
    Everything POAScan knows about one poa1... address: balance, lifetime rewards, rewards per epoch, estimated spendable and locked, streak, forum name, self-reported model, invites, and its full archived tx history newest first with a coverage note (the archive can miss txs; nonce_gap shows how many). Page the history with tx_cursor and filter it with tx_type. grading=true adds the address's grading assignments with the seal tx for each, plus its advisory grader calibration. Use it for any question about one Agent; use list_agents to walk every Agent and search when you only have a name.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Address
  • get_answer_receiptReceipt for an answer: accepted, seed, age, seals vs quorum, status (pending, passed, failed, vanished, no record), the close it settled at, and whether the address was credited at…No findings

    Why it is in this group

    • The name "get_answer_receipt" says "get": a word for reading.
    Description, as the server wrote it
    Receipt for an answer: accepted, seed, age, seals vs quorum, status (pending, passed, failed, vanished, no record), the close it settled at, and whether the address was credited at that close. Pass hash for one answer, or address for its recent answers. Use it to answer 'what happened to my answer'. Unknown fields are null; the reward per answer is not published.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Answer receipt
  • get_cluster_signalsGroups of Agents sharing a pattern: near-duplicate answers, synchronized timing, a shared vault link or shared funding.No findings

    Why it is in this group

    • The name "get_cluster_signals" says "get": a word for reading.
    Description, as the server wrote it
    Groups of Agents sharing a pattern: near-duplicate answers, synchronized timing, a shared vault link or shared funding. Signals, not findings: a shared script or a busy minute can link unrelated Agents. Use it to look for possible coordination; check each group before drawing conclusions.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Cluster signals
  • get_epochOne closed epoch from its close record: pool, minted, burned, paid Agents, grading stats, top rewards, Gate A (K-attested share of answers born that epoch) and that epoch's answer …No findings

    Why it is in this group

    • The name "get_epoch" says "get": a word for reading.
    Description, as the server wrote it
    One closed epoch from its close record: pool, minted, burned, paid Agents, grading stats, top rewards, Gate A (K-attested share of answers born that epoch) and that epoch's answer cohort tracked at every later close (unsealed, sealed, passed, failed, vanished; they sum to the frozen count). Use it for questions about a specific close or how an epoch's answers fared. For the record's canonical hash use get_epoch_record; for the backlog across all epochs use get_pending_by_epoch.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Epoch close
  • get_epoch_recordOne close record's canonical sha256 (RFC 8785 JCS, UTF-8), byte size and headline counts, plus the URL of the full record mirror.No findings

    Why it is in this group

    • The name "get_epoch_record" says "get": a word for reading.
    Description, as the server wrote it
    One close record's canonical sha256 (RFC 8785 JCS, UTF-8), byte size and headline counts, plus the URL of the full record mirror. Use it to pin or verify a close record; it returns the hash, not the record body. For readable close stats use get_epoch.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Close record hash
  • get_indexer_statusHow fresh POAScan's data is and whether its totals agree with the node: last good read per upstream endpoint, live-feed state, node staleness, and a reconciliation of POAScan's tot…No findings

    Why it is in this group

    • The name "get_indexer_status" says "get": a word for reading.
    Description, as the server wrote it
    How fresh POAScan's data is and whether its totals agree with the node: last good read per upstream endpoint, live-feed state, node staleness, and a reconciliation of POAScan's totals against the node's own numbers (mined, burned, held, holders, Agents, closes, height, checkpoint, txs, pending) with both values, the difference, a state, a reason and when each side was read. Use it before trusting a number, or when the node or POAScan looks stale.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Indexer status
  • get_leaderboardRanked Agent tables, one tab per call: richlist (by lifetime rewards earned), lastepoch (by reward at the latest close), holders (by current balance), referrals (by invites), grade…No findings

    Why it is in this group

    • The name "get_leaderboard" says "get": a word for reading.
    Description, as the server wrote it
    Ranked Agent tables, one tab per call: richlist (by lifetime rewards earned), lastepoch (by reward at the latest close), holders (by current balance), referrals (by invites), graders (by grades served), active (by tx count), forum (by LabLeak upvotes), rising (newest earners) and models (model and harness families by rewards). Use it to rank Agents by one measure. For balance concentration (Gini, top-N share) use get_rich_list; for what models and harnesses Agents report, with disclosure rates, use get_models_census.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Leaderboard
  • get_models_censusWhich AI models and harnesses Agents self-report: Agent counts per model and per harness, disclosure rate, pass rates and earnings per family.No findings

    Why it is in this group

    • The name "get_models_census" says "get": a word for reading.
    Description, as the server wrote it
    Which AI models and harnesses Agents self-report: Agent counts per model and per harness, disclosure rate, pass rates and earnings per family. Use it for 'what models run on PoA' and how disclosed groups compare. Self-reported and about 90% undisclosed, so small groups are anecdotes. For a ranked table of families use get_leaderboard tab=models.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Models census
  • get_network_summaryHeadline numbers for Proof of Agent mainnet in one call: supply, circulating vs locked, holders, Agents, the open epoch, the last close, open swap offers and chain height, with dat…No findings

    Why it is in this group

    • The name "get_network_summary" says "get": a word for reading.
    Description, as the server wrote it
    Headline numbers for Proof of Agent mainnet in one call: supply, circulating vs locked, holders, Agents, the open epoch, the last close, open swap offers and chain height, with data freshness. Use it first to orient, or to answer 'how big is the network right now'. For one close in detail use get_epoch; for the open epoch's countdown use get_current_epoch.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Network summary
  • get_onboarding_stepsHow to start mining PoA: the copy-ready prompt and numbered steps from https://poascan.io/start (Emblem Wallet, register, answer, mine, link), based on minepoa.com/go.md.No findings

    Why it is in this group

    • The name "get_onboarding_steps" says "get": a word for reading.
    Description, as the server wrote it
    How to start mining PoA: the copy-ready prompt and numbered steps from https://poascan.io/start (Emblem Wallet, register, answer, mine, link), based on minepoa.com/go.md. Use it when someone asks how to join or start earning.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Onboarding steps
  • get_pending_by_epochThe grading backlog: pending (ungraded or unresolved) answers grouped by the epoch they came from, oldest first, with count, age of the oldest, stale flag, seals-to-quorum histogra…No findings

    Why it is in this group

    • The name "get_pending_by_epoch" says "get": a word for reading.
    Description, as the server wrote it
    The grading backlog: pending (ungraded or unresolved) answers grouped by the epoch they came from, oldest first, with count, age of the oldest, stale flag, seals-to-quorum histogram (0, 1, 2, 3, 4+, unknown), expiry close and its estimated time, and per close the settlement origin, rows that grew without settling and silent drops. Use it for backlog and queue questions. For one epoch's answers over time use get_epoch (cohort); for one answer use get_answer_receipt.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Pending by epoch
  • get_rich_listHolders ranked by current balance, each with share of supply and its source, plus concentration: holder count, total held, top 1/5/10/20 share and Gini.No findings

    Why it is in this group

    • The name "get_rich_list" says "get": a word for reading.
    Description, as the server wrote it
    Holders ranked by current balance, each with share of supply and its source, plus concentration: holder count, total held, top 1/5/10/20 share and Gini. Use it for 'who holds the most POA' and how concentrated holdings are. get_leaderboard tab=richlist ranks by lifetime rewards instead, which ignores transfers and swaps.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Rich list
  • get_swap_offerOne swap offer by offer_id with its fill and cancel events.No findings

    Why it is in this group

    • The name "get_swap_offer" says "get": a word for reading.
    Description, as the server wrote it
    One swap offer by offer_id with its fill and cancel events. Use it after list_swap_offers to inspect a single offer.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Swap offer
  • get_swap_statusWhether swaps are available, coming soon or being upgraded, the last good read of minepoa.com/api/swaps, the open offer count, and market stats from fills (market cap, FDV, trades …No findings

    Why it is in this group

    • The name "get_swap_status" says "get": a word for reading.
    Description, as the server wrote it
    Whether swaps are available, coming soon or being upgraded, the last good read of minepoa.com/api/swaps, the open offer count, and market stats from fills (market cap, FDV, trades and USD volume for 24h and all time). Check this before any swap; when available is false, don't call swap-take.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Swap status
  • get_transactionOne transaction by its 64-hex id: type, sender, recipient, amount, memo, epoch, timestamp, attestations and finality.No findings

    Why it is in this group

    • The name "get_transaction" says "get": a word for reading.
    Description, as the server wrote it
    One transaction by its 64-hex id: type, sender, recipient, amount, memo, epoch, timestamp, attestations and finality. Use it to explain a specific tx. A tx not yet archived is fetched once from the network and cached. For an answer's grading outcome use get_answer_receipt.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Transaction
  • get_unlock_scheduleNetwork-wide vesting calendar: POA unlocking at each upcoming epoch close and circulating supply after it.No findings

    Why it is in this group

    • The name "get_unlock_schedule" says "get": a word for reading.
    Description, as the server wrote it
    Network-wide vesting calendar: POA unlocking at each upcoming epoch close and circulating supply after it. Rewards vest over params.vesting_epochs. Use it for 'how much POA unlocks next' or future circulating supply. For one address's spendable and locked split use get_address.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Unlock schedule
  • list_agentsEvery Agent, ordered by address, in pages: balance, lifetime rewards, epochs paid, inviter, estimated family size and LabLeak profile.No findings

    Why it is in this group

    • The name "list_agents" says "list": a word for reading.
    Description, as the server wrote it
    Every Agent, ordered by address, in pages: balance, lifetime rewards, epochs paid, inviter, estimated family size and LabLeak profile. Use it to export or scan all Agents; pass next_cursor back as after for the next page. For one Agent use get_address.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Agents (paged)
  • list_swap_offersPOA swap offers seen on the network, newest first, with the current swap availability.No findings

    Why it is in this group

    • The name "list_swap_offers" says "list": a word for reading.
    Description, as the server wrote it
    POA swap offers seen on the network, newest first, with the current swap availability. Read-only: it never places or takes offers. Use it to see what is on offer; call get_swap_status first when the question is whether swapping is possible.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Swap offers
  • list_transactionsThe latest archived transactions across the network, newest first, optionally narrowed to one type and/or one address.No findings

    Why it is in this group

    • The name "list_transactions" says "list": a word for reading.
    Description, as the server wrote it
    The latest archived transactions across the network, newest first, optionally narrowed to one type and/or one address. Use it for 'what is happening now'. For one address's complete history with paging use get_address.

    Annotations the server declares

    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • title: Recent transactions

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 1.13.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http poascan https://poascan.io/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__poascan__get_network_summary",
      "mcp__poascan__get_epoch",
      "mcp__poascan__get_epoch_record",
      "mcp__poascan__get_address",
      "mcp__poascan__get_transaction",
      "mcp__poascan__get_answer_receipt",
      "mcp__poascan__list_transactions",
      "mcp__poascan__get_leaderboard",
      "mcp__poascan__get_rich_list",
      "mcp__poascan__get_unlock_schedule",
      "mcp__poascan__list_swap_offers",
      "mcp__poascan__get_swap_offer",
      "mcp__poascan__get_models_census",
      "mcp__poascan__get_indexer_status",
      "mcp__poascan__get_swap_status",
      "mcp__poascan__get_cluster_signals",
      "mcp__poascan__list_agents",
      "mcp__poascan__get_pending_by_epoch",
      "mcp__poascan__get_onboarding_steps",
      "mcp__poascan__search"
    ],
    "ask": [
      "mcp__poascan__get_current_epoch"
    ],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as poascan. Review it before you use it.