Skip to main content
Glama

Server Details

Prepaid virtual cards for AI agents: one-time cards, spend caps, human approvals.

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 40 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A3.9/5.0

Scored across 55 tools

Disambiguation4/5

Most tools target distinct resources and actions (e.g., list_cards vs list_added_cards vs list_payment_methods), but there is slight overlap between get_balance and get_card_balance, and between list_added_cards and list_payment_methods. Descriptions are detailed and help clarify, though a few tools could be confused without careful reading.

Naming Consistency5/5

All tool names follow snake_case with a clear verb_noun pattern (e.g., add_funds, close_card, list_transactions, verify_phone). Minor exceptions like 'buy' and 'surprise_me' are still clear and consistent in style.

Tool Count2/5

With 55 tools, the surface is far beyond the recommended 3-15 range and even above the 25+ threshold. While the domain is broad (cards, funding, shopping, KYC, support), the sheer number makes it unwieldy for an agent to select the right tool quickly.

Completeness4/5

The core domain is well covered: card creation, listing, details, presets, funding, shopping, KYC, rewards, and support. Some gated tools (update_settings, cancel_plan) are referenced but not exposed, which is a minor gap, but the main workflows have no dead ends.

Available Tools

55 tools
add_fundsAInspect

Generate a secure checkout link the user opens to add cash to their own balance (the money that funds new cards) via Apple Pay or Google Pay, in USD. Calling this tool moves NO money and initiates NO transfer: it only prepares a single-use hosted payment page — the exact equivalent of the user clicking 'Add funds' in the dashboard. The user personally reviews, authorizes, and completes (or abandons) the payment in their own browser with their own payment method; you never see or handle payment credentials. If a one-time phone verification is needed first, this tool automatically sends the user a code and tells you where it went: ask the user for the code, call verify_phone with it, then call add_funds again.

ParametersJSON Schema
NameRequiredDescriptionDefault
amount_centsYesAmount to add in cents (e.g. 5000 = $50.00). Typical range: $20.00 to $10,000.00 (2000 to 1000000 cents); the exact range depends on the active funding provider and is returned by the API when the amount is invalid.
payment_methodNoPayment method for the checkout: apple_pay or google_pay. Ask the user which one their device has; apple_pay only when unknown.

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYesHuman-readable result or next step.
amountUsdNoAmount of the created checkout in USD.
checkoutUrlNoSingle-use payment link to hand the user verbatim (present when a checkout was created).

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations. It explicitly states that calling this tool moves no money, initiates no transfer, and only prepares a single-use hosted payment page. It also discloses that the user completes the payment in their own browser, that the agent never sees payment credentials, and that the tool may automatically send a verification code. This is rich behavioral context that the annotations (readOnlyHint=false, idempotentHint=false) do not provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, dense paragraph that front-loads the core purpose and then explains the verification flow. It is longer than strictly necessary, but every sentence adds meaningful information. The structure is logical: purpose, non-behavior, user experience, verification fallback. It earns a 4 rather than a 5 because it could be slightly more scannable with a break between the main behavior and the verification flow.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for an agent to invoke this tool correctly. It covers what the tool does, what it does not do, how the user interacts with the result, and the conditional verification flow. The output schema exists, so return values are already documented. The only minor gap is the exact range of the amount, but the description notes the API returns the range when invalid, which is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers both parameters with descriptions, including the enum values and the amount range. The description adds context by explaining the purpose of the amount (funds new cards) and the payment method selection guidance ('ask the user which one their device has; apple_pay only when unknown'). This adds value beyond the schema, though the schema already does most of the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: generating a secure checkout link for adding funds via Apple Pay or Google Pay in USD. It distinguishes itself from related tools by explicitly noting it moves no money and initiates no transfer, and it names the sibling tool verify_phone for the verification flow. The verb 'generate' plus the resource 'checkout link' is specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance: it is the equivalent of the user clicking 'Add funds' in the dashboard, and it should be used when the user wants to add cash to their balance. It also gives a clear conditional workflow: if phone verification is needed, call verify_phone with the code, then call add_funds again. This is strong usage guidance that routes the agent correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

allow_card_merchantAInspect

Remember a merchant on a card so the next matching charge is allowed even when the card's category or merchant rules would otherwise deny it. One tool call — does not replace the rest of the preset.

ParametersJSON Schema
NameRequiredDescriptionDefault
card_idNoCard id (from list_cards).
patternYesMerchant name pattern to remember, e.g. "STARBUCKS" or "ODD CAFE".

Output Schema

ParametersJSON Schema
NameRequiredDescription
scopeNo
presetNo
messageYes
patternNo
summaryNo
messagesNoCard scope: where the remember is enforced.
needsNewCardNoCard scope: true when the card keeps a network category allowlist the remember cannot widen.
policyVersionNo

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral disclosure burden. It explicitly discloses the override effect (allows a charge that would be denied), indicates persistence through 'remember,' and clarifies scope by stating it does not replace the preset. It omits details like how to undo the action or whether the allowance expires, but the core behavior is transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description consists of two concise sentences that front-load the core purpose and include a useful scope caveat. There is no fluff, and every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple 2-parameter tool with an output schema, the description is mostly adequate, but it does not address the notable fact that card_id is not required while the description says 'on a card.' It also leaves merchant matching semantics unspecified. Sibling buy_unlink_merchant suggests an undo path exists, which the description could have noted for completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for both parameters, so the baseline is 3. The description adds contextual meaning by linking the pattern to merchant matching, but it does not clarify the optionality of card_id or the exact matching semantics (case sensitivity, exact vs. substring). The description adds no significant information beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's specific action: remembering a merchant on a card so that the next matching charge is allowed even when card category or merchant rules would deny it. This distinguishes it from sibling tools like buy_unlink_merchant (which presumably removes such an exception) and set_card_preset (which manages broader preset rules).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use this tool (to allow a specific merchant charge that would otherwise be denied) and includes the scope note 'does not replace the rest of the preset.' However, it does not explicitly name alternative tools or state when not to use it, leaving the guidance mostly implied rather than actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

approve_requestAInspect

Resolve a pending approval request (approve or deny) once the USER has decided. Use this after get_card_details or create_card returns a 202 requiring approval, or for a row from list_pending_approvals. For card_details and transaction, approval automatically completes the follow-up action and returns the result. For cross_app actions (asks from another app: close/pause/resume a card, change a limit, view details), approval records the user's consent and the REQUESTING app completes the action from its side when it retries with the approval id.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesThe original action type from the approval prompt (list_pending_approvals rows carry it as action).
decisionYesWhether to approve or deny the request
approval_idYesThe approval request ID
resource_idYesCard ID (for card_details and cross_app actions) or approval ID (for transaction)

Output Schema

ParametersJSON Schema
NameRequiredDescription
cardNoThe card resource returned by the approved follow-up action, when applicable.
actionNoThe original action type from the approval prompt: 'card_details' or 'transaction'.
statusNoOutcome of the request: 'denied', 'card_details', 'card_created', 'resolved' (cross_app approvals: consent recorded, the requesting app completes the action), 'personal_surface_only' (company-connected session; the user resolves personally), or 'unknown_action'.
messageYesHuman-readable summary of the approval outcome and any follow-up action.
decisionNoThe decision that was applied: 'approved' or 'denied'.

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Describes the two different outcomes: for card_details/transaction, approval completes the action and returns result; for cross_app, it records consent and the requesting app retries. This goes beyond annotations (readOnlyHint=false, destructiveHint=false) and fully discloses the behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise yet comprehensive, using a few well-structured sentences. Front-loaded with purpose, followed by usage contexts, and ends with specific behavior details. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (multiple action types with different outcomes), the description covers all necessary aspects: when to use, how each action type behaves, and parameter hints. The existence of an output schema means return details are covered elsewhere, so the description is complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Adds meaning beyond the 100% schema coverage: explains that resource_id is card ID for most actions but approval ID for transaction, and that list_pending_approvals rows carry the action field. This enhances understanding of parameter usage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool resolves pending approval requests (approve or deny) and specifies the contexts (202 responses, list_pending_approvals). It distinguishes between card_details/transaction and cross_app actions, which differentiates it from sibling tools like close_card or pause_card.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use this tool: after get_card_details or create_card returns a 202, or for rows from list_pending_approvals. It also contrasts the behavior for card_details/transaction (auto-complete) vs cross_app (record consent), providing clear usage guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buyA
Destructive
Inspect

Shop and check out, in natural language, across the merchants the user has linked (DoorDash, etc.). Pass the whole ask as request — e.g. "order a caesar salad from Zuni on DoorDash" — and this tool runs the shopping flow for you. It is CONVERSATIONAL: this tool RETURNS a conversation_id; pass that SAME conversation_id back on every follow-up (your reply to a question, "add a coke", "yes, check out") so it continues the SAME order. Omit it (or set new_order=true) only to start a fresh order. It will ask for the delivery address and have you confirm the cart and total. CHECKOUT (which charges a one-time card) happens ONLY after the user explicitly confirms in a later message — relay the confirmation through request ("yes, place the order") on the SAME conversation_id. RELAY REPLIES VERBATIM: when the user answers a question from this tool ("yes", "the 16 oz one", "use my other card"), pass their reply through request as-is on the same conversation_id — do NOT rewrite it into a fresh full order command; a rewritten command reads as a NEW ask and the confirmation never lands. NEVER use new_order (or drop the conversation_id) to recover from an error or a refused checkout — that discards the cart and any pending confirmation. Stay on the same conversation_id and follow the error's instruction instead; new_order is ONLY for the user starting an unrelated order. If it hands out a merchant login link (hosted connect), just reply on the SAME conversation_id once the user finishes (e.g. "done — I logged in") and it verifies the link itself. Logins started here have no pending_id, so the buy_connect / buy_connect_status pair does not apply to them. Call get_instructions FIRST for the current usage guide before your first buy.

ParametersJSON Schema
NameRequiredDescriptionDefault
requestYesThe natural-language ask or follow-up, e.g. "order a caesar salad from Zuni on DoorDash", "deliver to 123 Main St", or "yes, place the order".
new_orderNoStart a fresh shopping conversation instead of continuing the current one. Use when beginning an unrelated order (ignores any conversation_id).
conversation_idNoThe conversation_id returned by a previous buy call. Pass it to continue the SAME order (keeps the cart + confirmation). Omit to start a new order.

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusNoDiscriminator for the outcome. 'assistant_turn' when the buy loop replied; 'conversation_start_failed' or 'request_failed' on errors.
messageYesThe assistant's conversational turn (it may ask for the delivery address, show the cart + total, confirm, or report a placed order), or an error explanation.
messagesNoThe same turn split into ordered messages for multi-bubble surfaces (each narration segment, then the final reply/confirmation). `message` is the same content consolidated; clients that show one bubble should use `message` and ignore this.
conversation_idNoThe conversation id to thread back as conversation_id on the next buy call to continue the SAME order. Present on a successful assistant turn.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses critical behavioral traits beyond annotations: the tool returns a conversation_id that must be reused, checkout 'charges a one-time card' only after explicit user confirmation, replies must be relayed verbatim, and using new_order/timeout 'discards the cart and any pending confirmation.' This is exactly the kind of context an agent needs to avoid dangerous mistakes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but every paragraph addresses a distinct critical aspect: conversational flow, checkout confirmation, error recovery, login links, and prerequisite guidance. It is front-loaded with purpose and uses capitalization/emphasis effectively. Dense but justified for a complex, potentially destructive tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's high complexity and the presence of an output schema, the description fully covers the flow, prerequisites, alternative tools, safety rules, and error handling. An agent has everything needed to select and invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds significant semantics: request can be a follow-up or full ask with concrete examples, conversation_id must be 'the SAME conversation_id' for continuity, and new_order 'ignores any conversation_id' and is only for unrelated orders. The prose meaningfully clarifies all three parameters beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool 'Shops and checks out, in natural language, across the merchants the user has linked' and 'runs the shopping flow for you.' This clearly distinguishes it from siblings like buy_connect or buy_list_merchants, which handle narrower aspects of the shopping lifecycle.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage guidance is explicit and actionable: 'Call get_instructions FIRST for the current usage guide before your first buy.' It also explains when buy_connect/buy_connect_status do not apply ('Logins started here have no pending_id') and details when new_order is appropriate versus when it must never be used for error recovery.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buy_connectAInspect

Connect a merchant for shopping. For merchants that need a real login (e.g. DoorDash) this opens a secure hosted browser session and returns a URL the user opens to log in; after they finish, call buy_connect_status with the pending_id to confirm. Merchants that need no login (e.g. Agentcard Flights) come back ready immediately. Use this instead of buy_link_merchant for hosted-login merchants. This tool pairs only with buy_connect_status and only tracks logins it started itself; a login link handed out by the conversational buy tool has no pending_id and is verified inside that same buy conversation (the user replies there, e.g. "done — I logged in").

ParametersJSON Schema
NameRequiredDescriptionDefault
merchantYesmerchant slug (e.g. doordash)

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusNoOutcome: 'pending' (hosted login started), 'ready'/'linked' (auto-link merchant — no login needed), or 'error'.
messageYesHuman-readable next step.
loginUrlNoURL the user must open to log in to the merchant. Absent for auto-link merchants.
merchantNoThe merchant slug, present when an auto-link merchant needs no login.
pendingIdNoSession id to pass to buy_connect_status. Absent for auto-link merchants.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Describes that it opens a hosted browser session for some merchants, returns a URL, and requires calling buy_connect_status for confirmation. Mentions that non-login merchants are ready immediately. Also notes that it only tracks logins it started itself. Adds significant context beyond annotations (readOnlyHint=false, destructiveHint=false). No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each adding value. Could be slightly more concise but still effectively communicates key points without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given one parameter, existing annotations, and presence of output schema (implied), the description covers purpose, usage flow, alternatives, pairing, and specific behavioral notes. Complete for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Single parameter 'merchant' has schema description 'merchant slug (e.g. doordash)'. Description adds behavioral context: behavior varies by merchant type. Since schema coverage is 100%, description adds meaning beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states it connects a merchant for shopping, distinguishes between merchants needing login and those that don't, and explicitly contrasts with buy_link_merchant. This provides a specific verb+resource with sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use this instead of buy_link_merchant for hosted-login merchants.' Explains pairing with buy_connect_status and contrasts with conversational `buy` tool. Clear when to use and when not.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buy_connect_statusA
Read-onlyIdempotent
Inspect

Check the status of a hosted merchant login started with buy_connect. Returns linking (still in progress — call again in a few seconds), linked (success — the merchant is ready to shop), expired, or error. Pass the merchant and the pending_id from buy_connect. ONLY for logins started by the buy_connect tool: a login link handed out by the conversational buy tool has no pending_id — for those, reply to the same buy conversation ("done — I logged in") instead of calling this.

ParametersJSON Schema
NameRequiredDescriptionDefault
merchantYesmerchant slug (e.g. doordash)
pending_idYesThe pending_id returned by buy_connect.

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusNoConnect state: 'linking', 'linked', 'expired', or 'error'.
messageYesHuman-readable status / next step.
merchantNoThe merchant slug, present when linked.
cart_carried_overNoTrue when a cart built anonymously before linking was moved onto the linked account — re-show it (buy_view_cart) and re-confirm the total before checkout.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate safe, idempotent read. Description adds polling behavior and return states, no contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with purpose, efficient and clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given output schema exists and tool is simple, description covers all necessary context for correct usage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description covers parameters fully (100%). Description restates that pending_id comes from buy_connect, providing marginal extra context beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool checks the status of a hosted merchant login started with buy_connect, lists return values, and distinguishes from sibling tool 'buy'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use (after buy_connect) and when not to use (for logins from 'buy' tool), and provides alternative action.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buy_list_merchantsA
Read-onlyIdempotent
Inspect

List merchants available for agent commerce (Rappi, Good Eggs, DoorDash) and whether this user has linked each one. Link a merchant before shopping it.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNoNumber of merchants returned.
statusNoOutcome: 'ok', 'empty', or 'error'.
messageYesHuman-readable merchant list (or an error / empty note).
merchantsNoAvailable commerce merchants and this user's link status for each.

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnlyHint, idempotentHint, and destructiveHint safety, so the description mainly adds contextual behavior: it reports merchant availability and per-user linkage status. This is useful but not rich behavioral disclosure beyond what annotations and the presence of an output schema already communicate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short, purposeful sentences. It front-loads the core action, gives concrete merchant examples, and ends with the key workflow instruction—no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters, a read-only annotation profile, and an output schema, the description provides everything an agent needs to select and call this tool correctly. It covers scope, available merchants, user linkage status, and the prerequisite for shopping.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description appropriately focuses on what the tool returns rather than parameter details, and the empty input schema leaves no ambiguity.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List'), identifies the resource ('merchants available for agent commerce'), and clarifies the unique value: showing whether the user has linked each merchant. This distinguishes it from sibling tools like buy and buy_unlink_merchant.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly situates when to use the tool: before shopping, to see available merchants and whether they are linked. It also gives a practical instruction ('Link a merchant before shopping it') without explicitly naming alternative tools or exclusions, so it stops just short of a full usage guide.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_kyc_documentA
Read-onlyIdempotent
Inspect

Check the conversational verification state — use after the user uploads their ID via the browser upload link (or any time you need to re-orient). Returns the current step and the fields still missing.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYes
nextStepNo
uploadUrlNo
missingFieldsNo
verificationUrlNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, indicating safe read operation. The description adds value by stating it returns the current step and missing fields, and confirms the tool is non-destructive. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences with no filler. The first sentence states the action and usage context, the second describes the return value. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (zero parameters, clear annotations, and an output schema that presumably defines the return format), the description sufficiently covers purpose, usage, and behavioral context without missing critical details.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With zero parameters and 100% schema coverage, the tool's schema already conveys all parameter info. The description does not need to add parameter details, meeting the baseline for no-param tools.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool checks conversational verification state, specifies when to use it (after ID upload or for re-orientation), and distinguishes from siblings like 'get_kyc_status' and 'submit_kyc_document' by focusing on the verification state and missing fields.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly advises use after ID upload and for re-orientation, providing clear context. It does not mention exclusions or alternatives, but the guidance is sufficient for a simple read-only check tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

