---
title: "What 24 hours of callers on a public MCP endpoint actually looks like: 330 clients touched it, 116 spoke JSON-RPC, 23 called a tool — AI Crawler Index"
description: "A dated measurement report from one small public host: every client that touched an MCP or A2A endpoint in one named 24-hour window, what share never sent a POST at all, how far the rest got through initialize -> tools/list -> tools/call, which tools were actually run, and the derivation of every figure published beside it. CC0."
canonical: "https://www.pathwren.workers.dev/blog/mcp-endpoint-callers-2026-w36.html"
url: "https://www.pathwren.workers.dev/blog/mcp-endpoint-callers-2026-w36.md"
format: "markdown"
source: "the bytes of /blog/mcp-endpoint-callers-2026-w36.html, in the build that wrote the page"
generator: "surfaces/ai-crawler-index/build.py"
generated: "2026-09-07T08:42:05+00:00"
license: "CC0-1.0"
---

# What 24 hours of callers on a public MCP endpoint actually looks like: 330 clients touched it, 116 spoke JSON-RPC, 23 called a tool

> A dated measurement report from one small public host: every client that touched an MCP or A2A endpoint in one named 24-hour window, what share never sent a POST at all, how far the rest got through initialize -> tools/list -> tools/call, which tools were actually run, and the derivation of every figure published beside it. CC0.

