Skip to content

Kawal

by PugarHuda · remote · no sign-in to list tools · v0.1.0 · published by GitHub user PugarHuda

Evidence about ERC-8004 agents on BNB Smart Chain, gathered by calling them. No key.

Final · 1Changes · 4

9 tools: 1 do something that can't be undone, 4 change things and 4 only read.

Scanned Oct 21, 2026

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

claude mcp add --transport http kawal https://kawal-three.vercel.app/api/mcp

Findings

Matches of fixed checks, with the text they matched.

3 warn
  • The server marks "verify_agent" 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":true}; The description's first verb is "call": a word for a change.

    What this check looks for
  • The server marks "check_payment" read-only (readOnlyHint: true), and its own name, description or input give the class "irreversible".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The name "check_payment" says "payment": a word that usually means money moves, which cannot be taken back.

    What this check looks for
  • The server marks "compare_agents" 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":true}; The name "compare_agents" says "compare": 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.

9 tools

Can't be undone 1Claude Code: ask
  • check_paymentSend the opening request of the x402 protocol — no payment header — and report whether the server actually demands payment.Reads text others write1 finding

    Why it is in this group

    • The name "check_payment" says "payment": a word that usually means money moves, which cannot be taken back.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.

    Findings

    • Warn

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

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true}; The name "check_payment" says "payment": a word that usually means money moves, which cannot be taken back.

      What this check looks for
    Description, as the server wrote it
    Send the opening request of the x402 protocol — no payment header — and report whether the server actually demands payment. `x402_supported` on the registry is a flag a registration sets about itself; this is the answer to asking. Kawal never settles a payment, so the price is quoted in the server's own words and nothing moves.

    Annotations the server declares

    • title: Ask whether an agent really charges
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
Changes things 4Claude Code: ask
  • compare_agentsPut two or three agents side by side and answer the same questions of each — the ones a buyer weighs before handing over a spend cap: can it be hired, does it answer right now, has…Reads text others write1 finding

    Why it is in this group

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

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.

    Findings

    • Warn

      The server marks "compare_agents" 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":true}; The name "compare_agents" says "compare": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Put two or three agents side by side and answer the same questions of each — the ones a buyer weighs before handing over a spend cap: can it be hired, does it answer right now, has it kept answering, what does it offer, what does it say it costs, does its domain verify, what is its track record, what is flagged against it, and when it was registered. Each agent is dialled for this call. No combined score: the disagreements are the point.

    Annotations the server declares

    • title: The same questions of two or three agents
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • deep_reportEverything Kawal holds about one agent in a single answer: the live handshake, the full probe history, how the endpoint fails when it fails, whether it really charges, and who wrot…Reads text others writeNo findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Everything Kawal holds about one agent in a single answer: the live handshake, the full probe history, how the endpoint fails when it fails, whether it really charges, and who wrote its feedback. This one costs money. Kawal measured that 75 of 200 BSC registrations declare x402 support and that none of the reachable ones ever asks to be paid; this is the counter-example. Calling it without payment returns the terms rather than the report. Pay the terms with a plain BNB transfer and call again with `txHash`; the receipt is read on-chain and spent once.

    Annotations the server declares

    • title: Everything Kawal holds about one agent (paid)
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • plan_mandateTurn a capital amount and a duration into the four scoped sessions Kawal would grant on Altana — one per seat, each with its own contract allowlist, spend cap and expiry — without …No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Turn a capital amount and a duration into the four scoped sessions Kawal would grant on Altana — one per seat, each with its own contract allowlist, spend cap and expiry — without granting anything. Pure arithmetic over the venue table: the same plan the mandate form shows, and the same refusals, since a plan that would widen authority (an unproven venue, an empty allowlist, caps that overcommit) is refused rather than built.

    Annotations the server declares

    • title: Plan four bounded seats for a capital amount
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • verify_agentCall an agent's declared endpoint right now and report what answered.Reads text others write1 finding

    Why it is in this group

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

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.

    Findings

    • Warn

      The server marks "verify_agent" 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":true}; The description's first verb is "call": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Call an agent's declared endpoint right now and report what answered. This is a live handshake made by Kawal, not a reading of the registry: an agent whose registration declares MCP but whose endpoint is gone is reported as not answering. Returns the hireability tier and the evidence behind it, including how many times Kawal has reached this endpoint before.

    Annotations the server declares

    • title: Verify an agent by calling it
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
Only reads 4Claude Code: allow
  • agents_by_ownerList the agents one wallet registered on BSC and call each of their declared endpoints now.Reads text others writeNo findings

    Why it is in this group

    • The description's first verb is "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    List the agents one wallet registered on BSC and call each of their declared endpoints now. Nothing on the chain tells an owner their endpoint went dark — the registry keeps listing it — so this is the answer to "is my agent still answering?": what answered, how each failure looks, and every probe Kawal kept. At most 12 agents are dialled, so a large owner sees the first page.

    Annotations the server declares

    • title: Every agent an address minted, called now
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • find_agentsSearch the BSC roster by describing the problem rather than naming a product, and get back agents ranked with Kawal's evidence attached.Reads text others writeNo findings

    Why it is in this group

    • The name "find_agents" says "find": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Search the BSC roster by describing the problem rather than naming a product, and get back agents ranked with Kawal's evidence attached. Duplicate registrations are collapsed: roughly two thirds of the newest registrations are copies of a template, and returning all of them would be returning the same agent many times. With `trending`, the list is instead what 8004scan's visitors looked at most over that window — attention, not evidence — each entry carrying the tier Kawal's own record gives it, which is where the two disagree.

    Annotations the server declares

    • title: Search the roster by problem
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • read_reputationReport who wrote an agent's ERC-8004 feedback, not how much of it there is.Reads text others writeNo findings

    Why it is in this group

    • The name "read_reputation" says "read": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Report who wrote an agent's ERC-8004 feedback, not how much of it there is. A sample of 1,200 BSC records came from 53 addresses, one of which wrote 265 of the oldest 600, so a count of records is a count of writes rather than of opinions. Returns how many carry a mark, how many distinct addresses wrote them, and what share came from the busiest one.

    Annotations the server declares

    • title: Who wrote an agent's feedback
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
  • uptime_historyRead the history Kawal keeps of one agent's endpoint without dialling it: how many times it was called, how many times it answered in the protocol it declared, since when, and the …Reads text others writeNo findings

    Why it is in this group

    • The description's first verb is "read": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Read the history Kawal keeps of one agent's endpoint without dialling it: how many times it was called, how many times it answered in the protocol it declared, since when, and the median and worst latency of the answering calls. This is the record the registry does not have. Null when Kawal has never called this endpoint; verify_agent makes the first call.

    Annotations the server declares

    • title: Every probe Kawal has made of an agent
    • readOnlyHint: true
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true

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.