close_cardA
Destructive
Inspect

Permanently close a virtual card. This is irreversible — the card cannot be reopened. Safe to call on an already-closed card (idempotent). The user's rewards card (the card their tokenback redeems onto) is close-protected: closing it returns its balance to the wallet but retires the card number the user may have on file at AI labs, so it requires confirm_rewards_card — set it ONLY after the user explicitly confirms they want the rewards card closed.

ParametersJSON Schema
NameRequiredDescriptionDefault
card_idYesThe card ID to close
approval_idNoApproval id from a prior approval_required response, once the user has approved. Only for cards created through ANOTHER app: first call without it (the user is emailed an approve link), then retry with it.
confirm_rewards_cardNoRequired to close the rewards card. Only set after the user explicitly confirms; never set it preemptively.

Output Schema

ParametersJSON Schema
NameRequiredDescription
cardIdNoThe ID of the card that was closed.
statusNoOutcome discriminator; always "closed" on success.
messageYesHuman-readable confirmation that the card was closed.
approvalIdNoPresent when status is approval_required: pass it back as approval_id after the user approves.

TDQS

A3.9/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description richly discloses irreversibility, idempotency, and rewards-card protection. However, it directly contradicts the annotation 'idempotentHint: false' by stating 'Safe to call on an already-closed card (idempotent)'. Per rule, any contradiction with annotations warrants a score of 1.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded. The core purpose is stated first, followed by essential caveats, and every sentence delivers distinct, actionable information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists, the description comprehensively covers the completion flow: irreversibility, idempotent call behavior, rewards-card additional confirmation, and the approval workflow. All three parameters are addressed in sufficient operational detail.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already covers all parameters (100% coverage), providing the baseline of 3. The description adds significant value by explaining the two-phase approval_id workflow and the strict condition for setting confirm_rewards_card, both of which are not inferable from the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Starts with a specific verb and resource, 'Permanently close a virtual card', and makes the irreversible nature explicit. This clearly differentiates the tool from siblings like pause_card and resume_card, and the rewards-card caveat adds additional specificity without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly conveys this is the permanent closure tool, and gives detailed usage context for approval_id and confirm_rewards_card. However, it does not explicitly name alternative siblings (e.g., pause_card) for non-permanent actions, leaving that connection to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_cardAInspect