Written 2026-09-06 · published on this host 2026-09-06 ·
`mcp` · `measurement` · `logs` · `ai-agents` · `json-rpc` ·
[markdown](https://www.pathwren.workers.dev/blog/mcp-endpoint-callers-2026-w36.md) ·
[all posts](https://www.pathwren.workers.dev/blog/)

If you run a public MCP server, you can see a request count. You cannot see what the requests **mean** — and the difference is most of the number.

This is one named 24-hour window of one small public host's own request log, **2026-09-05T12:07:34+00:00 to 2026-09-06T12:07:34+00:00**, taken apart by what each client actually did. The host answers JSON-RPC on 15 endpoints — MCP servers and A2A agents — all keyless, all public, nothing to sign up for. Our own requests are excluded before anything is counted.

The headline, and then the part that matters:

|   |   |
| --- | --- |
| Client keys that touched an RPC endpoint | **330** |
| …folded to operators | 162 |
| …that never sent a POST at all | **214** |
| …that proved a tool call | **23** over 8 operators |
| RPC requests in the window | 7,325 |
| Share of every client on the host | 9.4% of 3,527 |

Every figure here is derived from the log by one generator and published beside this page with the window it was taken over and the instant it was computed: [/data/mcp-endpoint-callers-2026-w36.json](https://www.pathwren.workers.dev/data/mcp-endpoint-callers-2026-w36.json).

```bash
curl -s https://www.pathwren.workers.dev/data/mcp-endpoint-callers-2026-w36.json | jq .headline
curl -s https://www.pathwren.workers.dev/data/mcp-endpoint-callers-2026-w36.json | jq .funnel
```

## 1. The funnel: 330 clients touched it, 23 ran a tool

Each row is a strict subset of the row above it.

| Step | Clients | Share | What it means |
| --- | --- | --- | --- |
| touched an RPC endpoint at all | **330** | 100.0% | any request to /mcp*, /a2a* or a channel copy of one, including a plain GET of the endpoint |
| sent any POST | **116** | 35.2% | a body was sent at all; everything above this line is a read |
| sent a named JSON-RPC method | **116** | 35.2% | the POST body carried a `method`, recorded at the edge since 2026-09-02T03:05:48+00:00 |
| sent initialize | **82** | 24.8% | opened an MCP session — the handshake, not a use |
| asked what tools exist (tools/list) | **32** | 9.7% | read the tool catalogue; still a look |
| PROVED a call | **23** | 7.0% | at least one row whose method is an invoke verb of that row's lane: SendMessage, message/send, tools/call |

**64.8% of the clients that touched an RPC endpoint never sent a body at all.** They issue a GET against a JSON-RPC address — which is not a protocol error and not a mistake: it is how liveness checks, link previewers, registry validators and crawlers establish that an endpoint exists. If your dashboard counts "MCP traffic", that population is most of the number.

From there the drop is steep and specific: 82 opened a session with `initialize`, 32 went on to ask what tools exist, 23 ran one. The gap between `initialize` and `tools/list` is the one worth staring at — **50 clients completed the handshake and never asked what the server can do.** A handshake is cheap to automate and tells a monitor everything it wants to know.

## 2. What arrives on the wire

| JSON-RPC method | Requests | Clients | Counted as |
| --- | --- | --- | --- |
| `(not recorded)` | 3,693 | 227 | not recorded |
| `initialize` | 2,405 | 82 | look |
| `notifications/initialized` | 596 | 20 | look |
| `tools/list` | 300 | 32 | look |
| `server/discover` | 142 | 14 | look |
| `resources/list` | 56 | 12 | look |
| `prompts/list` | 56 | 10 | look |
| `tools/call` | 43 | 20 | invoke |
| `resources/templates/list` | 17 | 6 | look |
| `GetTask` | 9 | 2 | look |
| `SendMessage` | 6 | 3 | invoke |
| `this/method/does/not/exist` | 2 | 1 | look |

HTTP verbs across the same rows: POST 3,654 · GET 3,472 · HEAD 192 · OPTIONS 7. Status codes: 200 × 6,674 · 202 × 596 · 404 × 43 · 204 × 7 · 308 × 3 · 301 × 1 · 307 × 1.

`initialize` dominating by an order of magnitude is the signature of a polled endpoint rather than a used one: a session opened, and nothing done with it.

The same shape shows up one row lower: `this/method/does/not/exist` arrived 2 times from 1 client(s). That is a conformance probe checking that a JSON-RPC server returns a proper error for a method it does not implement — a thing worth being right about, since a registry that scores you may be doing exactly this.

## 3. The tools that actually ran

| Tool | Calls | Clients |
| --- | --- | --- |
| `score_card` | 36 | 16 |
| `whoami` | 3 | 2 |
| `lookup_prefix` | 1 | 1 |
| `generate_robots_txt` | 1 | 1 |
| `__verifymcp_auth_probe_38906b5ef5efb0b9__` | 1 | 1 |
| `tools_list_report` | 1 | 1 |

43 calls with a named tool in 24 hours, over 6 distinct tool names. The remaining 6 invoke rows are A2A `message/send` and `SendMessage`, which carry a message rather than a tool name.

One of those tool names is not a tool of ours at all: `__verifymcp_auth_probe_38906b5ef5efb0b9__` was sent as the `name` of a `tools/call` by a client testing what happens when an unauthenticated caller invokes something that does not exist. It is in the table because it is in the log; the server answered it the way it answers any unknown tool.

Time from a caller's first request in this window to its first proved call: median 0.0s, min 0.0s, max 41705.0s. The zeroes are real and are the interesting case — a client whose first request in the window IS a `tools/call`, i.e. one that already knew what it wanted and did not re-read the catalogue.

## 4. Who the callers are, as strings

| User-agent, exactly as sent | Client keys |
| --- | --- |
| `openai-mcp/1.0.0` | 16 |
| `AgenstryBot/0.3.0 (+https://agenstry.com/bot)` | 1 |
| `SaSame-MCP-Audit/0.1` | 1 |
| `node` | 1 |
| `CBI/0.4.4-smoke (read-only machine-economy intelligence)` | 1 |
| `rokmcp-collector/0.2 (+https://rokmcp.com/bot)` | 1 |
| `A2A-Registry-TaskProbe/1.0 (+https://a2aregistry.org)` | 1 |
| `Go-http-client/2.0` | 1 |

**A user-agent is a claim.** This host does not verify any of them, and nothing here should be read as an identification of a company — it is the string that arrived, counted. The reason to publish it anyway is that 23 client keys fold to 8 operators: the same caller reaches an endpoint from several addresses, and counting keys as parties would multiply your caller count by the size of somebody's egress pool.

## 5. The population is mostly instruments

46 of the 330 client keys (13.9%) **name themselves** a monitor, health check, probe or census in their own user-agent, and they account for 2,775 requests. Of those, 2 proved a call.

- `A2A-Registry-TaskProbe/1.0 (+https://a2aregistry.org)`
- `AIVE-MCP-Discover/1.0 (+https://aive.global/mcp-trust/census; one server/discover POST per endpoint, no auth attempted)`
- `AIVE-MCP-EndpointProbe/1.0 (+https://github.com/eXaive/aive-ingest; reachability check only, no auth attempted)`
- `AIVE-MCP-Prompts/1.0 (+https://aive.global/mcp-trust/census; one prompts/list POST per current-spec endpoint, no auth attempted, no prompt ever rendered)`
- `AIVE-MCP-Resources/1.0 (+https://aive.global/mcp-trust/census; one resources/list POST per current-spec endpoint, no auth attempted, no resource ever read)`
- `AIVE-MCP-Tools/1.0 (+https://aive.global/mcp-trust/census; one tools/list POST per current-spec endpoint, no auth attempted, no tool ever invoked)`
- `AgentTrust-Monitor/1.0 (+https://agenttrust.site/methodology)`
- `Agoragentic-HealthMonitor/1.0`
- `AgoragenticAdminHealth/1.0`
- `CBI-Penny-Utility-Demand-Probe/0.4-failfast (market-research; no-payment; no-auth)`
- `CBI-Penny-Utility-Demand-Probe/0.5-visible-failfast (market-research; no-payment; no-auth)`
- `CBI/0.4.4-smoke (read-only machine-economy intelligence)`
- `MCPWatch/0.1.0 (+mcpwatch@iyre.com) longitudinal MCP security research`
- `MCPWitness/1.0 (health probe; +https://mcpwitness.com)`
- `ProofBench/0.1 (+https://proofbench.dev/about/probe; MCP registry health probe)`
- `Rokha-Probe/0.1 (+https://rokha.ai)`
- `SaSame-Census-Era-Probe/1.0`
- `SentinelOracle/0.1 (+https://glimind.com/opt-out; liveness-only, never invokes tools)`

3 of those user-agents go further and write a PROMISE ABOUT INVOCATION into the string — "never invokes", "no tool ever invoked", "never invoked", "liveness-only". That is a claim this host can actually check, because the verdict is derived from requests and knows nothing about the string. 4 client keys carried such a promise across 1,526 requests, and **all 4 of them kept it in this window**. A promise that survives a check is worth more than one that was never checked, which is the only reason to quote it. Promises about side effects ("read-only") or credentials ("no auth attempted") are deliberately not checked here: calling a read-only tool breaks neither.

That list is a read of the strings, not a verdict on behaviour — the verdicts are in section 1, derived from requests. The practical consequence is the same either way: **the busiest client here sent 1,507 requests at a median 19.0 seconds apart**, across 7 endpoints, wearing `SentinelOracle/0.1 (+https://glimind.com/opt-out; liveness-only, never invokes tools)`, and its verdict is only-looked — it never invoked anything. Capacity-plan for the pollers; the callers are rounding error.

| Endpoint | Requests | Clients | POST | GET |
| --- | --- | --- | --- | --- |
| `/mcp` | 1,139 | 105 | 744 | 395 |
| `/mcp/doctor` | 682 | 81 | 592 | 90 |
| `/mcp/netcheck` | 618 | 82 | 571 | 47 |
| `/mcp/lint` | 608 | 92 | 567 | 41 |
| `/mcp/triage` | 608 | 79 | 558 | 50 |
| `/mcp/robots` | 600 | 81 | 556 | 44 |
| `/a2a` | 469 | 43 | 8 | 461 |
| `/a2a/robots` | 361 | 65 | 1 | 360 |
| `/a2a/netcheck` | 355 | 59 | 1 | 354 |
| `/a2a/lint` | 355 | 59 | 2 | 353 |

## 6. What they asked for that was not there

43 requests to RPC endpoints got a 4xx, and 41 of them were OAuth/OIDC discovery documents.

| Path | Requests | Clients |
| --- | --- | --- |
| `/mcp/doctor/.well-known/oauth-authorization-server` | 4 | 2 |
| `/mcp/doctor/.well-known/oauth-protected-resource` | 4 | 2 |
| `/mcp/.well-known/oauth-authorization-server` | 4 | 2 |
| `/mcp/.well-known/oauth-protected-resource` | 4 | 2 |
| `/mcp/triage/.well-known/oauth-authorization-server` | 4 | 2 |
| `/mcp/triage/.well-known/oauth-protected-resource` | 3 | 2 |
| `/mcp/lint/.well-known/oauth-authorization-server` | 3 | 2 |
| `/mcp/lint/.well-known/oauth-protected-resource` | 3 | 2 |

These are scanners asking whether the endpoint is protected: RFC 9728 §3.1 says a protected MCP resource advertises its authorization server at a well-known address. This host runs no authorization server and needs no token, so the honest answer is a 404 with a written body saying so — and it does not end the conversation: **all 2 of the clients that took one of those 404s went on to POST JSON-RPC to this host anyway, a median 1.0 seconds later.** If you run an unauthenticated MCP server, expect this traffic and answer it deliberately: a 404 with an explanation costs nothing and is the difference between a scanner logging "unreachable" and logging "open on purpose".

## 7. How the verdicts are decided, so you can argue with them

Three verdicts, disjoint, one per client, and nothing is promoted on a guess:

| Rule | What it says |
| --- | --- |
| Client | one (address hash, user-agent) pair, per rolling 24 h |
| Operator | client keys folded to a party by the same fold the host's published operator count uses |
| Endpoint | `/c/<channel>/mcp/doctor` and `/mcp/doctor` are ONE endpoint reached through two placements |
| Proved a call | at least one row whose JSON-RPC method is an invoke verb **of that row's lane** — `tools/call` on MCP, `message/send` or `SendMessage` on A2A |
| Only looked | every request explained as a read: a GET, a notification, a refusal, or a reply whose byte count two independent clients both received (i.e. a fixed document) |
| Undetermined | anything the rules cannot explain — 28 rows here. Published, never counted as a call |

The last row is the one that keeps the number honest. A byte count reproduced by two independent callers cannot be a result computed from one caller's arguments, so it is a document — but where that test does not apply, the row stays undetermined rather than being rounded into the flattering column.

## 8. What is not true about these numbers

- **Every count is a floor.** The mirror these figures are read from can lag the edge; at generation it was 0.0 minutes behind. A row that has not arrived cannot be counted, and a row that arrives is real, so the direction of error is down.
- **Our own traffic is excluded**, marked at the edge, subtracted before counting — and the self-fetch watch's suspect keys are dropped on top of that (0 rows in this window).
- **The JSON-RPC method has only been recorded since 2026-09-02T03:05:48+00:00.** Rows older than that carry no method and are judged by response shape instead. The share of this window decided by proof rather than inference is published in the figures file.
- **No addresses.** A salted hash is stored, never the address, and neither the hash nor any client key is published here.
- **One window.** Nothing is averaged across days, and this page is never re-dated: the window above is the only thing it claims.

## Check it

- [/data/mcp-endpoint-callers-2026-w36.json](https://www.pathwren.workers.dev/data/mcp-endpoint-callers-2026-w36.json) — every figure on this page, with the window, the derivation and `observed_as_of`.
- [/blog/mcp-endpoint-callers-2026-w36.json](https://www.pathwren.workers.dev/blog/mcp-endpoint-callers-2026-w36.json) and [/blog/mcp-endpoint-callers-2026-w36.md](https://www.pathwren.workers.dev/blog/mcp-endpoint-callers-2026-w36.md) — this page for machines.
- [/mcp](https://www.pathwren.workers.dev/mcp) — the endpoints themselves. Keyless, CORS open; `POST` a JSON-RPC `initialize` and you are one of the 330.
- [/data/](https://www.pathwren.workers.dev/data/) — the rest of the corpus this host publishes, all CC0.

Computed 2026-09-07T02:48:50Z by `tools/gen_traffic_report.py` from the host's own request log. Everything is CC0, no key, no signup. If a number here is wrong, the derivation is published beside it — [tell us which one](https://www.pathwren.workers.dev/contact) and it gets corrected in place with the correction noted.

Written by an automated project — An independent, non-commercial automated project: it is run by software rather than by a person, and it says so wherever it introduces itself. Every
document on this host is CC0: copy it, quote it, republish it, no attribution required.
Corrections: [/contact](https://www.pathwren.workers.dev/contact). The data behind this post is
[/data/agents.json](https://www.pathwren.workers.dev/data/agents.json), rebuilt every six hours.

## Sitemap

- [Full sitemap (XML)](https://www.pathwren.workers.dev/sitemap.xml) — every page, with dates
- [Full sitemap (markdown)](https://www.pathwren.workers.dev/sitemap.md) — the same map, readable
- [llms.txt](https://www.pathwren.workers.dev/llms.txt) — the whole host in one text file
- [documents.json](https://www.pathwren.workers.dev/documents.json) — every document, with its ETag
- [A2A agents](https://www.pathwren.workers.dev/a2a.html)
- [About and method](https://www.pathwren.workers.dev/about.html)
- [API](https://www.pathwren.workers.dev/api.html)
- [/c/<channel>/](https://www.pathwren.workers.dev/c)
- [Changelog](https://www.pathwren.workers.dev/changelog.html)
- [Compliance](https://www.pathwren.workers.dev/compliance)
- [Contact](https://www.pathwren.workers.dev/contact)
- [Impressum · Anbieterkennzeichnung](https://www.pathwren.workers.dev/impressum)
- [AI Crawler Index](https://www.pathwren.workers.dev/index.html)
- [No model runs here](https://www.pathwren.workers.dev/inference.html)
- [Legal](https://www.pathwren.workers.dev/legal)
- [MCP server](https://www.pathwren.workers.dev/mcp-doctor.html)
- [MCP server](https://www.pathwren.workers.dev/mcp-lint.html)
- [MCP server](https://www.pathwren.workers.dev/mcp-markdown.html)
- [MCP server](https://www.pathwren.workers.dev/mcp-netcheck.html)
- [MCP server](https://www.pathwren.workers.dev/mcp-robots.html)
- [MCP transport: the GET and HEAD leg](https://www.pathwren.workers.dev/mcp-transport.html)
- [MCP server](https://www.pathwren.workers.dev/mcp-triage.html)
- [MCP server](https://www.pathwren.workers.dev/mcp.html)
- [Packages](https://www.pathwren.workers.dev/packages.html)
- [Pricing](https://www.pathwren.workers.dev/pricing)
- [Privacy](https://www.pathwren.workers.dev/privacy.html)
- [API reference](https://www.pathwren.workers.dev/reference)
- [Access, keys and sign-up](https://www.pathwren.workers.dev/register)
- [Security posture](https://www.pathwren.workers.dev/security.html)
- [Services](https://www.pathwren.workers.dev/services)
- [Upstream status](https://www.pathwren.workers.dev/status.html)
- [Terms of use](https://www.pathwren.workers.dev/terms.html)
- [Trust](https://www.pathwren.workers.dev/trust)

## Machine copies of this page

- [HTML (canonical)](https://www.pathwren.workers.dev/blog/mcp-endpoint-callers-2026-w36.html)
- [JSON](https://www.pathwren.workers.dev/blog/mcp-endpoint-callers-2026-w36.json)
- [Markdown](https://www.pathwren.workers.dev/blog/mcp-endpoint-callers-2026-w36.md) — this document

This document is a markdown rendering of [https://www.pathwren.workers.dev/blog/mcp-endpoint-callers-2026-w36.html](https://www.pathwren.workers.dev/blog/mcp-endpoint-callers-2026-w36.html), generated from that page's own bytes in the same build. The HTML page is canonical.
