CorroborateMe
Server Details
Prove end users to agents and apps: login-links, OIDC clients, and API keys over remote MCP
- Status
- Healthy
- Uptime
- 81.7% over 22 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- CNR-Consulting/corroborate-me
- GitHub Stars
- 1
- Server Listing
- CorroborateMe
TDQS
Scored across 13 tools
Most tools target distinct resources and phases (bootstrap, billing, login-link session, integrations, keys, OIDC, webhooks). The three billing tools (billing_checkout, billing_machine_pay, billing_portal) overlap conceptually, but each description explicitly states what it does NOT do and points to the right sibling, so selection is usually clear.
All names are snake_case with recognizable resource prefixes (billing_*, integration_*, oauth_client_*), which aids scanning. However verb placement is inconsistent: some are verb-first (create_login_link, get_login_status, retry_login_webhook) while others are noun-first (integration_upsert, keys_create, billing_checkout, budget_get).
13 tools is well within a reasonable range and the surface maps to clear workflow areas: onboarding, billing, authentication/login links, integrations, and credentials. Each tool appears to earn its place, with only mild fragmentation across the login-link and webhook helpers.
The surface covers onboarding, billing, login, integrations, keys, and OIDC creation, but lifecycle coverage is asymmetric: keys_create and oauth_client_create have no corresponding revoke/delete or list operations, and integration_upsert has list but no delete. These gaps could leave agents unable to clean up or audit credentials and clients.
Available Tools
14 toolsagent_bootstrapARead-onlyIdempotentInspect
Show how to start zero-human company onboarding. This call does not create a company, send email, or mint a bootstrap token or an aa_ key. MCP requires a company API key (aa_...) or an MCP OAuth access token before any tool runs. Returns message, path (/api/agents/bootstrap), body (company_name and contact_email echoed), product, and keyPrefix. The unauthenticated REST POST to that path returns bootstrapToken, expiresIn 900 (about 15 minutes), and next billing paths, and it does not mint the aa_ key. After that REST call, POST /api/billing/machine-pay with the bootstrap token for an agent prepaid unlock, or POST /api/billing/checkout when a human will pay in the browser.
| Name | Required | Description | Default |
|---|---|---|---|
| company_name | No | Optional display name echoed in body for POST /api/agents/bootstrap. This tool does not store it. | |
| contact_email | No | Optional contact email echoed in body. No message is sent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description builds on them by enumerating the side effects it explicitly avoids (no company creation, no email sent, no bootstrap token or aa_ key minted) and by naming the auth requirement. It also discloses the return payload (message, path, body echo, product, keyPrefix) and the REST token's 900-second expiry, which is meaningful context absent an output schema.
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 denial-of-side-effects and the auth prerequisite are front-loaded before the return shape and the downstream REST options, which is good ordering. The passage is dense with a lot of REST detail, but nearly every clause (auth, negations, return fields, expiry, next steps) carries distinct information rather than repeating structured data.
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 zero-side-effect informational tool with no output schema, the description covers everything an agent needs: what it does and explicitly does not do, the auth precondition, the returned fields, and the follow-on REST calls with their selecting conditions. Nothing needed to invoke it correctly is missing.
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 100% and both params are optional, so the schema already carries the semantics; the description only restates that company_name and contact_email are echoed in the body and not stored, mirroring the schema text. Baseline 3 applies since the description adds nothing beyond the structured field documentation.
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 action (show how to start zero-human company onboarding) and immediately bounds it with three negations (does not create a company, send email, or mint tokens). It is distinguishable from siblings like billing_checkout because it positions itself as the pre-onboarding informational step, though it never explicitly contrasts itself with an MCP sibling tool.
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 real routing guidance: it states the auth prerequisite (aa_ key or OAuth token) 'before any tool runs,' and it names the downstream alternatives POST /api/billing/machine-pay (agent prepaid unlock) versus POST /api/billing/checkout (human pays in browser) with the condition that selects each. It stops short of explicitly telling the agent when to call this tool instead of the billing_* MCP siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
billing_checkoutInspect
Create a Stripe Checkout session for the authenticated company so a human can subscribe to Pro, monthly or yearly (optional interval month or year). Requires a company API key (aa_...) or an MCP OAuth access token. It does not accept a console session or a bootstrap token, and it does not mint a company or an aa_ secret. Returns url. Creating the session does not charge a card; the human pays on the Stripe page. When local billing bypass is enabled, there is no Stripe call and no charge: Pro is granted immediately with no period end, and url is the console success URL (/console?billing=ok), not a Stripe Checkout URL. If Stripe is not configured and bypass is off, the JSON includes error stripe_not_configured. For prepaid purchase instructions, use billing_machine_pay. To manage an existing subscription, use billing_portal.
| Name | Required | Description | Default |
|---|---|---|---|
| interval | No | month for $5.99 a month (default), year for $55 a year. |
billing_machine_payARead-onlyIdempotentInspect
Return prepaid Pro purchase instructions. This tool does not charge a card, grant Pro, or return an aa_ secret. MCP requires a company API key (aa_...) or an MCP OAuth access token; a bootstrap token is not accepted on this call. Optional sku defaults to pro_prepaid_30d. On success, returns sku, amount (the live price), currency, periodDays, mppConfigured, action (POST /api/billing/machine-pay), agentSkus, and instructions. If MPP is not configured and local billing bypass is off, returns an error with code mpp_not_configured and does not grant Pro. An unknown sku returns invalid_sku. The REST POST /api/billing/machine-pay is what charges or grants: with MPP enabled it starts a prepaid charge and, only when the caller used a bootstrap token and the company has no API key yet, returns secret (aa_..., shown once) after settlement. With local billing bypass and MPP off, that REST call grants Pro for the SKU period with no Stripe charge and may return the same secret on the bootstrap path. Use billing_checkout for a human Stripe Checkout session.
| Name | Required | Description | Default |
|---|---|---|---|
| sku | No | Optional prepaid plan id. When omitted, the server uses pro_prepaid_30d. That is the only accepted SKU. The tool response includes the live amount. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this readOnly/idempotent/non-destructive, and the description reinforces that with explicit negative guarantees (does not charge, grant Pro, or return a secret) plus failure modes (mpp_not_configured, invalid_sku) and their consequences. It also disambiguates this MCP call from the REST POST that actually charges/grants, which is rich context beyond the annotations.
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 action is front-loaded and every sentence carries information, but the extended passage on the REST /api/billing/machine-pay charge/grant semantics is dense and goes beyond what is needed to select one tool. It is efficient but not maximally tight.
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?
Despite having no output schema, the description enumerates the return fields (sku, amount, currency, periodDays, mppConfigured, action, agentSkus, instructions) and documents auth requirements and both error paths. An agent has everything needed to invoke it correctly.
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 100% for the single sku parameter and already documents the pro_prepaid_30d default and that it is the only accepted SKU, which the description largely restates. The description adds only the invalid_sku error outcome, a behavioral rather than semantic addition, so the baseline 3 is appropriate.
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 opens with a specific verb+resource ('Return prepaid Pro purchase instructions') and immediately scopes what the tool does NOT do (no charge, no grant, no secret). It then contrasts sharply with the REST POST endpoint and with billing_checkout, so an agent can place it against siblings without opening a schema.
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 states the required auth ('a company API key (aa_...) or an MCP OAuth access token; a bootstrap token is not accepted on this call') and names the alternative explicitly ('Use billing_checkout for a human Stripe Checkout session'). When-to-use and when-not-to-use are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
billing_portalAInspect
Create a billing portal URL for the authenticated company. Use this when a human needs to update a payment method, view invoices, or change an existing subscription. Requires a company API key (aa_...) or an MCP OAuth access token. Returns url when Stripe is configured and the company has a Stripe customer. The call itself does not change the plan or charge a card. When local billing bypass is enabled, Stripe is not called and url is the console URL. If Stripe is not configured or the company has no Stripe customer, the JSON includes error stripe_not_configured. To buy Pro, use billing_checkout. billing_machine_pay only returns prepaid REST instructions.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare openWorldHint=true and readOnlyHint=false, but the description adds substantial context: required API key/OAuth token, that the call does not change the plan or charge a card, that local billing bypass skips Stripe and returns the console URL, and the stripe_not_configured error condition. This goes well beyond the annotation surface.
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?
Six sentences, each carrying distinct load: purpose, usage, auth, return value, non-mutation caveat, bypass behavior, error mode, and sibling routing. Purpose is front-loaded and there is no filler.
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 no output schema, the description correctly covers the return contract (url on success, stripe_not_configured error) and the environment-dependent variation. Auth, error modes, and side-effect scope are all present, so nothing needed to call it correctly is missing.
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 the baseline is 4 and there is nothing for the description to document. Auth requirements are mentioned, but that is behavioral rather than parameter semantics.
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?
Opens with a specific verb+resource ("Create a billing portal URL") scoped to "the authenticated company." It also explicitly distinguishes itself from siblings by naming billing_checkout and billing_machine_pay, so an agent can route correctly without opening other schemas.
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 concrete when-to-use criteria (human needs to update payment method, view invoices, or change subscription) and explicit alternative routing ("To buy Pro, use billing_checkout" and what billing_machine_pay actually returns). Both the trigger and the exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
budget_getRead-onlyIdempotentInspect
Read remaining quotas and plan entitlement for the authenticated company. Call this when you need to know whether an active plan is in effect before registering OIDC clients or creating login links. Creating login links, minting extra API keys, and registering end users all require an active plan (the bootstrap key does not). Requires a company API key (aa_...) or an MCP OAuth access token. Returns planId, planStatus, periodYm, included, used, remaining, and hardCap. It does not change billing or charge a card. To start a human Pro checkout, use billing_checkout. billing_machine_pay only returns prepaid REST instructions. To manage an existing Stripe subscription, use billing_portal.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
create_login_linkInspect
Mint a one-time human login URL and session id so you can prove an end user. Call webhook_allowlist_add first when using webhook, redirect, form_post or post_message. Requires a company API key (aa_...) or an MCP OAuth access token and an active plan. A missing subscription returns an error result with code subscription_required (meter status 402). Exhausted quota returns code quota_exceeded (meter status 429). Too many creates can return code rate_limited. Returns ok, sessionId, loginUrl, expiresAt, methods, alwaysOn, and forceReauth. poll and sse are always included. Optional methods are webhook, redirect, post_message, and form_post. SMS is not offered. The default reuses the company cookie (Continue-as). Set force_reauth true, or reuse_session false, for a fresh login. When ttl_seconds is omitted, the link lasts 900 seconds. Poll with get_login_status using sessionId. If a webhook notify fails, use retry_login_webhook.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | Optional opaque string echoed back on status and notify payloads so you can correlate the session. | |
| methods | No | Optional notify channels to add. poll and sse stay available even when this is omitted. If this is omitted, a provided webhook_url, redirect_uri, post_message_origin, or form_post_uri turns that channel on. There is no SMS method. | |
| ttl_seconds | No | Optional lifetime of the login link, in seconds. When omitted, the server uses 900 seconds. There is no maximum clamp. | |
| webhook_url | No | URL that receives the signed webhook after login. It must match a prefix from webhook_allowlist_add. Use https (http only for localhost when the environment is local). Required when webhook is enabled. | |
| force_reauth | No | When true, require a fresh login. When false or omitted, the company cookie can be reused (Continue-as), unless reuse_session is false. | |
| redirect_uri | No | Browser redirect after login, such as an https URL or a cursor:// deep link. It must match an allowlisted prefix. Required when redirect is enabled. | |
| form_post_uri | No | http(s) URL that receives an unsigned browser form POST with session_id, status, user_id, email, and state. It must match an allowlisted prefix. Required when form_post is enabled. Production requires https except localhost. Custom schemes are rejected. | |
| reuse_session | No | When false, require a fresh login (same effect as force_reauth true). When true or omitted, it does not override force_reauth true. The tool result reports forceReauth, not this field. | |
| post_message_origin | No | http(s) origin (scheme://host[:port]) that should receive the agent_auth.login_completed postMessage. Required when post_message is enabled. Its origin must match an allowlisted prefix (the path is ignored). Production requires https except localhost. |
get_login_statusARead-onlyIdempotentInspect
Poll one login-link session until the human finishes, and read any notify errors. Use this after create_login_link, passing that call's sessionId as session_id. Requires a company API key (aa_...) or an MCP OAuth access token. Returns id, status, state, user_id, email, claims, expires_at, completed_at, force_reauth, reuse_session, methods, notify_result, errors, poll, sse, and events_url. status is pending, completed, consumed, or expired. There is no done status. user_id (cu_...) and email are present when the person has finished and null while pending. A missing session returns null. It does not send a new notification. If webhook delivery failed, call retry_login_webhook.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | sessionId returned by create_login_link. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations it discloses auth requirements (aa_ key or MCP OAuth token), the full status vocabulary and the fact there is no 'done' status, null return for a missing session, and that user_id/email are null until completion. This is substantive behavioral context the annotations cannot convey.
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?
Purpose and sequencing are front-loaded, and the enumeration of return fields is justified by the absence of an output schema. It is dense and runs long, but nearly every clause carries information the agent needs; only the field list slightly overlaps schema-level concerns.
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 no output schema, the description carries the full burden of describing return values and does so: it lists the returned fields, enumerates status values, explains null semantics and the missing-session case, and names the follow-up tool for webhook failures. Nothing needed to call it correctly is missing.
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 100% and there is one parameter, so the schema already documents session_id. The description restates its provenance ('passing that call's sessionId') but adds no syntax or format detail beyond the schema, so the baseline applies.
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 ('Poll one login-link session until the human finishes') and immediately scopes it against siblings by tying it to create_login_link and retry_login_webhook. An agent can distinguish it from the other login tools without opening a schema.
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?
Explicit sequencing ('Use this after create_login_link, passing that call's sessionId'), plus an exclusion routing to retry_login_webhook when webhook delivery failed and a clarification that it does not send a new notification. When-to-use and when-to-use-something-else are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
integration_listARead-onlyIdempotentInspect
List this company's stored integrations. Use this to see which providers are configured before calling integration_upsert. Requires a company API key (aa_...) or an MCP OAuth access token. Returns a JSON array of id, provider, label, secret_prefix, meta, created_at, and rotated_at. Full secrets are never included. The call does not modify stored secrets.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, non-destructive), but the description adds material context beyond them: the auth requirement (company API key aa_... or MCP OAuth token) and the secret-handling guarantee that full secrets are never returned. That is genuine value not present in structured fields.
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?
Four short sentences, front-loaded with the core action before the usage hint and return details. Slightly redundant in restating the non-mutation guarantee already implied by readOnlyHint, but nothing is wasted.
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 no output schema, the description usefully enumerates the returned fields (id, provider, label, secret_prefix, meta, created_at, rotated_at) and the security caveat. Combined with the stated auth requirement, an agent has everything needed to call and interpret the result.
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 the schema has nothing to document and there is no parameter semantics to add. The description correctly stays silent on parameters rather than padding.
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 ('List this company's stored integrations') and immediately distinguishes itself from the sibling write operation integration_upsert. An agent can tell what this does without opening the schema.
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?
Explicitly frames the use case ('see which providers are configured before calling integration_upsert'), routing the agent between this read tool and the sibling upsert tool. No ambiguity about when to reach for it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
integration_upsertADestructiveInspect
Store or replace an encrypted integration secret for a provider such as Google or Apple. Use this before login-link social sign-in needs that provider's credentials. Requires a company API key (aa_...) or an MCP OAuth access token and an active plan. Returns id and prefix (first four and last four characters of the secret). The full secret is not returned. The value is encrypted at rest. A later upsert with the same provider and the same label replaces that stored secret. A different label inserts another row. Each successful call consumes integration quota, including a repeat with the same secret. A missing subscription returns an error result with status 402 (subscription_required). Exhausted quota returns status 429 (quota_exceeded). Use integration_list to see which providers are already stored.
| Name | Required | Description | Default |
|---|---|---|---|
| label | No | Optional label. When omitted, the stored label is an empty string. The same provider and label replaces the existing secret. A different label stores another secret. | |
| secret | Yes | Provider secret to encrypt and store. Later reads return only a prefix, not this value. | |
| provider | Yes | Integration provider id, such as Google or Apple. Together with label, this selects the row to insert or replace. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already covering safety (readOnlyHint=false, destructiveHint=true), the description adds substantial non-obvious behavior: encryption at rest, only id and prefix returned, replace-vs-insert semantics keyed on provider+label, per-call quota consumption even on repeats, and specific 402/429 error statuses. Nothing here contradicts the annotations.
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?
Sentences are short and the primary purpose, precondition, and failure modes are front-loaded. The label replace/insert rule is repeated from the schema, adding mild redundancy, but overall the text is dense and earns most of its length.
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 no output schema, the description carries the return-value burden and does so well (id and prefix, not the full secret). Combined with quota, error codes, and the sibling pointer, an agent has everything needed to call this mutation correctly.
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 provider, label, and secret are already fully documented in the schema, including the label replace/insert rule. The description restates the same label semantics and adds no syntax or format detail beyond the structured fields, so the baseline of 3 applies.
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 first sentence states a specific verb set (store or replace), the resource (encrypted integration secret), and the scope (per provider such as Google or Apple). This is clearly distinguishable from siblings like integration_list and create_login_link.
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 an explicit precondition ('Use this before login-link social sign-in needs that provider's credentials') and routes the agent to the sibling integration_list to discover which providers already exist. Quota and subscription error paths are also flagged, so the agent knows when the call will fail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
keys_createAInspect
Mint an additional company API key. The full secret is returned once (only a hash is stored) and cannot be fetched again. An active plan is not required. Requires a company API key (aa_...) or an MCP OAuth access token. Returns id, secret, and prefix. Creating a key can be rate limited. Optional name is only a label. When name is omitted, the stored label is mcp.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional label stored with the new key. When omitted, the label is mcp. The server generates the secret and returns it once. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses critical behaviors beyond annotations: secret returned once only, only a hash stored, cannot be fetched again, rate limiting possible, and required auth. Annotations cover mutation/idempotency but not these operational details.
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?
Front-loaded with the core action, then details. Slightly dense but each sentence earns its place; no wasted words.
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 tool with no output schema, the description covers return values (id, secret, prefix), security constraints, auth requirements, and rate limits. Everything an agent needs to call it safely is present.
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 parameters are already documented. The description adds meaningful context about the 'name' parameter (label only, default 'mcp'), which reinforces and slightly clarifies the schema.
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 ('Mint an additional company API key') that clearly distinguishes it from siblings like oauth_client_create or create_login_link. The action is unambiguous and scoped.
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?
Provides useful context (no active plan required, auth methods accepted), but does not explicitly compare against alternatives or state when-not-to-use this tool versus siblings. Usage is implied but not fully directed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oauth_client_createAInspect
Register an OIDC relying-party client that uses CorroborateMe as the identity provider, with RP-initiated logout enabled. Use this for your app's own OIDC login. MCP hosts connect through protected-resource metadata and dynamic client registration, not this tool. Requires a company API key (aa_...) or an MCP OAuth access token and an active plan. Returns clientId and, for a confidential client, clientSecret once (the secret prefix is aas_, not aa_). A missing subscription fails the tool with message subscription_required. Exhausted quota fails with message quota_exceeded. Too many registrations returns an error result with code rate_limited. Set public_client for a public PKCE client. If post_logout_redirect_uris is omitted, each redirect origin's / and /login are allowlisted.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Display name of the relying-party client. | |
| public_client | No | Set true for a public client that uses PKCE, such as a SPA. Omit or false for a confidential client, which receives clientSecret once. | |
| redirect_uris | Yes | Redirect URIs after sign-in. This field must be present. An empty array is stored. | |
| post_logout_redirect_uris | No | Optional allowlist of post_logout_redirect_uri values for end-session. When omitted, each redirect origin's / and /login are used. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the generic write/safety profile (readOnlyHint=false, idempotentHint=false), while the description adds real behavioral context: auth requirements, the one-time clientSecret return with its aas_ prefix, and the specific failure modes (subscription_required, quota_exceeded, rate_limited). The rate_limited disclosure also reinforces the non-idempotent annotation rather than contradicting it.
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 description is long but front-loaded with purpose and routing, then auth, then return/error behavior. Nearly every sentence carries information an agent needs; only the secret-prefix aside ('aas_, not aa_') borders on trivia, so it falls just short of maximal efficiency.
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?
There is no output schema, so the description correctly compensates by naming the return values (clientId, clientSecret once) and the error codes an agent may encounter. Combined with the auth and default-behavior notes, an agent has everything needed to call and interpret this tool.
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 a baseline of 3 applies, but the description goes further by explaining the consequence of omitting post_logout_redirect_uris (each redirect origin's / and /login are allowlisted) and clarifying the PKCE meaning of public_client. That is genuine added meaning beyond the schema text, though it does not cover every parameter.
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 ('Register an OIDC relying-party client that uses CorroborateMe as the identity provider') and immediately scopes it against the sibling behavior of MCP hosts using dynamic client registration. An agent can distinguish this from keys_create, integration_upsert, and the other siblings without opening a schema.
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 explicit when-to-use ('Use this for your app's own OIDC login') and when-not ('MCP hosts connect through protected-resource metadata and dynamic client registration, not this tool'), plus prerequisites (company API key aa_... or MCP OAuth access token, active plan). Nothing about routing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
oauth_client_revokeDestructiveIdempotentInspect
Soft-revoke an OIDC relying-party client for the authenticated company. Use this when an app should no longer authorize or refresh tokens. Sets revoked_at, disables the Better Auth oauthClient, and stamps outstanding access/refresh tokens revoked. Requires a company API key (aa_...) or an MCP OAuth access token. Returns ok true when the client was revoked. Missing or already-revoked clients return an error result with code not_found. This does not delete the row; list via REST GET /api/oidc/clients still shows revoked clients. REST equivalent: POST /api/oidc/clients/{clientId}/revoke.
| Name | Required | Description | Default |
|---|---|---|---|
| client_id | Yes | OIDC client_id to revoke (the public identifier returned by oauth_client_create, not the internal row id). |
retry_login_webhookAInspect
Send the signed login webhook again for a session that already used the webhook method. A prior delivery failure is not required. The session must be completed or consumed. Delivery already tries up to 3 times (immediately, then after 500ms, then after 2000ms) on HTTP 408, 429, 5xx, and network errors, and it does not retry other 4xx responses. Call this for a further attempt. Requires a company API key (aa_...) or an MCP OAuth access token. Pass the sessionId from create_login_link as session_id. It POSTs the signed JSON again to the session webhook URL. The hex SHA-256 HMAC of the raw body is in X-Agent-Auth-Signature, and X-Agent-Auth-Attempt is also set. The payload type is agent_auth.login_completed and includes session_id, company_id, state, user_id, email, claims, and retry true. Returns ok, delivery, and errors, or ok false with code not_found, not_completed, no_webhook, or webhook_not_enabled. It does not mint a new login link. Redirect, post_message, and form_post do not use this tool.
| Name | Required | Description | Default |
|---|---|---|---|
| session_id | Yes | sessionId from create_login_link whose webhook should be sent again. The session must be completed or consumed and must include a webhook URL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (non-read-only, non-idempotent, non-destructive), and the description adds substantial behavior beyond that: the exact retry schedule, which HTTP statuses trigger retries and which do not, the auth requirement, the HMAC header and attempt header, the payload type and fields, and the failure codes. This is unusually rich disclosure for a mutation tool.
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?
Front-loaded with the operation and the key precondition, and every sentence carries operational information. It is on the long side and repeats the POST/signed-JSON idea and the error-code list slightly, but no sentence is filler.
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 no output schema, the description carries the return contract itself: success shape (ok, delivery, errors) and failure codes (not_found, not_completed, no_webhook, webhook_not_enabled), plus the explicit note that it does not mint a new login link. Nothing needed to call it correctly is missing.
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% for the single parameter, so the baseline is high. The description still adds value by mapping the caller-side name ('Pass the sessionId from create_login_link as session_id') and restating the completion/webhook-URL precondition that governs valid input.
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 ('Send the signed login webhook again') and immediately scopes it to sessions that already used the webhook method, which cleanly separates it from create_login_link and get_login_status. An agent can identify the tool's job without opening the schema.
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 explicit preconditions ('session must be completed or consumed', must include a webhook URL) and explicitly rules out the 'prior delivery failure required' assumption. It also names the exclusions ('Redirect, post_message, and form_post do not use this tool') and points at create_login_link as the source of the session, so when/when-not is fully covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
webhook_allowlist_addIdempotentInspect
Allow a callback URL prefix for later login-link notify. Call this before create_login_link when methods include webhook, redirect, form_post or post_message. Requires a company API key (aa_...) or an MCP OAuth access token. Pass url_prefix, at least 4 characters, for example https://hooks.example.com/ or cursor://. Returns ok true. Adding the same prefix again has no further effect. A shorter prefix returns ok false with code invalid_prefix. Callbacks outside an allowlisted prefix make create_login_link return an error with code not_allowlisted, or allowlist_empty when no prefix is stored. This call does not send a webhook.
| Name | Required | Description | Default |
|---|---|---|---|
| url_prefix | Yes | URL prefix to allow, at least 4 characters. Use an https prefix for webhooks, redirects, and form posts, or a custom scheme such as cursor:// for deep links. |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
create_login_link1 field changed- changed
Input schema / properties / post_message_origin / descriptionPrevious value: -"http(s) origin that should receive the agent_auth.login_completed postMessage. Required when post_message is enabled. It is not allowlisted. Production requires https except localhost."New value: +"http(s) origin (scheme://host[:port]) that should receive the agent_auth.login_completed postMessage. Required when post_message is enabled. Its origin must match an allowlisted prefix (the path is ignored). Production requires https except localhost."
1 tool update
- Changed
billing_checkout1 field changed- added
Input schema / properties / intervalAdded value: +{ + "description": "month for $5.99 a month (default), year for $55 a year.", + "enum": [ + "month", + "year" + ], + "type": "string" +}
1 tool update
- Added
oauth_client_revoke
13 tool updates
- First observed
agent_bootstrap - First observed
billing_checkout - First observed
billing_machine_pay - First observed
billing_portal - First observed
budget_get - First observed
create_login_link - First observed
get_login_status - First observed
integration_list - First observed
integration_upsert - First observed
keys_create - First observed
oauth_client_create - First observed
retry_login_webhook - First observed
webhook_allowlist_add
Publisher details
- Operator
- CNR Consulting · Publisher source
- Operator website
- https://corroborateme.com/ · Publisher source
- Vendor relationship
- Unknown
- Documentation
- https://corroborateme.com/docs · Publisher source
- Trust center
- Unknown
- Restrictions
- Paid Plans
Related MCP Connectors
An authenticated remote MCP server for user-owned devices and one-shot capability invocation.
MCP server for mandates, delegation, policy-gated execution, credential grants, and audit.
Self-hosted federated MCP gateway: one OAuth 2.1 MCP server in front of N apps, user-level scopes.
Hash passwords with bcrypt and issue/verify JWT session tokens over A2A + MCP.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceProvides OAuth-based MCP integration and client-side tooling for connecting agents to a remote service, with CLI and plugin support.MIT
- AlicenseAqualityBmaintenanceEnables MCP clients to interact with Zammad tickets, articles, search and replies under each caller's own permissions, using either a static token or SSO/OIDC per-user mode.1MIT
- AlicenseNot gradedqualityDmaintenanceMCP Server for AI agent identity and authorization. Create, verify, and manage agent identities with trust scores and scoped authorization tokens.MIT
- AlicenseNot gradedqualityBmaintenanceEnables agent clients to safely connect to tools and execution resources through MCP with authorization, approvals, audit, chat-context isolation, SSH/Docker access, and long-running command session tracking.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.