The one card tool: get the user a virtual debit card for a purchase. Cards are live and charged for real when used. For a FIRST-TIME user it starts by putting the user's OWN card in their Agentcard vault (any Visa, Mastercard, Amex, or Discover from any country, no identity verification (KYC), no balance funding): the call returns a secure link (vault_started); send it to the user (they type the card once and lock it with their passkey or master password; Agentcard never sees the number). A vaulted card pays through the buy tool, where the user approves each purchase on their device with their passkey or master password; it never becomes a card number you type, so after vault_started (or vault_ready, when a card is already in the vault) use buy for purchases instead of calling create_card again. If the user specifically needs a card NUMBER, that is an Agentcard funded from their cash balance, which requires KYC the first time: only after the user agrees, call create_card with source "issued". Established users: the saved default decides (get_settings default_payment: their chosen added card, or the wallet balance); with no saved default, an active ADDED card wins, otherwise the cash balance. Per-call overrides: connected_card_id issues against a specific added card, source "issued" forces the cash balance, restart_setup mints a fresh vault link. If the balance is short on the issued path, top up with add_funds. Connections through a company OAuth client have NO card count or amount limits; only first-party personal accounts have per-plan caps. Call get_plan for the limits in effect.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeNoCard behavior. 'single_use' (default) closes after its first approved charge — right for one-off purchases. 'multi_use' stays open across charges until its total limit is spent — right for subscriptions and recurring merchants. Multi-use cards can be paused (pause_card), resumed (resume_card), and resized (update_card_limit).
presetNoPreset for this card: a template name (ai_labs, weekday_meals, cli_only, daily), comma-separated templates, a saved preset name/id, inline JSON privileges, or { name?, privileges }. Adds restrictions only — omit for a normal unrestricted card.
sourceNoForce the card to be funded from the user's cash balance (the issued path: KYC + wallet funding) even when they have an added or vaulted card or would otherwise be offered the vault. Use it only after the user explicitly picks the balance option. Omit for the default (an active added card wins; first-time users get the vault link).
expires_atNoOptional hard expiry for a multi-use card (ISO-8601 with timezone, e.g. "2027-01-01T00:00:00Z"). Must be in the future, at most 365 days out. The card closes automatically when it passes.
amount_centsYesCard funding amount in CENTS, not dollars (minimum 100). 100 = $1.00 and 2500 = $25.00 — a value like 25 would be $0.25. Company-governed connections have no maximum; personal accounts are capped by their plan — call get_plan for the limits in effect.
funds_sourceNoWhere the card funds come from. OMIT unless instructed: the server applies the right default (company-connected accounts use the company wallet automatically when the company enables it). company_flow = the company's wallet funds the card; onramp_flow = the user's own wallet.
purchase_keyNoThe purchaseKey from the same approval_pending answer as pending_card_id; the pair proves the retry is for that purchase.
scope_presetNoSilent alias for preset 'ai_labs': a multi-use card restricted to AI-lab merchants (OpenAI, Anthropic, Gemini); charges anywhere else are declined at authorization. AI cards earn boosted tokenback on eligible spend. Implies type 'multi_use'. Prefer `preset`.
restart_setupNoSet true ONLY when the user lost or never received a vault link, it expired (about 15 minutes), or they want to add ANOTHER card. Never needed on the first call or for normal retries. amount_cents is still required on this call (the link itself carries no amount).
pending_card_idNoOnly when retrying an approval_pending purchase whose preset has since changed: the cardId from that earlier answer, together with purchase_key. The older approval link is retired once the replacement is minted. Never pass it for a different purchase.
connected_card_idNoMulti-card: issue against a SPECIFIC added card (an id from the user's added cards, see list_added_cards) instead of the newest active one. Omit for the default.

Output Schema

ParametersJSON Schema
NameRequiredDescription
last4NoLast four digits of the new card. Present only when status is "created".
cardIdNoThe new card ID. Present only when status is "created".
expiryNoCard expiry (MM/YY). Present only when status is "created".
presetNoPreset summary for the new card, or null when unrestricted. Present when status is "created".
reasonNoOn "issuing_suggested" (legacy servers only; current servers route every first-time user to the vault instead): why the card could not be added. On "kyc_required": why the previous identity-verification attempt failed (e.g. "document_unverified_other"), present only when a prior attempt was rejected.
sourceNo"connected" when the card was created against the user's added card. Absent for wallet-funded cards.
statusNoOutcome discriminator: "created" (card issued), "vault_started" (first-time setup: send vaultUrl to the user; once their card is in the vault, purchases go through buy, not create_card), "vault_ready" (the user's own card is already in their vault: use buy; only source "issued" produces a card number), "attach_started" / "attach_pending" (an older add-card enrollment still in flight: send attachUrl or wait, then call again with the same arguments), "issuing_suggested" (legacy servers only: offer the balance-funded fallback, noting it requires KYC, and only then call again with source "issued"), "approval_required" (human approval needed), "approval_pending" (added-card passkey approval: send approvalUrl to the user, then retry with the same arguments in ~10s), "kyc_required" (issued path only), "user_info_required" (check missingFields: phone/terms go through submit_user_info; consent must be recorded by the connecting platform), "beta_capacity_reached", "issuing_balance_insufficient" (issued path only), "payment_method_declined", "limit_reached", "funding_in_progress" (company wallet funding underway: retry with the same arguments in ~10s), "funding_not_approved", "org_wallet_funding_required", "org_wallet_unavailable" (the company wallet backing this account is not active: the company must finish setup; do not retry immediately), "rate_limited" (wait ~1 minute, then retry), "issuer_daily_limit" (the issuing rail's daily card budget is spent: retry in about an hour, never in a loop), "issuer_capacity" / "wallet_balance_unavailable" (the rail is briefly unavailable: retry shortly). A refusal this build does not model relays the backend's own code here with its message.
messageYesHuman-readable result or guidance for the next step.
vaultUrlNoThe secure link the user opens to put their card in their vault. Present only when status is "vault_started".
attachUrlNoThe secure link the user opens to finish an older add-card enrollment. Present only when status is "attach_started".
expiresAtNoWhen the link expires (ISO 8601). Present when status is "vault_started" or "attach_started".
approvalIdNoThe approval request ID to pass to approve_request. Present only when status is "approval_required".
cardStatusNoCard status, e.g. "active". Present only when status is "created".
vaultCardsNoHow many cards the user already holds in their vault. Present only when status is "vault_ready".
approvalUrlNoThe passkey approval link to send to the user. Present only when status is "approval_pending".
purchaseKeyNoThe purchase's key. Present only when status is "approval_pending"; pass it back as purchase_key with pending_card_id.
balanceCentsNoCard balance in cents. Present only when status is "created".
missingFieldsNoWhat is missing when status is "user_info_required" (e.g. "termsAccepted", "consent").
pendingCardIdNoThe parked card awaiting the passkey. Present only when status is "approval_pending"; pass it back as pending_card_id on the retry, with purchaseKey as purchase_key.
balanceDollarsNoCard balance formatted as USD dollars, e.g. "12.50". Present only when status is "created".
maxAmountCentsNoThe issuing rail's per-card ceiling in cents. Present when status is "limit_reached" because the amount exceeded that ceiling; retry with amount_cents at most this value.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses that cards are live and charged for real, that vaulted cards never become a typed card number, that KYC is required only for issued cards, that users approve purchases with passkey/master password, and that OAuth-connected accounts have no card/amount limits. No statement 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but front-loaded with the core purpose, and every sentence carries decision-relevant information. It is long because the tool has multiple complex paths, but there is no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter tool with two major funding paths, the description covers vault setup, issued cards, defaults, per-call overrides, KYC, balance shortfalls, plan limits, and sibling-tool routing. With an output schema present, return values do not need to be restated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 cross-parameter and workflow meaning: per-call overrides (connected_card_id, source 'issued', restart_setup), the requirement that amount_cents is still needed on restart_setup, and how source interacts with defaults. These integrations go beyond the individual schema entries.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a crisp statement of the tool's core job: 'get the user a virtual debit card for a purchase,' and then distinguishes the vault path, issued path, and the buy tool. It names the one-card role explicitly and separates it from siblings like buy and add_funds.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance: first-time users get the vault link; after vault_started or vault_ready, use buy instead; use source 'issued' only after the user agrees; restart_setup only for lost/expired links; top up with add_funds; call get_plan for limits. Alternatives and exclusions are spelled out.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_presetAInspect

Delete a preset you saved (from save_preset). Refuses built-in template names — there's nothing to delete there. Cards already issued keep whatever rules they have; this only retires the name for future use. Refused while a card still inherits the name as a standing default.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe saved preset name to delete.

Output Schema

ParametersJSON Schema
NameRequiredDescription
deletedNo
messageYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden, and it delivers: it states that built-in templates are refused, that existing cards keep their rules, that only the name is retired for future use, and that deletion is blocked while the name is a standing default. The only minor omission is explicit irreversibility or permission requirements, but 'delete' plus the stated constraints already disclose the essential side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences deliver the main action, the built-in-name refusal, and two important behavioral caveats without wasted words. The primary action is front-loaded, and each subsequent sentence earns its place by preventing a likely misuse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter delete operation with an output schema available, the description covers the required input, refusal conditions, and side-effect scope. An agent has everything needed to decide whether to call this tool and what to expect regarding existing cards and standing defaults.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 enriches the 'name' parameter beyond the schema's 'The saved preset name to delete.' It clarifies that valid names come from save_preset, that built-in names are invalid inputs, and that names still used as standing defaults will be refused. This gives an agent practical validation criteria the schema alone does not provide.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Delete a preset you saved (from save_preset)', which clearly identifies this as the inverse operation to save_preset and distinct from list_presets or set_card_preset. It further distinguishes saved presets from built-in template names, so an agent can select this tool unambiguously.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear conditions for use and refusal: it only applies to presets you saved, refuses built-in template names, and is refused while a card still inherits the name as a standing default. It does not explicitly name sibling alternatives or say 'use list_presets to find valid names', but the exclusion conditions effectively guide when this tool should and should not be called.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_balanceA
Idempotent
Inspect

The user's cash balance: the money that funds new cards. Provisions the balance account on first use. Users add cash with Apple Pay or Google Pay in USD; funds are held as USDC. (Their wallet, meaning the cards themselves, is list_cards.)

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusNoBalance account status.
messageYesHuman-readable balance summary.
balanceUsdNoSpendable cash balance in USD (string decimal).
confirmingUsdNoDeposit clearing on-chain, not yet spendable (present only mid-deposit).

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that the tool provisions the balance account on first use, a behavioral trait beyond annotations. Explains fund flow (Apple Pay/Google Pay to USDC). Annotations are consistent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with primary purpose, efficient and waste-free.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete description for a simple read tool with no params and an output schema. Explains balance nature, provisioning, and sibling differentiation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters, so baseline 4. Description adds value by explaining what the returned balance represents and its source, compensating for lack of params.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool returns the user's cash balance for funding cards. Differentiates from list_cards by specifying that cards themselves are listed elsewhere, providing clear sibling distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides context that balance account is provisioned on first use and describes funding sources. However, lacks explicit when-to-use vs alternatives like get_card_balance, though differentiation is implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_card_balanceA
Read-onlyIdempotent
Inspect

The live balance of ONE virtual card (the user's overall cash balance is get_balance). Prefer this over get_card_details when you only need to verify available funds: it is faster and does not expose sensitive card credentials.

ParametersJSON Schema
NameRequiredDescriptionDefault
card_idYesThe card ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
cachedNoWhether the balance was served from a short-lived cache rather than fetched live.
messageYesHuman-readable balance summary.
balanceCentsNoAvailable balance in cents.
balanceDollarsNoAvailable balance formatted as USD dollars, e.g. "12.50".

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Aligns with annotations (readOnlyHint, idempotentHint, destructiveHint) and adds useful behavioral context: live balance, faster, no credential exposure. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, each purposeful: first states purpose with resource specificity, second provides usage guidance. No wasted words, front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for its purpose: explains what it does, when to use, and key benefits. Output schema exists but not shown; description covers all needed context for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Single parameter card_id with basic schema description 'The card ID'. Description adds 'of ONE virtual card' but doesn't elaborate on format or constraints. Schema coverage is 100%, so baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns the live balance of a single virtual card, distinguishing it from get_balance (overall cash balance) and get_card_details (which exposes sensitive credentials).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly advises preferring this tool over get_card_details when only verifying available funds, citing speed and credential safety. Also contrasts with get_balance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_card_detailsA
Read-onlyIdempotent
Inspect

Get decrypted PAN, CVV, expiry, and current balance for a specific card. Use this only when you need to fill in a payment form — prefer get_card_balance if you only need the balance. May require human approval before returning credentials. If approval is required, prompt the user and then call approve_request. Card details are encrypted at rest with AES-256-GCM.

ParametersJSON Schema
NameRequiredDescriptionDefault
card_idYesThe card ID
approval_idNoApproval id from a prior approval_required response, once the user has approved. Only for cards created through ANOTHER app: first call without it (the user is emailed an approve link), then retry with it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
last4NoLast four digits of the card number. Present only when status is "details".
cardIdNoThe card ID.
expiryNoCard expiry (MM/YY). Present only when status is "details".
statusNoOutcome discriminator: "details" when credentials were returned, "approval_required" when human approval is needed first, "not_accessible" when the card exists outside this connection's scope, "policy_denied" when the card preset blocks reveal (message is the deny reason), "managed_by_organization" for org-issued read-only cards.
messageYesHuman-readable card details (or an approval-required prompt).
approvalIdNoThe approval request ID to pass to approve_request. Present only when status is "approval_required".
cardStatusNoCard status, e.g. "active" or "closed". Present only when status is "details".
balanceCentsNoCard balance in cents. Present only when status is "details".
balanceDollarsNoCard balance formatted as USD dollars, e.g. "12.50". Present only when status is "details".

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark readOnlyHint=true and idempotentHint=true, but the description adds critical behavioral context: it may require human approval, it returns sensitive decrypted credentials, and the data is encrypted at rest with AES-256-GCM. It also explains the two-step approval flow with approval_id. No annotation contradiction exists; the description enriches the safety profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise (four sentences) and front-loaded with the core purpose. Each sentence earns its place: purpose, use-case restriction, approval workflow, and security note. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema (which defines the return structure) and comprehensive annotations, the description fully covers the necessary context: when to use, the approval exception flow, and the security implication of returning decrypted PAN/CVV. An agent can correctly invoke this tool with no missing information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% — both parameters (card_id and approval_id) are thoroughly described in the schema, including the special case for cards created through another app. The description does not add any information about parameters beyond what the schema already provides. Baseline 3 is appropriate since the schema carries the full weight.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the exact resource and action: 'Get decrypted PAN, CVV, expiry, and current balance for a specific card.' It explicitly distinguishes itself from the sibling tool 'get_card_balance' by naming the condition for preferring it. There is no ambiguity about what the tool does or how it differs from alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit when-to-use guidance: 'Use this only when you need to fill in a payment form' and names the preferred alternative for balance-only queries. It also outlines the conditional approval workflow, instructing to prompt the user and call 'approve_request' if approval is required. This leaves nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_card_presetAInspect

Read a card's preset (spend limits, rate limits, allowed categories/merchants, time windows, and surfaces) as a plain-English summary. A card without a preset is unrestricted.

ParametersJSON Schema
NameRequiredDescriptionDefault
card_idYesThe card id (from list_cards).

Output Schema

ParametersJSON Schema
NameRequiredDescription
cardIdNo
presetNoPreset summary, or null when unrestricted.
messageYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the burden of behavioral disclosure. It conveys that the operation is read-only via 'Read', discloses the output format ('plain-English summary'), and adds a valuable edge case: a card without a preset is unrestricted. It does not discuss errors or auth, but this is not a major gap for a read operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two tight sentences with no filler. The core purpose is front-loaded, and the important 'unrestricted edge case is delivered in a single clause.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple: one required parameter, an output schema present, and a description that clarifies behavior, return type, and the no-preset case. Nothing needed for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with card_id fully described as 'The card id (from list_cards)', so the schema already does the heavy lifting. The description adds no card_id-specific meaning beyond tying it to the preset concept, which is sufficient; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Read') and resource ('a card's preset'), enumerates exactly what the preset covers (spend limits, rate limits, allowed categories/merchants, time windows, surfaces), and clarifies the output form ('plain-English summary'). This clearly distinguishes it from sibling tools like list_presets or set_card_preset.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the usage context clear: use this to read a specific card's preset and understand whether it is restricted or unrestricted. It does not explicitly list when not to use it or name alternatives like list_presets, but the singular 'a card's preset' makes the intended selection unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_instructionsA
Read-onlyIdempotent
Inspect

Call this FIRST; returns the latest usage guide for shopping with buy AND for operating the Agentcard account tools (cards, funding, your own card, KYC, support).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYesThe latest buy usage guide / instructions text.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds value by saying the guide is the 'latest' usage guide and by specifying which domains it covers, clarifying that the tool returns guidance rather than performing an operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded instruction, and no wasted words. It communicates timing, content domains, and tool purpose economically. The emphasis on 'Call this FIRST' gives the most important practical information immediately.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless, read-only, idempotent tool with an output schema and broad sibling coverage, the description is fully sufficient. It explains what the guide contains, which tool family it applies to, and when to call it. No additional setup or return-format details are necessary given the structured context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are zero parameters and schema description coverage is 100%, so no parameter documentation is owed. The description appropriately avoids inventing parameter details. The baseline of 4 applies for parameterless tools.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a clear action ('returns the latest usage guide') and specifies its scope: shopping via `buy` and Agentcard account tools. It also positions itself as a bootstrap step, which distinguishes it from the long list of operation-specific sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Call this FIRST' provides explicit timing guidance for when to use the tool. It does not enumerate when-not-to-use conditions or name alternatives, but for an instruction/help tool whose alternatives are the operational tools themselves, the first-step instruction is sufficient context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_kyc_statusA
Read-onlyIdempotent
Inspect

Check the user's identity verification (KYC) status. Returns whether they are verified and, if not, the current state plus the conversational next step. Use this to poll after the user does the face scan, or any time create_card reports kyc_required.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
reasonNoFailure reason from the verification provider when one exists.
statusNoRaw KYC state: "verified", "pending", "requires_input", "duplicate_identity", "canceled", or null if never started.
messageYesHuman-readable status / next step.
nextStepNoConversational next step when the flow is in progress.
verifiedNoTrue when identity verification has passed.
missingFieldsNo
verificationUrlNo

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint. Description adds useful behavioral info (returns state and next step), but is not essential beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no wasted words. Front-loaded with purpose, followed by usage. Highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters and the presence of an output schema, the description fully covers the tool's purpose, usage, and behavior. Complete for this context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has zero parameters, so schema coverage is 100% automatically. Description adds no parameter info, but none is needed. Baseline 4 for 0 parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the tool checks KYC status, returns verification state and next step. It clearly distinguishes from sibling tools like start_kyc or submit_kyc_document.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance: poll after face scan or when create_card reports kyc_required. Offers clear context for when to use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_planA
Read-onlyIdempotent
Inspect

Show the user's current subscription plan, card limits, and this month's usage. Call this before create_card when you need the per-card amount cap or remaining monthly quota, and ALWAYS before creating a multi-use card: multi-use cards are a paid-plan feature, so maxActiveMultiUseCards is 0 on Free and the mint is refused. Also call it whenever the user asks about their plan, limits, billing, or upgrading. To cancel a paid plan, the gated tool cancel_plan also exists; call it by name even though it isn't in the tools list.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
planNoRaw plan id, e.g. 'free', 'basic', or 'pro'.
messageYesHuman-readable plan + usage summary.
planNameNoDisplay label of the plan, e.g. "Basic ($15/mo)".
ordersPlacedNoOrders placed (counts toward the free-order quota on Free).
cardsRemainingNoCards remaining this month; null means unlimited.
cardsThisMonthNoNumber of cards created this month.
currentPeriodEndNoISO date the current billing period ends, or null.
maxCardsPerMonthNoMax cards allowed per month; null means unlimited (connections through a company OAuth client or organization have no card limits).
cancelAtPeriodEndNoWhether the subscription cancels at the end of the current billing period.
maxLifetimeOrdersNoLifetime free-order quota; null means unlimited (paid plans).
maxCardAmountCentsNoThe per-card cap in effect, in cents: the tighter of the plan cap and the issuing rail's own ceiling; null means no per-card cap at all.
subscriptionStatusNoStripe subscription status (e.g. 'active', 'past_due'), or null on Free / when unavailable.
activeMultiUseCardsNoHow many multi-use cards the user currently holds open (they hold their limit as collateral for their whole life, so closing one frees a slot).
maxCardAmountDollarsNoThe per-card cap in effect, formatted as USD dollars, e.g. "500.00"; null means no per-card cap.
maxActiveMultiUseCardsNoHow many multi-use cards may be open at once. 0 means multi-use cards need a paid plan and create_card with type "multi_use" will be refused; null means unlimited (company-governed).
planMaxCardAmountCentsNoThe personal plan's per-card cap, in cents; null for company-governed connections (no plan cap).
railMaxCardAmountCentsNoThe issuing rail's own per-card ceiling for cards funded from the cash balance (source "issued"), in cents, when the rail this account mints on has one; enforced when such a card is created, not on purchases against the user's own added card. null when the rail has none.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds meaningful behavioral context beyond that: multi-use cards are a paid-plan feature, maxActiveMultiUseCards is 0 on Free, and the mint is refused. This helps the agent interpret plan data and anticipate downstream behavior when using the result with create_card.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and then provides targeted usage triggers. All three sentences contribute information, though the final sentence about cancel_plan is somewhat tangential to get_plan itself and could have been shorter without losing meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only tool with an output schema and strong annotations, the description is complete. It identifies what data is returned, when to call the tool, why it is needed before multi-use card creation, and how to route cancellation to a different tool. 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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema is an empty object, so there is no parameter detail that needs clarification. The description still adds value by naming the returned data categories (plan, card limits, monthly usage), which is sufficient given the no-parameter baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it 'Show[s] the user's current subscription plan, card limits, and this month's usage.' This clearly distinguishes get_plan from siblings like get_balance, get_settings, list_transactions, and upgrade_plan, so an agent can select it correctly without inspecting schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: call before create_card when the per-card amount cap or remaining monthly quota is needed, ALWAYS before creating a multi-use card, and whenever the user asks about plan, limits, billing, or upgrading. It also names cancel_plan as the alternative for cancellation, including the note to call it by name even though it is not listed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_rewardsA
Read-onlyIdempotent
Inspect

Show the user's tokenback: balance, lifetime earned, and recent activity. Tokenback pays tokens (1 token = 1¢ of credit value) on settled card spend. AI cards (create_card scope_preset: 'ai_labs') earn a boosted rate on AI-lab purchases, and companies can route a share of their earnings to their users as tokenback. Redeem with redeem_rewards.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYesHuman-readable summary.
balanceTokensNoCurrent token balance (1 token = 1 cent).
redeemedTokensNoTokens redeemed all-time.
minRedeemTokensNoMinimum tokens per redemption.
lifetimeEarnedTokensNoTokens earned all-time.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint, idempotentHint, destructiveHint. Description adds valuable context: what data is shown (balance, lifetime, recent activity) and explains tokenback mechanics (rate, AI card boost). No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise (3 sentences, ~55 words). Every sentence serves a purpose: describes output, explains tokenback value, and provides cross-reference to redeem_rewards. No redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given zero parameters, existing output schema, and annotations, the description fully covers what the tool does, what it returns, and how it fits with sibling tools. Complete for a simple read-only tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters; baseline 4 is appropriate. Schema is empty, so description adds no parameter info, but none is needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Show the user's tokenback' with specific components (balance, lifetime earned, recent activity). Distinguishes from sibling tools like redeem_rewards, so agents know this is the read-only view.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells when to use this tool vs. alternatives: 'Redeem with redeem_rewards' for redemption. Also implies use for viewing reward details, not for other actions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_settingsA
Read-onlyIdempotent
Inspect

View the user's notification preferences (which email alerts they receive), their default payment source (which card or balance agents charge — check it before picking a funding source for them), their default delivery address (the wallet-level shipping address to use when buying physical goods for them — check it before asking them to dictate an address), and authorization settings (whether viewing card details or making transactions requires explicit approval). Authorization settings are read-only here; change the rest with the gated tool update_settings, calling it by name even though it isn't in the tools list.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYesHuman-readable settings summary.
authorizationNoAuthorization (approval) settings — read-only.
notificationsNoEmail notification preferences.
default_paymentNoThe wallet-level default payment source: { source: 'balance' } or { source: 'connected', connected_card_id }. null = auto (an active added card wins, else the balance).
delivery_addressNoThe wallet-level default delivery address (street/city/state/zip + optional address2/phone/name), or null when unset.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the tool read-only, idempotent, and non-destructive. The description adds valuable behavioral detail by specifying which settings are read-only (authorization settings) and that the rest can be changed via update_settings. It does not contradict annotations, and the practical guidance on using the returned data goes beyond what annotations provide, though it stops short of disclosing rate limits or pagination behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single long sentence with multiple clauses, but every clause adds substantive value: it enumerates the data returned, explains the practical importance of each, and points to the update tool. It is dense but not bloated, and the front-loaded 'View the user's notification preferences' immediately orients the reader.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that an output schema exists, the description need not enumerate return fields. It provides rich context about the meaning and use of each data category, states that authorization settings are read-only, and references the update tool. For a zero-parameter, read-only tool, this description is fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the schema is empty. According to the rubric, a baseline of 4 applies. The description appropriately does not attempt to document nonexistent parameters; it focuses on the content of the read operation instead.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'View' and precisely enumerates the four categories of information returned: notification preferences, default payment source, default delivery address, and authorization settings. This clearly distinguishes it from sibling tools like get_balance or get_plan, and the additional context on how to use each piece of data reinforces the tool's purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly instructs when to consult the tool ('check it before picking a funding source for them', 'check it before asking them to dictate an address') and names the alternative update_settings for modifying settings. This provides both concrete triggering conditions and an explicit alternative, fully satisfying the when-to-use vs. alternatives criterion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_added_cardsA
Read-onlyIdempotent
Inspect

List the user's ADDED cards (their own Visa/Mastercard cards enrolled via create_card's add-card flow — the funding source that charges their own card), with ids, brand, last4, expiry, and status. The row marked isDefault is what create_card charges when no connected_card_id is given — the user's chosen default card (set with update_settings default_payment), falling back to the newest active one. Not the same as list_cards (the virtual cards Agentcard issues).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNoNumber of non-revoked added cards.
messageYesHuman-readable list (or an empty-state note).
attachedCardsNoAdded-card enrollments, newest first. The row with isDefault true is the default for new cards; none is marked when the default payment is the wallet balance.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark it as read-only, idempotent, and non-destructive. The description adds genuinely useful behavior beyond that: what makes a card 'added', how isDefault is chosen, and how create_card uses the default card when no connected_card_id is supplied.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earning its place: one defines the resource, one clarifies default behavior, and one disambiguates from a sibling tool. No wasted or filler wording.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read-only tool with an output schema and safekeeping annotations, the description covers all the necessary context: what the cards are, what fields are returned, how defaults behave, and how this differs from list_cards. Nothing meaningful is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters and full schema coverage, so there is nothing for the description to clarify in that scope. It still adds meaningful context about the output, especially the isDefault flag's semantic meaning, which goes beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Uses specific verb 'List' plus resource 'user's ADDED cards' and defines them as own Visa/Mastercard cards enrolled via create_card's add-card flow. Explicitly distinguishes from list_cards, so an agent can recognize the intended scope right away.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains when this tool is relevant by tying the listed data to create_card behavior and update_settings, and explicitly names list_cards as a different tool for issued virtual cards. This gives the agent a clear decision point between the two.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_cardsA
Read-onlyIdempotent
Inspect

The user's wallet: every live card they hold, with IDs, last four digits, expiry, balance, and status, plus vaultCards: the user's OWN cards stored in their Agentcard vault (display fields only; a vaulted card pays through buy with an approval on the user's device (their passkey or master password) and never exposes a number). Start here to find available cards; if none are returned, call create_card. When the shared wallet is enabled, wallet lists every card across all connected apps and companies, each tagged with its source (kind personal/company, the issuing app, and the company where applicable); cards created by another app or company are read-only from this session: get_card_details and close_card will not work on them.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
cardsNoThe user's own virtual cards.
countNoTotal number of cards across the user's own cards and any connected-account cards.
walletNoOne-wallet view (present when the shared wallet is enabled): every LIVE card across personal and company sources, each tagged with its provenance. Closed cards are excluded; transactions carry history.
messageYesHuman-readable list of cards (or an empty-state message).
vaultCardsNoThe user's own cards stored in their Agentcard vault. Display fields only; they pay through buy with an approval on the user's device (their passkey or master password) and never expose a card number.
connectedAccountsNoRead-only cards issued and managed by an organization the user is linked to.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (readOnlyHint=true, idempotentHint=true), the description adds meaningful behavioral context: vault cards never expose a number and pay via device approval, while cards from other apps/companies are read-only in this session. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is information-dense and front-loaded with the core purpose, followed by usage guidance and edge-case behavior. It is longer than ideal but every clause carries useful information, so it earns a 4 rather than a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite the tool having zero parameters, the output has complex semantics (wallet vs vaultCards, shared wallet behavior, source tags, read-only restrictions) that the description thoroughly covers. The empty-state action (call create_card) is also addressed, making it complete for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has zero parameters, so schema coverage is trivially 100%. With no parameters to explain, the description correctly focuses on output semantics rather than parameters, deserving the baseline 4 for a no-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists the user's wallet and vault cards, with specific fields (IDs, last four, expiry, balance, status). It distinguishes itself from siblings by noting how vault cards differ and which cards are read-only for get_card_details and close_card.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says 'Start here to find available cards' and provides a conditional alternative: 'if none are returned, call create_card.' It also explains when cards cannot be modified (shared wallet cards from other apps/companies), giving clear when-to-use and when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_connectionsA
Read-onlyIdempotent
Inspect

List the third-party apps the user has connected to their Agentcard account via OAuth (e.g. Kilo), including when each was connected and whether it is still active. Read-only. To revoke an app, call revoke_connection with its clientId.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNoNumber of connected apps.
statusNoResult status: "no_connections" when none are connected, otherwise "ok".
messageYesHuman-readable summary of the connected apps.
connectionsNoThe third-party apps connected to the user's account via OAuth.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Description adds details beyond readOnlyHint: includes 'when each was connected and whether it is still active'. Also explicitly states 'Read-only', consistent with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded purpose, no waste. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete description for a parameterless tool with output schema. Covers purpose, data returned, and alternative tool for revocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist; baseline 4 per guidelines. Schema coverage is 100% trivially, no additional param info needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists third-party apps connected via OAuth, with specific example (Kilo). It distinguishes from revoke_connection by directing to that sibling for revocation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use (to list connected apps) and when not to (to revoke, use revoke_connection). Provides clear alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_payment_methodsA
Read-onlyIdempotent
Inspect

List the saved payment methods (used only to pay for flight bookings, not for cards or adding funds). Returns each method with its id, brand, last 4 digits, and expiry, and marks the default one. Use setup_payment_method to add a new one. The gated tools set_default_payment_method and remove_payment_method also exist; call them by name even though they aren't in the tools list.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNoNumber of saved payment methods.
statusNoWhether any payment methods are saved.
messageYesHuman-readable summary of the saved payment methods.
defaultIdNoThe id of the payment method marked as default, if any.
paymentMethodsNoThe saved payment methods.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds context that this is for flight bookings only and that the default method is marked. No contradictions. Could add more on behavior like order or pagination, but currently sufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: first explains purpose and return structure, second provides usage alternatives. Front-loaded with key information, no redundant phrases, highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (0 params, output schema exists), the description covers the tool's purpose, what it returns, and related tools. No gaps in required information for agent selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist, so schema coverage is 100%. The description does not need to explain parameters, and it does not repeat schema info. The context that it returns specific fields is helpful and goes beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists saved payment methods used only for flight bookings, lists the returned fields (id, brand, last 4 digits, expiry, default), and explicitly excludes cards and adding funds, distinguishing it from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance on when to use this tool (listing payment methods) and when to use alternatives: setup_payment_method for adding, and set_default_payment_method/remove_payment_method for modifying. Also mentions that gated tools can be called by name despite not being in the tool list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_pending_approvalsA
Read-onlyIdempotent
Inspect

List the user's PENDING approval requests: asks from connected apps (create a card, view full card details, close/pause/resume a card, change a limit) waiting on the user's decision. Surface each one to the user and let THEM decide; after the user answers, resolve with approve_request. NEVER approve or deny on your own — an approval is the user's consent, not yours. Personal sessions only; company-connected sessions have no personal inbox.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNoNumber of pending approvals.
statusNoPresent only when the list is unavailable: "personal_surface_only" for company-connected sessions.
messageYesHuman-readable list of pending approvals (or an empty-state note).
approvalsNoPending, unexpired approval requests, newest first. Each is waiting on the user's decision.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes beyond annotations by emphasizing that approvals require user consent and the agent must not act on its own. Also discloses session scope. The readOnlyHint/idempotentHint align with 'list pending approvals', with no contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences with no filler. Each sentence adds either scope, usage rule, or session constraint; the most critical consent rule is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With zero params and an output schema present, the description fully covers what the tool does, when to use it, and important guardrails. No gaps remain for an agent to select and invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Tool has zero parameters, so the schema is empty and there is nothing to document. Baseline for 0 params is 4; description correctly omits parameter details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool lists the user's PENDING approval requests from connected apps with specific examples (create a card, view full card details, close/pause/resume a card, change a limit). It distinguishes from sibling approve_request by framing this as the listing step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit guidance: surface each request and let the user decide, resolve with approve_request afterward. Also states session limitation ('Personal sessions only; company-connected sessions have no personal inbox') and the rule 'NEVER approve or deny on your own'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_presetsAInspect

List every preset you can use by name: the built-in templates (ai_labs, weekday_meals, cli_only, daily) plus any you've saved yourself, each with a plain-English summary of its rules.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYes
presetsNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral transparency burden. It clearly reveals what the tool returns: preset names and a plain-English summary of rules, and it discloses coverage including built-in and user-saved presets. Although it doesn't explicitly say 'read-only', the verb 'List' strongly implies a non-mutating operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that front-loads the core action and resource. It includes useful examples in parentheses and adds the summary detail without unnecessary filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a no-parameter listing tool with an output schema, the description is complete for invocation purposes. It tells the agent exactly what to expect in the response, and there are no required arguments or edge-case parameters left unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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. The description adds no parameter-specific meaning because there are no parameters to document. The input schema is empty and the description accurately reflects that, so no information is missing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') with a clear resource ('presets') and even enumerates the built-in templates, distinguishing this from related tools like get_card_preset or save_preset. It clearly communicates the scope: all usable presets, built-in plus user-saved, with a plain-English summary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies its use case: when you need an overview of available presets by name and summary. However, it does not explicitly state when not to use it or point to alternatives such as get_card_preset, save_preset, or delete_preset, leaving the choice of tool partly to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_transactionsA
Read-onlyIdempotent
Inspect

Transactions with amount, merchant, status, and timestamps. Pass card_id for one card's transactions; OMIT it for every card in the account (newest first, each row tagged with its card). Use limit and status to filter. The gated views list_all_transactions and list_transactions_by_payment_method also exist; call them by name even though they aren't in the tools list.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax number of transactions to return (default 20)
offsetNoSkip this many (all-cards view pagination; ignored for a single card).
statusNoFilter by transaction status (e.g. PENDING, SETTLED, DECLINED, REVERSED, EXPIRED, REFUNDED)
card_idNoA card ID for that card's transactions; omit for all cards in the account.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNoNumber of transactions returned.
messageYesHuman-readable list of transactions (or a "no transactions" note).
transactionsNoThe transactions for the card, newest first.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already convey read-only, idempotent, non-destructive behavior, lowering the bar. The description adds useful behavioral details: 'newest first, each row tagged with its card' and the existence of gated views. It does not discuss permissions or rate limits, but the annotation set covers the safety profile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each pulling weight: return content, parameter scoping/filtering, and alternative tool routing. The most important information 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.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a full output schema, read-only/idempotent annotations, and a description that covers scoping, filtering, ordering, and gated alternatives, an agent has everything needed to invoke this tool correctly. Pagination and default details are already covered by the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description reinforces card_id's omit-for-all-cards semantics and the use of limit/status for filtering, but these are already present in the schema descriptions; no substantially new parameter-level meaning is added.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the resource and fields ('Transactions with amount, merchant, status, and timestamps') and clarifies the two scopes (with/without card_id), so an agent can tell what the tool returns. It also distinguishes itself by naming gated sibling views, though the opening is a noun fragment rather than an explicit verb-phrase.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to pass card_id (single card) vs omit it (all cards), instructs the agent to use limit and status for filtering, and directly names the alternatives list_all_transactions and list_transactions_by_payment_method, including that they are gated and callable by name. This gives clear, actionable routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

manage_subscriptionAInspect

Manage a recurring meal/grocery SUBSCRIPTION (e.g. Locale) — NOT a one-time purchase, and no payment is taken (the subscription auto-bills the card on file at the merchant). action: 'menu_search' (browse the recurring menu; items flagged inPlan are covered by the plan), 'get_skip_dates' (list skipped/paused deliveries), 'skip'/'unskip' (one upcoming delivery date), 'set_skip_dates' (replace the full skip set; [] resumes all), 'update_setting' (change a setting). Locale settings: subscription_size (meals, e.g. 8), calorie_preference (low_calorie|both|moderate), diets (array), longevity_allergens (array), ingredient_allergies (array), default_window ('9am - 6pm'|'3pm - 7pm'|'9am - 12pm'), delivery_instructions (text). Link the merchant first.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoskip/unskip: one ISO delivery date (YYYY-MM-DD)
datesNoset_skip_dates: FULL set of ISO dates to skip ([] resumes all)
limitNomenu_search: max items
queryNomenu_search: term over the recurring menu (e.g. 'salmon'); '' lists everything
valueNoupdate_setting: the new value (number, string, or array of strings)
actionYesthe management action
settingNoupdate_setting: the setting key (see description)
merchantYesmerchant slug (e.g. locale)

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYesHuman-readable result or next step.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (readOnlyHint=false, destructiveHint=false), the description adds key behavioral details: no payment taken, auto-billing, actions like skip/unskip affecting deliveries, and the need to link the merchant first. This fully compensates for minimal annotation info.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is fairly concise given the complexity, with front-loaded purpose. Every sentence earns its place, though it could be slightly more structured (e.g., bullet lists). Still effective.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (8 parameters, various actions), and existence of an output schema, the description covers all necessary context: actions, settings, prerequisite linking. It is complete enough for an agent to use correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage, baseline is 3. The description adds significant value by explaining the action enum values and providing a detailed list of settings for 'update_setting', which goes beyond the schema's brief descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it manages recurring meal/grocery subscriptions (e.g., Locale), explicitly distinguishes from one-time purchases, and lists specific actions. This differentiates it from sibling tools like 'buy', which are likely for purchases.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context: it's for subscription management, not one-time purchases, and no payment is taken. It also mentions linking the merchant first. However, it lacks explicit when-not-to-use guidance relative to siblings, though many are unrelated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

name_cardA
Idempotent
Inspect

Tell the vault which card product one of the user's own stored cards is (e.g. "Chase Sapphire Preferred", "Amex Gold"), so smart purchases can rank it. Takes a vault card id (a vaultCards row from list_cards) and the product name as the user says it; the closest match is saved and echoed back. Confirm with the user when the match is not obviously right. Pass clear_product to forget the name, or smart_excluded to keep a card out of the ranking without removing it.

ParametersJSON Schema
NameRequiredDescriptionDefault
card_idYesThe vault card id (from list_cards → vaultCards).
productNoThe card product as the user says it, e.g. "Chase Sapphire Preferred" or "Amex Gold". Four characters minimum.
clear_productNotrue = forget the product name. Do not combine with product.
smart_excludedNotrue = leave this card out of smart purchases; false = include it again.

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusYes"named" | "cleared" | "updated" | "no_match" | "ambiguous" (several products match; nothing saved, ask the user) | "noop".
matchesNoOn no_match or an ambiguous name: the closest products found, to offer the user.
messageYesWhat was saved.
product_keyNoThe saved product key.
product_nameNoThe saved product name.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true and readOnlyHint=false. Description adds that the closest match is saved and echoed back, and that smart_excluded does not remove the card. It also mentions user confirmation for uncertain matches, adding behavioral context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, no filler. Purpose is front-loaded, id source mentioned, and flag behaviors succinctly covered. Every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-parameter tool with output schema, description covers all parameters, mentions confirmation behavior, and clarifies the smart_excluded semantics. Minor gaps like exact output structure are likely covered by the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers all parameters (100%), so baseline is 3. Description enhances meaning by explaining the purpose of product, clear_product, and smart_excluded in context, and clarifies that clear_product and product should not be combined. Adds value beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a clear verb ('tell the vault') and specific resource (card product for a stored card), with explicit purpose for smart purchases. It also references list_cards as the id source, distinguishing it from other card tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides guidance on when to use the flags (clear_product, smart_excluded) and mentions user confirmation. Does not explicitly compare to sibling tools like recommend_card or get_card_details, but implies usage via the id source from list_cards.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pause_cardA
Idempotent
Inspect

Pause a multi-use card: temporarily blocks ALL new charges (reversible — use resume_card to unblock). Right for "stop this subscription for now" or a card the user suspects is compromised but is not sure. Only multi-use cards can be paused; single-use cards close after one charge and cannot be paused.

ParametersJSON Schema
NameRequiredDescriptionDefault
card_idYesThe card ID to pause (from list_cards or create_card).
approval_idNoApproval id from a prior approval_required response, once the user has approved. Only for cards created through ANOTHER app: first call without it (the user is emailed an approve link), then retry with it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
cardIdNoThe card ID.
statusNo"paused" on success; an error discriminator otherwise (e.g. "not_multi_use", "card_not_updatable").
messageYesHuman-readable result.

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare non-destructive and idempotent. Description adds reversibility and mentions resume_card. Also specifies that it blocks all new charges, though missing details on pending transactions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with main purpose, then constraints and parameter usage. No redundant words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers action, when to use, card type constraints, and a key parameter detail. With only 2 simple params and output schema present, description is fully sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%. Description adds critical context for approval_id, explaining the flow for cards from another app, which goes beyond schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Pause a multi-use card: temporarily blocks ALL new charges', with specific verb (pause) and resource (multi-use card). Distinguishes from siblings like close_card (permanent) and resume_card (reverse).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use: 'Right for stop this subscription for now or a card the user suspects is compromised' and when not to: 'Only multi-use cards can be paused; single-use cards... cannot be paused.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_support_chatA
Read-onlyIdempotent
Inspect

Read the message history of a support conversation

ParametersJSON Schema
NameRequiredDescriptionDefault
conversation_idYesThe conversation ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNoNumber of messages returned.
statusNoOutcome of the read: 'empty' when there are no messages yet, 'ok' when messages were returned.
messageYesHuman-readable rendering of the conversation history.
messagesNoThe messages in the conversation, oldest first.

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, which sufficiently convey the tool's safety and behavior. The description adds the detail about reading 'message history' but does not provide additional behavioral traits 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence that conveys the essential purpose with zero waste. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a single parameter, high schema coverage, and an output schema present, the description is largely sufficient. It does not cover potential limitations like pagination or message ordering, but for a simple read operation with strong annotations, this is acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with a single required parameter conversation_id. The description confirms the tool reads a support conversation but adds no new meaning beyond the schema field description 'The conversation ID'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the specific verb 'Read' and states the resource 'message history of a support conversation'. It clearly identifies the tool's action and distinguishes it from siblings like start_support_chat or send_support_message.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives such as start_support_chat or send_support_message. There is no mention of prerequisites or context for choosing this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

recommend_cardA
Read-onlyIdempotent
Inspect

Ask the vault which of the user's own stored cards earns the most for a purchase (smart purchases). Pass the merchant name, its website when you know it, and the amount. Returns the card id to use as card_id at checkout, the reason in plain words, and the runners-up. null when smart purchases is off for this account, no stored card has been named yet (see name_card), or nothing could be said; then pay as you would have. Never a card number.

ParametersJSON Schema
NameRequiredDescriptionDefault
currencyNoISO currency code, default usd. Non-USD purchases account for foreign transaction fees.
merchantYesThe merchant as the user would see it, e.g. "DoorDash".
amount_centsNoOrder total in cents, when known.
merchant_urlNoThe merchant's website or checkout origin, e.g. https://www.doordash.com. Improves the category match.

Output Schema

ParametersJSON Schema
NameRequiredDescription
reasonNoWhy, in one or two sentences the user can be told verbatim.
card_idNoThe vault card to pay with (pass as card_id at checkout), or null.
messageYesHuman-readable pick and reason.
categoryNoThe spend category the merchant resolved to.
alternativesNoOther stored cards with their estimated value in cents and reason.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate read-only, idempotent, and non-destructive behavior. The description adds meaningful behavioral context: null conditions for smart purchases being off, no named card, or nothing to say; the guarantee that a card number is never returned; and the plain-words reason in the output. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, then gives invocation hints, output shape, null semantics, and the safety note. Every sentence carries useful information without fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description does not need to restate return types. It covers selection context, required inputs, null behavior, fallback behavior, and a critical privacy guarantee. This is complete for an agent to decide when to call it and what to expect.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all four parameters. The description adds slight practical guidance ('when you know it' for the website, 'amount' for the total), but does not materially expand parameter meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: asking the vault which of the user's own stored cards earns the most for a purchase. It clearly scopes the tool to smart-purchase recommendation and distinguishes it from related tools like list_cards and name_card. The return value (card id, reason, runners-up) is also explicitly stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description tells the agent what to pass (merchant name, website when known, amount) and how to interpret null results, including paying as usual. It points to name_card when no stored card has been named. It does not broadly compare against other sibling tools, but the usage context is clear enough for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

redeem_codeA
Idempotent
Inspect

Redeem a promo code that adds money to the user's cash balance. Each code works once per user; the credit lands in the balance and becomes spendable within a minute or two. Some codes hold the money until the user verifies their identity — the claim still locks the code to this user instantly, and the credit lands automatically once KYC is approved (start_kyc begins verification). The gated tool list_codes shows the user's code history; call it by name even though it isn't in the tools list.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe promo code exactly as the user provided it (case and dashes are forgiven).

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYesHuman-readable result or next step.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (readOnlyHint=false, idempotentHint=true), the description discloses critical behaviors: credit lands within 1-2 minutes, some codes are gated on KYC approval, the claim locks instantly, and list_codes is a gated tool accessible by name. This adds significant context 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and uses three sentences, each earning its place. The second sentence explains timing and KYC exceptions, the third offers a useful pointer to list_codes. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully covers what an agent needs to know: purpose, idempotency, delay, KYC dependencies, and a hidden tool reference. An output schema exists to explain return values, so no additional return-format information is required.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers the only parameter (code) with a clear description that case and dashes are forgiven. The tool description adds no additional parameter syntax, but it does provide behavioral context such as idempotency and KYC gating. This meets the baseline for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Redeem a promo code that adds money to the user's cash balance.' This clearly states what the tool does and distinguishes it from similar siblings like redeem_rewards or add_funds by focusing on promo codes and cash balance.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use (when a user provides a promo code) and adds contextual guidance (each code works once per user, delay, KYC conditions). It also mentions list_codes as an alternative for viewing history, but does not explicitly exclude other tools or name alternatives for redeeming.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

redeem_rewardsAInspect

Redeem tokenback: the tokens' cash value (1 token = 1¢) lands on the user's rewards card as spending power. The rewards card is permanent and locked to AI-lab merchants (OpenAI, Anthropic, Gemini) — created on first redemption, topped up after. Check get_rewards first for the balance and the minimum. Ask the user before redeeming.

ParametersJSON Schema
NameRequiredDescriptionDefault
tokensYesHow many tokens to redeem (1 token = 1 cent, so 500 tokens = $5.00 of wallet credit).

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusNo"redeemed" on success; an error discriminator otherwise (e.g. "below_minimum", "insufficient_tokens", "redemption_in_progress").
messageYesHuman-readable result.
amountCentsNoWallet credit in cents. Present when status is "redeemed".
redemptionIdNoThe redemption ID. Present when status is "redeemed".
deliveredCardIdNoRewards card the value landed on, when delivery completed inline. Absent = the value sits as wallet credit (it reaches the rewards card within a few minutes when delivery is enabled).
deliveredCardLast4NoLast 4 digits of the rewards card, when delivered inline.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses important behavioral details beyond annotations: tokens convert at a fixed rate, the rewards card is permanent, locked to specific merchants, created on first redemption, and topped up afterward. Since annotations only indicate non-read-only but don't specify effects, these details add significant transparency. It could further mention irreversibility but is not required for basic use.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three sentences, front-loaded with the core action and effect, then a key restriction, then brief usage guidance. Every sentence adds essential information with no redundancy or fluff, making it highly concise and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter tool with an output schema, the description covers all essential aspects: what happens, conversion rate, card behavior, merchant restriction, prerequisite check, and user consent. It doesn't explain every edge case but points to get_rewards for balance/minimum, which is sufficient for correct invocation. This is complete for the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema for the single parameter 'tokens' already provides a full description including the conversion rate and an example, giving 100% coverage. The tool description repeats the rate but adds no new parameter-level constraints or format details. Therefore, it meets the baseline for schema-covered parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Redeem tokenback' with a specific conversion rate and effect on the rewards card. It distinguishes itself from sibling tools like redeem_code and withdraw by describing the unique reward card mechanism and AI-lab merchant restrictions. The verb 'redeem' plus the specific resource 'tokenback' makes the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: 'Check get_rewards first for the balance and the minimum' and 'Ask the user before redeeming.' This gives a prerequisite and consent requirement, but it does not explicitly name alternatives or when-not-to-use conditions, so it stops short of a 5. The guidance is still effective for the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

remove_added_cardA
Destructive
Inspect

Remove (unenroll) one of the user's added cards. Irreversible for that enrollment: any virtual cards created against it are closed first, then the card is unenrolled at the network. ALWAYS confirm with the user before calling. Get ids from list_added_cards. The user can add the same card again later (create_card with restart_setup: true).

ParametersJSON Schema
NameRequiredDescriptionDefault
attached_card_idYesThe id of the added card to remove (from list_added_cards).

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoThe id of the removed card.
statusNo"revoked" on success.
messageYesHuman-readable confirmation or guidance.
closedCardsNoHow many virtual cards created against it were closed.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses critical behavioral consequences beyond what annotations indicate: virtual cards are closed first, the card is unenrolled at the network, and removal is irreversible for that enrollment. This aligns with destructiveHint and adds valuable context for the agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is tight and information-dense: core action, irreversibility, side effects, user confirmation requirement, id source, and re-enrollment path all fit into a few sentences without unnecessary filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully covers the tool's purpose, prerequisites, side effects, user-confirmation requirement, and recovery path. With the output schema present, no critical context is missing for an agent to safely use this destructive tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already fully describes attached_card_id with 100% coverage, so the description does not need to carry much parameter burden. It does reiterate the source of the id (list_added_cards), which is helpful but not significantly beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the action as removing/unenrolling one of the user's added cards, which is a specific verb-resource combination. It sets this apart from sibling tools like close_card or pause_card by focusing on removal of an added card enrollment.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to always confirm with the user before calling, tells the agent to obtain ids from list_added_cards, and explains that the card can be re-added later using create_card with restart_setup: true. This is practical, actionable guidance for correct invocation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

resume_cardA
Idempotent
Inspect

Resume a paused multi-use card so it accepts charges again. The inverse of pause_card.

ParametersJSON Schema
NameRequiredDescriptionDefault
card_idYesThe paused card ID to resume.
approval_idNoApproval id from a prior approval_required response, once the user has approved. Only for cards created through ANOTHER app: first call without it (the user is emailed an approve link), then retry with it.

Output Schema

ParametersJSON Schema
NameRequiredDescription
cardIdNoThe card ID.
statusNo"active" on success; an error discriminator otherwise (e.g. "card_not_paused").
messageYesHuman-readable result.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate non-read-only, non-destructive, and idempotent behavior. The description adds that the card will 'accept charges again,' but does not cover the two-step approval flow hinted by the 'approval_id' parameter, leaving a behavioral gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, with two sentences that front-load the main action and efficiently link to the sibling tool. Every sentence serves a purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's moderate complexity (2 parameters, one with conditional usage), the description plus schema covers the essential behavior. However, omitting a summary of the two-step approval pattern (for cards from another app) is a minor completeness gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers both parameters with descriptive comments (100% coverage). The description adds no additional meaning beyond what the schema already provides, so it meets the baseline but does not exceed it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Resume a paused multi-use card'), the resource ('paused multi-use card'), and distinguishes from the sibling 'pause_card' by calling itself the inverse.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context by referring to 'pause_card' as the inverse, implying it is used after pausing. However, it does not explicitly state when not to use it or mention alternatives like 'close_card'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

