Koskamo

Packet Guru Agent Verifier MCP

This MCP server provides a read-only tool for verifying Web Bot Auth (RFC 9421) signatures. It allows AI agents to test if a signature is valid and receive guidance on how to fix issues, supporting privacy-first network forensics and agent authentication debugging.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Packet Guru Agent Verifier MCP logo, by packet.guruVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-06Operated by packet.guru
MCP endpoint (Streamable HTTP)
https://fp.packet.guru/api/v1/mcp
Vendor documentation

What its tools do

1 tool, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

1 of 1 have a description · 1 of 1 declare behavior hints

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to packet.guru ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Verify Web Bot Auth signature validity
  • Debug AI agent authentication errors
  • Check signature fixes for RFC 9421 compliance

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
guru.packet/agent-verifier 1.0.0
MCP protocol negotiated in check
2025-11-25
Tools
1 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {}
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

One tool, taking no arguments. It reports how the request carrying the call looks from the outside: whether its Web Bot Auth signature verified, what the named key directory publishes, the exact fault and the sentence saying what to change, and plain facts about the address it arrived from. Call it directly, without a proxy, because the answer describes the request exactly as it arrives. Free and anonymous.

Tools

1 advertised

self_check_web_bot_auth — Check my own Web Bot Auth setup
Advertised by the server during the last successful anonymous check.
Advertised read-only

Reports how the request carrying this call looks from the outside: whether its Web Bot Auth (RFC 9421) signature verified, what the key directory it named publishes, the exact fault if there is one and the sentence saying what to change, plus plain facts about the address it arrived from. Sign the call the way you sign requests to anyone else. Free, anonymous, no account. Takes no arguments: an unsigned call still gets an answer about its address.

