Agentcard issues virtual debit cards for AI agents.
GETTING A CARD: create_card is the one card tool. For a FIRST-TIME user it
starts by putting the user's own card in their Agentcard vault: any card,
no identity verification (KYC), no prefunding: it 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
buy, where the user approves each purchase on their device with their passkey or master password, and it never
becomes a card number you type: once the card is saved (vault_ready), use
buy instead of calling create_card again. restart_setup: true mints a fresh
link. If the user specifically needs a card NUMBER, that is an Agentcard
funded from their cash balance, which requires identity verification (KYC)
the first time; only after the user agrees, call create_card with source
"issued". get_wallet_link with purpose "add_card" mints the same vault link
on demand. list_cards shows the vault cards on file beside the others;
list_added_cards / remove_added_card cover older hands-free (network-token)
enrollments, which still mint against the added card (attach_pending means
one of those is still in flight).
VOCABULARY: the user's WALLET is their cards (list_cards); their BALANCE
is their cash (get_balance). Balance-funded (issued) cards draw on the
balance; cards created against an added card charge the user's own card.
FUNDING (issued path only): The user adds cash with Apple Pay or Google
Pay, in USD (funds are held as USDC). get_balance shows the cash balance.
add_funds prepares a single-use checkout LINK — it moves no money and
initiates no transfer (the equivalent of the user clicking "Add funds" in
the dashboard); the user opens the link and personally authorizes +
completes the payment in their own browser, so calling it on request is
always appropriate. If a one-time phone verification is needed,
add_funds automatically
Protocol
Pass100/10020 / 20 pts
Connection, authentication, and protocol compatibility.
Server does not advertise the Skills over MCP extension
All tools have OpenAI behavior hints
18 behavior annotation issue(s) found
How to fix: On each tool, declare annotations.readOnlyHint, annotations.destructiveHint, and annotations.openWorldHint as booleans. The policy review separately assesses whether their values match the tool's actual behavior.
How to fix: For Claude directory submission, declare the applicable annotations.readOnlyHint or annotations.destructiveHint value as a boolean on every tool.
How to fix: Set the top-level tool.title to a short human-readable label (for example, "Search catalog"). Claude directory submission requires tool titles; annotations.title remains accepted only as a legacy fallback.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs86/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
request
The 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".
Clear enough to supply this argument.
conversation_id
The 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.
Clear enough to supply this argument.
new_order
Start a fresh shopping conversation instead of continuing the current one. Use when beginning an unrelated order (ignores any conversation_id).
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"status": {
"enum": [
"assistant_turn",
"conversation_start_failed",
"request_failed"
],
"type": "string",
"description": "Discriminator for the outcome. 'assistant_turn' when the buy loop replied; 'conversation_start_failed' or 'request_failed' on errors."
},
"message": {
"type": "string",
"description": "The 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."
},
"messages": {
"type": "array",
"items": {
"type": "string"
},
"description": "The 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_id": {
"type": "string",
"description": "The conversation id to thread back as conversation_id on the next buy call to continue the SAME order. Present on a successful assistant turn."
}
}
}
Original tool metadata
{
"name": "buy",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"request",
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"request": {
"type": "string",
"description": "The 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_order": {
"type": "boolean",
"description": "Start a fresh shopping conversation instead of continuing the current one. Use when beginning an unrelated order (ignores any conversation_id)."
},
"conversation_id": {
"type": "string",
"description": "The 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."
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"status": {
"enum": [
"assistant_turn",
"conversation_start_failed",
"request_failed"
],
"type": "string",
"description": "Discriminator for the outcome. 'assistant_turn' when the buy loop replied; 'conversation_start_failed' or 'request_failed' on errors."
},
"message": {
"type": "string",
"description": "The 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."
},
"messages": {
"type": "array",
"items": {
"type": "string"
},
"description": "The 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_id": {
"type": "string",
"description": "The conversation id to thread back as conversation_id on the next buy call to continue the SAME order. Present on a successful assistant turn."
}
}
},
"annotations": {
"title": "Buy",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
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).
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
max_dollars
Hard spend cap in dollars, total including fees. Optional; default 10, values above 25 are clamped to 25.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
merchant
Optional merchant hint the surprise should come from, e.g. 'doordash'. Omit to let the agent pick.
Clear enough to supply this argument.
vibe
Optional notes/vibe from the user, e.g. "make it food", "something for my desk", "they love ducks".
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"status": {
"enum": [
"assistant_turn",
"conversation_start_failed",
"request_failed"
],
"type": "string",
"description": "Discriminator for the outcome. 'assistant_turn' when the buy loop replied; 'conversation_start_failed' or 'request_failed' on errors."
},
"message": {
"type": "string",
"description": "The 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."
},
"messages": {
"type": "array",
"items": {
"type": "string"
},
"description": "The 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_id": {
"type": "string",
"description": "The conversation id to thread back as conversation_id on the next buy call to continue the SAME order. Present on a successful assistant turn."
}
}
}
Original tool metadata
{
"name": "surprise_me",
"description": "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).",
"inputSchema": {
"type": "object",
"required": [
"context"
],
"properties": {
"vibe": {
"type": "string",
"description": "Optional notes/vibe from the user, e.g. \"make it food\", \"something for my desk\", \"they love ducks\"."
},
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"merchant": {
"type": "string",
"description": "Optional merchant hint the surprise should come from, e.g. 'doordash'. Omit to let the agent pick."
},
"max_dollars": {
"type": "number",
"description": "Hard spend cap in dollars, total including fees. Optional; default 10, values above 25 are clamped to 25."
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"status": {
"enum": [
"assistant_turn",
"conversation_start_failed",
"request_failed"
],
"type": "string",
"description": "Discriminator for the outcome. 'assistant_turn' when the buy loop replied; 'conversation_start_failed' or 'request_failed' on errors."
},
"message": {
"type": "string",
"description": "The 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."
},
"messages": {
"type": "array",
"items": {
"type": "string"
},
"description": "The 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_id": {
"type": "string",
"description": "The conversation id to thread back as conversation_id on the next buy call to continue the SAME order. Present on a successful assistant turn."
}
}
},
"annotations": {
"title": "Surprise Me",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
Align the title with the capability actually described by this tool.
Description85/100
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).
The description explains the capability, when to use it, and what to expect.
Inputs74/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "get_instructions",
"description": "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).",
"inputSchema": {
"type": "object",
"required": [
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"description": "The latest buy usage guide / instructions text."
}
}
},
"annotations": {
"title": "Get Buy Instructions",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"name": {
"type": [
"string",
"null"
],
"description": "Cardholder name (\"First Last\"), or null before KYC info is submitted."
},
"plan": {
"type": "string",
"description": "Subscription plan id, e.g. 'free', 'basic', or 'pro'."
},
"email": {
"type": [
"string",
"null"
],
"description": "Email of the authenticated account, or null for a phone-first account (e.g. signed up by text message)."
},
"userId": {
"type": "string",
"description": "AgentCard user id of the authenticated account."
},
"message": {
"type": "string",
"description": "Human-readable identity summary."
},
"kycStatus": {
"type": [
"string",
"null"
],
"description": "Raw stored KYC state (e.g. approved, pending, requires_input), or null if never started."
},
"kycVerified": {
"type": "boolean",
"description": "Whether identity verification (KYC) has passed (stored snapshot)."
},
"memberSince": {
"type": "string",
"description": "ISO timestamp the account was created."
},
"accountStatus": {
"type": "string",
"description": "Account standing: 'active' or 'suspended'."
},
"connectionType": {
"enum": [
"oauth",
"personal",
"organization"
],
"type": "string",
"description": "How this session authenticates: 'oauth' (third-party app connection), 'personal' (CLI/dashboard login), or 'organization' (a company's Agentcard integration acting for its end user)."
},
"connectionClientId": {
"type": [
"string",
"null"
],
"description": "OAuth client id of the connected app, when connectionType is oauth, or organization through a company's app."
},
"subscriptionStatus": {
"type": [
"string",
"null"
],
"description": "Stripe subscription status (e.g. 'active', 'past_due'), or null on the free plan."
},
"connectionClientName": {
"type": [
"string",
"null"
],
"description": "Display name of the connected OAuth app (e.g. \"Claude\"), when known, for an oauth or organization connection."
},
"connectionOrganizationId": {
"type": [
"string",
"null"
],
"description": "Organization id, when connectionType is organization."
}
}
}
Original tool metadata
{
"name": "whoami",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"name": {
"type": [
"string",
"null"
],
"description": "Cardholder name (\"First Last\"), or null before KYC info is submitted."
},
"plan": {
"type": "string",
"description": "Subscription plan id, e.g. 'free', 'basic', or 'pro'."
},
"email": {
"type": [
"string",
"null"
],
"description": "Email of the authenticated account, or null for a phone-first account (e.g. signed up by text message)."
},
"userId": {
"type": "string",
"description": "AgentCard user id of the authenticated account."
},
"message": {
"type": "string",
"description": "Human-readable identity summary."
},
"kycStatus": {
"type": [
"string",
"null"
],
"description": "Raw stored KYC state (e.g. approved, pending, requires_input), or null if never started."
},
"kycVerified": {
"type": "boolean",
"description": "Whether identity verification (KYC) has passed (stored snapshot)."
},
"memberSince": {
"type": "string",
"description": "ISO timestamp the account was created."
},
"accountStatus": {
"type": "string",
"description": "Account standing: 'active' or 'suspended'."
},
"connectionType": {
"enum": [
"oauth",
"personal",
"organization"
],
"type": "string",
"description": "How this session authenticates: 'oauth' (third-party app connection), 'personal' (CLI/dashboard login), or 'organization' (a company's Agentcard integration acting for its end user)."
},
"connectionClientId": {
"type": [
"string",
"null"
],
"description": "OAuth client id of the connected app, when connectionType is oauth, or organization through a company's app."
},
"subscriptionStatus": {
"type": [
"string",
"null"
],
"description": "Stripe subscription status (e.g. 'active', 'past_due'), or null on the free plan."
},
"connectionClientName": {
"type": [
"string",
"null"
],
"description": "Display name of the connected OAuth app (e.g. \"Claude\"), when known, for an oauth or organization connection."
},
"connectionOrganizationId": {
"type": [
"string",
"null"
],
"description": "Organization id, when connectionType is organization."
}
}
},
"annotations": {
"title": "Who Am I",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"required": [
"message"
],
"properties": {
"cards": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Card ID."
},
"last4": {
"type": "string",
"description": "Last four digits of the card number."
},
"expiry": {
"type": "string",
"description": "Card expiry (MM/YY)."
},
"preset": {
"type": [
"object",
"null"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": [
"string",
"null"
]
},
"summary": {
"type": "string"
},
"version": {
"type": "number"
}
},
"description": "Preset summary when the card has restrictions; omit or null when unrestricted."
},
"status": {
"type": "string",
"description": "Card status, e.g. \"active\" or \"closed\"."
},
"sandbox": {
"type": "boolean",
"description": "Whether this is a test/sandbox card."
},
"balanceCents": {
"type": "number",
"description": "Card balance in cents."
},
"spendLimitCents": {
"type": "number",
"description": "Per-card spend limit in cents."
}
}
},
"description": "The user's own virtual cards."
},
"count": {
"type": "number",
"description": "Total number of cards across the user's own cards and any connected-account cards."
},
"wallet": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Card ID."
},
"last4": {
"type": "string",
"description": "Last four digits of the card number."
},
"access": {
"enum": [
"owned",
"connected"
],
"type": "string",
"description": "Whether THIS session can manage the card (owned) or only see it (connected = read-only here)."
},
"expiry": {
"type": "string",
"description": "Card expiry (MM/YY)."
},
"preset": {
"type": [
"object",
"null"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": [
"string",
"null"
]
},
"summary": {
"type": "string"
},
"version": {
"type": "number"
}
},
"description": "Preset summary when present."
},
"source": {
"type": "object",
"properties": {
"app": {
"type": [
"string",
"null"
],
"description": "OAuth client id of the app that created the card (null for first-party surfaces)."
},
"kind": {
"enum": [
"personal",
"company"
],
"type": "string",
"description": "personal = created on the user's own account; company = created under a company the user is connected to."
},
"appName": {
"type": [
"string",
"null"
],
"description": "Display name of the issuing app (null when unknown or first-party)."
},
"companyId": {
"type": "string",
"description": "Company id (company cards only)."
},
"companyName": {
"type": "string",
"description": "Company name (company cards only)."
}
},
"description": "Where this card came from."
},
"status": {
"type": "string",
"description": "Card status."
},
"sandbox": {
"type": "boolean",
"description": "Whether this is a test card."
},
"balanceCents": {
"type": "number",
"description": "Card balance in cents."
},
"spendLimitCents": {
"type": "number",
"description": "Per-card spend limit in cents."
}
}
},
"description": "One-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."
},
"message": {
"type": "string",
"description": "Human-readable list of cards (or an empty-state message)."
},
"vaultCards": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Vault card ID."
},
"brand": {
"type": [
"string",
"null"
],
"description": "Card brand, e.g. \"visa\"."
},
"label": {
"type": [
"string",
"null"
],
"description": "The user's nickname for the card, if any."
},
"last4": {
"type": [
"string",
"null"
],
"description": "Last four digits."
},
"expiry": {
"type": [
"string",
"null"
],
"description": "Card expiry (MM/YY)."
}
}
},
"description": "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."
},
"connectedAccounts": {
"type": "array",
"items": {
"type": "object",
"properties": {
"cards": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Card ID."
},
"last4": {
"type": "string",
"description": "Last four digits of the card number."
},
"expiry": {
"type": "string",
"description": "Card expiry (MM/YY)."
},
"preset": {
"type": [
"object",
"null"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": [
"string",
"null"
]
},
"summary": {
"type": "string"
},
"version": {
"type": "number"
}
},
"description": "Preset summary when present."
},
"status": {
"type": "string",
"description": "Card status, e.g. \"active\" or \"closed\"."
},
"sandbox": {
"type": "boolean",
"description": "Whether this is a test/sandbox card."
},
"balanceCents": {
"type": "number",
"description": "Card balance in cents."
},
"spendLimitCents": {
"type": "number",
"description": "Per-card spend limit in cents."
}
}
},
"description": "Cards issued under this connected account."
},
"readOnly": {
"type": "boolean",
"description": "Whether these cards are read-only for the user."
},
"cardholderId": {
"type": "string",
"description": "The user's cardholder ID within the organization."
},
"organizationId": {
"type": "string",
"description": "ID of the organization that owns these cards."
},
"organizationName": {
"type": "string",
"description": "Name of the organization that owns these cards."
}
}
},
"description": "Read-only cards issued and managed by an organization the user is linked to."
}
}
}
Original tool metadata
{
"name": "list_cards",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"cards": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Card ID."
},
"last4": {
"type": "string",
"description": "Last four digits of the card number."
},
"expiry": {
"type": "string",
"description": "Card expiry (MM/YY)."
},
"preset": {
"type": [
"object",
"null"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": [
"string",
"null"
]
},
"summary": {
"type": "string"
},
"version": {
"type": "number"
}
},
"description": "Preset summary when the card has restrictions; omit or null when unrestricted."
},
"status": {
"type": "string",
"description": "Card status, e.g. \"active\" or \"closed\"."
},
"sandbox": {
"type": "boolean",
"description": "Whether this is a test/sandbox card."
},
"balanceCents": {
"type": "number",
"description": "Card balance in cents."
},
"spendLimitCents": {
"type": "number",
"description": "Per-card spend limit in cents."
}
}
},
"description": "The user's own virtual cards."
},
"count": {
"type": "number",
"description": "Total number of cards across the user's own cards and any connected-account cards."
},
"wallet": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Card ID."
},
"last4": {
"type": "string",
"description": "Last four digits of the card number."
},
"access": {
"enum": [
"owned",
"connected"
],
"type": "string",
"description": "Whether THIS session can manage the card (owned) or only see it (connected = read-only here)."
},
"expiry": {
"type": "string",
"description": "Card expiry (MM/YY)."
},
"preset": {
"type": [
"object",
"null"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": [
"string",
"null"
]
},
"summary": {
"type": "string"
},
"version": {
"type": "number"
}
},
"description": "Preset summary when present."
},
"source": {
"type": "object",
"properties": {
"app": {
"type": [
"string",
"null"
],
"description": "OAuth client id of the app that created the card (null for first-party surfaces)."
},
"kind": {
"enum": [
"personal",
"company"
],
"type": "string",
"description": "personal = created on the user's own account; company = created under a company the user is connected to."
},
"appName": {
"type": [
"string",
"null"
],
"description": "Display name of the issuing app (null when unknown or first-party)."
},
"companyId": {
"type": "string",
"description": "Company id (company cards only)."
},
"companyName": {
"type": "string",
"description": "Company name (company cards only)."
}
},
"description": "Where this card came from."
},
"status": {
"type": "string",
"description": "Card status."
},
"sandbox": {
"type": "boolean",
"description": "Whether this is a test card."
},
"balanceCents": {
"type": "number",
"description": "Card balance in cents."
},
"spendLimitCents": {
"type": "number",
"description": "Per-card spend limit in cents."
}
}
},
"description": "One-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."
},
"message": {
"type": "string",
"description": "Human-readable list of cards (or an empty-state message)."
},
"vaultCards": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Vault card ID."
},
"brand": {
"type": [
"string",
"null"
],
"description": "Card brand, e.g. \"visa\"."
},
"label": {
"type": [
"string",
"null"
],
"description": "The user's nickname for the card, if any."
},
"last4": {
"type": [
"string",
"null"
],
"description": "Last four digits."
},
"expiry": {
"type": [
"string",
"null"
],
"description": "Card expiry (MM/YY)."
}
}
},
"description": "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."
},
"connectedAccounts": {
"type": "array",
"items": {
"type": "object",
"properties": {
"cards": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Card ID."
},
"last4": {
"type": "string",
"description": "Last four digits of the card number."
},
"expiry": {
"type": "string",
"description": "Card expiry (MM/YY)."
},
"preset": {
"type": [
"object",
"null"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": [
"string",
"null"
]
},
"summary": {
"type": "string"
},
"version": {
"type": "number"
}
},
"description": "Preset summary when present."
},
"status": {
"type": "string",
"description": "Card status, e.g. \"active\" or \"closed\"."
},
"sandbox": {
"type": "boolean",
"description": "Whether this is a test/sandbox card."
},
"balanceCents": {
"type": "number",
"description": "Card balance in cents."
},
"spendLimitCents": {
"type": "number",
"description": "Per-card spend limit in cents."
}
}
},
"description": "Cards issued under this connected account."
},
"readOnly": {
"type": "boolean",
"description": "Whether these cards are read-only for the user."
},
"cardholderId": {
"type": "string",
"description": "The user's cardholder ID within the organization."
},
"organizationId": {
"type": "string",
"description": "ID of the organization that owns these cards."
},
"organizationName": {
"type": "string",
"description": "Name of the organization that owns these cards."
}
}
},
"description": "Read-only cards issued and managed by an organization the user is linked to."
}
}
},
"annotations": {
"title": "List Cards",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Explain the meaning of this value, not just its name.
card_id
The card ID
Explain the meaning of this value, not just its name.
approval_id
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.
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"last4": {
"type": "string",
"description": "Last four digits of the card number. Present only when status is \"details\"."
},
"cardId": {
"type": "string",
"description": "The card ID."
},
"expiry": {
"type": "string",
"description": "Card expiry (MM/YY). Present only when status is \"details\"."
},
"status": {
"type": "string",
"description": "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."
},
"message": {
"type": "string",
"description": "Human-readable card details (or an approval-required prompt)."
},
"approvalId": {
"type": "string",
"description": "The approval request ID to pass to approve_request. Present only when status is \"approval_required\"."
},
"cardStatus": {
"type": "string",
"description": "Card status, e.g. \"active\" or \"closed\". Present only when status is \"details\"."
},
"balanceCents": {
"type": "number",
"description": "Card balance in cents. Present only when status is \"details\"."
},
"balanceDollars": {
"type": "string",
"description": "Card balance formatted as USD dollars, e.g. \"12.50\". Present only when status is \"details\"."
}
}
}
Original tool metadata
{
"name": "get_card_details",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"card_id",
"context"
],
"properties": {
"card_id": {
"type": "string",
"description": "The card ID"
},
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"approval_id": {
"type": "string",
"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."
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"last4": {
"type": "string",
"description": "Last four digits of the card number. Present only when status is \"details\"."
},
"cardId": {
"type": "string",
"description": "The card ID."
},
"expiry": {
"type": "string",
"description": "Card expiry (MM/YY). Present only when status is \"details\"."
},
"status": {
"type": "string",
"description": "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."
},
"message": {
"type": "string",
"description": "Human-readable card details (or an approval-required prompt)."
},
"approvalId": {
"type": "string",
"description": "The approval request ID to pass to approve_request. Present only when status is \"approval_required\"."
},
"cardStatus": {
"type": "string",
"description": "Card status, e.g. \"active\" or \"closed\". Present only when status is \"details\"."
},
"balanceCents": {
"type": "number",
"description": "Card balance in cents. Present only when status is \"details\"."
},
"balanceDollars": {
"type": "string",
"description": "Card balance formatted as USD dollars, e.g. \"12.50\". Present only when status is \"details\"."
}
}
},
"annotations": {
"title": "Get Card Details",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs61/100
Explain the meaning of this value, not just its name.
card_id
The card ID
Explain the meaning of this value, not just its name.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"cached": {
"type": "boolean",
"description": "Whether the balance was served from a short-lived cache rather than fetched live."
},
"message": {
"type": "string",
"description": "Human-readable balance summary."
},
"balanceCents": {
"type": "number",
"description": "Available balance in cents."
},
"balanceDollars": {
"type": "string",
"description": "Available balance formatted as USD dollars, e.g. \"12.50\"."
}
}
}
Original tool metadata
{
"name": "get_card_balance",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"card_id",
"context"
],
"properties": {
"card_id": {
"type": "string",
"description": "The card ID"
},
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"cached": {
"type": "boolean",
"description": "Whether the balance was served from a short-lived cache rather than fetched live."
},
"message": {
"type": "string",
"description": "Human-readable balance summary."
},
"balanceCents": {
"type": "number",
"description": "Available balance in cents."
},
"balanceDollars": {
"type": "string",
"description": "Available balance formatted as USD dollars, e.g. \"12.50\"."
}
}
},
"annotations": {
"title": "Check Card Balance",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs89/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
card_id
The card ID to close
Clear enough to supply this argument.
confirm_rewards_card
Required to close the rewards card. Only set after the user explicitly confirms; never set it preemptively.
Clear enough to supply this argument.
approval_id
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.
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"cardId": {
"type": "string",
"description": "The ID of the card that was closed."
},
"status": {
"type": "string",
"description": "Outcome discriminator; always \"closed\" on success."
},
"message": {
"type": "string",
"description": "Human-readable confirmation that the card was closed."
},
"approvalId": {
"type": "string",
"description": "Present when status is approval_required: pass it back as approval_id after the user approves."
}
}
}
Original tool metadata
{
"name": "close_card",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"card_id",
"context"
],
"properties": {
"card_id": {
"type": "string",
"description": "The card ID to close"
},
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"approval_id": {
"type": "string",
"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."
},
"confirm_rewards_card": {
"type": "boolean",
"description": "Required to close the rewards card. Only set after the user explicitly confirms; never set it preemptively."
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"cardId": {
"type": "string",
"description": "The ID of the card that was closed."
},
"status": {
"type": "string",
"description": "Outcome discriminator; always \"closed\" on success."
},
"message": {
"type": "string",
"description": "Human-readable confirmation that the card was closed."
},
"approvalId": {
"type": "string",
"description": "Present when status is approval_required: pass it back as approval_id after the user approves."
}
}
},
"annotations": {
"title": "Close Card",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs81/100
11 of 13 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
amount_cents
Card 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.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
connected_card_id
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.
Clear enough to supply this argument.
pending_card_id
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.
Clear enough to supply this argument.
purchase_key
The purchaseKey from the same approval_pending answer as pending_card_id; the pair proves the retry is for that purchase.
Clear enough to supply this argument.
source
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).
Clear enough to supply this argument.
restart_setup
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).
Clear enough to supply this argument.
funds_source
Where 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.
Clear enough to supply this argument.
type
Card 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).
Clear enough to supply this argument.
expires_at
Optional 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.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
preset › oneOf › 1 › name
Not provided
Missing description. Explain what this value means and how to supply it.
preset › oneOf › 1 › privileges
Not provided
Missing description. Explain what this value means and how to supply it.
scope_preset
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`.
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
{
"type": "object",
"required": [
"message"
],
"properties": {
"last4": {
"type": "string",
"description": "Last four digits of the new card. Present only when status is \"created\"."
},
"cardId": {
"type": "string",
"description": "The new card ID. Present only when status is \"created\"."
},
"expiry": {
"type": "string",
"description": "Card expiry (MM/YY). Present only when status is \"created\"."
},
"preset": {
"type": [
"object",
"null"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": [
"string",
"null"
]
},
"summary": {
"type": "string"
},
"version": {
"type": "number"
}
},
"description": "Preset summary for the new card, or null when unrestricted. Present when status is \"created\"."
},
"reason": {
"type": "string",
"description": "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."
},
"source": {
"type": "string",
"description": "\"connected\" when the card was created against the user's added card. Absent for wallet-funded cards."
},
"status": {
"type": "string",
"description": "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."
},
"message": {
"type": "string",
"description": "Human-readable result or guidance for the next step."
},
"vaultUrl": {
"type": "string",
"description": "The secure link the user opens to put their card in their vault. Present only when status is \"vault_started\"."
},
"attachUrl": {
"type": "string",
"description": "The secure link the user opens to finish an older add-card enrollment. Present only when status is \"attach_started\"."
},
"expiresAt": {
"type": "string",
"description": "When the link expires (ISO 8601). Present when status is \"vault_started\" or \"attach_started\"."
},
"approvalId": {
"type": "string",
"description": "The approval request ID to pass to approve_request. Present only when status is \"approval_required\"."
},
"cardStatus": {
"type": "string",
"description": "Card status, e.g. \"active\". Present only when status is \"created\"."
},
"vaultCards": {
"type": "number",
"description": "How many cards the user already holds in their vault. Present only when status is \"vault_ready\"."
},
"approvalUrl": {
"type": "string",
"description": "The passkey approval link to send to the user. Present only when status is \"approval_pending\"."
},
"purchaseKey": {
"type": "string",
"description": "The purchase's key. Present only when status is \"approval_pending\"; pass it back as purchase_key with pending_card_id."
},
"balanceCents": {
"type": "number",
"description": "Card balance in cents. Present only when status is \"created\"."
},
"missingFields": {
"type": "array",
"items": {
"type": "string"
},
"description": "What is missing when status is \"user_info_required\" (e.g. \"termsAccepted\", \"consent\")."
},
"pendingCardId": {
"type": "string",
"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."
},
"balanceDollars": {
"type": "string",
"description": "Card balance formatted as USD dollars, e.g. \"12.50\". Present only when status is \"created\"."
},
"maxAmountCents": {
"type": "number",
"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."
}
}
}
Original tool metadata
{
"name": "create_card",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"amount_cents",
"context"
],
"properties": {
"type": {
"enum": [
"single_use",
"multi_use"
],
"type": "string",
"description": "Card 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)."
},
"preset": {
"oneOf": [
{
"type": "string"
},
{
"type": "object",
"required": [
"privileges"
],
"properties": {
"name": {
"type": "string"
},
"privileges": {
"type": "array",
"items": {}
}
}
}
],
"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."
},
"source": {
"enum": [
"issued"
],
"type": "string",
"description": "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)."
},
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"expires_at": {
"type": "string",
"description": "Optional 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_cents": {
"type": "number",
"description": "Card 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_source": {
"enum": [
"onramp_flow",
"company_flow"
],
"type": "string",
"description": "Where 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_key": {
"type": "string",
"description": "The purchaseKey from the same approval_pending answer as pending_card_id; the pair proves the retry is for that purchase."
},
"scope_preset": {
"enum": [
"ai_labs"
],
"type": "string",
"description": "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`."
},
"restart_setup": {
"type": "boolean",
"description": "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)."
},
"pending_card_id": {
"type": "string",
"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."
},
"connected_card_id": {
"type": "string",
"description": "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."
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"last4": {
"type": "string",
"description": "Last four digits of the new card. Present only when status is \"created\"."
},
"cardId": {
"type": "string",
"description": "The new card ID. Present only when status is \"created\"."
},
"expiry": {
"type": "string",
"description": "Card expiry (MM/YY). Present only when status is \"created\"."
},
"preset": {
"type": [
"object",
"null"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": [
"string",
"null"
]
},
"summary": {
"type": "string"
},
"version": {
"type": "number"
}
},
"description": "Preset summary for the new card, or null when unrestricted. Present when status is \"created\"."
},
"reason": {
"type": "string",
"description": "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."
},
"source": {
"type": "string",
"description": "\"connected\" when the card was created against the user's added card. Absent for wallet-funded cards."
},
"status": {
"type": "string",
"description": "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."
},
"message": {
"type": "string",
"description": "Human-readable result or guidance for the next step."
},
"vaultUrl": {
"type": "string",
"description": "The secure link the user opens to put their card in their vault. Present only when status is \"vault_started\"."
},
"attachUrl": {
"type": "string",
"description": "The secure link the user opens to finish an older add-card enrollment. Present only when status is \"attach_started\"."
},
"expiresAt": {
"type": "string",
"description": "When the link expires (ISO 8601). Present when status is \"vault_started\" or \"attach_started\"."
},
"approvalId": {
"type": "string",
"description": "The approval request ID to pass to approve_request. Present only when status is \"approval_required\"."
},
"cardStatus": {
"type": "string",
"description": "Card status, e.g. \"active\". Present only when status is \"created\"."
},
"vaultCards": {
"type": "number",
"description": "How many cards the user already holds in their vault. Present only when status is \"vault_ready\"."
},
"approvalUrl": {
"type": "string",
"description": "The passkey approval link to send to the user. Present only when status is \"approval_pending\"."
},
"purchaseKey": {
"type": "string",
"description": "The purchase's key. Present only when status is \"approval_pending\"; pass it back as purchase_key with pending_card_id."
},
"balanceCents": {
"type": "number",
"description": "Card balance in cents. Present only when status is \"created\"."
},
"missingFields": {
"type": "array",
"items": {
"type": "string"
},
"description": "What is missing when status is \"user_info_required\" (e.g. \"termsAccepted\", \"consent\")."
},
"pendingCardId": {
"type": "string",
"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."
},
"balanceDollars": {
"type": "string",
"description": "Card balance formatted as USD dollars, e.g. \"12.50\". Present only when status is \"created\"."
},
"maxAmountCents": {
"type": "number",
"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."
}
}
},
"annotations": {
"title": "Create Card",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
card_id
The card id (from list_cards).
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations0/100
Declare readOnlyHint, destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
Not declared
Output schema48/100
Describe the returned fields so an agent can interpret the result.
{
"name": "get_card_preset",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"card_id",
"context"
],
"properties": {
"card_id": {
"type": "string",
"description": "The card id (from list_cards)."
},
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"cardId": {
"type": "string"
},
"preset": {
"type": [
"object",
"null"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": [
"string",
"null"
]
},
"summary": {
"type": "string"
},
"version": {
"type": "number"
}
},
"description": "Preset summary, or null when unrestricted."
},
"message": {
"type": "string"
}
}
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs44/100
2 of 4 inputs have descriptions. Add descriptions to the missing inputs, including where to obtain IDs and how to supply values.
card_id
The card id (from list_cards).
Clear enough to supply this argument.
preset › oneOf › 2 › name
Not provided
Missing description. Explain what this value means and how to supply it.
preset › oneOf › 2 › privileges
Not provided
Missing description. Explain what this value means and how to supply it.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations0/100
Declare readOnlyHint, destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
Not declared
Output schema46/100
Describe the returned fields so an agent can interpret the result.
{
"name": "set_card_preset",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"card_id",
"preset",
"context"
],
"properties": {
"preset": {
"oneOf": [
{
"type": "string"
},
{
"type": "null"
},
{
"type": "object",
"required": [
"privileges"
],
"properties": {
"name": {
"type": "string"
},
"privileges": {
"type": "array",
"items": {}
}
}
}
],
"description": "Template 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_id": {
"type": "string",
"description": "The card id (from list_cards)."
},
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"preset": {
"type": [
"object",
"null"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": [
"string",
"null"
]
},
"summary": {
"type": "string"
},
"version": {
"type": "number"
}
}
},
"pushed": {
"type": "array",
"items": {
"type": "string"
}
},
"message": {
"type": "string"
},
"summary": {
"type": "string"
},
"messages": {
"type": "array",
"items": {
"type": "string"
}
},
"policyId": {
"type": "string"
},
"needsNewCard": {
"type": "boolean"
},
"agentcardOnly": {
"type": "array",
"items": {
"type": "string"
}
},
"policyVersion": {
"type": "number"
}
}
}
}
Add a human-readable title so users do not have to interpret the tool identifier.
Description85/100
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.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs68/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
pattern
Merchant name pattern to remember, e.g. "STARBUCKS" or "ODD CAFE".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
card_id
Card id (from list_cards).
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations0/100
Declare readOnlyHint, destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
Not declared
Output schema45/100
Describe the returned fields so an agent can interpret the result.
{
"name": "allow_card_merchant",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"pattern",
"context"
],
"properties": {
"card_id": {
"type": "string",
"description": "Card id (from list_cards)."
},
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"pattern": {
"type": "string",
"description": "Merchant name pattern to remember, e.g. \"STARBUCKS\" or \"ODD CAFE\"."
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"scope": {
"type": "string"
},
"preset": {
"type": [
"object",
"null"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": [
"string",
"null"
]
},
"summary": {
"type": "string"
},
"version": {
"type": "number"
}
}
},
"message": {
"type": "string"
},
"pattern": {
"type": "string"
},
"summary": {
"type": "string"
},
"messages": {
"type": "array",
"items": {
"type": "string"
},
"description": "Card scope: where the remember is enforced."
},
"needsNewCard": {
"type": "boolean",
"description": "Card scope: true when the card keeps a network category allowlist the remember cannot widen."
},
"policyVersion": {
"type": "number"
}
}
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description82/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations0/100
Declare readOnlyHint, destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
Not declared
Output schema61/100
Describe the returned fields so an agent can interpret the result.
{
"name": "list_presets",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string"
},
"presets": {
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string",
"description": "The name to pass elsewhere as `preset`."
},
"builtin": {
"type": "boolean"
},
"summary": {
"type": "string"
},
"version": {
"type": "number"
}
}
}
}
}
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs93/100
Explain the meaning of this value, not just its name.
name
A name for this preset, e.g. "meals-only".
Clear enough to supply this argument.
total
Lifetime spend cap, in US dollars.
Clear enough to supply this argument.
per_day
Spend cap per rolling 24 hours, in US dollars.
Clear enough to supply this argument.
per_week
Spend cap per rolling 7 days, in US dollars.
Clear enough to supply this argument.
per_month
Spend cap per rolling 30 days, in US dollars.
Clear enough to supply this argument.
categories
Comma-separated spend categories to allow, e.g. "meals,groceries" (meals, groceries, travel, software, ai, wellness, retail).
Clear enough to supply this argument.
only_merchants
Comma-separated merchant name patterns to allow, e.g. "openai,anthropic".
Clear enough to supply this argument.
only_in
Comma-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".
Clear enough to supply this argument.
currencies
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.
Clear enough to supply this argument.
only_days
Comma-separated days to allow, e.g. "mon,tue,wed" or "weekdays"/"weekends".
Clear enough to supply this argument.
only_hours
An hour range to allow, e.g. "9-17" (24-hour clock; defaults to UTC without timezone).
Clear enough to supply this argument.
timezone
IANA timezone for only_days/only_hours (default UTC), e.g. "America/Los_Angeles". Always shown in summaries.
Clear enough to supply this argument.
only_from
Comma-separated callers to allow, e.g. "cli,mcp" (cli, mcp, api, browser).
Clear enough to supply this argument.
mode
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.
Clear enough to supply this argument.
privileges
Advanced: raw privilege objects instead of the rule fields above.
Explain the meaning of this value, not just its name.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations0/100
Declare readOnlyHint, destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
Not declared
Output schema47/100
Describe the returned fields so an agent can interpret the result.
{
"name": "save_preset",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"name",
"context"
],
"properties": {
"mode": {
"enum": [
"strict",
"watch"
],
"type": "string",
"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."
},
"name": {
"type": "string",
"description": "A name for this preset, e.g. \"meals-only\"."
},
"total": {
"type": "number",
"description": "Lifetime spend cap, in US dollars."
},
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"only_in": {
"type": "string",
"description": "Comma-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_day": {
"type": "number",
"description": "Spend cap per rolling 24 hours, in US dollars."
},
"per_week": {
"type": "number",
"description": "Spend cap per rolling 7 days, in US dollars."
},
"timezone": {
"type": "string",
"description": "IANA timezone for only_days/only_hours (default UTC), e.g. \"America/Los_Angeles\". Always shown in summaries."
},
"only_days": {
"type": "string",
"description": "Comma-separated days to allow, e.g. \"mon,tue,wed\" or \"weekdays\"/\"weekends\"."
},
"only_from": {
"type": "string",
"description": "Comma-separated callers to allow, e.g. \"cli,mcp\" (cli, mcp, api, browser)."
},
"per_month": {
"type": "number",
"description": "Spend cap per rolling 30 days, in US dollars."
},
"categories": {
"type": "string",
"description": "Comma-separated spend categories to allow, e.g. \"meals,groceries\" (meals, groceries, travel, software, ai, wellness, retail)."
},
"currencies": {
"type": "string",
"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."
},
"only_hours": {
"type": "string",
"description": "An hour range to allow, e.g. \"9-17\" (24-hour clock; defaults to UTC without timezone)."
},
"privileges": {
"type": "array",
"items": {},
"description": "Advanced: raw privilege objects instead of the rule fields above."
},
"only_merchants": {
"type": "string",
"description": "Comma-separated merchant name patterns to allow, e.g. \"openai,anthropic\"."
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"preset": {
"type": [
"object",
"null"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": [
"string",
"null"
]
},
"summary": {
"type": "string"
},
"version": {
"type": "number"
}
}
},
"message": {
"type": "string"
}
}
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
The saved preset name to delete.
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations0/100
Declare readOnlyHint, destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior.
Not declared
Output schema46/100
Describe the returned fields so an agent can interpret the result.
{
"name": "delete_preset",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"name",
"context"
],
"properties": {
"name": {
"type": "string",
"description": "The saved preset name to delete."
},
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"deleted": {
"type": "boolean"
},
"message": {
"type": "string"
}
}
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
The user's hosted wallet, as one shareable URL. Opens their Agentcard wallet in the browser: every card in one place, apply for an Agentcard card (identity verification runs right in the page). Mint it whenever the user needs a browser step (seeing cards, finishing verification when in-chat photos fail) and send them the URL. To ADD the user's own card, pass purpose "add_card": the link then opens their Agentcard vault card form directly (any card, typed once, locked with their passkey or master password, never seen by Agentcard) and works on personal logins too. Pass merchant + amount_cents to open the wallet ON the payment-approval sheet (the user picks a card and approves that exact charge) instead of the card list. Multi-use but short-lived (about 15 minutes — the exact moment is in expiresAt); mint a fresh one when it expires. The wallet link only works for app connections (OAuth).
The description explains the capability, when to use it, and what to expect.
Inputs81/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
purpose
"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.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
merchant
Merchant name shown on the payment-approval sheet (with amount_cents).
Clear enough to supply this argument.
amount_cents
Amount in cents. When present, the link opens on the payment-approval sheet for this charge.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"url": {
"type": "string",
"description": "The hosted wallet URL to share with the user."
},
"kind": {
"type": "string",
"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\" = passkey setup or passkey sign-in."
},
"message": {
"type": "string",
"description": "Ready-to-send sentence containing the URL."
},
"sandbox": {
"type": "boolean",
"description": "True when the connection is in test mode."
},
"expiresAt": {
"type": "string",
"description": "ISO time the link stops working."
}
}
}
Original tool metadata
{
"name": "get_wallet_link",
"description": "The user's hosted wallet, as one shareable URL. Opens their Agentcard wallet in the browser: every card in one place, apply for an Agentcard card (identity verification runs right in the page). Mint it whenever the user needs a browser step (seeing cards, finishing verification when in-chat photos fail) and send them the URL. To ADD the user's own card, pass purpose \"add_card\": the link then opens their Agentcard vault card form directly (any card, typed once, locked with their passkey or master password, never seen by Agentcard) and works on personal logins too. Pass merchant + amount_cents to open the wallet ON the payment-approval sheet (the user picks a card and approves that exact charge) instead of the card list. Multi-use but short-lived (about 15 minutes — the exact moment is in expiresAt); mint a fresh one when it expires. The wallet link only works for app connections (OAuth).",
"inputSchema": {
"type": "object",
"required": [
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"purpose": {
"enum": [
"wallet",
"add_card"
],
"type": "string",
"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."
},
"merchant": {
"type": "string",
"description": "Merchant name shown on the payment-approval sheet (with amount_cents)."
},
"amount_cents": {
"type": "integer",
"minimum": 1,
"description": "Amount in cents. When present, the link opens on the payment-approval sheet for this charge."
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"url": {
"type": "string",
"description": "The hosted wallet URL to share with the user."
},
"kind": {
"type": "string",
"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\" = passkey setup or passkey sign-in."
},
"message": {
"type": "string",
"description": "Ready-to-send sentence containing the URL."
},
"sandbox": {
"type": "boolean",
"description": "True when the connection is in test mode."
},
"expiresAt": {
"type": "string",
"description": "ISO time the link stops working."
}
}
},
"annotations": {
"title": "Get Wallet Link",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
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).
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"count": {
"type": "number",
"description": "Number of non-revoked added cards."
},
"message": {
"type": "string",
"description": "Human-readable list (or an empty-state note)."
},
"attachedCards": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Id of the added card (pass to create_card connected_card_id or remove_added_card)."
},
"brand": {
"type": [
"string",
"null"
],
"description": "Card brand."
},
"label": {
"type": "string",
"description": "Display name every surface shares: the nickname when set, else 'Bancorp Visa •••• 6830'."
},
"last4": {
"type": [
"string",
"null"
],
"description": "Last four digits."
},
"issuer": {
"type": [
"string",
"null"
],
"description": "Issuing bank, statement-style ('Bancorp', 'Chase'). Null when BIN data lacked it."
},
"status": {
"type": "string",
"description": "pending | active | ineligible."
},
"nickname": {
"type": [
"string",
"null"
],
"description": "User-set name for the card, when they gave it one."
},
"isDefault": {
"type": "boolean",
"description": "Whether create_card uses this one when no connected_card_id is given."
},
"statusDetail": {
"type": "string",
"description": "Ineligible rows only: why the card could not be added, in user-ready copy."
}
}
},
"description": "Added-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."
}
}
}
Original tool metadata
{
"name": "list_added_cards",
"description": "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).",
"inputSchema": {
"type": "object",
"required": [
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"count": {
"type": "number",
"description": "Number of non-revoked added cards."
},
"message": {
"type": "string",
"description": "Human-readable list (or an empty-state note)."
},
"attachedCards": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Id of the added card (pass to create_card connected_card_id or remove_added_card)."
},
"brand": {
"type": [
"string",
"null"
],
"description": "Card brand."
},
"label": {
"type": "string",
"description": "Display name every surface shares: the nickname when set, else 'Bancorp Visa •••• 6830'."
},
"last4": {
"type": [
"string",
"null"
],
"description": "Last four digits."
},
"issuer": {
"type": [
"string",
"null"
],
"description": "Issuing bank, statement-style ('Bancorp', 'Chase'). Null when BIN data lacked it."
},
"status": {
"type": "string",
"description": "pending | active | ineligible."
},
"nickname": {
"type": [
"string",
"null"
],
"description": "User-set name for the card, when they gave it one."
},
"isDefault": {
"type": "boolean",
"description": "Whether create_card uses this one when no connected_card_id is given."
},
"statusDetail": {
"type": "string",
"description": "Ineligible rows only: why the card could not be added, in user-ready copy."
}
}
},
"description": "Added-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."
}
}
},
"annotations": {
"title": "List Added Cards",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
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).
The description explains the capability, when to use it, and what to expect.
Inputs85/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
attached_card_id
The id of the added card to remove (from list_added_cards).
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"id": {
"type": "string",
"description": "The id of the removed card."
},
"status": {
"type": "string",
"description": "\"revoked\" on success."
},
"message": {
"type": "string",
"description": "Human-readable confirmation or guidance."
},
"closedCards": {
"type": "number",
"description": "How many virtual cards created against it were closed."
}
}
}
Original tool metadata
{
"name": "remove_added_card",
"description": "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).",
"inputSchema": {
"type": "object",
"required": [
"attached_card_id",
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"attached_card_id": {
"type": "string",
"description": "The id of the added card to remove (from list_added_cards)."
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"id": {
"type": "string",
"description": "The id of the removed card."
},
"status": {
"type": "string",
"description": "\"revoked\" on success."
},
"message": {
"type": "string",
"description": "Human-readable confirmation or guidance."
},
"closedCards": {
"type": "number",
"description": "How many virtual cards created against it were closed."
}
}
},
"annotations": {
"title": "Remove Added Card",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs87/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
card_id
The card ID to pause (from list_cards or create_card).
Clear enough to supply this argument.
approval_id
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.
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "pause_card",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"card_id",
"context"
],
"properties": {
"card_id": {
"type": "string",
"description": "The card ID to pause (from list_cards or create_card)."
},
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"approval_id": {
"type": "string",
"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."
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"cardId": {
"type": "string",
"description": "The card ID."
},
"status": {
"type": "string",
"description": "\"paused\" on success; an error discriminator otherwise (e.g. \"not_multi_use\", \"card_not_updatable\")."
},
"message": {
"type": "string",
"description": "Human-readable result."
}
}
},
"annotations": {
"title": "Pause Card",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description76/100
Resume a paused multi-use card so it accepts charges again. The inverse of pause_card.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs87/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
card_id
The paused card ID to resume.
Clear enough to supply this argument.
approval_id
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.
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "resume_card",
"description": "Resume a paused multi-use card so it accepts charges again. The inverse of pause_card.",
"inputSchema": {
"type": "object",
"required": [
"card_id",
"context"
],
"properties": {
"card_id": {
"type": "string",
"description": "The paused card ID to resume."
},
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"approval_id": {
"type": "string",
"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."
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"cardId": {
"type": "string",
"description": "The card ID."
},
"status": {
"type": "string",
"description": "\"active\" on success; an error discriminator otherwise (e.g. \"card_not_paused\")."
},
"message": {
"type": "string",
"description": "Human-readable result."
}
}
},
"annotations": {
"title": "Resume Card",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs90/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
card_id
The multi-use card ID to resize.
Clear enough to supply this argument.
approval_id
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.
Clear enough to supply this argument.
spend_limit_cents
The 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.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
new_limit_cents
Deprecated alias for spend_limit_cents. Prefer spend_limit_cents (matches the docs and the REST API).
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"cardId": {
"type": "string",
"description": "The card ID."
},
"status": {
"type": "string",
"description": "\"updated\" on success; an error discriminator otherwise (e.g. \"limit_below_spent\", \"insufficient_collateral\")."
},
"message": {
"type": "string",
"description": "Human-readable result."
},
"balanceCents": {
"type": "number",
"description": "The remaining spendable balance in cents."
},
"spendLimitCents": {
"type": "number",
"description": "The new total limit in cents."
}
}
}
Original tool metadata
{
"name": "update_card_limit",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"card_id",
"context"
],
"properties": {
"card_id": {
"type": "string",
"description": "The multi-use card ID to resize."
},
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"approval_id": {
"type": "string",
"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."
},
"new_limit_cents": {
"type": "number",
"description": "Deprecated alias for spend_limit_cents. Prefer spend_limit_cents (matches the docs and the REST API)."
},
"spend_limit_cents": {
"type": "number",
"description": "The 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."
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"cardId": {
"type": "string",
"description": "The card ID."
},
"status": {
"type": "string",
"description": "\"updated\" on success; an error discriminator otherwise (e.g. \"limit_below_spent\", \"insufficient_collateral\")."
},
"message": {
"type": "string",
"description": "Human-readable result."
},
"balanceCents": {
"type": "number",
"description": "The remaining spendable balance in cents."
},
"spendLimitCents": {
"type": "number",
"description": "The new total limit in cents."
}
}
},
"annotations": {
"title": "Update Card Limit",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description83/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs73/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "get_rewards",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"description": "Human-readable summary."
},
"balanceTokens": {
"type": "number",
"description": "Current token balance (1 token = 1 cent)."
},
"redeemedTokens": {
"type": "number",
"description": "Tokens redeemed all-time."
},
"minRedeemTokens": {
"type": "number",
"description": "Minimum tokens per redemption."
},
"lifetimeEarnedTokens": {
"type": "number",
"description": "Tokens earned all-time."
}
}
},
"annotations": {
"title": "Get Rewards",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description86/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs76/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tokens
How many tokens to redeem (1 token = 1 cent, so 500 tokens = $5.00 of wallet credit).
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"status": {
"type": "string",
"description": "\"redeemed\" on success; an error discriminator otherwise (e.g. \"below_minimum\", \"insufficient_tokens\", \"redemption_in_progress\")."
},
"message": {
"type": "string",
"description": "Human-readable result."
},
"amountCents": {
"type": "number",
"description": "Wallet credit in cents. Present when status is \"redeemed\"."
},
"redemptionId": {
"type": "string",
"description": "The redemption ID. Present when status is \"redeemed\"."
},
"deliveredCardId": {
"type": "string",
"description": "Rewards 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)."
},
"deliveredCardLast4": {
"type": "string",
"description": "Last 4 digits of the rewards card, when delivered inline."
}
}
}
Original tool metadata
{
"name": "redeem_rewards",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"tokens",
"context"
],
"properties": {
"tokens": {
"type": "number",
"description": "How many tokens to redeem (1 token = 1 cent, so 500 tokens = $5.00 of wallet credit)."
},
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"status": {
"type": "string",
"description": "\"redeemed\" on success; an error discriminator otherwise (e.g. \"below_minimum\", \"insufficient_tokens\", \"redemption_in_progress\")."
},
"message": {
"type": "string",
"description": "Human-readable result."
},
"amountCents": {
"type": "number",
"description": "Wallet credit in cents. Present when status is \"redeemed\"."
},
"redemptionId": {
"type": "string",
"description": "The redemption ID. Present when status is \"redeemed\"."
},
"deliveredCardId": {
"type": "string",
"description": "Rewards 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)."
},
"deliveredCardLast4": {
"type": "string",
"description": "Last 4 digits of the rewards card, when delivered inline."
}
}
},
"annotations": {
"title": "Redeem Rewards",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs86/100
Explain what happens when this optional value is omitted.
merchant
The merchant as the user would see it, e.g. "DoorDash".
Clear enough to supply this argument.
merchant_url
The merchant's website or checkout origin, e.g. https://www.doordash.com. Improves the category match.
Clear enough to supply this argument.
amount_cents
Order total in cents, when known.
Explain what happens when this optional value is omitted.
currency
ISO currency code, default usd. Non-USD purchases account for foreign transaction fees.
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"reason": {
"type": [
"string",
"null"
],
"description": "Why, in one or two sentences the user can be told verbatim."
},
"card_id": {
"type": [
"string",
"null"
],
"description": "The vault card to pay with (pass as card_id at checkout), or null."
},
"message": {
"type": "string",
"description": "Human-readable pick and reason."
},
"category": {
"type": [
"string",
"null"
],
"description": "The spend category the merchant resolved to."
},
"alternatives": {
"type": "array",
"description": "Other stored cards with their estimated value in cents and reason."
}
}
}
Original tool metadata
{
"name": "recommend_card",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"merchant",
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"currency": {
"type": "string",
"description": "ISO currency code, default usd. Non-USD purchases account for foreign transaction fees."
},
"merchant": {
"type": "string",
"description": "The merchant as the user would see it, e.g. \"DoorDash\"."
},
"amount_cents": {
"type": "number",
"description": "Order total in cents, when known."
},
"merchant_url": {
"type": "string",
"description": "The merchant's website or checkout origin, e.g. https://www.doordash.com. Improves the category match."
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"reason": {
"type": [
"string",
"null"
],
"description": "Why, in one or two sentences the user can be told verbatim."
},
"card_id": {
"type": [
"string",
"null"
],
"description": "The vault card to pay with (pass as card_id at checkout), or null."
},
"message": {
"type": "string",
"description": "Human-readable pick and reason."
},
"category": {
"type": [
"string",
"null"
],
"description": "The spend category the merchant resolved to."
},
"alternatives": {
"type": "array",
"description": "Other stored cards with their estimated value in cents and reason."
}
}
},
"annotations": {
"title": "Recommend Card",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description86/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs78/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
card_id
The vault card id (from list_cards → vaultCards).
Clear enough to supply this argument.
product
The card product as the user says it, e.g. "Chase Sapphire Preferred" or "Amex Gold". Four characters minimum.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
clear_product
true = forget the product name. Do not combine with product.
Clear enough to supply this argument.
smart_excluded
true = leave this card out of smart purchases; false = include it again.
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "name_card",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"card_id",
"context"
],
"properties": {
"card_id": {
"type": "string",
"description": "The vault card id (from list_cards → vaultCards)."
},
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"product": {
"type": "string",
"description": "The card product as the user says it, e.g. \"Chase Sapphire Preferred\" or \"Amex Gold\". Four characters minimum."
},
"clear_product": {
"type": "boolean",
"description": "true = forget the product name. Do not combine with product."
},
"smart_excluded": {
"type": "boolean",
"description": "true = leave this card out of smart purchases; false = include it again."
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message",
"status"
],
"properties": {
"status": {
"type": "string",
"description": "\"named\" | \"cleared\" | \"updated\" | \"no_match\" | \"ambiguous\" (several products match; nothing saved, ask the user) | \"noop\"."
},
"matches": {
"type": "array",
"description": "On no_match or an ambiguous name: the closest products found, to offer the user."
},
"message": {
"type": "string",
"description": "What was saved."
},
"product_key": {
"type": [
"string",
"null"
],
"description": "The saved product key."
},
"product_name": {
"type": [
"string",
"null"
],
"description": "The saved product name."
}
}
},
"annotations": {
"title": "Name Card",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description68/100
Start a new support conversation and send the first message
Describe the returned information so the agent knows whether it will answer the request.
Inputs76/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
message
Your initial support message
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"description": "Human-readable summary confirming the conversation was started."
},
"conversationId": {
"type": "string",
"description": "The ID of the newly created support conversation. Pass this to send_support_message or read_support_chat."
}
}
}
Original tool metadata
{
"name": "start_support_chat",
"description": "Start a new support conversation and send the first message",
"inputSchema": {
"type": "object",
"required": [
"message",
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"message": {
"type": "string",
"description": "Your initial support message"
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"description": "Human-readable summary confirming the conversation was started."
},
"conversationId": {
"type": "string",
"description": "The ID of the newly created support conversation. Pass this to send_support_message or read_support_chat."
}
}
},
"annotations": {
"title": "Start Support Chat",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description65/100
Send a message in an existing support conversation
Describe the concrete operation and its scope instead of restating the tool name.
Inputs58/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
conversation_id
The conversation ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
message
Your message
Explain the meaning of this value, not just its name.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"description": "Human-readable confirmation that the message was sent."
},
"conversationId": {
"type": "string",
"description": "The ID of the conversation the message was sent to."
}
}
}
Original tool metadata
{
"name": "send_support_message",
"description": "Send a message in an existing support conversation",
"inputSchema": {
"type": "object",
"required": [
"conversation_id",
"message",
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"message": {
"type": "string",
"description": "Your message"
},
"conversation_id": {
"type": "string",
"description": "The conversation ID"
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"description": "Human-readable confirmation that the message was sent."
},
"conversationId": {
"type": "string",
"description": "The ID of the conversation the message was sent to."
}
}
},
"annotations": {
"title": "Send Support Message",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description66/100
Read the message history of a support conversation
Describe the returned information so the agent knows whether it will answer the request.
Inputs56/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
conversation_id
The conversation ID
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"count": {
"type": "number",
"description": "Number of messages returned."
},
"status": {
"type": "string",
"description": "Outcome of the read: 'empty' when there are no messages yet, 'ok' when messages were returned."
},
"message": {
"type": "string",
"description": "Human-readable rendering of the conversation history."
},
"messages": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Unique message ID."
},
"body": {
"type": "string",
"description": "The message text."
},
"role": {
"type": "string",
"description": "Author role, e.g. 'visitor' for the user or an agent role for support."
},
"createdAt": {
"type": "string",
"description": "ISO timestamp of when the message was created."
}
}
},
"description": "The messages in the conversation, oldest first."
}
}
}
Original tool metadata
{
"name": "read_support_chat",
"description": "Read the message history of a support conversation",
"inputSchema": {
"type": "object",
"required": [
"conversation_id",
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"conversation_id": {
"type": "string",
"description": "The conversation ID"
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"count": {
"type": "number",
"description": "Number of messages returned."
},
"status": {
"type": "string",
"description": "Outcome of the read: 'empty' when there are no messages yet, 'ok' when messages were returned."
},
"message": {
"type": "string",
"description": "Human-readable rendering of the conversation history."
},
"messages": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Unique message ID."
},
"body": {
"type": "string",
"description": "The message text."
},
"role": {
"type": "string",
"description": "Author role, e.g. 'visitor' for the user or an agent role for support."
},
"createdAt": {
"type": "string",
"description": "ISO timestamp of when the message was created."
}
}
},
"description": "The messages in the conversation, oldest first."
}
}
},
"annotations": {
"title": "Read Support Chat",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"count": {
"type": "number",
"description": "Number of pending approvals."
},
"status": {
"type": "string",
"description": "Present only when the list is unavailable: \"personal_surface_only\" for company-connected sessions."
},
"message": {
"type": "string",
"description": "Human-readable list of pending approvals (or an empty-state note)."
},
"approvals": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Approval id. Pass as approval_id to approve_request once the user decides."
},
"card": {
"type": [
"object",
"null"
],
"properties": {
"id": {
"type": "string",
"description": "Card id."
},
"last4": {
"type": "string",
"description": "Last four digits."
},
"provider": {
"type": "string",
"description": "Issuing provider."
},
"connectedCard": {
"type": [
"object",
"null"
],
"description": "For cards created against the user's added card: the real card behind it (issuer, brand, last4, nickname)."
}
},
"description": "The card the ask is about (null for card-creation asks)."
},
"action": {
"type": "string",
"description": "Machine action, e.g. 'transaction', 'card_details', 'cross_app:close'."
},
"params": {
"type": "object",
"description": "Structured numbers bound to the ask, e.g. { amountCents } or { newLimitCents }."
},
"appName": {
"type": [
"string",
"null"
],
"description": "The app or company asking, when known."
},
"summary": {
"type": [
"string",
"null"
],
"description": "Short human summary of the ask, e.g. \"$25.00 card\"."
},
"createdAt": {
"type": "string",
"description": "ISO timestamp when the ask was made."
},
"expiresAt": {
"type": "string",
"description": "ISO timestamp when the ask expires unanswered."
},
"actionLabel": {
"type": "string",
"description": "Human verb for the ask, e.g. 'Create a card'."
}
}
},
"description": "Pending, unexpired approval requests, newest first. Each is waiting on the user's decision."
}
}
}
Original tool metadata
{
"name": "list_pending_approvals",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"count": {
"type": "number",
"description": "Number of pending approvals."
},
"status": {
"type": "string",
"description": "Present only when the list is unavailable: \"personal_surface_only\" for company-connected sessions."
},
"message": {
"type": "string",
"description": "Human-readable list of pending approvals (or an empty-state note)."
},
"approvals": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Approval id. Pass as approval_id to approve_request once the user decides."
},
"card": {
"type": [
"object",
"null"
],
"properties": {
"id": {
"type": "string",
"description": "Card id."
},
"last4": {
"type": "string",
"description": "Last four digits."
},
"provider": {
"type": "string",
"description": "Issuing provider."
},
"connectedCard": {
"type": [
"object",
"null"
],
"description": "For cards created against the user's added card: the real card behind it (issuer, brand, last4, nickname)."
}
},
"description": "The card the ask is about (null for card-creation asks)."
},
"action": {
"type": "string",
"description": "Machine action, e.g. 'transaction', 'card_details', 'cross_app:close'."
},
"params": {
"type": "object",
"description": "Structured numbers bound to the ask, e.g. { amountCents } or { newLimitCents }."
},
"appName": {
"type": [
"string",
"null"
],
"description": "The app or company asking, when known."
},
"summary": {
"type": [
"string",
"null"
],
"description": "Short human summary of the ask, e.g. \"$25.00 card\"."
},
"createdAt": {
"type": "string",
"description": "ISO timestamp when the ask was made."
},
"expiresAt": {
"type": "string",
"description": "ISO timestamp when the ask expires unanswered."
},
"actionLabel": {
"type": "string",
"description": "Human verb for the ask, e.g. 'Create a card'."
}
}
},
"description": "Pending, unexpired approval requests, newest first. Each is waiting on the user's decision."
}
}
},
"annotations": {
"title": "List Pending Approvals",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs85/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
approval_id
The approval request ID
Clear enough to supply this argument.
decision
Whether to approve or deny the request
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
action
The original action type from the approval prompt (list_pending_approvals rows carry it as action).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
resource_id
Card ID (for card_details and cross_app actions) or approval ID (for transaction)
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"required": [
"message"
],
"properties": {
"card": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Card ID."
},
"last4": {
"type": "string",
"description": "Last 4 digits of the card number."
},
"expiry": {
"type": "string",
"description": "Card expiry date."
},
"status": {
"type": "string",
"description": "Card status."
},
"balanceCents": {
"type": "number",
"description": "Card balance in cents."
}
},
"description": "The card resource returned by the approved follow-up action, when applicable."
},
"action": {
"type": "string",
"description": "The original action type from the approval prompt: 'card_details' or 'transaction'."
},
"status": {
"type": "string",
"description": "Outcome 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'."
},
"message": {
"type": "string",
"description": "Human-readable summary of the approval outcome and any follow-up action."
},
"decision": {
"type": "string",
"description": "The decision that was applied: 'approved' or 'denied'."
}
}
}
Original tool metadata
{
"name": "approve_request",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"approval_id",
"decision",
"action",
"resource_id",
"context"
],
"properties": {
"action": {
"enum": [
"card_details",
"transaction",
"cross_app:details",
"cross_app:close",
"cross_app:pause",
"cross_app:resume",
"cross_app:update"
],
"type": "string",
"description": "The original action type from the approval prompt (list_pending_approvals rows carry it as action)."
},
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"decision": {
"enum": [
"approved",
"denied"
],
"type": "string",
"description": "Whether to approve or deny the request"
},
"approval_id": {
"type": "string",
"description": "The approval request ID"
},
"resource_id": {
"type": "string",
"description": "Card ID (for card_details and cross_app actions) or approval ID (for transaction)"
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"card": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Card ID."
},
"last4": {
"type": "string",
"description": "Last 4 digits of the card number."
},
"expiry": {
"type": "string",
"description": "Card expiry date."
},
"status": {
"type": "string",
"description": "Card status."
},
"balanceCents": {
"type": "number",
"description": "Card balance in cents."
}
},
"description": "The card resource returned by the approved follow-up action, when applicable."
},
"action": {
"type": "string",
"description": "The original action type from the approval prompt: 'card_details' or 'transaction'."
},
"status": {
"type": "string",
"description": "Outcome 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'."
},
"message": {
"type": "string",
"description": "Human-readable summary of the approval outcome and any follow-up action."
},
"decision": {
"type": "string",
"description": "The decision that was applied: 'approved' or 'denied'."
}
}
},
"annotations": {
"title": "Approve Request",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
phone_number
User's phone number in international E.164 format with a country code (e.g. +1 555 123 4567, +44 7911 123456)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
terms_accepted
Must be true — the user accepted the AgentCard cardholder terms of service
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"status": {
"type": "string",
"description": "Outcome of the submission: 'saved' when the user information was stored successfully."
},
"message": {
"type": "string",
"description": "Human-readable confirmation that the user information was saved."
}
}
}
Original tool metadata
{
"name": "submit_user_info",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"phone_number",
"terms_accepted",
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"phone_number": {
"type": "string",
"description": "User's phone number in international E.164 format with a country code (e.g. +1 555 123 4567, +44 7911 123456)"
},
"terms_accepted": {
"type": "boolean",
"description": "Must be true — the user accepted the AgentCard cardholder terms of service"
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"status": {
"type": "string",
"description": "Outcome of the submission: 'saved' when the user information was stored successfully."
},
"message": {
"type": "string",
"description": "Human-readable confirmation that the user information was saved."
}
}
},
"annotations": {
"title": "Submit User Info",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
terms_accepted
DEPRECATED — use agreements_accepted. Pass true once the user has explicitly agreed to the card issuer's cardholder terms in the conversation.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
agreements_accepted
Keys 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.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "start_kyc",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"terms_accepted": {
"type": "boolean",
"description": "DEPRECATED — use agreements_accepted. Pass true once the user has explicitly agreed to the card issuer's cardholder terms in the conversation."
},
"agreements_accepted": {
"type": "array",
"items": {
"type": "string"
},
"description": "Keys 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."
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"reason": {
"type": [
"string",
"null"
],
"description": "Provider reason on rejection."
},
"status": {
"type": "string",
"description": "\"started\", \"verified\", \"rejected\", or \"unknown\"."
},
"message": {
"type": "string",
"description": "Human-readable summary / next step."
},
"nextStep": {
"type": [
"string",
"null"
],
"description": "Conversational step: id_document | fields | terms | face_verification | review_pending | verified | rejected."
},
"uploadUrl": {
"type": "string",
"description": "Browser upload page for the ID photo (1h validity)."
},
"missingFields": {
"type": "array",
"items": {
"type": "string"
},
"description": "Fields still needed from the user."
},
"verificationUrl": {
"type": "string",
"description": "Face-scan page (conversational flow) or hosted verification URL (legacy flow), 48h validity."
}
}
},
"annotations": {
"title": "Start Identity Verification",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs73/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"reason": {
"type": [
"string",
"null"
],
"description": "Failure reason from the verification provider when one exists."
},
"status": {
"type": [
"string",
"null"
],
"description": "Raw KYC state: \"verified\", \"pending\", \"requires_input\", \"duplicate_identity\", \"canceled\", or null if never started."
},
"message": {
"type": "string",
"description": "Human-readable status / next step."
},
"nextStep": {
"type": [
"string",
"null"
],
"description": "Conversational next step when the flow is in progress."
},
"verified": {
"type": "boolean",
"description": "True when identity verification has passed."
},
"missingFields": {
"type": "array",
"items": {
"type": "string"
}
},
"verificationUrl": {
"type": "string"
}
}
}
Original tool metadata
{
"name": "get_kyc_status",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"reason": {
"type": [
"string",
"null"
],
"description": "Failure reason from the verification provider when one exists."
},
"status": {
"type": [
"string",
"null"
],
"description": "Raw KYC state: \"verified\", \"pending\", \"requires_input\", \"duplicate_identity\", \"canceled\", or null if never started."
},
"message": {
"type": "string",
"description": "Human-readable status / next step."
},
"nextStep": {
"type": [
"string",
"null"
],
"description": "Conversational next step when the flow is in progress."
},
"verified": {
"type": "boolean",
"description": "True when identity verification has passed."
},
"missingFields": {
"type": "array",
"items": {
"type": "string"
}
},
"verificationUrl": {
"type": "string"
}
}
},
"annotations": {
"title": "Get KYC Status",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
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).
The description explains the capability, when to use it, and what to expect.
Inputs94/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
front_base64
Base64 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.
Clear enough to supply this argument.
back_base64
Base64 image bytes of the license back (optional, recommended — the barcode reads most accurately). Same rule: programmatically sourced only.
Clear enough to supply this argument.
front_mime_type
MIME type of front_base64 (image/jpeg, image/png, image/webp). Defaults to image/jpeg.
Clear enough to supply this argument.
back_mime_type
MIME type of back_base64. Defaults to image/jpeg.
Clear enough to supply this argument.
file_path
Local 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.
Clear enough to supply this argument.
back_file_path
Local path to the back of the license (optional, recommended). Local/stdio connections only.
Clear enough to supply this argument.
document_type
ONLY 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.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
issuing_country
2-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.
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Describe the returned fields so an agent can interpret the result.
View output schema
{
"type": "object",
"required": [
"message"
],
"properties": {
"status": {
"type": "string",
"description": "processed | document_expired | upload_failed | upload_link_provided"
},
"message": {
"type": "string"
},
"nextStep": {
"type": [
"string",
"null"
]
},
"extracted": {
"type": "object",
"description": "Fields read from the document (confirm with the user)."
},
"uploadUrl": {
"type": "string"
},
"unreadable": {
"type": "boolean",
"description": "True 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."
},
"missingFields": {
"type": "array",
"items": {
"type": "string"
}
},
"verificationUrl": {
"type": "string"
}
}
}
Original tool metadata
{
"name": "submit_kyc_document",
"description": "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).",
"inputSchema": {
"type": "object",
"required": [
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"file_path": {
"type": "string",
"description": "Local 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_base64": {
"type": "string",
"description": "Base64 image bytes of the license back (optional, recommended — the barcode reads most accurately). Same rule: programmatically sourced only."
},
"front_base64": {
"type": "string",
"description": "Base64 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_type": {
"enum": [
"drivers_license",
"state_id",
"passport"
],
"type": "string",
"description": "ONLY 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_path": {
"type": "string",
"description": "Local path to the back of the license (optional, recommended). Local/stdio connections only."
},
"back_mime_type": {
"type": "string",
"description": "MIME type of back_base64. Defaults to image/jpeg."
},
"front_mime_type": {
"type": "string",
"description": "MIME type of front_base64 (image/jpeg, image/png, image/webp). Defaults to image/jpeg."
},
"issuing_country": {
"type": "string",
"description": "2-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."
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"status": {
"type": "string",
"description": "processed | document_expired | upload_failed | upload_link_provided"
},
"message": {
"type": "string"
},
"nextStep": {
"type": [
"string",
"null"
]
},
"extracted": {
"type": "object",
"description": "Fields read from the document (confirm with the user)."
},
"uploadUrl": {
"type": "string"
},
"unreadable": {
"type": "boolean",
"description": "True 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."
},
"missingFields": {
"type": "array",
"items": {
"type": "string"
}
},
"verificationUrl": {
"type": "string"
}
}
},
"annotations": {
"title": "Submit ID Document",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description80/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs67/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "check_kyc_document",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string"
},
"nextStep": {
"type": [
"string",
"null"
]
},
"uploadUrl": {
"type": "string"
},
"missingFields": {
"type": "array",
"items": {
"type": "string"
}
},
"verificationUrl": {
"type": "string"
}
}
},
"annotations": {
"title": "Check ID Document Status",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description80/100
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.
Describe the returned information so the agent knows whether it will answer the request.
Inputs89/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
first_name
Legal first name, exactly as printed on the ID document.
Clear enough to supply this argument.
last_name
Legal last name, exactly as printed on the ID document.
Clear enough to supply this argument.
date_of_birth
YYYY-MM-DD
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
ssn
US documents: 9-digit SSN, dashes optional. Non-US documents: the national ID / tax number printed on the ID. Forward-only — never stored.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
address_line1
Residential street address, line 1 (e.g. 123 Main St).
Clear enough to supply this argument.
address_line2
Residential street address, line 2 — apartment, suite, or unit. Omit if none.
Clear enough to supply this argument.
address_city
City of the residential address.
Clear enough to supply this argument.
address_region
2-letter state code for US (e.g. CA).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
address_postal_code
Postal / ZIP code of the residential address.
Clear enough to supply this argument.
address_country_code
2-letter ISO country code (e.g. US).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
phone_number
E.164 with country code, e.g. +14155551234.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
terms_accepted
DEPRECATED — use agreements_accepted. true once the user explicitly accepted the card issuer's cardholder terms.
Clear enough to supply this argument.
agreements_accepted
Keys 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.
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "submit_kyc_fields",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"context"
],
"properties": {
"ssn": {
"type": "string",
"description": "US documents: 9-digit SSN, dashes optional. Non-US documents: the national ID / tax number printed on the ID. Forward-only — never stored."
},
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"last_name": {
"type": "string",
"description": "Legal last name, exactly as printed on the ID document."
},
"first_name": {
"type": "string",
"description": "Legal first name, exactly as printed on the ID document."
},
"address_city": {
"type": "string",
"description": "City of the residential address."
},
"phone_number": {
"type": "string",
"description": "E.164 with country code, e.g. +14155551234."
},
"address_line1": {
"type": "string",
"description": "Residential street address, line 1 (e.g. 123 Main St)."
},
"address_line2": {
"type": "string",
"description": "Residential street address, line 2 — apartment, suite, or unit. Omit if none."
},
"date_of_birth": {
"type": "string",
"description": "YYYY-MM-DD"
},
"address_region": {
"type": "string",
"description": "2-letter state code for US (e.g. CA)."
},
"terms_accepted": {
"type": "boolean",
"description": "DEPRECATED — use agreements_accepted. true once the user explicitly accepted the card issuer's cardholder terms."
},
"address_postal_code": {
"type": "string",
"description": "Postal / ZIP code of the residential address."
},
"agreements_accepted": {
"type": "array",
"items": {
"type": "string"
},
"description": "Keys 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_code": {
"type": "string",
"description": "2-letter ISO country code (e.g. US)."
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string"
},
"nextStep": {
"type": [
"string",
"null"
]
},
"missingFields": {
"type": "array",
"items": {
"type": "string"
}
},
"verificationUrl": {
"type": "string",
"description": "Face-scan link, present once everything is collected."
}
}
},
"annotations": {
"title": "Submit KYC Fields",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description80/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
card_id
A card ID for that card's transactions; omit for all cards in the account.
Clear enough to supply this argument.
limit
Max number of transactions to return (default 20)
Clear enough to supply this argument.
offset
Skip this many (all-cards view pagination; ignored for a single card).
Clear enough to supply this argument.
status
Filter by transaction status (e.g. PENDING, SETTLED, DECLINED, REVERSED, EXPIRED, REFUNDED)
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"count": {
"type": "number",
"description": "Number of transactions returned."
},
"message": {
"type": "string",
"description": "Human-readable list of transactions (or a \"no transactions\" note)."
},
"transactions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Transaction ID."
},
"mcc": {
"type": "string",
"description": "Merchant category code."
},
"cardId": {
"type": [
"string",
"null"
],
"description": "Card ID (present in the all-cards view; null for wallet-funding rows)."
},
"source": {
"type": "string",
"description": "Transaction source."
},
"status": {
"type": "string",
"description": "Status, e.g. PENDING, SETTLED, DECLINED, REVERSED, EXPIRED, REFUNDED."
},
"merchant": {
"type": "string",
"description": "Merchant name."
},
"cardLast4": {
"type": [
"string",
"null"
],
"description": "Last four of the card (present in the all-cards view; null for wallet-funding rows)."
},
"createdAt": {
"type": "string",
"description": "ISO timestamp when the transaction was created."
},
"eventType": {
"type": "string",
"description": "Underlying issuing event type."
},
"amountCents": {
"type": "number",
"description": "Transaction amount in cents."
},
"description": {
"type": "string",
"description": "Transaction description."
},
"processorTransactionId": {
"type": [
"string",
"null"
],
"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."
}
}
},
"description": "The transactions for the card, newest first."
}
}
}
Original tool metadata
{
"name": "list_transactions",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"context"
],
"properties": {
"limit": {
"type": "number",
"description": "Max number of transactions to return (default 20)"
},
"offset": {
"type": "number",
"description": "Skip this many (all-cards view pagination; ignored for a single card)."
},
"status": {
"type": "string",
"description": "Filter by transaction status (e.g. PENDING, SETTLED, DECLINED, REVERSED, EXPIRED, REFUNDED)"
},
"card_id": {
"type": "string",
"description": "A card ID for that card's transactions; omit for all cards in the account."
},
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"count": {
"type": "number",
"description": "Number of transactions returned."
},
"message": {
"type": "string",
"description": "Human-readable list of transactions (or a \"no transactions\" note)."
},
"transactions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Transaction ID."
},
"mcc": {
"type": "string",
"description": "Merchant category code."
},
"cardId": {
"type": [
"string",
"null"
],
"description": "Card ID (present in the all-cards view; null for wallet-funding rows)."
},
"source": {
"type": "string",
"description": "Transaction source."
},
"status": {
"type": "string",
"description": "Status, e.g. PENDING, SETTLED, DECLINED, REVERSED, EXPIRED, REFUNDED."
},
"merchant": {
"type": "string",
"description": "Merchant name."
},
"cardLast4": {
"type": [
"string",
"null"
],
"description": "Last four of the card (present in the all-cards view; null for wallet-funding rows)."
},
"createdAt": {
"type": "string",
"description": "ISO timestamp when the transaction was created."
},
"eventType": {
"type": "string",
"description": "Underlying issuing event type."
},
"amountCents": {
"type": "number",
"description": "Transaction amount in cents."
},
"description": {
"type": "string",
"description": "Transaction description."
},
"processorTransactionId": {
"type": [
"string",
"null"
],
"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."
}
}
},
"description": "The transactions for the card, newest first."
}
}
},
"annotations": {
"title": "List Transactions",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs72/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"description": "Human-readable summary of the result."
},
"checkoutUrl": {
"type": "string",
"description": "Secure Stripe checkout URL the user must open to save their payment method."
},
"stripeSessionId": {
"type": "string",
"description": "Identifier of the Stripe Checkout session created for the setup."
}
}
}
Original tool metadata
{
"name": "setup_payment_method",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"description": "Human-readable summary of the result."
},
"checkoutUrl": {
"type": "string",
"description": "Secure Stripe checkout URL the user must open to save their payment method."
},
"stripeSessionId": {
"type": "string",
"description": "Identifier of the Stripe Checkout session created for the setup."
}
}
},
"annotations": {
"title": "Setup Payment Method",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description79/100
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.)
Describe the returned information so the agent knows whether it will answer the request.
Inputs67/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "get_balance",
"description": "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.)",
"inputSchema": {
"type": "object",
"required": [
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"status": {
"type": "string",
"description": "Balance account status."
},
"message": {
"type": "string",
"description": "Human-readable balance summary."
},
"balanceUsd": {
"type": "string",
"description": "Spendable cash balance in USD (string decimal)."
},
"confirmingUsd": {
"type": "string",
"description": "Deposit clearing on-chain, not yet spendable (present only mid-deposit)."
}
}
},
"annotations": {
"title": "Get Cash Balance",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs83/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
amount_cents
Amount 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.
Clear enough to supply this argument.
payment_method
Payment method for the checkout: apple_pay or google_pay. Ask the user which one their device has; apple_pay only when unknown.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"description": "Human-readable result or next step."
},
"amountUsd": {
"type": "string",
"description": "Amount of the created checkout in USD."
},
"checkoutUrl": {
"type": "string",
"description": "Single-use payment link to hand the user verbatim (present when a checkout was created)."
}
}
}
Original tool metadata
{
"name": "add_funds",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"amount_cents",
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"amount_cents": {
"type": "number",
"description": "Amount 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_method": {
"enum": [
"apple_pay",
"google_pay"
],
"type": "string",
"description": "Payment method for the checkout: apple_pay or google_pay. Ask the user which one their device has; apple_pay only when unknown."
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"description": "Human-readable result or next step."
},
"amountUsd": {
"type": "string",
"description": "Amount of the created checkout in USD."
},
"checkoutUrl": {
"type": "string",
"description": "Single-use payment link to hand the user verbatim (present when a checkout was created)."
}
}
},
"annotations": {
"title": "Add Funds",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs71/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Align the output schema with the tool’s documented result.
View output schema
{
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"description": "Human-readable result or next step."
}
}
}
Original tool metadata
{
"name": "start_phone_verification",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"description": "Human-readable result or next step."
}
}
},
"annotations": {
"title": "Start Phone Verification",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs80/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
code
The one-time code the user received, as a string (keep any leading zeros — do not send it as a number).
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Describe the returned fields so an agent can interpret the result.
View output schema
{
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"description": "Human-readable result or next step."
}
}
}
Original tool metadata
{
"name": "verify_phone",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"code",
"context"
],
"properties": {
"code": {
"type": "string",
"description": "The one-time code the user received, as a string (keep any leading zeros — do not send it as a number)."
},
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"description": "Human-readable result or next step."
}
}
},
"annotations": {
"title": "Verify Phone",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs70/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
code
The promo code exactly as the user provided it (case and dashes are forgiven).
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"description": "Human-readable result or next step."
}
}
}
Original tool metadata
{
"name": "redeem_code",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"code",
"context"
],
"properties": {
"code": {
"type": "string",
"description": "The promo code exactly as the user provided it (case and dashes are forgiven)."
},
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"description": "Human-readable result or next step."
}
}
},
"annotations": {
"title": "Redeem Promo Code",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"plan": {
"type": "string",
"description": "Raw plan id, e.g. 'free', 'basic', or 'pro'."
},
"message": {
"type": "string",
"description": "Human-readable plan + usage summary."
},
"planName": {
"type": "string",
"description": "Display label of the plan, e.g. \"Basic ($15/mo)\"."
},
"ordersPlaced": {
"type": "number",
"description": "Orders placed (counts toward the free-order quota on Free)."
},
"cardsRemaining": {
"type": [
"number",
"null"
],
"description": "Cards remaining this month; null means unlimited."
},
"cardsThisMonth": {
"type": "number",
"description": "Number of cards created this month."
},
"currentPeriodEnd": {
"type": [
"string",
"null"
],
"description": "ISO date the current billing period ends, or null."
},
"maxCardsPerMonth": {
"type": [
"number",
"null"
],
"description": "Max cards allowed per month; null means unlimited (connections through a company OAuth client or organization have no card limits)."
},
"cancelAtPeriodEnd": {
"type": "boolean",
"description": "Whether the subscription cancels at the end of the current billing period."
},
"maxLifetimeOrders": {
"type": [
"number",
"null"
],
"description": "Lifetime free-order quota; null means unlimited (paid plans)."
},
"maxCardAmountCents": {
"type": [
"number",
"null"
],
"description": "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."
},
"subscriptionStatus": {
"type": [
"string",
"null"
],
"description": "Stripe subscription status (e.g. 'active', 'past_due'), or null on Free / when unavailable."
},
"activeMultiUseCards": {
"type": "number",
"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)."
},
"maxCardAmountDollars": {
"type": [
"string",
"null"
],
"description": "The per-card cap in effect, formatted as USD dollars, e.g. \"500.00\"; null means no per-card cap."
},
"maxActiveMultiUseCards": {
"type": [
"number",
"null"
],
"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)."
},
"planMaxCardAmountCents": {
"type": [
"number",
"null"
],
"description": "The personal plan's per-card cap, in cents; null for company-governed connections (no plan cap)."
},
"railMaxCardAmountCents": {
"type": [
"number",
"null"
],
"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."
}
}
}
Original tool metadata
{
"name": "get_plan",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"plan": {
"type": "string",
"description": "Raw plan id, e.g. 'free', 'basic', or 'pro'."
},
"message": {
"type": "string",
"description": "Human-readable plan + usage summary."
},
"planName": {
"type": "string",
"description": "Display label of the plan, e.g. \"Basic ($15/mo)\"."
},
"ordersPlaced": {
"type": "number",
"description": "Orders placed (counts toward the free-order quota on Free)."
},
"cardsRemaining": {
"type": [
"number",
"null"
],
"description": "Cards remaining this month; null means unlimited."
},
"cardsThisMonth": {
"type": "number",
"description": "Number of cards created this month."
},
"currentPeriodEnd": {
"type": [
"string",
"null"
],
"description": "ISO date the current billing period ends, or null."
},
"maxCardsPerMonth": {
"type": [
"number",
"null"
],
"description": "Max cards allowed per month; null means unlimited (connections through a company OAuth client or organization have no card limits)."
},
"cancelAtPeriodEnd": {
"type": "boolean",
"description": "Whether the subscription cancels at the end of the current billing period."
},
"maxLifetimeOrders": {
"type": [
"number",
"null"
],
"description": "Lifetime free-order quota; null means unlimited (paid plans)."
},
"maxCardAmountCents": {
"type": [
"number",
"null"
],
"description": "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."
},
"subscriptionStatus": {
"type": [
"string",
"null"
],
"description": "Stripe subscription status (e.g. 'active', 'past_due'), or null on Free / when unavailable."
},
"activeMultiUseCards": {
"type": "number",
"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)."
},
"maxCardAmountDollars": {
"type": [
"string",
"null"
],
"description": "The per-card cap in effect, formatted as USD dollars, e.g. \"500.00\"; null means no per-card cap."
},
"maxActiveMultiUseCards": {
"type": [
"number",
"null"
],
"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)."
},
"planMaxCardAmountCents": {
"type": [
"number",
"null"
],
"description": "The personal plan's per-card cap, in cents; null for company-governed connections (no plan cap)."
},
"railMaxCardAmountCents": {
"type": [
"number",
"null"
],
"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."
}
}
},
"annotations": {
"title": "Get Plan & Usage",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
plan
Which plan to upgrade to. Defaults to 'basic'.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"plan": {
"type": "string",
"description": "Display label of the target plan, e.g. 'Basic' or 'Pro'. Present when the requested plan is known."
},
"status": {
"enum": [
"swapped",
"checkout_required",
"already_on_plan",
"waitlisted",
"unavailable",
"checkout_failed"
],
"type": "string",
"description": "Discriminator for the outcome branch."
},
"message": {
"type": "string",
"description": "Human-readable summary of the upgrade outcome."
},
"checkoutUrl": {
"type": "string",
"description": "Stripe Checkout URL the user must open to complete payment. Present only when status is checkout_required."
}
}
}
Original tool metadata
{
"name": "upgrade_plan",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"context"
],
"properties": {
"plan": {
"enum": [
"basic",
"pro"
],
"type": "string",
"description": "Which plan to upgrade to. Defaults to 'basic'."
},
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"plan": {
"type": "string",
"description": "Display label of the target plan, e.g. 'Basic' or 'Pro'. Present when the requested plan is known."
},
"status": {
"enum": [
"swapped",
"checkout_required",
"already_on_plan",
"waitlisted",
"unavailable",
"checkout_failed"
],
"type": "string",
"description": "Discriminator for the outcome branch."
},
"message": {
"type": "string",
"description": "Human-readable summary of the upgrade outcome."
},
"checkoutUrl": {
"type": "string",
"description": "Stripe Checkout URL the user must open to complete payment. Present only when status is checkout_required."
}
}
},
"annotations": {
"title": "Upgrade Plan",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs72/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"count": {
"type": "number",
"description": "Number of saved payment methods."
},
"status": {
"enum": [
"listed",
"no_payment_method"
],
"type": "string",
"description": "Whether any payment methods are saved."
},
"message": {
"type": "string",
"description": "Human-readable summary of the saved payment methods."
},
"defaultId": {
"type": "string",
"description": "The id of the payment method marked as default, if any."
},
"paymentMethods": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The payment method ID (e.g. pm_xxx)."
},
"brand": {
"type": "string",
"description": "Card brand, e.g. \"visa\"."
},
"last4": {
"type": "string",
"description": "Last 4 digits of the card."
},
"expYear": {
"type": "number",
"description": "Card expiry year."
},
"expMonth": {
"type": "number",
"description": "Card expiry month."
},
"isDefault": {
"type": "boolean",
"description": "Whether this is the default payment method."
}
}
},
"description": "The saved payment methods."
}
}
}
Original tool metadata
{
"name": "list_payment_methods",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"count": {
"type": "number",
"description": "Number of saved payment methods."
},
"status": {
"enum": [
"listed",
"no_payment_method"
],
"type": "string",
"description": "Whether any payment methods are saved."
},
"message": {
"type": "string",
"description": "Human-readable summary of the saved payment methods."
},
"defaultId": {
"type": "string",
"description": "The id of the payment method marked as default, if any."
},
"paymentMethods": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The payment method ID (e.g. pm_xxx)."
},
"brand": {
"type": "string",
"description": "Card brand, e.g. \"visa\"."
},
"last4": {
"type": "string",
"description": "Last 4 digits of the card."
},
"expYear": {
"type": "number",
"description": "Card expiry year."
},
"expMonth": {
"type": "number",
"description": "Card expiry month."
},
"isDefault": {
"type": "boolean",
"description": "Whether this is the default payment method."
}
}
},
"description": "The saved payment methods."
}
}
},
"annotations": {
"title": "List Payment Methods",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"count": {
"type": "number",
"description": "Number of connected apps."
},
"status": {
"type": "string",
"description": "Result status: \"no_connections\" when none are connected, otherwise \"ok\"."
},
"message": {
"type": "string",
"description": "Human-readable summary of the connected apps."
},
"connections": {
"type": "array",
"items": {
"type": "object",
"properties": {
"active": {
"type": "boolean",
"description": "Whether the connection is still active."
},
"scopes": {
"type": "array",
"items": {
"type": "string"
},
"description": "OAuth scopes granted to the app."
},
"clientId": {
"type": "string",
"description": "The OAuth client ID of the connected app."
},
"clientName": {
"type": [
"string",
"null"
],
"description": "The display name of the connected app, or null if unnamed."
},
"connectedAt": {
"type": "string",
"description": "ISO timestamp of when the app was first connected."
},
"lastTokenAt": {
"type": "string",
"description": "ISO timestamp of the most recent token issued to the app."
}
}
},
"description": "The third-party apps connected to the user's account via OAuth."
}
}
}
Original tool metadata
{
"name": "list_connections",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"count": {
"type": "number",
"description": "Number of connected apps."
},
"status": {
"type": "string",
"description": "Result status: \"no_connections\" when none are connected, otherwise \"ok\"."
},
"message": {
"type": "string",
"description": "Human-readable summary of the connected apps."
},
"connections": {
"type": "array",
"items": {
"type": "object",
"properties": {
"active": {
"type": "boolean",
"description": "Whether the connection is still active."
},
"scopes": {
"type": "array",
"items": {
"type": "string"
},
"description": "OAuth scopes granted to the app."
},
"clientId": {
"type": "string",
"description": "The OAuth client ID of the connected app."
},
"clientName": {
"type": [
"string",
"null"
],
"description": "The display name of the connected app, or null if unnamed."
},
"connectedAt": {
"type": "string",
"description": "ISO timestamp of when the app was first connected."
},
"lastTokenAt": {
"type": "string",
"description": "ISO timestamp of the most recent token issued to the app."
}
}
},
"description": "The third-party apps connected to the user's account via OAuth."
}
}
},
"annotations": {
"title": "List Connected Apps",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs84/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
client_id
The OAuth client ID of the app to revoke (from list_connections).
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"status": {
"type": "string",
"description": "Result status: \"revoked\" when tokens were invalidated, \"not_connected\" when the app had no active access."
},
"message": {
"type": "string",
"description": "Human-readable outcome."
},
"revoked": {
"type": "number",
"description": "Number of OAuth tokens that were revoked."
},
"clientId": {
"type": "string",
"description": "The client ID that was revoked."
}
}
}
Original tool metadata
{
"name": "revoke_connection",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"client_id",
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"client_id": {
"type": "string",
"description": "The OAuth client ID of the app to revoke (from list_connections)."
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"status": {
"type": "string",
"description": "Result status: \"revoked\" when tokens were invalidated, \"not_connected\" when the app had no active access."
},
"message": {
"type": "string",
"description": "Human-readable outcome."
},
"revoked": {
"type": "number",
"description": "Number of OAuth tokens that were revoked."
},
"clientId": {
"type": "string",
"description": "The client ID that was revoked."
}
}
},
"annotations": {
"title": "Revoke Connected App",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
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.
Resolve contradictions between the description, input schema, and annotations.
Inputs75/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "get_settings",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"description": "Human-readable settings summary."
},
"authorization": {
"type": "object",
"description": "Authorization (approval) settings — read-only."
},
"notifications": {
"type": "object",
"description": "Email notification preferences."
},
"default_payment": {
"type": [
"object",
"null"
],
"description": "The wallet-level default payment source: { source: 'balance' } or { source: 'connected', connected_card_id }. null = auto (an active added card wins, else the balance)."
},
"delivery_address": {
"type": [
"object",
"null"
],
"description": "The wallet-level default delivery address (street/city/state/zip + optional address2/phone/name), or null when unset."
}
}
},
"annotations": {
"title": "Get Settings",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Link or merge another Agentcard account that belongs to the same person. Use when the user says they already have an account under a DIFFERENT email or phone number — most often after identity verification (KYC) is rejected as a duplicate, which means that person already verified on another account. Two steps: (1) call with { type, identifier } to send a one-time code to that email/phone; (2) call again with the { ticket, code } to verify. If the identifier belongs to a different account, the two accounts are MERGED (the identity-verified account survives and gains the other's email/phone, so both sign in to one account); if no account has it, it is simply added to the current account.
The description explains the capability, when to use it, and what to expect.
Inputs82/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
type
Step 1: which kind of identifier the OTHER account uses.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
identifier
Step 1: the email address or phone number of the other account to verify.
Clear enough to supply this argument.
ticket
Step 2: the ticket returned by step 1.
Clear enough to supply this argument.
code
Step 2: the one-time code the user received.
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"description": "Human-readable result or next step."
}
}
}
Original tool metadata
{
"name": "link_account",
"description": "Link or merge another Agentcard account that belongs to the same person. Use when the user says they already have an account under a DIFFERENT email or phone number — most often after identity verification (KYC) is rejected as a duplicate, which means that person already verified on another account. Two steps: (1) call with { type, identifier } to send a one-time code to that email/phone; (2) call again with the { ticket, code } to verify. If the identifier belongs to a different account, the two accounts are MERGED (the identity-verified account survives and gains the other's email/phone, so both sign in to one account); if no account has it, it is simply added to the current account.",
"inputSchema": {
"type": "object",
"required": [
"context"
],
"properties": {
"code": {
"type": "string",
"description": "Step 2: the one-time code the user received."
},
"type": {
"enum": [
"email",
"phone"
],
"type": "string",
"description": "Step 1: which kind of identifier the OTHER account uses."
},
"ticket": {
"type": "string",
"description": "Step 2: the ticket returned by step 1."
},
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"identifier": {
"type": "string",
"description": "Step 1: the email address or phone number of the other account to verify."
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"description": "Human-readable result or next step."
}
}
},
"annotations": {
"title": "Link / Merge Account",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description88/100
List merchants available for agent commerce (Rappi, Good Eggs, DoorDash) and whether this user has linked each one. Link a merchant before shopping it.
The description explains the capability, when to use it, and what to expect.
Inputs71/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"count": {
"type": "number",
"description": "Number of merchants returned."
},
"status": {
"type": "string",
"description": "Outcome: 'ok', 'empty', or 'error'."
},
"message": {
"type": "string",
"description": "Human-readable merchant list (or an error / empty note)."
},
"merchants": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Merchant display name."
},
"slug": {
"type": "string",
"description": "Merchant slug identifier."
},
"link_status": {
"type": "string",
"description": "'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."
}
}
},
"description": "Available commerce merchants and this user's link status for each."
}
}
}
Original tool metadata
{
"name": "buy_list_merchants",
"description": "List merchants available for agent commerce (Rappi, Good Eggs, DoorDash) and whether this user has linked each one. Link a merchant before shopping it.",
"inputSchema": {
"type": "object",
"required": [
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"count": {
"type": "number",
"description": "Number of merchants returned."
},
"status": {
"type": "string",
"description": "Outcome: 'ok', 'empty', or 'error'."
},
"message": {
"type": "string",
"description": "Human-readable merchant list (or an error / empty note)."
},
"merchants": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Merchant display name."
},
"slug": {
"type": "string",
"description": "Merchant slug identifier."
},
"link_status": {
"type": "string",
"description": "'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."
}
}
},
"description": "Available commerce merchants and this user's link status for each."
}
}
},
"annotations": {
"title": "List Merchants",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description94/100
Disconnect a merchant — drops the saved session + link. The user must re-link (e.g. hosted connect) before shopping it again.
The description explains the capability, when to use it, and what to expect.
Inputs70/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
merchant
Merchant slug to disconnect (e.g. doordash).
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"name": "buy_unlink_merchant",
"description": "Disconnect a merchant — drops the saved session + link. The user must re-link (e.g. hosted connect) before shopping it again.",
"inputSchema": {
"type": "object",
"required": [
"merchant",
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"merchant": {
"type": "string",
"description": "Merchant slug to disconnect (e.g. doordash)."
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"status": {
"type": "string",
"description": "Outcome: 'unlinked', 'not_linked', or 'error'."
},
"message": {
"type": "string",
"description": "Human-readable unlink outcome."
},
"merchant": {
"type": "string",
"description": "The merchant slug that was unlinked (or attempted)."
}
}
},
"annotations": {
"title": "Unlink Merchant",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description97/100
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").
The description explains the capability, when to use it, and what to expect.
Inputs63/100
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
merchant
merchant slug (e.g. doordash)
Clarify units, where to obtain this value, or conventions not already expressed in the schema.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"status": {
"type": "string",
"description": "Outcome: 'pending' (hosted login started), 'ready'/'linked' (auto-link merchant — no login needed), or 'error'."
},
"message": {
"type": "string",
"description": "Human-readable next step."
},
"loginUrl": {
"type": "string",
"description": "URL the user must open to log in to the merchant. Absent for auto-link merchants."
},
"merchant": {
"type": "string",
"description": "The merchant slug, present when an auto-link merchant needs no login."
},
"pendingId": {
"type": "string",
"description": "Session id to pass to buy_connect_status. Absent for auto-link merchants."
}
}
}
Original tool metadata
{
"name": "buy_connect",
"description": "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\").",
"inputSchema": {
"type": "object",
"required": [
"merchant",
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"merchant": {
"type": "string",
"description": "merchant slug (e.g. doordash)"
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"status": {
"type": "string",
"description": "Outcome: 'pending' (hosted login started), 'ready'/'linked' (auto-link merchant — no login needed), or 'error'."
},
"message": {
"type": "string",
"description": "Human-readable next step."
},
"loginUrl": {
"type": "string",
"description": "URL the user must open to log in to the merchant. Absent for auto-link merchants."
},
"merchant": {
"type": "string",
"description": "The merchant slug, present when an auto-link merchant needs no login."
},
"pendingId": {
"type": "string",
"description": "Session id to pass to buy_connect_status. Absent for auto-link merchants."
}
}
},
"annotations": {
"title": "Connect Merchant (Hosted Login)",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs81/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
merchant
merchant slug (e.g. doordash)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
pending_id
The pending_id returned by buy_connect.
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"status": {
"type": "string",
"description": "Connect state: 'linking', 'linked', 'expired', or 'error'."
},
"message": {
"type": "string",
"description": "Human-readable status / next step."
},
"merchant": {
"type": "string",
"description": "The merchant slug, present when linked."
},
"cart_carried_over": {
"type": "boolean",
"description": "True 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."
}
}
}
Original tool metadata
{
"name": "buy_connect_status",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"merchant",
"pending_id",
"context"
],
"properties": {
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"merchant": {
"type": "string",
"description": "merchant slug (e.g. doordash)"
},
"pending_id": {
"type": "string",
"description": "The pending_id returned by buy_connect."
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"status": {
"type": "string",
"description": "Connect state: 'linking', 'linked', 'expired', or 'error'."
},
"message": {
"type": "string",
"description": "Human-readable status / next step."
},
"merchant": {
"type": "string",
"description": "The merchant slug, present when linked."
},
"cart_carried_over": {
"type": "boolean",
"description": "True 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."
}
}
},
"annotations": {
"title": "Connect Status",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description80/100
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.
The description explains the capability, when to use it, and what to expect.
Inputs79/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
merchant
merchant slug (e.g. locale)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
action
the management action
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
query
menu_search: term over the recurring menu (e.g. 'salmon'); '' lists everything
Clear enough to supply this argument.
limit
menu_search: max items
Explain what happens when this optional value is omitted.
date
skip/unskip: one ISO delivery date (YYYY-MM-DD)
Clear enough to supply this argument.
dates
set_skip_dates: FULL set of ISO dates to skip ([] resumes all)
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
setting
update_setting: the setting key (see description)
Explain the meaning of this value, not just its name.
value
update_setting: the new value (number, string, or array of strings)
Clear enough to supply this argument.
context
Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): "Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization."
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
{
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"description": "Human-readable result or next step."
}
}
}
Original tool metadata
{
"name": "manage_subscription",
"description": "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.",
"inputSchema": {
"type": "object",
"required": [
"merchant",
"action",
"context"
],
"properties": {
"date": {
"type": "string",
"description": "skip/unskip: one ISO delivery date (YYYY-MM-DD)"
},
"dates": {
"type": "array",
"items": {
"type": "string"
},
"description": "set_skip_dates: FULL set of ISO dates to skip ([] resumes all)"
},
"limit": {
"type": "number",
"description": "menu_search: max items"
},
"query": {
"type": "string",
"description": "menu_search: term over the recurring menu (e.g. 'salmon'); '' lists everything"
},
"value": {
"description": "update_setting: the new value (number, string, or array of strings)"
},
"action": {
"enum": [
"menu_search",
"get_skip_dates",
"skip",
"unskip",
"set_skip_dates",
"update_setting"
],
"type": "string",
"description": "the management action"
},
"context": {
"type": "string",
"description": "Explain why you are calling this tool and how it fits into the user's overall goal. This parameter is used for analytics and user intent tracking. YOU MUST provide 15-25 words (count carefully). NEVER use first person ('I', 'we', 'you') - maintain third-person perspective. NEVER include sensitive information such as credentials, passwords, or personal data. Example (20 words): \"Searching across the organization's repositories to find all open issues related to performance complaints and latency issues for team prioritization.\""
},
"setting": {
"type": "string",
"description": "update_setting: the setting key (see description)"
},
"merchant": {
"type": "string",
"description": "merchant slug (e.g. locale)"
}
}
},
"outputSchema": {
"type": "object",
"required": [
"message"
],
"properties": {
"message": {
"type": "string",
"description": "Human-readable result or next step."
}
}
},
"annotations": {
"title": "Manage Subscription",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": false,
"destructiveHint": false
}
}
Loading score analytics…
Put your MCP to the test
A few tasks worth trying with this server, chosen from its reviewed tools. These have not been run.
01Recommend CardAsk the vault which of the user's own stored cards earns the most for a purchase (smart purchases).
02List TransactionsTransactions with amount, merchant, status, and timestamps.
03List CardsThe 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 thei…
04Who Am IShow who you are operating as: the authenticated AgentCard account's email, user id, name, plan, KYC + account status, member-since date, and how this sessio…
05Get Plan & UsageShow the user's current subscription plan, card limits, and this month's usage.
Want to run these tasks against your MCP server with us?
AgentCard setup, tools, quality score, publishing readiness, and alternatives.
How do I add AgentCard to Claude, ChatGPT, or Cursor?
Add AgentCard to Claude, ChatGPT, or Cursor by connecting its remote MCP URL in each client's MCP settings. In Claude, add a custom connector. In ChatGPT, add an MCP app. In Cursor, add an MCP server under Settings. The MCP URL is https://mcp.agentcard.sh/mcp.
Is AgentCard MCP ready for ChatGPT and Claude?
As of October 6, 2026, AgentCard scores 78/100 on Manufact's MCP publishing checklist. The scan does not yet meet ChatGPT publishing checks and does not yet meet Claude publishing checks. Passing these checks does not guarantee marketplace approval.
How clear is AgentCard's MCP tool documentation?
As of October 6, 2026, AgentCard scores 85/100 in Manufact's review of tool titles, descriptions, input and output schemas, and behavior annotations. The review covers 55 of 55 discovered tools. The quality score measures documentation clarity; runtime behavior and marketplace readiness require separate checks.
What are the best alternatives to AgentCard?
As of October 6, 2026, alternatives to AgentCard in financial-services on the Manufact MCP catalog include Contract-Factory — Sociétés & SIREN, Kavara Kirk, Ramp Data, Trioteca Hipotecas, and CoinGecko.
How can AgentCard improve its MCP documentation?
set_card_preset is the lowest-scoring reviewed tool at 57/100. Declare readOnlyHint, destructiveHint, idempotentHint, openWorldHint based on the tool’s actual behavior. Open its review for feedback and a copyable fix prompt, then rerun the documentation review after updating your tool metadata.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.