# io.github.lonniev/tollbooth-oauth2-collector

> Unauthenticated OAuth2 callback collector for Tollbooth MCP services

- name: io.github.lonniev/tollbooth-oauth2-collector
- version: 0.2.11
- connection class: R0 (autonomous)
- trust: 91/100
- quality: 83/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/io.github.lonniev%2Ftollbooth-oauth2-collector
- tools: https://api.protogrid.dev/v1/servers/io.github.lonniev%2Ftollbooth-oauth2-collector/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "tollbooth-oauth2-collector": {
      "type": "http",
      "url": "https://tollbooth-oauth2-collector.fastmcp.app/mcp"
    }
  }
}
```


## Trust

- hygiene: 100
- liveness: 100
- freshness: 85
- provenance: 80
- drivers: +repository +namespace-matches-repo +reachable +uptime-100% ~updated-56d-ago
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 83/100 (good)

### protocol: 88 (weight 25)

- pass `protocol.modern`: supports 2026-07-28 (server/discover)
- pass `protocol.stateless`: answers without a session
- pass `protocol.transport`: streamable HTTP
- warn `protocol.list_ttl`: tools/list declares ttlMs 0, so clients re-fetch it on every use

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 71 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- pass `tools.schemas`: every tool has an object input schema
- fail `tools.annotations`: no tool declares readOnlyHint or destructiveHint, so clients cannot tell safe calls from risky ones
- fail `tools.directory_hints`: no tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: store_code (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); collector_status (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); retrieve_code (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); …
- pass `tools.token_cost`: about 546 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 100 (weight 15)

- pass `stability.changes`: 4 tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 4, about 546 tokens to load them all
- tool set hash: 065fd9f0c9673da1f2088f4bd5e15f3e
- tools last changed: 2026-10-18T02:02:20.962Z
- badge: [![protogrid quality](https://protogrid.dev/badge/io.github.lonniev/tollbooth-oauth2-collector.svg)](https://protogrid.dev/servers/io.github.lonniev/tollbooth-oauth2-collector)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-10-18 `service_status` changed (title)
- 2026-10-18 `collector_status` changed (title)
- 2026-10-18 `retrieve_code` changed (title)
- 2026-10-18 `store_code` changed (title)

Full history: https://api.protogrid.dev/v1/servers/io.github.lonniev%2Ftollbooth-oauth2-collector/changes

## Remotes

- https://tollbooth-oauth2-collector.fastmcp.app/mcp (streamable-http, auth none, reachable true, uptime30d 1)

## Packages

_none_

## Tools (4)

- `collector_status`: Health check — shows the number of pending authorization codes and TTL.
- `retrieve_code`: Retrieve a stored authorization code (one-time read, auto-deleted).

Called by the originating MCP server to pick up the code after the user
has authorized in the browser. Returns the encrypted code which the
caller decrypts using the same state token.
- `service_status`: Report the running build so a redeploy can be verified. Free.

Delegates to the SDK's canonical ``build_service_status`` — the single
source of the service_status payload shape — so this collector reports the
same envelope as every other DPYC service. The load-bearing field is
``build_info.fastmcp_cloud_git_commit_sha``: the commit Horizon actually
deployed. The post-merge deploy-verify probe reads it to confirm the live
service redeployed the merged sha; with no ``service_status`` tool to probe,
that sha reads as ``<none>`` and an otherwise-healthy deploy is flagged as
"did not land".

The vault/courier/operator fields are ``False``/empty by construction —
this is an unauthenticated community utility with no operator runtime.
- `store_code`: Store a sealed OAuth2 authorization code.

Called by the serverless callback function after the browser redirect. The
``state`` carries BOTH the patron npub (the lookup/retrieve key) and the
operator npub (the PUBLIC key the code is sealed to) — see the SDK's
``pack_oauth_state``. The code is sealed with NIP-44 to the operator so only
that operator's nsec can open it; the Neon row is keyed by the patron npub,
so retrieval (``retrieve_code(state=patron_npub)``) is unchanged.