revoke_connectionA
DestructiveIdempotent
Inspect

Revoke a third-party app's access to the user's Agentcard account. Disconnects the app and invalidates its OAuth tokens; it must reconnect via OAuth to regain access. Pass the clientId shown by list_connections.

ParametersJSON Schema
NameRequiredDescriptionDefault
client_idYesThe OAuth client ID of the app to revoke (from list_connections).

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusNoResult status: "revoked" when tokens were invalidated, "not_connected" when the app had no active access.
messageYesHuman-readable outcome.
revokedNoNumber of OAuth tokens that were revoked.
clientIdNoThe client ID that was revoked.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that the action is destructive (aligning with destructiveHint=true) and adds details beyond annotations: it invalidates tokens and requires reconnection via OAuth. No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the primary action, no redundant information. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (1 param, full schema coverage, output schema present), the description covers purpose, behavior, and parameter source completely. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for the single parameter, so baseline is 3. The description adds value by specifying the source of the client ID ('from list_connections'), which helps the agent determine the correct value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Revoke a third-party app's access'), the resource (user's Agentcard account), and the mechanism ('Disconnects the app and invalidates its OAuth tokens'). It distinguishes itself from sibling tools like list_connections by specifying the required input source.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent to 'Pass the clientId shown by list_connections', providing clear usage guidance. While it doesn't list when not to use it, the context of revoking access versus other actions is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

save_presetAInspect

Save your own preset — a named set of rules (spend caps, category/merchant/place/currency/day/hour/program restrictions) you can reuse by name in set_card_preset or create_card. Saving under a name you already used adds a new version: cards already using the old one keep it, new ones get the update. Pick a name other than the built-ins (ai_labs, weekday_meals, cli_only, daily). Pass either the rule fields below or a raw privileges array.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoWhat the preset does when a purchase breaks any of its rules: "strict" refuses it (the default), "watch" lets it through and tells the user once.
nameYesA name for this preset, e.g. "meals-only".
totalNoLifetime spend cap, in US dollars.
only_inNoComma-separated places to allow charges from: a country ("US", "Canada"), a region ("europe", "eu", "north-america", "latin-america", "apac"), or a US state ("California", "US-CA"). A region expands to its countries; a state next to a region narrows only the US, e.g. "north-america,US-CA". Example: "europe,Canada".
per_dayNoSpend cap per rolling 24 hours, in US dollars.
per_weekNoSpend cap per rolling 7 days, in US dollars.
timezoneNoIANA timezone for only_days/only_hours (default UTC), e.g. "America/Los_Angeles". Always shown in summaries.
only_daysNoComma-separated days to allow, e.g. "mon,tue,wed" or "weekdays"/"weekends".
only_fromNoComma-separated callers to allow, e.g. "cli,mcp" (cli, mcp, api, browser).
per_monthNoSpend cap per rolling 30 days, in US dollars.
categoriesNoComma-separated spend categories to allow, e.g. "meals,groceries" (meals, groceries, travel, software, ai, wellness, retail).
currenciesNoComma-separated purchase currencies to allow: ISO 4217 codes or common names, e.g. "usd,eur" or "dollars,euros,pounds,yen". In strict mode a purchase in another currency is refused at checkout and a settled charge in another currency pauses the card. Checked by Agentcard at checkout and settlement, not by the card network. Unknown currencies are refused.
only_hoursNoAn hour range to allow, e.g. "9-17" (24-hour clock; defaults to UTC without timezone).
privilegesNoAdvanced: raw privilege objects instead of the rule fields above.
only_merchantsNoComma-separated merchant name patterns to allow, e.g. "openai,anthropic".

Output Schema

ParametersJSON Schema
NameRequiredDescription
presetNo
messageYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full transparency burden. It discloses a non-obvious versioning behavior: re-saving a name adds a new version, existing cards keep the old one, and new cards get the update. It also warns against built-in names and clarifies that either rule fields or a privileges array can be passed, going beyond what the schema states.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short sentences with no redundant wording. It front-loads the primary purpose, then covers versioning semantics, naming constraints, and input options in a clear, efficient order.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-parameter creation tool with an output schema, the description covers all essential invocation decisions: what to pass, which names to avoid, how re-saving behaves, and the alternative input path. Return-value details are delegated to the output schema, so nothing critical for a correct call is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is already met. The description adds the crucial either/or relationship between the rule fields and the raw privileges array, which is not obvious from the schema alone. It also provides a high-level grouping of the rule fields (spend caps, restrictions) and a name constraint for the required parameter, adding meaningful semantic guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with 'Save your own preset' and immediately explains that it creates a named, reusable set of rules for use in set_card_preset or create_card. It clearly distinguishes this tool from sibling tools by framing it as an authoring action rather than an assignment action, and explicitly contrasts with built-in presets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states that the saved preset is reused by name in set_card_preset or create_card, signaling when this creation step is needed. It also gives a concrete constraint ('Pick a name other than the built-ins') and clarifies the two input modes. It doesn't contrast with list_presets or delete_preset, but that omission is minor for invoking this tool correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_support_messageCInspect

Send a message in an existing support conversation

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYesYour message
conversation_idYesThe conversation ID

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYesHuman-readable confirmation that the message was sent.
conversationIdNoThe ID of the conversation the message was sent to.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate readOnlyHint=false, destructiveHint=false, etc. Description adds no behavioral context beyond annotations. No disclosure of permissions, rate limits, or side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence that efficiently conveys purpose. No extraneous information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequate for a simple tool with output schema and fully described params. Lacks usage guidance and behavioral details, leaving gaps for an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with descriptions for both parameters. However, descriptions are minimal ('Your message', 'The conversation ID'). Description adds no extra meaning beyond schema, so baseline is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states verb 'Send' and resource 'message' in context of 'existing support conversation'. It is specific but does not differentiate from sibling tools like 'read_support_chat' or 'start_support_chat'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use or when-not-to-use guidance. No mention of alternatives despite having similar sibling tools. Agent must infer usage from name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_card_presetAInspect

Update a card's preset. Pass a template name (ai_labs, weekday_meals, cli_only, daily), a saved preset name (from list_presets), a comma-separated template list, or inline JSON / { name, privileges }. Pass null or "" to clear the card's preset (Agentcard-side checks stop; any limit already on the card network stays). Edits create a new version. The response reports what was applied on Agentcard vs what was updated on the card's spend limit, and whether the change needs a new card.

ParametersJSON Schema
NameRequiredDescriptionDefault
presetYesTemplate name (ai_labs, weekday_meals, cli_only, daily), comma-separated templates, inline JSON privileges, or { name?, privileges }. Pass null or "" with card_id to clear that card's preset.
card_idYesThe card id (from list_cards).

Output Schema

ParametersJSON Schema
NameRequiredDescription
presetNo
pushedNo
messageYes
summaryNo
messagesNo
policyIdNo
needsNewCardNo
agentcardOnlyNo
policyVersionNo

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses several important behaviors beyond the schema: clearing a preset stops Agentcard-side checks but leaves any existing card network limit intact, edits create a new version, and the response reports what was applied on Agentcard vs the card's spend limit and whether a new card is needed. With no annotations provided, this behavioral context is valuable. It could be slightly richer (e.g., whether the operation is reversible or requires special permissions), but it covers the key side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-organized: it opens with the core action, then enumerates input forms, then explains clearing behavior, then notes versioning and response contents. Every sentence adds information. It is slightly long but justified given the complexity of the preset parameter's polymorphic nature.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is complete for a tool with two parameters, full schema coverage, and an output schema. It explains the input forms, the clearing semantics, the versioning side effect, and what the response reports. The only minor gap is that it doesn't explicitly state the return type or error conditions, but the output schema presumably covers the response structure, and the description covers the behavioral nuances.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters. The description adds meaning by explaining the semantics of the preset parameter in more depth: the accepted forms (template name, saved preset name, comma-separated list, inline JSON) and the clearing behavior with null or empty string. This goes beyond the schema's oneOf definition, though the schema already covers the structure.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Update a card's preset.' It then enumerates the accepted input forms (template name, saved preset name, comma-separated list, inline JSON) and the clearing behavior, which distinguishes it from sibling tools like get_card_preset, list_presets, save_preset, and delete_preset. The verb 'update' plus the resource 'card's preset' is specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains what inputs can be passed and how to clear a preset, which implies when to use it. It references list_presets as the source for saved preset names, giving a clear prerequisite. However, it does not explicitly state when NOT to use this tool versus alternatives like save_preset or delete_preset, so it falls just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

setup_payment_methodAInspect

Save a payment method used ONLY to pay for flight bookings (the fare is charged to it via a hold at booking; no virtual card is created for flights). It does NOT fund cards or the cash balance — cards are funded from the balance (see add_funds). Returns a secure checkout URL the user must open to save their card details.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYesHuman-readable summary of the result.
checkoutUrlNoSecure Stripe checkout URL the user must open to save their payment method.
stripeSessionIdNoIdentifier of the Stripe Checkout session created for the setup.

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses key behavioral traits beyond the minimal annotations: the fare is charged via a hold at booking, no virtual card is created for flights, and it returns a secure checkout URL. It also clarifies what the tool does NOT do, which is important given the annotations provide no safety or side-effect information.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is composed of three concise, information-dense sentences. It front-loads the primary purpose, then provides exclusions and an alternative, and ends with the return value. Every sentence earns its place with no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has no parameters but does have an output schema, the description is complete: it states the action, the specific use case, what it does not do, and the return value. It also references a sibling tool for alternative behavior, making it fully self-sufficient for an agent to select and invoke.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description does not need to explain parameter syntax, but it adds contextual meaning about the tool's purpose and return value, which helps the agent understand the invocation context.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Save') and resource ('payment method') plus a clear scope: used ONLY to pay for flight bookings. It distinguishes itself from sibling tools by explicitly stating it does not fund cards or cash balance, which sets it apart from tools like add_card and add_funds.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit usage guidance: this tool is for saving a payment method for flight bookings only. It provides an explicit exclusion ('does NOT fund cards or the cash balance') and names the alternative tool ('see add_funds'), making it clear when not to use this tool and what to use instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_kycA
Idempotent
Inspect