self_check_web_bot_auth input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
self_check_web_bot_auth output schema
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifier for this verdict, safe to quote in a support request."
    },
    "ip": {
      "type": "object",
      "properties": {
        "asn": {
          "type": [
            "integer",
            "null"
          ],
          "description": "Autonomous system number of the network."
        },
        "org": {
          "type": [
            "string",
            "null"
          ],
          "description": "The organisation that network is registered to."
        },
        "origin": {
          "type": "string",
          "description": "What kind of network the address belongs to: residential, datacenter, mobile, and so on."
        },
        "hostname": {
          "type": [
            "string",
            "null"
          ],
          "description": "Reverse DNS name of the address, when it has one."
        },
        "riskLevel": {
          "type": "string",
          "description": "The same figure as a word: low, medium or high."
        },
        "riskScore": {
          "type": "integer",
          "description": "Reputation of the ADDRESS, 0 to 100, higher meaning worse. A datacenter address scores in the middle by nature: it is a statement about where you are, never about who you are or what you did."
        },
        "blacklisted": {
          "type": "boolean",
          "description": "Whether the address appears on the public abuse feeds this service tracks."
        }
      },
      "description": "Plain facts about your own address: network, operator, reputation of the address itself.",
      "additionalProperties": true
    },
    "geo": {
      "type": "object",
      "properties": {
        "city": {
          "type": [
            "string",
            "null"
          ],
          "description": "City the address is placed in."
        },
        "region": {
          "type": [
            "string",
            "null"
          ],
          "description": "First-level administrative division."
        },
        "country": {
          "type": [
            "string",
            "null"
          ],
          "description": "ISO 3166-1 alpha-2 country code of the address."
        },
        "timezone": {
          "type": [
            "string",
            "null"
          ],
          "description": "IANA timezone name for that place."
        }
      },
      "description": "Country, region, city and timezone of your address.",
      "additionalProperties": true
    },
    "meta": {
      "type": "object",
      "properties": {
        "axes": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Sources that contributed to this answer, such as ip, knownBot and webBotAuth. A field can be missing without anything being wrong: its source did not contribute."
        },
        "apiVersion": {
          "type": "string",
          "description": "Version of this API, such as v1."
        },
        "queryTimeMs": {
          "type": [
            "integer",
            "null"
          ],
          "description": "How long the answer took to build, in milliseconds."
        }
      },
      "description": "Envelope: API version, how long the answer took, and the sources that contributed.",
      "additionalProperties": true
    },
    "mode": {
      "enum": [
        "direct"
      ],
      "type": "string",
      "description": "You called this endpoint yourself, so the answer describes your own request."
    },
    "signals": {
      "type": "object",
      "properties": {
        "agent": {
          "type": "object",
          "properties": {
            "card": {
              "type": "object",
              "description": "Your own published card read back to you, plus the one promise a single live request can settle: the User-Agent you said you would send.",
              "additionalProperties": true
            },
            "notes": {
              "type": "array",
              "description": "Observations about your setup that are not faults."
            },
            "knownBot": {
              "enum": [
                "matched",
                "none"
              ],
              "type": "string",
              "description": "A second check, independent of the signature. Some operators publish the address ranges their crawlers use, and those lists are refreshed regularly. matched means the address this request came from is inside such a range. none is the usual answer and not a fault: no operator publishes a list containing this address, which holds for most agents and for every address that is not a large crawler."
            },
            "signature": {
              "type": "object",
              "description": "Whether a Web Bot Auth signature was present and how it came out.",
              "additionalProperties": true
            },
            "webBotAuthDetail": {
              "type": "object",
              "description": "The specific fault, and the sentence saying what to change. Read this part first. Besides reason and fix it may carry three more members. clockDriftSec is how far the signing clock sits from this server, in seconds. directoryStatus is the HTTP status the named key directory answered with, where 403 or 429 is almost always a firewall in front of it refusing this verifier rather than anything about the keys. fromCachedDirectory appears only when true and means the answer rests on a stored copy that could not be refreshed, so a key reported as absent may simply have been published after that copy was taken.",
              "additionalProperties": true
            },
            "refutedSignatures": {
              "type": "array",
              "description": "Other signatures on the same request whose named directory does not list the key they used. You can confirm each against the published file yourself."
            },
            "keyDirectoryBinding": {
              "enum": [
                "binding-proven",
                "binding-key-proven",
                "binding-not-provided",
                "binding-failed",
                "binding-not-checked"
              ],
              "type": "string",
              "description": "Whether your directory proved it published the key set that was read. binding-key-proven means the response signature verified but did not cover the body, so possession of the key is proven and the key set is not."
            }
          }
        },
        "transport": {
          "type": "object",
          "properties": {
            "provenance": {
              "enum": [
                "measured",
                "unavailable"
              ],
              "type": "string",
              "description": "measured = your request arrived directly and was read first-hand. unavailable = it did not, and no finding in this answer rests on it."
            }
          }
        },
        "automation": {
          "type": "object",
          "properties": {
            "uaClient": {
              "type": "string",
              "description": "What your User-Agent string alone says you are. A string, not a judgement."
            },
            "clientHints": {
              "type": "string",
              "description": "State of the Client Hints headers you sent."
            }
          }
        }
      }
    },
    "success": {
      "type": "boolean",
      "description": "Always true on a 200. Errors carry success:false and an error object."
    },
    "identity": {
      "type": "object",
      "properties": {
        "bot": {
          "type": [
            "string",
            "null"
          ],
          "description": "The specific bot within that operator, when the evidence distinguishes one."
        },
        "method": {
          "type": "string",
          "description": "How the name was established: signature when your own signature verified, ip-range when your address sat in a list its operator publishes."
        },
        "trusted": {
          "type": "boolean",
          "description": "Whether the established name is one this verifier holds a trust anchor for. A verified signature from an unknown domain still says who sent the request, and false here says that nothing more is known about that domain."
        },
        "operator": {
          "type": [
            "string",
            "null"
          ],
          "description": "The name established for you, when one could be. Null when nothing named you."
        }
      },
      "description": "Who you were established to be, and on what evidence. Empty of judgement: the outcome of checking a signature you sent against a directory you published.",
      "additionalProperties": true
    }
  }
}
self_check_web_bot_auth annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (2 of 2 answered).

  1. 2026-11-06: 1 of 1 checks answered
  2. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1079 ms
95th percentile latency
1079 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1079 ms · metadata changed · 1 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http packet-guru-agent-verifier-mcp https://fp.packet.guru/api/v1/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add packet-guru-agent-verifier-mcp --url https://fp.packet.guru/api/v1/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable packet-guru-agent-verifier-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "packet-guru-agent-verifier-mcp": {
      "url": "https://fp.packet.guru/api/v1/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "packet-guru-agent-verifier-mcp": {
      "type": "streamableHttp",
      "url": "https://fp.packet.guru/api/v1/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start packet-guru-agent-verifier-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "packet-guru-agent-verifier-mcp": {
      "type": "http",
      "url": "https://fp.packet.guru/api/v1/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http packet-guru-agent-verifier-mcp https://fp.packet.guru/api/v1/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://fp.packet.guru/api/v1/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "packet-guru-agent-verifier-mcp": {
      "serverUrl": "https://fp.packet.guru/api/v1/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Packet Guru Agent Verifier MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Packet Guru Agent Verifier MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing