CorroborateMe
Server Details
Prove end users to agents and apps: login-links, OIDC clients, and API keys over remote MCP
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- CNR-Consulting/corroborate-me
- GitHub Stars
- 1
- Server Listing
- CorroborateMe
TDQS
Scored across 14 tools
Most tools target clearly distinct resources and actions, such as list_tables, inspect_table, get_document, create_document, and update_env_vars. The main ambiguity is the run_* cluster (run_function, run_query, run_mutation, run_action) plus the multi-document read tools list_documents and query_documents, which could be confused without relying on descriptions.
The set mostly follows a predictable snake_case verb_noun pattern: list_tables, get_document, create_deployment, update_env_vars, delete_document. The main minor deviation is status, which is a standalone noun rather than a verb_noun tool name.
With 24 tools, the surface is heavy for a single MCP server and sits at the upper end of the borderline range. The scope is broad enough to justify many tools, but the run_* and document-query variants make the count feel somewhat padded.
The tool set covers the core backend workflows: document CRUD, document querying/counting/aggregation, function listing/getting/running/deploying, deployment lifecycle, environment variables, logs, and status. Some administrative gaps remain, such as explicit deployment inspection/update or environment-variable deletion, but most can be worked around through existing tools.
Available Tools
14 toolsagent_bootstrapAInspect
Start zero-human company onboarding from a contact email. Does not charge or create a company. Step 1: call with contact_email. The result has verificationRequired=true and a 6-digit code is emailed (10 minutes; up to a few guesses, single use on success). Step 2: call again with contact_email and code. Returns bootstrapToken, expiresIn (~15 minutes), and next billing paths. When you have no aa_ key yet, use REST POST /api/agents/bootstrap instead: MCP requires Authorization Bearer aa_... or an MCP OAuth access token before any tool runs. After bootstrap, POST /api/billing/machine-pay (or billing_machine_pay / billing_checkout) with the bootstrap token; the company and aa_ secret are minted on settle. Optional company_name is stored on the bootstrap JWT for the company display name.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | 6-digit code from the verification email. Omit on the first call; required on the second. | |
| company_name | No | Optional display name stored on the bootstrap JWT for the company created at pay time. | |
| contact_email | Yes | Contact email. Required. Disposable domains are rejected. A verification code is sent on the first call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses the no-charge/no-company-creation semantics, the OTP expiry (10 minutes), guess limits and single-use behavior, token expiry (~15 minutes), and the MCP auth prerequisite (Bearer aa_... or OAuth token). Annotations only give safe-mutation hints; the description carries the real behavioral load.
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 purpose and the non-charge caveat, then walks the numbered steps in order. It is dense and long, but nearly every clause carries operational information; the REST-vs-MCP aside is the only part that could be tightened.
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 multi-step, no-output-schema onboarding tool with an auth prerequisite, the description covers inputs, returns (bootstrapToken, expiresIn), expiry windows, and the downstream call path. Nothing an agent needs 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 coverage is 100% and the field descriptions already state the per-call rules (code omitted first call, required second; disposable domains rejected; company_name stored on the JWT). The description repeats this rather than adding new syntax or format detail, so baseline 3 is correct.
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 ('Start zero-human company onboarding from a contact email') and immediately bounds the scope ('Does not charge or create a company'). An agent can distinguish it from the billing_* siblings without opening any 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 lays out the two-step call sequence, names the condition that switches to the REST alternative ('When you have no aa_ key yet'), and routes to the follow-up tools (billing_machine_pay / billing_checkout) after bootstrap. No condition 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.
billing_checkoutAInspect
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: discloses that creating the session does not charge a card, that local billing bypass grants Pro immediately with a console URL instead of a Stripe URL, and that a stripe_not_configured error is returned when unconfigured. It also spells out auth requirements and explicitly denies minting a company or aa_ secret.
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?
Dense but front-loaded: the primary action leads, followed by auth, side effects, and bypass behavior. Every sentence carries distinct behavioral information, though the bypass/error details make it longer than strictly minimal.
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 covers the return value ('Returns url'), the failure mode, and the bypass alternative URL. An agent has everything needed to call and interpret the result 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% and the single 'interval' enum already documents month/year with prices. The description only restates 'optional interval month or year' without adding syntax or behavioral detail beyond the schema, so the baseline 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?
States a specific verb and resource ('Create a Stripe Checkout session') plus the actor and goal ('for the authenticated company so a human can subscribe to Pro'). It clearly distinguishes itself from billing_machine_pay and billing_portal by naming them.
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 routes the agent: 'For prepaid purchase instructions, use billing_machine_pay' and 'To manage an existing subscription, use billing_portal.' It also states what credentials are accepted versus rejected (no console session, no bootstrap token).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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_getARead-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 | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, but the description adds value beyond them: the auth requirement (company API key 'aa_...' or MCP OAuth access token), the fact that the bootstrap key is exempt from the active-plan requirement, and an explicit non-effect ('It does not change billing or charge a card'). It also enumerates the returned 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?
Six short sentences, each load-bearing: purpose first, then when-to-use, then prerequisites, then auth, then return fields, then the negative scope. No filler or repetition of the tool name.
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 input parameters and no output schema, the description compensates by listing the return payload (planId, planStatus, periodYm, included, used, remaining, hardCap) and by covering auth, prerequisites, and non-effects. An agent has everything needed to decide and invoke 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?
The tool takes zero parameters, so the baseline is 4; there is no parameter semantics for the description to enrich. The description correctly does not invent any inputs.
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 precise verb and resource ('Read remaining quotas and plan entitlement for the authenticated company'), and the 'authenticated company' scoping separates it from tenant-level siblings. The following routing sentences make it unmistakable against billing_checkout, billing_machine_pay, and billing_portal.
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 an explicit trigger ('Call this when you need to know whether an active plan is in effect before registering OIDC clients or creating login links') and names three alternatives with the condition that selects each ('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').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_login_linkAInspect
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare it is a non-idempotent write with no destructive/open-world behavior; the description goes far beyond by disclosing auth requirements (aa_ key or MCP OAuth token, active plan), specific failure codes with HTTP statuses (subscription_required 402, quota_exceeded 429, rate_limited), default cookie reuse semantics, the 900s default lifetime, and the returned 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?
Front-loads the core action and keeps each sentence load-bearing (auth, error codes, defaults, routing), but it is dense and repeats a few schema facts ('poll and sse are always included', the 900s default) that are already documented in the parameter descriptions.
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 9-parameter, zero-required, mutation-style tool with no output schema, the description enumerates every return field (ok, sessionId, loginUrl, expiresAt, methods, alwaysOn, forceReauth) and covers auth, quota, and default behaviors, leaving nothing an agent needs to call 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 coverage is 100%, so the baseline is 3, but the description adds synthesis the schema does not: the force_reauth/reuse_session interaction ('Set force_reauth true, or reuse_session false, for a fresh login') and the fact that forceReauth is what the result reports. It also confirms poll and sse are always present and SMS is unavailable.
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 concrete verb+resource ('Mint a one-time human login URL and session id') plus the intent ('so you can prove an end user'), which cleanly separates it from get_login_status and retry_login_webhook. An agent knows exactly what this tool produces 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 prerequisites and routing: call webhook_allowlist_add first for the four channel types, poll with get_login_status using sessionId, and use retry_login_webhook if a notify fails. It also names the alternative paths for a fresh login (force_reauth vs reuse_session false).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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_revokeADestructiveIdempotentInspect
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). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing the exact side effects (sets revoked_at, disables the Better Auth oauthClient, stamps outstanding access/refresh tokens), the auth requirement (company API key aa_... or MCP OAuth token), the success signal (ok true), and the failure mode (error result with code not_found for missing or already-revoked clients). It also states the non-destructive-to-the-row behavior, which usefully refines destructiveHint=true.
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 action and the when-to-use condition, then layered with side effects, auth, return values and the REST equivalent. It is longer than most single-parameter tools need, but nearly every sentence conveys actionable information rather than 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?
No output schema exists, yet the description covers the return contract (ok true, not_found error), the auth prerequisites, the mutation semantics, and the REST equivalent. An agent has everything needed to call this correctly 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?
With one parameter at 100% schema description coverage, the schema already carries the semantics, including the public-vs-internal id distinction. The description adds no format or syntax detail beyond the schema, so the baseline 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?
States a specific verb and resource ('Soft-revoke an OIDC relying-party client for the authenticated company') and immediately qualifies the scope as soft rather than hard delete. It is clearly distinguishable from the sibling oauth_client_create and the REST route it mirrors.
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 states the triggering condition: 'Use this when an app should no longer authorize or refresh tokens.' It also clarifies a boundary (does not delete the row; revoked clients still appear in REST list). It stops short of naming a sibling tool as the alternative, but no delete counterpart exists in the sibling set, so coverage is effectively complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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_addAIdempotentInspect
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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readOnly, idempotent, non-destructive, but the description adds substantial context beyond them: auth requirements (aa_ key or OAuth token), idempotent behavior explained in prose ('no further effect'), failure codes (invalid_prefix), minimum length semantics, and the explicit clarification that no webhook is sent.
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 purpose and the ordering constraint, then error and idempotency semantics. Every sentence carries distinct operational information (auth, prefix rules, return values, error codes) with 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?
For a single-parameter mutation with no output schema, the description covers auth, idempotency, success/failure shapes, error codes, and the interaction with create_login_link — everything an agent needs to call it correctly 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?
Schema description coverage is 100% and the schema already documents the 4-character minimum and the https/custom-scheme guidance. The description's parameter detail (minimum length, example prefixes) largely repeats the schema, so it adds little beyond the baseline.
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 (allow) and resource (callback URL prefix) with the intended downstream purpose (login-link notify). It explicitly ties itself to the sibling create_login_link, so an agent can distinguish it from that tool without opening either 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 an explicit ordering rule ('Call this before create_login_link') and the exact condition that triggers it ('when methods include webhook, redirect, form_post or post_message'). It also explains the consequence of not calling it (not_allowlisted / allowlist_empty errors).
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.
14 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
oauth_client_revoke - First observed
retry_login_webhook - First observed
webhook_allowlist_add
Related MCP Connectors
Prove end users to agents and apps: login-links, OIDC clients, and API keys over remote MCP
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.
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.27 PyPIMIT
- AlicenseNot gradedqualityCmaintenanceEnables MCP clients to connect once to self-hosted, user-owned upstream accounts and then discover and invoke granted tools through a single authenticated endpoint. Each client receives its own key with deny-by-default tool grants, while sensitive calls require durable human approval and credentials stay encrypted and never forwarded upstream.Apache 2.0
Glama MCP Gateway
Add one secure layer between your agents and this server.