Exfil surface

Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.

No private-data, untrusted-input, outbound path in this server alone: no tool is tagged private-data or outbound.

Reads private data0
Reads files, mail, messages, databases, secrets, calendars or repositories.
Reads text others write8
Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
Can send data out0
Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.

Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.

Remote posture

What anyone on the internet sees at the remote endpoint: an anonymous initialize and tools/list, and the public OAuth metadata.

Looked at Oct 22, 2026, 14:54 UTC, unchanged since Oct 22, 2026. No credentials were sent and no tool was called. What is looked at.

Reachable
yes
HTTP status of an anonymous initialize
200
tools/list served without credentials
yes
Tools that change things, listed without credentials
5
Protocol version
2025-06-18
WWW-Authenticate on 401
not observed
resource_metadata in WWW-Authenticate
none
RFC 9728 protected resource metadata
none
Authorization servers
none
Legacy HTTP+SSE transport
no
Dynamic client registration
not observed
Client ID metadata documents
not observed
  • HighThe whole server

    The endpoint served tools/list without credentials, and the list has 5 tools that change things (1 irreversible, 4 write). Whether a call also works without credentials was not tested: tools are never called.

    Matched text

    https://kawal-three.vercel.app/api/mcp: tools/list returned 9 tools to an anonymous client, including check_payment (irreversible), verify_agent (write), compare_agents (write), plan_mandate (write), deep_report (write)

    What this check looks for

Install

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

claude mcp add --transport http kawal https://kawal-three.vercel.app/api/mcp

Run in a terminal.

Claude Code permissions

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

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__kawal__read_reputation",
      "mcp__kawal__find_agents",
      "mcp__kawal__agents_by_owner",
      "mcp__kawal__uptime_history"
    ],
    "ask": [
      "mcp__kawal__verify_agent",
      "mcp__kawal__check_payment",
      "mcp__kawal__compare_agents",
      "mcp__kawal__plan_mandate",
      "mcp__kawal__deep_report"
    ],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as kawal. Review it before you use it.

Capability tags behind 8 rules
  • mcp__kawal__verify_agent untrusted-input
  • mcp__kawal__check_payment untrusted-input
  • mcp__kawal__read_reputation untrusted-input
  • mcp__kawal__find_agents untrusted-input
  • mcp__kawal__agents_by_owner untrusted-input
  • mcp__kawal__compare_agents untrusted-input
  • mcp__kawal__uptime_history untrusted-input
  • mcp__kawal__deep_report untrusted-input