Begin (or resume) identity verification. Verification is CONVERSATIONAL: it starts with a photo of the user's government ID — the backend reads the printed details automatically and the user confirms every value. Only fields the ID does not carry are asked (like the SSN for US documents, or the national ID number for non-US ones); occupation/income questions are never asked. The only browser step is a short face scan at the end. Relay each step to the user as ONE SHORT message (one or two sentences — the current ask only, never the whole flow, never an unrequested link). Returns the next step, ID-photo upload options, and (for legacy hosted-flow accounts) a hosted verification URL instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
terms_acceptedNoDEPRECATED — use agreements_accepted. Pass true once the user has explicitly agreed to the card issuer's cardholder terms in the conversation.
agreements_acceptedNoKeys of the User Agreements the user explicitly accepted, one by one (the full required set from the agreements list — e.g. e_sign, account_opening_privacy, card_terms, accuracy, non_solicitation). Only pass after presenting each agreement verbatim and getting a yes covering all of them.

Output Schema

ParametersJSON Schema
NameRequiredDescription
reasonNoProvider reason on rejection.
statusNo"started", "verified", "rejected", or "unknown".
messageYesHuman-readable summary / next step.
nextStepNoConversational step: id_document | fields | terms | face_verification | review_pending | verified | rejected.
uploadUrlNoBrowser upload page for the ID photo (1h validity).
missingFieldsNoFields still needed from the user.
verificationUrlNoFace-scan page (conversational flow) or hosted verification URL (legacy flow), 48h validity.

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds detailed behavioral context beyond annotations: explains the interactive process, which fields are automatically read vs. asked, that occupation/income are never asked, and the return value structure (next step, upload options, hosted URL). No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Packs much information but includes instructions to the agent ('Relay each step as one short message') that could be considered extraneous. Front-loaded purpose, but could be more concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of identity verification, the description covers the process, input constraints, and expected outputs. Output schema exists to define return values, so description need not detail them.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. Description adds value by clarifying that 'terms_accepted' is deprecated and 'agreements_accepted' expects specific keys (e_sign, etc.), and explains the acceptance process.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Begin (or resume) identity verification.' Describes the conversational flow and differentiates from siblings like check_kyc_document or submit_kyc_fields by specifying this is the initial step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Describes when to use (starting/resuming KYC) and provides conversational guidance, but does not explicitly state when not to use or mention alternatives among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_phone_verificationAInspect

Send (or re-send) the user's one-time funding verification code (the provider verifies the phone on the user's Agentcard identity, valid 60 days). add_funds already sends this code automatically when verification is needed — call this tool only to RE-send when the code never arrived (any unexpired code still works; sends are rate-limited). Returns the masked destination (text or email) and whether a code was sent; if the phone is already verified it says so and you go straight to add_funds. After the user reads back the code, call verify_phone.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYesHuman-readable result or next step.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations show readOnlyHint=false and destructiveHint=false; description adds that tool is rate-limited, returns masked destination and whether code was sent, and explains behavior when phone is already verified. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single well-written paragraph that front-loads the main action and includes all necessary details without fluff. Could be slightly more structured, but efficiently conveys all key information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and presence of output schema (inferred), description covers return values, next step (verify_phone), and contrasts with sibling tools. Completely sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema is empty (0 params), baseline 4 per instructions. Description does not need to add parameter info, but does not provide extra semantics beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the tool sends a one-time verification code, distinguishes it from add_funds (which auto-sends) and verify_phone (next step). Specific verb 'send/re-send' and resource 'verification code' are explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to use only to re-send when code never arrived, mentions rate limits, that unexpired codes still work, and when phone is already verified to go straight to add_funds. Provides clear when-to-use and when-not-to-use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

start_support_chatA
Idempotent
Inspect

Start a new support conversation and send the first message

ParametersJSON Schema
NameRequiredDescriptionDefault
messageYesYour initial support message

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYesHuman-readable summary confirming the conversation was started.
conversationIdNoThe ID of the newly created support conversation. Pass this to send_support_message or read_support_chat.

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide idempotentHint=true, but the description says 'start a new conversation', which may imply non-idempotent behavior. No additional context on side effects, authentication, or conversation limits is given, so transparency is moderate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence with no wasted words. It is front-loaded and gets to the point, though it could be slightly more informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one parameter and output schema, the description is sufficiently complete for an AI agent to use. Missing behavioral clarifications are minor given the annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'message' is fully described in the schema with clear meaning. The description adds no extra detail, so the baseline of 3 applies due to high schema coverage (100%).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'start' and resource 'support conversation', and specifies the action of sending the first message. It distinguishes itself from sibling tools like 'send_support_message' (for existing conversations) and 'read_support_chat'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use (initiate a new chat), but lacks explicit guidance on prerequisites or alternatives. However, the context from sibling tools provides enough distinction for an AI agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submit_kyc_documentAInspect

Submit the user's ID photo for identity verification. Ways in: (a) image data you hold programmatically (e.g. the user sent the photo in this chat and your platform exposes its bytes) — pass front_base64 (and back_base64 for a license back; its barcode reads most accurately); (b) local (stdio) mode — pass file_path/back_file_path and the file is read from disk; (c) neither — you get a secure upload link to hand the user. Do NOT ask the user what kind of document it is or where it was issued — the type and country are detected automatically from the photo; only relay a question if the result says the type could not be determined. Returns the fields read off the document — SHOW THEM TO THE USER for confirmation before continuing — plus whatever is still missing. If the result says NO identity details could be read, the image did not read as an ID at all: never insist to the user that it was their ID. Supported: JPEG/PNG/WebP up to 12MB (convert HEIC or HEIF photos first).

