tollbooth-oauth2-collector
Server Details
Unauthenticated OAuth2 callback collector for Tollbooth MCP services
- Status
- Healthy
- Uptime
- 99.9% over 79 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- lonniev/tollbooth-oauth2-collector
- GitHub Stars
- 0
- Server Listing
- tollbooth-oauth2-collector
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 4 tools
store_code and retrieve_code are clearly distinct halves of one lifecycle, but collector_status and service_status both read as generic 'status' tools and an agent could easily probe the wrong one for a health check. Descriptions do distinguish them (pending codes/TTL vs. build sha), but the boundary is only disambiguated by reading the long text rather than the names.
Two consistent patterns exist: verb_noun (store_code, retrieve_code) and noun_status (collector_status, service_status). Both are readable and snake_case throughout, with no style mixing, though having two parallel conventions is a minor deviation from a single predictable scheme.
Four tools is a well-scoped surface for a narrowly purposed OAuth2 code collector: store, retrieve, and two status/inspection tools. Nothing feels padded or missing.
The store/retrieve lifecycle is complete (auto-delete on read means no delete tool is needed) and status covers observability. A listing or purge-stale-codes operation is absent, but that is a minor gap agents can likely work around via collector_status counts.
Available Tools
4 toolscollector_statusCollector StatusBInspect
Health check — shows the number of pending authorization codes and TTL.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully discloses that the payload is a pending-code count plus a TTL, but never states that this is a non-mutating read, whether any auth is required, or how the TTL is defined — modest context for a read-only tool whose risk profile is low.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded clause with no filler — the identity and payload are stated immediately. It could be marginally tighter by disambiguating 'TTL' (TTL of what: the codes, the collector, a cache?), which leaves a small ambiguity in an otherwise efficient sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description does not need to explain return values, and the parameterless schema needs no parameter prose. What remains missing is the routing information against 'service_status' and any read-only/auth context, so it is adequate but not complete for an agent choosing between the two status siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes no parameters (0 params, additionalProperties false), so there is nothing for the description to disambiguate; the baseline for a parameterless tool is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb/resource pairing ('Health check') and names exactly what it reports: pending authorization code count and TTL. It is clear what the tool does, but it does not distinguish itself from the sibling 'service_status', which from the name alone could plausibly be the same kind of health check.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use statement and no mention of alternatives, despite 'service_status' being an obvious candidate for confusion. At best the phrase 'Health check' weakly implies a monitoring use case; nothing tells the agent when to call this versus the other status-style sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
retrieve_codeRetrieve CodeAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| state | Yes | Where the code was filed: patron npub + the flow's secret (the SDK's ``oauth_code_key`` of the authorization state). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does much of it: it discloses that the read is one-time and the stored code is auto-deleted, and that the returned value is encrypted and must be decrypted with the same state token. It omits permission/auth requirements and the failure mode when the code is absent or already consumed, which matters for a destructive-on-read operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, and the most decision-relevant fact (one-time read, auto-deleted) is front-loaded in parentheses. Every clause adds information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return-value explanation isn't needed, and the single parameter is fully documented. The remaining gap is failure behavior (already-retrieved or missing code) and any auth prerequisite, which a caller of a self-destructing read would want to know.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: the same state token used to file the code is also the decryption key for the returned payload. That is a semantic detail not spelled out in the schema's field description, which only describes where the code was filed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve a stored authorization code') plus its defining lifecycle trait ('one-time read, auto-deleted'). It implicitly contrasts with the write-side sibling store_code via 'pick up the code', but never names that sibling explicitly, so the differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear trigger condition: called by the originating MCP server after the user has authorized in the browser. That tells an agent the calling context well. It does not state what to do if the code was already consumed, or what alternative to consult instead (e.g., collector_status), so no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
service_statusService StatusAInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that the service is unauthenticated, free, has no operator runtime, and that vault/courier/operator fields are False/empty by construction. It also names the load-bearing return field, though it omits side-effect/rate-limit framing beyond the implied read-only nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence front-loads the purpose well, but the following paragraphs are dense and somewhat verbose for a no-parameter status collector, with implementation detail (backticked field names, envelope provenance) that partly duplicates what the output schema conveys.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because an output schema exists, the description needn't enumerate return values, and it covers purpose, usage context, auth posture, and the key field. It is complete enough to call correctly, with only minor gaps around output interpretation beyond the highlighted sha.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing to document and the baseline is 4. The description correctly adds no parameter detail because none exists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource — 'Report the running build' — and clarifies it delegates to the canonical build_service_status envelope, so an agent knows exactly what it returns. It does not explicitly differentiate from the sibling collector_status, which is the main gap keeping it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear use context: verifying that a redeploy landed the merged sha, as read by the post-merge deploy-verify probe. That tells the agent when this tool is the right one, but no alternatives or exclusions are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
store_codeStore CodeAInspect
Store a sealed OAuth2 authorization code.
Called by the serverless callback function after the browser redirect. The
state carries the patron npub, the operator npub (the PUBLIC key the
code is sealed to) and the flow's one-time secret — 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
oauth_code_key(state) (patron npub + secret), so only the flow that
holds the secret finds it: a link someone else built with a patron's npub
files its code where that patron's flow never looks.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The authorization code from the OAuth provider. | |
| state | Yes | The packed state (``patron_npub.operator_npub.secret``). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden and does well: it explains that the code is sealed with NIP-44 to the operator, that state carries the patron npub, operator npub, and one-time secret, and that the Neon row is keyed in a way that only the correct flow can find it. It does not discuss duplicate-row handling, overwrite behavior, or failure modes, which are the main remaining transparency gaps for a storage operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, and the remaining sentences add relevant security and storage context. The description is dense and somewhat long, but most of its detail earns its place by explaining the sealing and keying model.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a security-sensitive write operation with no annotations, the description is substantially complete: it covers purpose, callback usage, sealing, state contents, and row-key isolation. Since the input schema is fully documented and an output schema exists, the main minor omissions are duplicate handling and error behavior rather than core invocation semantics.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is already 100%, so the baseline is 3, but the description adds substantial meaning beyond the schema by explaining what the packed state contains and how it controls sealing and row lookup. It reinforces the security semantics of both parameters rather than merely restating their types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Store a sealed OAuth2 authorization code.' It clearly distinguishes the write-side operation from the sibling retrieve_code tool and explains the callback context in which storage happens.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear usage context by saying this is called by the serverless callback function after the browser redirect. It does not explicitly name retrieve_code or state when not to use this tool, but the operational context is specific enough for an agent to select it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
- Changed
retrieve_code1 field changed- changed
Input schema / properties / state / descriptionPrevious value: -"The state token (patron npub) used during authorization."New value: +"Where the code was filed: patron npub + the flow's secret\n(the SDK's ``oauth_code_key`` of the authorization state)."
- Changed
store_code1 field changed- changed
Input schema / properties / state / descriptionPrevious value: -"The packed state (``patron_npub.operator_npub``)."New value: +"The packed state (``patron_npub.operator_npub.secret``)."
2 tool updates
- Changed
retrieve_code1 field changed- added
Input schema / properties / state / descriptionAdded value: +"The state token (patron npub) used during authorization."
- Changed
store_code2 fields changed- added
Input schema / properties / code / descriptionAdded value: +"The authorization code from the OAuth provider." - added
Input schema / properties / state / descriptionAdded value: +"The packed state (``patron_npub.operator_npub``)."
4 tool updates
- First observed
collector_status - First observed
retrieve_code - First observed
service_status - First observed
store_code
Related MCP Connectors
Ephemeral, human-friendly short URLs for Tollbooth MCP services
OAuth MCP for Google, Meta, X, LinkedIn, Reddit, TikTok, GSC, GA4, WordPress and GHL.
Experimental MCP server for current empirical verification of explicit public HTTPS endpoint claims.
OAuth scope approvals and consent receipts for remote MCP servers.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAuthenticating reverse proxy for MCP servers providing credential isolation, OAuth2 token management, and composite tool aggregation.BSD Zero Clause
- AlicenseNot gradedqualityDmaintenanceOAuth MCP server providing thin edge adapter access to the tickward public API via REST endpoints.AGPL 3.0
- AlicenseNot gradedqualityBmaintenanceSecure MCP protocol proxy with OAuth2 + Dynamic Client Registration (DCR), JWT auth, RBAC, rate limiting, multi-server aggregation, and a monitoring/admin dashboard.106 PyPI13MIT
- AlicenseNot gradedqualityBmaintenanceEnables connecting multiple accounts to remote MCP servers like Slack, Sentry, and Trello through a single OAuth-fronted proxy, with per-account URLs and token handling.914,234 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.