sh.agentcard/agentcard
REMOTE · MCP.AGENTCARD.SH
Prepaid virtual cards for AI agents: one-time cards, spend caps, human approvals.
Available components
Last scanned (5 hours ago)
Scores higher than 98% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Finance and Payments
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security89
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation is enforced on tool calls, advertised via RFC 9728 protected-resource metadata. Discovery is public, which costs nothing: no tool can be invoked without a token. View diagnostics → Pass
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
- The authorisation server offers only Dynamic Client Registration (RFC 7591), which MCP 2026-07-28 deprecated in favour of Client ID Metadata Documents. View diagnostics → Partial
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability68
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 9985 tokens (~181/item across 55 items; 55 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety96
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 5 of 6 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "delete_preset" implies "delete" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Partial
- An AI judge read all 56 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 31 Oct 26 0
- Tool “add_funds” rewrote its description, which is the text the model reads security
- “add_funds” reworded the description of “payment_method” cosmetic
- 24 Oct 26 +1
- Stability: fail → pass ▲ security
- Tool “buy_list_merchants” rewrote its description, which is the text the model reads security
- Tool “get_wallet_link” rewrote its description, which is the text the model reads security
- “get_wallet_link” reworded the description of “purpose” cosmetic
- 21 Oct 26 0
- Tool “buy_list_merchants” rewrote its description, which is the text the model reads security
- “buy_list_merchants” added an optional parameter “cursor” cosmetic
- “buy_list_merchants” added an optional parameter “kind” cosmetic
- “buy_list_merchants” added an optional parameter “query” cosmetic
- 8 Oct 26 0
- Tool “get_card_details” rewrote its description, which is the text the model reads security
- 28 Sept 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 25 Sept 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 24 Sept 26 0
- Stability: pass → fail ▼ security
- A breaking change shipped without a version bump: still 1.0.0 ▼ security
- Tool “create_withdrawal_recipient” was removed ▼ security
- Tool “list_withdrawal_recipients” was removed ▼ security
- Tool “withdraw” was removed ▼ security
- 23 Sept 26 0
- Stability: fail → pass ▲ security
- Tool “get_plan” rewrote its description, which is the text the model reads security
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Probed https://mcp.agentcard.sh/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=mcp.agentcard.sh | CN=WE1,O=Google Trust Services,C=US | 23 Sept 2026 | 23 Dec 2026 | ECDSA 256 | ECDSA-SHA256 | 2772b3a9b5a9d0ec13770e52ed51b488 |
| SANs: mcp.agentcard.sh | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC insecure
Validation of mcp.agentcard.sh. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| sh. | present | 34349 | 8 | Verified |
| agentcard.sh. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication Enforced and verified
The endpoint asked for a token and published valid RFC 9728 metadata describing how to get one.
| Result | Enforced and verified |
|---|---|
| Enforced | On tool calls |
| HTTP status | 200 |
WWW-Authenticate challenge Bearer resource_metadata="https://mcp.agentcard.sh/.well-known/oauth-protected-resource/mcp"
Bearer resource_metadata="https://mcp.agentcard.sh/.well-known/oauth-protected-resource/mcp" Protected resource metadata
| Document | https://mcp.agentcard.sh/.well-known/oauth-protected-resource/mcp |
|---|---|
| Retrieved | Yes |
| Resource | https://mcp.agentcard.sh/mcp |
| Authorisation server | https://mcp.agentcard.sh/ |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://mcp.agentcard.sh/mcp | Verified | 200 | |
| http (plaintext) | http://mcp.agentcard.sh/mcp | HTTPS enforced | 301 | https://mcp.agentcard.sh/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
start_support_chat ~31
Start a new support conversation and send the first message
| Name | Type | Req | Description |
|---|---|---|---|
| message | string | yes | Your initial support message |
| Name | Type | Req | Description |
|---|---|---|---|
| conversationId | string | – | The ID of the newly created support conversation. Pass this to send_support_message or read_support_chat. |
| message | string | yes | Human-readable summary confirming the conversation was started. |
No examples provided.
submit_kyc_document ~527
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).
| Name | Type | Req | Description |
|---|---|---|---|
| back_base64 | string | – | Base64 image bytes of the license back (optional, recommended — the barcode reads most accurately). Same rule: programmatically sourced only. |
| back_file_path | string | – | Local path to the back of the license (optional, recommended). Local/stdio connections only. |
| back_mime_type | string | – | MIME type of back_base64. Defaults to image/jpeg. |
| document_type | string | – | 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. |
| file_path | string | – | 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. |
| front_base64 | string | – | 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 byt… |
| front_mime_type | string | – | MIME type of front_base64 (image/jpeg, image/png, image/webp). Defaults to image/jpeg. |
| issuing_country | string | – | 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. |
| Name | Type | Req | Description |
|---|---|---|---|
| extracted | object | – | Fields read from the document (confirm with the user). |
| message | string | yes | – |
| missingFields | array | – | – |
| nextStep | string|null | – | – |
| status | string | – | processed | document_expired | upload_failed | upload_link_provided |
| unreadable | boolean | – | 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. |
| uploadUrl | string | – | – |
| verificationUrl | string | – | – |
No examples provided.
submit_kyc_fields ~452
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.
| Name | Type | Req | Description |
|---|---|---|---|
| address_city | string | – | City of the residential address. |
| address_country_code | string | – | 2-letter ISO country code (e.g. US). |
| address_line1 | string | – | Residential street address, line 1 (e.g. 123 Main St). |
| address_line2 | string | – | Residential street address, line 2 — apartment, suite, or unit. Omit if none. |
| address_postal_code | string | – | Postal / ZIP code of the residential address. |
| address_region | string | – | 2-letter state code for US (e.g. CA). |
| agreements_accepted | array | – | 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… |
| date_of_birth | string | – | YYYY-MM-DD |
| first_name | string | – | Legal first name, exactly as printed on the ID document. |
| last_name | string | – | Legal last name, exactly as printed on the ID document. |
| phone_number | string | – | E.164 with country code, e.g. +14155551234. |
| ssn | string | – | US documents: 9-digit SSN, dashes optional. Non-US documents: the national ID / tax number printed on the ID. Forward-only — never stored. |
| terms_accepted | boolean | – | DEPRECATED — use agreements_accepted. true once the user explicitly accepted the card issuer's cardholder terms. |
| Name | Type | Req | Description |
|---|---|---|---|
| message | string | yes | – |
| missingFields | array | – | – |
| nextStep | string|null | – | – |
| verificationUrl | string | – | Face-scan link, present once everything is collected. |
No examples provided.
submit_user_info ~182
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.
| Name | Type | Req | Description |
|---|---|---|---|
| phone_number | string | yes | User's phone number in international E.164 format with a country code (e.g. +1 555 123 4567, +44 7911 123456) |
| terms_accepted | boolean | yes | Must be true — the user accepted the AgentCard cardholder terms of service |
| Name | Type | Req | Description |
|---|---|---|---|
| message | string | yes | Human-readable confirmation that the user information was saved. |
| status | string | – | Outcome of the submission: 'saved' when the user information was stored successfully. |
No examples provided.
surprise_me ~257
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).
| Name | Type | Req | Description |
|---|---|---|---|
| max_dollars | number | – | Hard spend cap in dollars, total including fees. Optional; default 10, values above 25 are clamped to 25. |
| merchant | string | – | Optional merchant hint the surprise should come from, e.g. 'doordash'. Omit to let the agent pick. |
| vibe | string | – | Optional notes/vibe from the user, e.g. "make it food", "something for my desk", "they love ducks". |
| Name | Type | Req | Description |
|---|---|---|---|
| conversation_id | string | – | 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. |
| message | string | yes | 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 | array | – | 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 bubb… |
| status | string | – | Discriminator for the outcome. 'assistant_turn' when the buy loop replied; 'conversation_start_failed' or 'request_failed' on errors. |
No examples provided.
update_card_limit ~218
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.
| Name | Type | Req | Description |
|---|---|---|---|
| approval_id | string | – | 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 wi… |
| card_id | string | yes | The multi-use card ID to resize. |
| new_limit_cents | number | – | Deprecated alias for spend_limit_cents. Prefer spend_limit_cents (matches the docs and the REST API). |
| spend_limit_cents | number | – | 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. |
| Name | Type | Req | Description |
|---|---|---|---|
| balanceCents | number | – | The remaining spendable balance in cents. |
| cardId | string | – | The card ID. |
| message | string | yes | Human-readable result. |
| spendLimitCents | number | – | The new total limit in cents. |
| status | string | – | "updated" on success; an error discriminator otherwise (e.g. "limit_below_spent", "insufficient_collateral"). |
No examples provided.
upgrade_plan ~154
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.
| Name | Type | Req | Description |
|---|---|---|---|
| plan | string | – | Which plan to upgrade to. Defaults to 'basic'. |
| Name | Type | Req | Description |
|---|---|---|---|
| checkoutUrl | string | – | Stripe Checkout URL the user must open to complete payment. Present only when status is checkout_required. |
| message | string | yes | Human-readable summary of the upgrade outcome. |
| plan | string | – | Display label of the target plan, e.g. 'Basic' or 'Pro'. Present when the requested plan is known. |
| status | string | – | Discriminator for the outcome branch. |
No examples provided.
verify_phone ~108
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.
| Name | Type | Req | Description |
|---|---|---|---|
| code | string | yes | The one-time code the user received, as a string (keep any leading zeros — do not send it as a number). |
| Name | Type | Req | Description |
|---|---|---|---|
| message | string | yes | Human-readable result or next step. |
No examples provided.
whoami ~123
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.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| accountStatus | string | – | Account standing: 'active' or 'suspended'. |
| connectionClientId | string|null | – | OAuth client id of the connected app, when connectionType is oauth, or organization through a company's app. |
| connectionClientName | string|null | – | Display name of the connected OAuth app (e.g. "Claude"), when known, for an oauth or organization connection. |
| connectionOrganizationId | string|null | – | Organization id, when connectionType is organization. |
| connectionType | string | – | 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). |
| string|null | – | Email of the authenticated account, or null for a phone-first account (e.g. signed up by text message). | |
| kycStatus | string|null | – | Raw stored KYC state (e.g. approved, pending, requires_input), or null if never started. |
| kycVerified | boolean | – | Whether identity verification (KYC) has passed (stored snapshot). |
| memberSince | string | – | ISO timestamp the account was created. |
| message | string | yes | Human-readable identity summary. |
| name | string|null | – | Cardholder name ("First Last"), or null before KYC info is submitted. |
| plan | string | – | Subscription plan id, e.g. 'free', 'basic', or 'pro'. |
| subscriptionStatus | string|null | – | Stripe subscription status (e.g. 'active', 'past_due'), or null on the free plan. |
| userId | string | – | AgentCard user id of the authenticated account. |
No examples provided.
How do I install the sh.agentcard/agentcard MCP server?
sh.agentcard/agentcard is a hosted endpoint at https://mcp.agentcard.sh/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · mcp.agentcard.sh
claude mcp add --transport http sh-agentcard-agentcard 'https://mcp.agentcard.sh/mcp'
What is the sh.agentcard/agentcard MCP server?
sh.agentcard/agentcard is an MCP server listed in the public MCP registry as sh.agentcard/agentcard. Prepaid virtual cards for AI agents: one-time cards, spend caps, human approvals. This page covers its hosted endpoint (https://mcp.agentcard.sh/mcp).
Is the sh.agentcard/agentcard MCP server safe to use?
sh.agentcard/agentcard scores 90 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the sh.agentcard/agentcard MCP server expose?
sh.agentcard/agentcard exposes 55 tools: buy, surprise_me, get_instructions, whoami, list_cards, and 50 more. Their descriptions and schemas cost roughly 9,951 tokens of context every time the server is loaded.
Does the sh.agentcard/agentcard MCP server require authentication?
Yes. sh.agentcard/agentcard asked us for credentials when we connected, so you will need to authorise it in your MCP client before it can do anything.
Is the sh.agentcard/agentcard MCP server still maintained?
sh.agentcard/agentcard is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.