ParametersJSON Schema
NameRequiredDescriptionDefault
file_pathNoLocal path to the ID photo (front of license, or passport photo page). Local/stdio connections only — remote connections without image data receive an upload link instead.
back_base64NoBase64 image bytes of the license back (optional, recommended — the barcode reads most accurately). Same rule: programmatically sourced only.
front_base64NoBase64 image bytes of the ID front (or passport photo page). ONLY pass base64 you received programmatically from your platform (e.g. an injected chat attachment) — never type or reconstruct image bytes yourself.
document_typeNoONLY pass this when the user themselves said what the document is ("here's my license") — otherwise omit it; the type is detected from the photo. Never ask up front.
back_file_pathNoLocal path to the back of the license (optional, recommended). Local/stdio connections only.
back_mime_typeNoMIME type of back_base64. Defaults to image/jpeg.
front_mime_typeNoMIME type of front_base64 (image/jpeg, image/png, image/webp). Defaults to image/jpeg.
issuing_countryNo2-letter ISO country that issued the document (e.g. US, AR). ONLY when the user volunteered it — otherwise omit; it is detected from the photo. Never ask up front.

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusNoprocessed | document_expired | upload_failed | upload_link_provided
messageYes
nextStepNo
extractedNoFields read from the document (confirm with the user).
uploadUrlNo
unreadableNoTrue when the image was received but NO identity fields could be read from it — it did not read as an ID; never assert to the user that it was one.
missingFieldsNo
verificationUrlNo

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond annotations: discloses automatic detection, the need to show extracted fields to the user, the failure meaning, supported formats and size limit, and HEIC/HEIF conversion requirement. Annotations are only boolean hints; this text supplies the real behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but structured with (a)/(b)/(c), and every clause carries operational value. The most important constraints (don't ask type/country, show extracted fields, failure handling) come after the input-method breakdown; no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (8 params, multiple input modes, user-interaction constraints) and an available output schema, the description covers all deciding factors: when each input form applies, file requirements, and how to interpret/respond to results. No critical gap for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the description still adds meaning: front_base64 must be programmatically obtained and never reconstructed; document_type/issuing_country should only be passed when the user volunteered them; back barcode accuracy; local-only paths. This materially improves parameter selection beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description states a specific action—submit the user's ID photo for identity verification—and distinguishes among three input modes (base64, local file path, upload link). The wording clearly separates this from similar KYC siblings like submit_kyc_fields/check_kyc_document by emphasizing automatic detection and submission of the photo itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use routing by source of image data: (a) programmatic bytes, (b) local stdio paths, (c) otherwise upload link. Also gives when-not-to instructions: never ask document type/country, only ask if result says type undetermined, and never insist an unreadable image was an ID.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submit_kyc_fieldsAInspect

Submit identity fields for verification: the ones the ID photo didn't carry (listed by missingFields — the tax/ID number always has to be asked since IDs don't print it; call it "SSN" only for US documents and "national ID number" otherwise), corrections to extracted values the user flagged, and the User Agreements acceptance (agreements_accepted, after presenting each agreement verbatim). That number is forwarded directly to the verification provider and never stored by Agentcard. NEVER ask about occupation, income, spending volume, or account purpose — those are filled automatically and must not be asked.

ParametersJSON Schema
NameRequiredDescriptionDefault
ssnNoUS documents: 9-digit SSN, dashes optional. Non-US documents: the national ID / tax number printed on the ID. Forward-only — never stored.
last_nameNoLegal last name, exactly as printed on the ID document.
first_nameNoLegal first name, exactly as printed on the ID document.
address_cityNoCity of the residential address.
phone_numberNoE.164 with country code, e.g. +14155551234.
address_line1NoResidential street address, line 1 (e.g. 123 Main St).
address_line2NoResidential street address, line 2 — apartment, suite, or unit. Omit if none.
date_of_birthNoYYYY-MM-DD
address_regionNo2-letter state code for US (e.g. CA).
terms_acceptedNoDEPRECATED — use agreements_accepted. true once the user explicitly accepted the card issuer's cardholder terms.
address_postal_codeNoPostal / ZIP code of the residential address.
agreements_acceptedNoKeys of the User Agreements the user explicitly accepted, one by one — the FULL required set from the agreements list in the previous step's result. Only pass after presenting each agreement verbatim and getting an explicit yes covering all of them.
address_country_codeNo2-letter ISO country code (e.g. US).

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYes
nextStepNo
missingFieldsNo
verificationUrlNoFace-scan link, present once everything is collected.

TDQS

A4.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses that SSN is forwarded to verification provider and never stored by Agentcard, and agreements must be presented verbatim. Annotations show readOnlyHint=false so write behavior is expected; description adds data handling details. Slightly lacking idempotency or side-effect info, but strong overall.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then concise details. Every sentence adds value, no redundancy. Efficiently covers all important aspects without extraneous text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 13-parameter tool with output schema, the description covers boundary behaviors (what not to ask), data retention policy, and required user interaction for agreements. Thorough and complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and description adds critical meaning: explains which params correspond to missingFields vs corrections vs agreements, clarifies SSN handling, and mandates agreement presentation. Goes far beyond schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Submit identity fields for verification' and lists specific categories (missingFields, corrections, agreements). Distinguishes from sibling tools like submit_kyc_document and start_kyc by specifying its unique role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use: when ID photo didn't carry fields, corrections needed, and agreements acceptance. Includes explicit 'NEVER ask' instructions for irrelevant fields. Implicitly distinguishes from siblings like submit_kyc_document (document upload) and start_kyc (initiation).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submit_user_infoAInspect

Submit the user's phone number and terms acceptance for a virtual card. Call this after create_card returns user_info_required. Do NOT ask the user for occupation, income, or account purpose — those are never asked. Identity fields (name, date of birth, SSN / national ID, address) belong to the KYC flow: create_card tells you whether it runs conversationally (start_kyc → ID photo → face scan) or via a hosted verification_url. After phone + terms are saved, retry create_card.

ParametersJSON Schema
NameRequiredDescriptionDefault
phone_numberYesUser's phone number in international E.164 format with a country code (e.g. +1 555 123 4567, +44 7911 123456)
terms_acceptedYesMust be true — the user accepted the AgentCard cardholder terms of service

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusNoOutcome of the submission: 'saved' when the user information was stored successfully.
messageYesHuman-readable confirmation that the user information was saved.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate this is a mutation (readOnlyHint=false) but not destructive. The description correctly implies a write operation and explains the expected outcome (saves data then retry). No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single coherent paragraph with no redundancy. It efficiently conveys purpose, usage, and exclusions. Could be slightly more structured but is well-organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of the sibling tools and the orchestration context, the description thoroughly explains the tool's role in the broader flow, including post-submission actions and limits on user prompts.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema already provides full coverage with descriptions for both parameters (phone_number format, terms_accepted must be true). The description does not add significant new semantic details beyond the schema, though it contextualizes them within the workflow.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool's purpose: submitting phone number and terms acceptance for a virtual card. It distinguishes this from other flows like KYC and explicitly ties it to the create_card workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use guidance: call after create_card returns user_info_required. Also states what not to ask (occupation, income, etc.) and what to do after submitting (retry create_card).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

surprise_meAInspect

Buy the user something totally unexpected and very silly/stupid-fun under a small dollar cap (default $10, hard max $25). Great when the user cannot decide what to order (from DoorDash etc.) or just wants a fun surprise. It kicks off a shopping conversation that FIRST brainstorms deliberately stupid ideas, picks ONE genuinely unexpected item, builds the cart, and shows the item + exact total. It NEVER checks out by itself: the reply includes a conversation_id — relay the user's explicit confirmation ("yes, place it") through the buy tool on that SAME conversation_id, exactly like a normal order. Each surprise_me call starts a fresh surprise; use buy for all follow-ups (answers, tweaks, the confirmation).

ParametersJSON Schema
NameRequiredDescriptionDefault
vibeNoOptional notes/vibe from the user, e.g. "make it food", "something for my desk", "they love ducks".
merchantNoOptional merchant hint the surprise should come from, e.g. 'doordash'. Omit to let the agent pick.
max_dollarsNoHard spend cap in dollars, total including fees. Optional; default 10, values above 25 are clamped to 25.

Output Schema

ParametersJSON Schema
NameRequiredDescription
statusNoDiscriminator for the outcome. 'assistant_turn' when the buy loop replied; 'conversation_start_failed' or 'request_failed' on errors.
messageYesThe assistant's conversational turn (it may ask for the delivery address, show the cart + total, confirm, or report a placed order), or an error explanation.
messagesNoThe same turn split into ordered messages for multi-bubble surfaces (each narration segment, then the final reply/confirmation). `message` is the same content consolidated; clients that show one bubble should use `message` and ignore this.
conversation_idNoThe conversation id to thread back as conversation_id on the next buy call to continue the SAME order. Present on a successful assistant turn.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Describes the multi-step workflow: brainstorms ideas, picks one, builds cart, shows item+total. Notes it requires explicit user confirmation through a separate tool. Annotations support this (readOnlyHint=false, openWorldHint=true). Adds context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-structured: main action first, then workflow, then limitations. Every sentence adds information. Slightly long but justified by complexity; no wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers usage, workflow, integration with sibling tool, and constraints. Missing output schema details but description states what is shown. Sufficient given openWorldHint annotation and no undefined behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers 100% with descriptions, but description adds value: explains default max_dollars (10), hard clamp (25), and 'merchant' being optional. Provides behavioral nuance not in schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states verb (buy), resource (something unexpected), and scope (under a small dollar cap, default $10, hard max $25). Distinguishes from sibling tools like 'buy' which handles normal orders and checkout.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use: 'when the user cannot decide what to order or just wants a fun surprise'. Also clarifies when not to rely on it for checkout: 'It NEVER checks out by itself' and directs follow-up via the 'buy' tool on the same conversation_id.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_card_limitA
Idempotent
Inspect

Change a multi-use card's total spending limit. Raising it reserves the extra amount from the user's cash balance (top up with add_funds if short); lowering it frees the difference, but the new limit can never go below what the card has already spent. Single-use cards cannot be resized.

ParametersJSON Schema
NameRequiredDescriptionDefault
card_idYesThe multi-use card ID to resize.
approval_idNoApproval id from a prior approval_required response, once the user has approved. Only for cards created through ANOTHER app: first call without it (the user is emailed an approve link), then retry with it.
new_limit_centsNoDeprecated alias for spend_limit_cents. Prefer spend_limit_cents (matches the docs and the REST API).
spend_limit_centsNoThe new TOTAL spending limit in cents (minimum 100). This is the lifetime cap, not a delta: a card that spent $20 of a $50 limit, resized to 8000, can spend $60 more.

Output Schema

ParametersJSON Schema
NameRequiredDescription
cardIdNoThe card ID.
statusNo"updated" on success; an error discriminator otherwise (e.g. "limit_below_spent", "insufficient_collateral").
messageYesHuman-readable result.
balanceCentsNoThe remaining spendable balance in cents.
spendLimitCentsNoThe new total limit in cents.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already set readOnlyHint=false, idempotentHint=true, destructiveHint=false. The description adds key behaviors: raising reserves extra balance, lowering frees difference, limit floor of current spent, and the need for approval_id with cross-app cards. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one concise paragraph starting with the main action, then effects, then restrictions. Every sentence adds value without waste. Minor improvement could be shorter phrasing but overall well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 4 parameters, 1 required, and an output schema, the description covers the core behavior, special case of approval_id, and single-use restriction. It omits edge cases like what happens if limit unchanged but balance affected, but output schema likely covers return. Adequate for an update tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description provides a high-level overview but does not add meaningful detail beyond what the schema already describes for each parameter (e.g., card_id, approval_id, etc.).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses the verb 'Change' with the specific resource 'multi-use card's total spending limit', clearly distinguishing it from siblings like close_card or pause_card. It also explicitly states that single-use cards cannot be resized, further differentiating tool scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use the tool (to adjust spending limit), provides context for raising (needs balance, use add_funds if short) and lowering (frees balance, cannot go below spent), and warns against use with single-use cards. However, it does not explicitly compare to other card modification tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upgrade_planAInspect

Start a paid-plan upgrade. Choose the target plan: 'basic' ($15/mo — 15 cards/month, up to $500 per card) or 'pro' ($100/mo — 50 cards/month, up to $1,000 per card). Defaults to 'basic' if omitted. Returns a Stripe Checkout URL the user must open in their browser to complete payment. After they finish checkout, the plan updates automatically; verify with get_plan. Use only when the user explicitly wants to upgrade. To cancel a paid plan instead, the gated tool cancel_plan also exists; call it by name even though it isn't in the tools list.

ParametersJSON Schema
NameRequiredDescriptionDefault
planNoWhich plan to upgrade to. Defaults to 'basic'.

Output Schema

ParametersJSON Schema
NameRequiredDescription
planNoDisplay label of the target plan, e.g. 'Basic' or 'Pro'. Present when the requested plan is known.
statusNoDiscriminator for the outcome branch.
messageYesHuman-readable summary of the upgrade outcome.
checkoutUrlNoStripe Checkout URL the user must open to complete payment. Present only when status is checkout_required.

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Description discloses that the tool returns a Stripe Checkout URL the user must open, that the plan updates automatically after checkout, and the default behavior. Annotations (readOnlyHint=false etc.) are consistent and this adds detailed behavioral context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is front-loaded with the action and resources, but includes some redundancy (e.g., 'Defaults to 'basic' if omitted.' is repeated from schema). However, every sentence adds value for the agent, so it's moderately concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has one optional parameter and an output schema, the description fully explains the checkout flow, post-update verification, and when to use it. No gaps for a focused mutation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and includes the default. The description adds meaningful context about pricing limits per plan, which goes beyond the schema's enum labels, providing extra semantic value for agent decision-making.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Start a paid-plan upgrade.' It specifies the target plans (basic and pro) with pricing and limits, and distinguishes itself from the sibling cancel_plan, which is explicitly mentioned.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Use only when the user explicitly wants to upgrade.' Provides alternative (cancel_plan) and instructs to call it by name. Also mentions verifying with get_plan after checkout, giving a clear usage workflow.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

verify_phoneAInspect

Check the one-time code the user received from start_phone_verification. On success the balance is unlocked for funding (the verification stays fresh for 60 days) — call add_funds next. A wrong or expired code returns a recoverable status so you can ask the user to re-check it, or call start_phone_verification to resend.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYesThe one-time code the user received, as a string (keep any leading zeros — do not send it as a number).

Output Schema

ParametersJSON Schema
NameRequiredDescription
messageYesHuman-readable result or next step.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are minimal (readOnlyHint=false, etc.). The description adds key behavioral context: on success the balance unlocks for funding, verification lasts 60 days, and wrong/expired codes return a recoverable status. However, it doesn't detail the exact structure of the recoverable status or any other side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no wasted words. Front-loaded with purpose and immediate usage context. Every sentence provides necessary information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter tool with an output schema, the description covers input expectations, success/failure behavior, and next steps. It is fully adequate for an agent to select and invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with one parameter (code). The description adds crucial semantic instruction: 'keep any leading zeros — do not send it as a number'. This exceeds the schema's description, which only says 'as a string'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool checks a one-time code from start_phone_verification. It distinguishes itself from siblings by naming start_phone_verification and add_funds as related but distinct actions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use (after start_phone_verification, before add_funds), what to do on success (call add_funds), and how to handle failure (ask user to re-check or resend). Provides clear contextual guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

whoamiA
Read-onlyIdempotent
Inspect

Show who you are operating as: the authenticated AgentCard account's email, user id, name, plan, KYC + account status, member-since date, and how this session is connected (personal login vs a third-party OAuth app connection, with the app name). Call this when the user asks "who am I" / "which account is this", or before money-moving actions when you need to confirm the account. Read-only. KYC shown here is the stored snapshot — use get_kyc_status when you need the live, provider-checked state.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameNoCardholder name ("First Last"), or null before KYC info is submitted.
planNoSubscription plan id, e.g. 'free', 'basic', or 'pro'.
emailNoEmail of the authenticated account, or null for a phone-first account (e.g. signed up by text message).
userIdNoAgentCard user id of the authenticated account.
messageYesHuman-readable identity summary.
kycStatusNoRaw stored KYC state (e.g. approved, pending, requires_input), or null if never started.
kycVerifiedNoWhether identity verification (KYC) has passed (stored snapshot).
memberSinceNoISO timestamp the account was created.
accountStatusNoAccount standing: 'active' or 'suspended'.
connectionTypeNoHow this session authenticates: 'oauth' (third-party app connection), 'personal' (CLI/dashboard login), or 'organization' (a company's Agentcard integration acting for its end user).
connectionClientIdNoOAuth client id of the connected app, when connectionType is oauth, or organization through a company's app.
subscriptionStatusNoStripe subscription status (e.g. 'active', 'past_due'), or null on the free plan.
connectionClientNameNoDisplay name of the connected OAuth app (e.g. "Claude"), when known, for an oauth or organization connection.
connectionOrganizationIdNoOrganization id, when connectionType is organization.

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, and the description's 'Read-only' is consistent with those. However, the description adds valuable non-obvious context beyond the annotations: KYC data is a stored snapshot rather than live, and session connectivity details (personal login vs third-party OAuth app) are disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, then moves to usage triggers, then safety, then the KYC caveat and sibling routing. It is compact yet information-dense; every sentence earns its place and no filler is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter tool with an output schema present, the description covers everything an agent needs: what the tool returns, when to call it, the read-only safety profile, the stored-snapshot limitation, and the alternative for live KYC. No material gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and an empty input schema, so 100% schema coverage is automatic and there is nothing for the description to add. This matches the 0-param baseline, where parameter semantics are inherently satisfied.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource ('Show who you are operating as') and enumerates the exact fields returned: email, user id, name, plan, KYC + account status, member-since date, and session connection type. It also distinguishes this tool from get_kyc_status by clarifying the stored-snapshot vs live-state difference, so an agent can tell it apart from siblings without opening schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit trigger conditions: call when the user asks 'who am I' / 'which account is this', or before money-moving actions when account confirmation is needed. It also provides a direct alternative with a selection rule: use get_kyc_status when the live, provider-checked KYC state is required instead of the stored snapshot.

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.

  1. 1 tool update
    • Changedwhoami2 fields changed
      • changedOutput schema / properties / connectionClientId / description
        Previous value: -"OAuth client id of the connected app, when connectionType is oauth."New value: +"OAuth client id of the connected app, when connectionType is oauth, or organization through a company's app."
      • changedOutput schema / properties / connectionClientName / description
        Previous value: -"Display name of the connected OAuth app (e.g. \"Claude\"), when known."New value: +"Display name of the connected OAuth app (e.g. \"Claude\"), when known, for an oauth or organization connection."
  2. 1 tool update
    • Changedbuy_list_merchants2 fields changed
      • changedOutput schema / properties / merchants / items / properties / link_status / description
        Previous value: -"Whether the user has linked this merchant (e.g. 'linked', 'not_linked')."New value: +"'ready' (no account needed) or 'linked' (account linked): shop now. 'unlinked': no account linked yet. 'pending': a link was started and not finished. 'error': the last link attempt failed."
      • removedOutput schema / properties / merchants / items / properties / money_path
        Removed value: -{
        -  "description": "Funding/money path for the merchant, when applicable.",
        -  "type": "string"
        -}
  3. 3 tool updates
    • Removedcreate_withdrawal_recipient
    • Removedlist_withdrawal_recipients
    • Removedwithdraw
  4. 2 tool updates
    • Changedget_plan2 fields changed
      • addedOutput schema / properties / activeMultiUseCards
        Added value: +{
        +  "description": "How many multi-use cards the user currently holds open (they hold their limit as collateral for their whole life, so closing one frees a slot).",
        +  "type": "number"
        +}
      • addedOutput schema / properties / maxActiveMultiUseCards
        Added value: +{
        +  "description": "How many multi-use cards may be open at once. 0 means multi-use cards need a paid plan and create_card with type \"multi_use\" will be refused; null means unlimited (company-governed).",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
    • Changedlist_transactions1 field changed
      • addedOutput schema / properties / transactions / items / properties / processorTransactionId
        Added value: +{
        +  "description": "The card processor's reference for the charge, the value transaction.* webhook events carry as data.id (their transaction_id is this row's id). Null for wallet-funding rows.",
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
  5. 9 tool updates
    • Changedadd_funds1 field changed
      • changedInput schema / properties / payment_method / description
        Previous value: -"Payment method for the checkout. Defaults to apple_pay."New value: +"Payment method for the checkout: apple_pay or google_pay. Ask the user which one their device has; apple_pay only when unknown."
    • Changedallow_card_merchant2 fields changed
      • changedInput schema / properties / card_id / description
        Previous value: -"Card id (from list_cards). Required when scope is \"card\" (default)."New value: +"Card id (from list_cards)."
      • removedInput schema / properties / scope
        Removed value: -{
        -  "description": "Where to remember the merchant. Default \"card\". Use \"account\" for the standing preset (omit card_id).",
        -  "enum": [
        -    "card",
        -    "account"
        -  ],
        -  "type": "string"
        -}
    • Changedcreate_card1 field changed
      • changedInput schema / properties / preset / description
        Previous value: -"Preset for this card: a template name (ai_labs, weekday_meals, cli_only, daily), comma-separated templates, a saved preset name/id, inline JSON privileges, or { name?, privileges }. Adds restrictions only — omit for a normal unrestricted card (or to inherit the account default)."New value: +"Preset for this card: a template name (ai_labs, weekday_meals, cli_only, daily), comma-separated templates, a saved preset name/id, inline JSON privileges, or { name?, privileges }. Adds restrictions only — omit for a normal unrestricted card."
    • Changedget_card_preset3 fields changed
      • changedInput schema / properties / card_id / description
        Previous value: -"The card id (from list_cards). Omit to read the account default preset (or for_app's, if set)."New value: +"The card id (from list_cards)."
      • removedInput schema / properties / for_app
        Removed value: -{
        -  "description": "Read a specific app's standing preset instead of the account default: \"cli\" for the CLI, a connected app's name, or its client id. Ignored when card_id is set.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[]New value: +[
        +  "card_id"
        +]
    • Changedget_wallet_link1 field changed
      • changedOutput schema / properties / kind / description
        Previous value: -"purpose add_card only: how the vault link signs the user in. \"connected\" = a one-time code to their own phone or email; \"handoff\" = directly; \"open\" = Face ID setup or passkey sign-in."New value: +"purpose add_card only: how the vault link signs the user in. \"connected\" = a one-time code to their own phone or email; \"handoff\" = directly; \"open\" = passkey setup or passkey sign-in."
    • Changedlist_cards1 field changed
      • changedOutput schema / properties / vaultCards / description
        Previous value: -"The user's own cards stored in their Agentcard vault. Display fields only; they pay through buy with a Face ID approval and never expose a card number."New value: +"The user's own cards stored in their Agentcard vault. Display fields only; they pay through buy with an approval on the user's device (their passkey or master password) and never expose a card number."
    • Changedsave_preset7 fields changed
      • addedInput schema / properties / categories
        Added value: +{
        +  "description": "Comma-separated spend categories to allow, e.g. \"meals,groceries\" (meals, groceries, travel, software, ai, wellness, retail).",
        +  "type": "string"
        +}
      • addedInput schema / properties / currencies
        Added value: +{
        +  "description": "Comma-separated purchase currencies to allow: ISO 4217 codes or common names, e.g. \"usd,eur\" or \"dollars,euros,pounds,yen\". In strict mode a purchase in another currency is refused at checkout and a settled charge in another currency pauses the card. Checked by Agentcard at checkout and settlement, not by the card network. Unknown currencies are refused.",
        +  "type": "string"
        +}
      • addedInput schema / properties / mode
        Added value: +{
        +  "description": "What the preset does when a purchase breaks any of its rules: \"strict\" refuses it (the default), \"watch\" lets it through and tells the user once.",
        +  "enum": [
        +    "strict",
        +    "watch"
        +  ],
        +  "type": "string"
        +}
      • removedInput schema / properties / only_categories
        Removed value: -{
        -  "description": "Comma-separated spend categories to allow (strict), e.g. \"meals,groceries\" (meals, groceries, travel, software, ai, wellness, retail).",
        -  "type": "string"
        -}
      • removedInput schema / properties / only_currencies
        Removed value: -{
        -  "description": "Comma-separated purchase currencies to allow (strict): ISO 4217 codes or common names, e.g. \"usd,eur\" or \"dollars,euros,pounds,yen\". A purchase in another currency is refused at checkout; a settled charge in another currency pauses the card. Checked by Agentcard at checkout and settlement, not by the card network. Unknown currencies are refused.",
        -  "type": "string"
        -}
      • removedInput schema / properties / watch_categories
        Removed value: -{
        -  "description": "Categories in Watch mode (allow + notify on mismatch instead of refuse/pause): meals, groceries, travel, software, ai, wellness, retail. Spend caps, places, time windows, and merchant-only rules stay strict.",
        -  "type": "string"
        -}
      • removedInput schema / properties / watch_currencies
        Removed value: -{
        -  "description": "Purchase currencies in Watch mode (allow + notify on mismatch instead of refuse/pause), e.g. \"usd,eur\". Checked by Agentcard, not by the card network. Use only_currencies or watch_currencies, not both.",
        -  "type": "string"
        -}
    • Changedset_card_preset3 fields changed
      • changedInput schema / properties / card_id / description
        Previous value: -"The card id. Omit to set the account default preset (or for_app's, if set)."New value: +"The card id (from list_cards)."
      • removedInput schema / properties / for_app
        Removed value: -{
        -  "description": "Set a specific app's standing preset instead of the account default: \"cli\" for the CLI, a connected app's name, or its client id. Ignored when card_id is set.",
        -  "type": "string"
        -}
      • changedInput schema / required
        Previous value: -[
        -  "preset"
        -]New value: +[
        +  "card_id",
        +  "preset"
        +]
    • Changedwhoami1 field changed
      • changedOutput schema / properties / email / description
        Previous value: -"Email of the authenticated account, or null for a phone-first account (e.g. signed up by SMS on the iMessage relay)."New value: +"Email of the authenticated account, or null for a phone-first account (e.g. signed up by text message)."
  6. 2 tool updates
    • Addedname_card
    • Addedrecommend_card
  7. 1 tool update
    • Changedsave_preset2 fields changed
      • addedInput schema / properties / only_currencies
        Added value: +{
        +  "description": "Comma-separated purchase currencies to allow (strict): ISO 4217 codes or common names, e.g. \"usd,eur\" or \"dollars,euros,pounds,yen\". A purchase in another currency is refused at checkout; a settled charge in another currency pauses the card. Checked by Agentcard at checkout and settlement, not by the card network. Unknown currencies are refused.",
        +  "type": "string"
        +}
      • addedInput schema / properties / watch_currencies
        Added value: +{
        +  "description": "Purchase currencies in Watch mode (allow + notify on mismatch instead of refuse/pause), e.g. \"usd,eur\". Checked by Agentcard, not by the card network. Use only_currencies or watch_currencies, not both.",
        +  "type": "string"
        +}
  8. 9 tool updates
    • Addedallow_card_merchant
    • Changedcreate_card7 fields changed
      • addedInput schema / properties / pending_card_id
        Added value: +{
        +  "description": "Only when retrying an approval_pending purchase whose preset has since changed: the cardId from that earlier answer, together with purchase_key. The older approval link is retired once the replacement is minted. Never pass it for a different purchase.",
        +  "type": "string"
        +}
      • addedInput schema / properties / preset
        Added value: +{
        +  "description": "Preset for this card: a template name (ai_labs, weekday_meals, cli_only, daily), comma-separated templates, a saved preset name/id, inline JSON privileges, or { name?, privileges }. Adds restrictions only — omit for a normal unrestricted card (or to inherit the account default).",
        +  "oneOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "properties": {
        +        "name": {
        +          "type": "string"
        +        },
        +        "privileges": {
        +          "items": {},
        +          "type": "array"
        +        }
        +      },
        +      "required": [
        +        "privileges"
        +      ],
        +      "type": "object"
        +    }
        +  ]
        +}
      • addedInput schema / properties / purchase_key
        Added value: +{
        +  "description": "The purchaseKey from the same approval_pending answer as pending_card_id; the pair proves the retry is for that purchase.",
        +  "type": "string"
        +}
      • changedInput schema / properties / scope_preset / description
        Previous value: -"Create an AI card: a multi-use card restricted to AI-lab merchants (OpenAI, Anthropic, Gemini); charges anywhere else are declined at authorization. AI cards earn boosted tokenback on eligible spend. Implies type 'multi_use'."New value: +"Silent alias for preset 'ai_labs': a multi-use card restricted to AI-lab merchants (OpenAI, Anthropic, Gemini); charges anywhere else are declined at authorization. AI cards earn boosted tokenback on eligible spend. Implies type 'multi_use'. Prefer `preset`."
      • addedOutput schema / properties / pendingCardId
        Added value: +{
        +  "description": "The parked card awaiting the passkey. Present only when status is \"approval_pending\"; pass it back as pending_card_id on the retry, with purchaseKey as purchase_key.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / preset
        Added value: +{
        +  "description": "Preset summary for the new card, or null when unrestricted. Present when status is \"created\".",
        +  "properties": {
        +    "id": {
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "summary": {
        +      "type": "string"
        +    },
        +    "version": {
        +      "type": "number"
        +    }
        +  },
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / purchaseKey
        Added value: +{
        +  "description": "The purchase's key. Present only when status is \"approval_pending\"; pass it back as purchase_key with pending_card_id.",
        +  "type": "string"
        +}
    • Addeddelete_preset
    • Changedget_card_details1 field changed
      • changedOutput schema / properties / status / description
        Previous value: -"Outcome discriminator: \"details\" when credentials were returned, \"approval_required\" when human approval is needed first, \"not_accessible\" when the card exists outside this connection's scope, \"managed_by_organization\" for org-issued read-only cards."New value: +"Outcome discriminator: \"details\" when credentials were returned, \"approval_required\" when human approval is needed first, \"not_accessible\" when the card exists outside this connection's scope, \"policy_denied\" when the card preset blocks reveal (message is the deny reason), \"managed_by_organization\" for org-issued read-only cards."
    • Addedget_card_preset
    • Changedlist_cards3 fields changed
      • addedOutput schema / properties / cards / items / properties / preset
        Added value: +{
        +  "description": "Preset summary when the card has restrictions; omit or null when unrestricted.",
        +  "properties": {
        +    "id": {
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "summary": {
        +      "type": "string"
        +    },
        +    "version": {
        +      "type": "number"
        +    }
        +  },
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / connectedAccounts / items / properties / cards / items / properties / preset
        Added value: +{
        +  "description": "Preset summary when present.",
        +  "properties": {
        +    "id": {
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "summary": {
        +      "type": "string"
        +    },
        +    "version": {
        +      "type": "number"
        +    }
        +  },
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / wallet / items / properties / preset
        Added value: +{
        +  "description": "Preset summary when present.",
        +  "properties": {
        +    "id": {
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "summary": {
        +      "type": "string"
        +    },
        +    "version": {
        +      "type": "number"
        +    }
        +  },
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
    • Addedlist_presets
    • Addedsave_preset
    • Addedset_card_preset
  9. 2 tool updates
    • Changedcreate_card3 fields changed
      • changedInput schema / properties / restart_setup / description
        Previous value: -"Set true ONLY when the user lost or never received a vault link, it expired (about 15 minutes), or they want to add ANOTHER card. Never needed on the first call or for normal retries."New value: +"Set true ONLY when the user lost or never received a vault link, it expired (about 15 minutes), or they want to add ANOTHER card. Never needed on the first call or for normal retries. amount_cents is still required on this call (the link itself carries no amount)."
      • addedOutput schema / properties / maxAmountCents
        Added value: +{
        +  "description": "The issuing rail's per-card ceiling in cents. Present when status is \"limit_reached\" because the amount exceeded that ceiling; retry with amount_cents at most this value.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / status / description
        Previous value: -"Outcome discriminator: \"created\" (card issued), \"vault_started\" (first-time setup: send vaultUrl to the user; once their card is in the vault, purchases go through buy, not create_card), \"vault_ready\" (the user's own card is already in their vault: use buy; only source \"issued\" produces a card number), \"attach_started\" / \"attach_pending\" (an older add-card enrollment still in flight: send attachUrl or wait, then call again with the same arguments), \"issuing_suggested\" (legacy servers only: offer the balance-funded fallback, noting it requires KYC, and only then call again with source \"issued\"), \"approval_required\" (human approval needed), \"approval_pending\" (added-card passkey approval: send approvalUrl to the user, then retry with the same arguments in ~10s), \"kyc_required\" (issued path only), \"user_info_required\" (check missingFields: phone/terms go through submit_user_info; consent must be recorded by the connecting platform), \"beta_capacity_reached\", \"issuing_balance_insufficient\" (issued path only), \"payment_method_declined\", \"limit_reached\", \"funding_in_progress\" (company wallet funding underway: retry with the same arguments in ~10s), \"funding_not_approved\", \"org_wallet_funding_required\", \"org_wallet_unavailable\" (the company wallet backing this account is not active: the company must finish setup; do not retry immediately), or \"rate_limited\" (wait ~1 minute, then retry)."New value: +"Outcome discriminator: \"created\" (card issued), \"vault_started\" (first-time setup: send vaultUrl to the user; once their card is in the vault, purchases go through buy, not create_card), \"vault_ready\" (the user's own card is already in their vault: use buy; only source \"issued\" produces a card number), \"attach_started\" / \"attach_pending\" (an older add-card enrollment still in flight: send attachUrl or wait, then call again with the same arguments), \"issuing_suggested\" (legacy servers only: offer the balance-funded fallback, noting it requires KYC, and only then call again with source \"issued\"), \"approval_required\" (human approval needed), \"approval_pending\" (added-card passkey approval: send approvalUrl to the user, then retry with the same arguments in ~10s), \"kyc_required\" (issued path only), \"user_info_required\" (check missingFields: phone/terms go through submit_user_info; consent must be recorded by the connecting platform), \"beta_capacity_reached\", \"issuing_balance_insufficient\" (issued path only), \"payment_method_declined\", \"limit_reached\", \"funding_in_progress\" (company wallet funding underway: retry with the same arguments in ~10s), \"funding_not_approved\", \"org_wallet_funding_required\", \"org_wallet_unavailable\" (the company wallet backing this account is not active: the company must finish setup; do not retry immediately), \"rate_limited\" (wait ~1 minute, then retry), \"issuer_daily_limit\" (the issuing rail's daily card budget is spent: retry in about an hour, never in a loop), \"issuer_capacity\" / \"wallet_balance_unavailable\" (the rail is briefly unavailable: retry shortly). A refusal this build does not model relays the backend's own code here with its message."
    • Changedget_plan4 fields changed
      • changedOutput schema / properties / maxCardAmountCents / description
        Previous value: -"Maximum funding per card, in cents; null means no per-card cap."New value: +"The per-card cap in effect, in cents: the tighter of the plan cap and the issuing rail's own ceiling; null means no per-card cap at all."
      • changedOutput schema / properties / maxCardAmountDollars / description
        Previous value: -"Maximum funding per card, formatted as USD dollars, e.g. \"500.00\"; null means no per-card cap."New value: +"The per-card cap in effect, formatted as USD dollars, e.g. \"500.00\"; null means no per-card cap."
      • addedOutput schema / properties / planMaxCardAmountCents
        Added value: +{
        +  "description": "The personal plan's per-card cap, in cents; null for company-governed connections (no plan cap).",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / railMaxCardAmountCents
        Added value: +{
        +  "description": "The issuing rail's own per-card ceiling for cards funded from the cash balance (source \"issued\"), in cents, when the rail this account mints on has one; enforced when such a card is created, not on purchases against the user's own added card. null when the rail has none.",
        +  "type": [
        +    "number",
        +    "null"
        +  ]
        +}
  10. 3 tool updates
    • Changedcreate_card8 fields changed
      • changedInput schema / properties / restart_setup / description
        Previous value: -"Set true ONLY when the user lost or never received a pending add-card link (mints a fresh one), or wants to add ANOTHER card while one is already active. Never needed on the first call or for normal retries."New value: +"Set true ONLY when the user lost or never received a vault link, it expired (about 15 minutes), or they want to add ANOTHER card. Never needed on the first call or for normal retries."
      • changedInput schema / properties / source / description
        Previous value: -"Force the card to be funded from the user's cash balance (the issued path: KYC + wallet funding) even when they have an added card or would otherwise be offered the add-card flow. Use it only after the user explicitly picks the balance option. Omit for the default (an active added card wins; first-time users get the add-card flow)."New value: +"Force the card to be funded from the user's cash balance (the issued path: KYC + wallet funding) even when they have an added or vaulted card or would otherwise be offered the vault. Use it only after the user explicitly picks the balance option. Omit for the default (an active added card wins; first-time users get the vault link)."
      • changedOutput schema / properties / attachUrl / description
        Previous value: -"The secure link the user opens to add their card. Present only when status is \"attach_started\"."New value: +"The secure link the user opens to finish an older add-card enrollment. Present only when status is \"attach_started\"."
      • changedOutput schema / properties / expiresAt / description
        Previous value: -"When the add-card link expires (ISO 8601). Present only when status is \"attach_started\"."New value: +"When the link expires (ISO 8601). Present when status is \"vault_started\" or \"attach_started\"."
      • changedOutput schema / properties / reason / description
        Previous value: -"On \"issuing_suggested\": why the card could not be added (e.g. \"issuer_excluded\", \"commercial_card\", \"attach_unavailable\"). On \"kyc_required\": why the previous identity-verification attempt failed (e.g. \"document_unverified_other\"), present only when a prior attempt was rejected."New value: +"On \"issuing_suggested\" (legacy servers only; current servers route every first-time user to the vault instead): why the card could not be added. On \"kyc_required\": why the previous identity-verification attempt failed (e.g. \"document_unverified_other\"), present only when a prior attempt was rejected."
      • changedOutput schema / properties / status / description
        Previous value: -"Outcome discriminator: \"created\" (card issued), \"attach_started\" (first-time setup — send attachUrl to the user, then call again with the same arguments once they finish), \"attach_pending\" (user has not finished the add-card link yet), \"issuing_suggested\" (the user's card could not be added — offer the balance-funded fallback, noting it requires KYC, and only then call again with source \"issued\"), \"approval_required\" (human approval needed), \"approval_pending\" (added-card passkey approval — send approvalUrl to the user, then retry with the same arguments in ~10s), \"kyc_required\" (issued path only), \"user_info_required\" (check missingFields: phone/terms go through submit_user_info; consent must be recorded by the connecting platform), \"beta_capacity_reached\", \"issuing_balance_insufficient\" (issued path only), \"payment_method_declined\", \"limit_reached\", \"funding_in_progress\" (company wallet funding underway — retry with the same arguments in ~10s), \"funding_not_approved\", \"org_wallet_funding_required\", \"org_wallet_unavailable\" (the company wallet backing this account is not active — the company must finish setup; do not retry immediately), or \"rate_limited\" (wait ~1 minute, then retry)."New value: +"Outcome discriminator: \"created\" (card issued), \"vault_started\" (first-time setup: send vaultUrl to the user; once their card is in the vault, purchases go through buy, not create_card), \"vault_ready\" (the user's own card is already in their vault: use buy; only source \"issued\" produces a card number), \"attach_started\" / \"attach_pending\" (an older add-card enrollment still in flight: send attachUrl or wait, then call again with the same arguments), \"issuing_suggested\" (legacy servers only: offer the balance-funded fallback, noting it requires KYC, and only then call again with source \"issued\"), \"approval_required\" (human approval needed), \"approval_pending\" (added-card passkey approval: send approvalUrl to the user, then retry with the same arguments in ~10s), \"kyc_required\" (issued path only), \"user_info_required\" (check missingFields: phone/terms go through submit_user_info; consent must be recorded by the connecting platform), \"beta_capacity_reached\", \"issuing_balance_insufficient\" (issued path only), \"payment_method_declined\", \"limit_reached\", \"funding_in_progress\" (company wallet funding underway: retry with the same arguments in ~10s), \"funding_not_approved\", \"org_wallet_funding_required\", \"org_wallet_unavailable\" (the company wallet backing this account is not active: the company must finish setup; do not retry immediately), or \"rate_limited\" (wait ~1 minute, then retry)."
      • addedOutput schema / properties / vaultCards
        Added value: +{
        +  "description": "How many cards the user already holds in their vault. Present only when status is \"vault_ready\".",
        +  "type": "number"
        +}
      • addedOutput schema / properties / vaultUrl
        Added value: +{
        +  "description": "The secure link the user opens to put their card in their vault. Present only when status is \"vault_started\".",
        +  "type": "string"
        +}
    • Changedget_wallet_link2 fields changed
      • addedInput schema / properties / purpose
        Added value: +{
        +  "description": "\"wallet\" (default) opens the hosted wallet. \"add_card\" opens the vault card form so the user can put their own card on file; single-use, about 15 minutes.",
        +  "enum": [
        +    "wallet",
        +    "add_card"
        +  ],
        +  "type": "string"
        +}
      • addedOutput schema / properties / kind
        Added value: +{
        +  "description": "purpose add_card only: how the vault link signs the user in. \"connected\" = a one-time code to their own phone or email; \"handoff\" = directly; \"open\" = Face ID setup or passkey sign-in.",
        +  "type": "string"
        +}
    • Changedlist_cards1 field changed
      • addedOutput schema / properties / vaultCards
        Added value: +{
        +  "description": "The user's own cards stored in their Agentcard vault. Display fields only; they pay through buy with a Face ID approval and never expose a card number.",
        +  "items": {
        +    "properties": {
        +      "brand": {
        +        "description": "Card brand, e.g. \"visa\".",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "expiry": {
        +        "description": "Card expiry (MM/YY).",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "id": {
        +        "description": "Vault card ID.",
        +        "type": "string"
        +      },
        +      "label": {
        +        "description": "The user's nickname for the card, if any.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      },
        +      "last4": {
        +        "description": "Last four digits.",
        +        "type": [
        +          "string",
        +          "null"
        +        ]
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
  11. 3 tool updates
    • Removedadd_card
    • Changedclose_card2 fields changed
      • removedInput schema / approval_id
        Removed value: -{
        -  "description": "Approval id from a prior approval_required response, once the user has approved. Only for cards created through ANOTHER app: first call without it (the user is emailed an approve link), then retry with it.",
        -  "type": "string"
        -}
      • addedInput schema / properties / approval_id
        Added value: +{
        +  "description": "Approval id from a prior approval_required response, once the user has approved. Only for cards created through ANOTHER app: first call without it (the user is emailed an approve link), then retry with it.",
        +  "type": "string"
        +}
    • Changedcreate_card9 fields changed
      • changedInput schema / properties / connected_card_id / description
        Previous value: -"Multi-card BYOC: issue against a SPECIFIC added card (an id from the user's added cards) instead of the newest active one. Omit for the default."New value: +"Multi-card: issue against a SPECIFIC added card (an id from the user's added cards, see list_added_cards) instead of the newest active one. Omit for the default."
      • addedInput schema / properties / restart_setup
        Added value: +{
        +  "description": "Set true ONLY when the user lost or never received a pending add-card link (mints a fresh one), or wants to add ANOTHER card while one is already active. Never needed on the first call or for normal retries.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / source / description
        Previous value: -"Force the card to be funded from the user's cash balance even when they have an added card. Omit for the default (an active added card wins)."New value: +"Force the card to be funded from the user's cash balance (the issued path: KYC + wallet funding) even when they have an added card or would otherwise be offered the add-card flow. Use it only after the user explicitly picks the balance option. Omit for the default (an active added card wins; first-time users get the add-card flow)."
      • addedOutput schema / properties / attachUrl
        Added value: +{
        +  "description": "The secure link the user opens to add their card. Present only when status is \"attach_started\".",
        +  "type": "string"
        +}
      • addedOutput schema / properties / expiresAt
        Added value: +{
        +  "description": "When the add-card link expires (ISO 8601). Present only when status is \"attach_started\".",
        +  "type": "string"
        +}
      • addedOutput schema / properties / missingFields
        Added value: +{
        +  "description": "What is missing when status is \"user_info_required\" (e.g. \"termsAccepted\", \"consent\").",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / reason / description
        Previous value: -"Why the previous identity-verification attempt failed (e.g. \"document_unverified_other\"). Present only when status is \"kyc_required\" and a prior attempt was rejected."New value: +"On \"issuing_suggested\": why the card could not be added (e.g. \"issuer_excluded\", \"commercial_card\", \"attach_unavailable\"). On \"kyc_required\": why the previous identity-verification attempt failed (e.g. \"document_unverified_other\"), present only when a prior attempt was rejected."
      • changedOutput schema / properties / source / description
        Previous value: -"\"connected\" when the card was created against the user's added card (see add_card). Absent for wallet-funded cards."New value: +"\"connected\" when the card was created against the user's added card. Absent for wallet-funded cards."
      • changedOutput schema / properties / status / description
        Previous value: -"Outcome discriminator: \"created\" (card issued), \"approval_required\" (human approval needed), \"approval_pending\" (BYOC passkey approval — send approvalUrl to the user, then retry with the same arguments in ~10s), \"payment_method_required\", \"kyc_required\", \"user_info_required\", \"beta_capacity_reached\", \"issuing_balance_insufficient\", \"payment_method_declined\", \"limit_reached\", \"funding_in_progress\" (company wallet funding underway — retry with the same arguments in ~10s), \"funding_not_approved\", \"org_wallet_funding_required\", \"org_wallet_unavailable\" (the company wallet backing this account is not active — the company must finish setup; do not retry immediately), or \"rate_limited\" (wait ~1 minute, then retry)."New value: +"Outcome discriminator: \"created\" (card issued), \"attach_started\" (first-time setup — send attachUrl to the user, then call again with the same arguments once they finish), \"attach_pending\" (user has not finished the add-card link yet), \"issuing_suggested\" (the user's card could not be added — offer the balance-funded fallback, noting it requires KYC, and only then call again with source \"issued\"), \"approval_required\" (human approval needed), \"approval_pending\" (added-card passkey approval — send approvalUrl to the user, then retry with the same arguments in ~10s), \"kyc_required\" (issued path only), \"user_info_required\" (check missingFields: phone/terms go through submit_user_info; consent must be recorded by the connecting platform), \"beta_capacity_reached\", \"issuing_balance_insufficient\" (issued path only), \"payment_method_declined\", \"limit_reached\", \"funding_in_progress\" (company wallet funding underway — retry with the same arguments in ~10s), \"funding_not_approved\", \"org_wallet_funding_required\", \"org_wallet_unavailable\" (the company wallet backing this account is not active — the company must finish setup; do not retry immediately), or \"rate_limited\" (wait ~1 minute, then retry)."
  12. 1 tool update
    • Changedget_wallet_link2 fields changed
      • addedInput schema / properties / amount_cents
        Added value: +{
        +  "description": "Amount in cents. When present, the link opens on the payment-approval sheet for this charge.",
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / merchant
        Added value: +{
        +  "description": "Merchant name shown on the payment-approval sheet (with amount_cents).",
        +  "type": "string"
        +}
  13. 11 tool updates
    • Addedadd_card
    • Removedattach_card
    • Changedcreate_card3 fields changed
      • changedInput schema / properties / connected_card_id / description
        Previous value: -"Multi-card BYOC: mint against a SPECIFIC attached card (an id from the user's attached cards) instead of the newest active one. Omit for the default."New value: +"Multi-card BYOC: issue against a SPECIFIC added card (an id from the user's added cards) instead of the newest active one. Omit for the default."
      • changedInput schema / properties / source / description
        Previous value: -"Force the card to be funded from the user's cash balance even when they have an attached card. Omit for the default (an active attached card wins)."New value: +"Force the card to be funded from the user's cash balance even when they have an added card. Omit for the default (an active added card wins)."
      • changedOutput schema / properties / source / description
        Previous value: -"\"connected\" when the card was minted against the user's attached card (see attach_card). Absent for wallet-funded cards."New value: +"\"connected\" when the card was created against the user's added card (see add_card). Absent for wallet-funded cards."
    • Changedget_settings1 field changed
      • changedOutput schema / properties / default_payment / description
        Previous value: -"The wallet-level default payment source: { source: 'balance' } or { source: 'connected', connected_card_id }. null = auto (an active attached card wins, else the balance)."New value: +"The wallet-level default payment source: { source: 'balance' } or { source: 'connected', connected_card_id }. null = auto (an active added card wins, else the balance)."
    • Addedget_wallet_link
    • Addedlist_added_cards
    • Removedlist_attached_cards
    • Changedlist_cards3 fields changed
      • changedOutput schema / properties / wallet / items / properties / source / properties / app / description
        Previous value: -"OAuth client id of the app that minted the card (null for first-party surfaces)."New value: +"OAuth client id of the app that created the card (null for first-party surfaces)."
      • changedOutput schema / properties / wallet / items / properties / source / properties / appName / description
        Previous value: -"Display name of the minting app (null when unknown or first-party)."New value: +"Display name of the issuing app (null when unknown or first-party)."
      • changedOutput schema / properties / wallet / items / properties / source / properties / kind / description
        Previous value: -"personal = minted on the user's own account; company = minted under a company the user is connected to."New value: +"personal = created on the user's own account; company = created under a company the user is connected to."
    • Changedlist_pending_approvals1 field changed
      • changedOutput schema / properties / approvals / items / properties / card / properties / connectedCard / description
        Previous value: -"For cards minted against the user's attached card: the real card behind it (issuer, brand, last4, nickname)."New value: +"For cards created against the user's added card: the real card behind it (issuer, brand, last4, nickname)."
    • Addedremove_added_card
    • Removedremove_attached_card
  14. 3 tool updates
    • Changedattach_card1 field changed
      • changedInput schema / properties / additional / description
        Previous value: -"Attach ANOTHER card while one is already active (multi-card). Default false: with a card already attached the tool answers already_attached instead of starting a new enrollment. New cards become the default mint target (newest active wins); create_card can pick a specific one via connected_card_id."New value: +"Attach ANOTHER card while one is already active (multi-card). Default false: with a card already attached the tool answers already_attached instead of starting a new enrollment. Unless the user chose a default card (update_settings default_payment), the newest active card becomes the default mint target; create_card can pick a specific one via connected_card_id."
    • Changedget_settings1 field changed
      • addedOutput schema / properties / default_payment
        Added value: +{
        +  "description": "The wallet-level default payment source: { source: 'balance' } or { source: 'connected', connected_card_id }. null = auto (an active attached card wins, else the balance).",
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
    • Changedlist_attached_cards1 field changed
      • changedOutput schema / properties / attachedCards / description
        Previous value: -"Attached-card enrollments, newest first. The first active row is the default mint target."New value: +"Attached-card enrollments, newest first. The row with isDefault true is the default mint target; none is marked when the default payment is the wallet balance."
  15. 1 tool update
    • Changedget_settings1 field changed
      • addedOutput schema / properties / delivery_address
        Added value: +{
        +  "description": "The wallet-level default delivery address (street/city/state/zip + optional address2/phone/name), or null when unset.",
        +  "type": [
        +    "object",
        +    "null"
        +  ]
        +}
  16. 50 tool updates
    • First observedadd_funds
    • First observedapprove_request
    • First observedattach_card
    • First observedbuy
    • First observedbuy_connect
    • First observedbuy_connect_status
    • First observedbuy_list_merchants
    • First observedbuy_unlink_merchant
    • First observedcheck_kyc_document
    • First observedclose_card
    • First observedcreate_card
    • First observedcreate_withdrawal_recipient
    • First observedget_balance
    • First observedget_card_balance
    • First observedget_card_details
    • First observedget_instructions
    • First observedget_kyc_status
    • First observedget_plan
    • First observedget_rewards
    • First observedget_settings
    • First observedlink_account
    • First observedlist_attached_cards
    • First observedlist_cards
    • First observedlist_connections
    • First observedlist_payment_methods
    • First observedlist_pending_approvals
    • First observedlist_transactions
    • First observedlist_withdrawal_recipients
    • First observedmanage_subscription
    • First observedpause_card
    • First observedread_support_chat
    • First observedredeem_code
    • First observedredeem_rewards
    • First observedremove_attached_card
    • First observedresume_card
    • First observedrevoke_connection
    • First observedsend_support_message
    • First observedsetup_payment_method
    • First observedstart_kyc
    • First observedstart_phone_verification
    • First observedstart_support_chat
    • First observedsubmit_kyc_document
    • First observedsubmit_kyc_fields
    • First observedsubmit_user_info
    • First observedsurprise_me
    • First observedupdate_card_limit
    • First observedupgrade_plan
    • First observedverify_phone
    • First observedwhoami
    • First observedwithdraw

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides AI agents with a prepaid, capped payment method so they can request charges without accessing real accounts. Enforces spending limits, requires human approval for larger transactions, and supports out-of-band approvals via CLI, dashboard, or Telegram.
    MIT
  • -
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to manage and use prepaid virtual Visa cards with hard budget limits for secure online transactions. It provides tools for creating cards, checking balances, and retrieving payment credentials with human-in-the-loop approvals.
    1
    -
  • A
    license
    A
    quality
    A
    maintenance
    AI-native payment infrastructure that enables AI agents to make purchases, issue virtual cards, and manage spending within delegated budgets and policy controls.
    7
    468 npm
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources