highnote-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@highnote-mcpIssue a virtual card with a $100 per-transaction limit and allow only travel merchants"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
highnote-mcp
An MCP server that lets an AI agent issue and govern Highnote virtual cards: one card per agent or workflow, a per-transaction limit and a merchant category rule on it, a look at what it spent, and closing it when the work is done.
I built it on Highnote's own Node SDK (@highnote-oss/nodejs-sdk), so every call goes through the SDK's typed GraphQL operations. It is not an official Highnote project.
Tools
Tool | What it does |
| Issue an active virtual card on a financial account, with a capped lifetime and an idempotency key |
| Create an amount-limit spend rule and attach it to the card |
| Create an allow or block list (Highnote |
| Suspend a card (reversible) |
| Close a card for good |
| Status, last 4, network, expiration (never the card number) |
| Ledger balances and the cards on the account |
| Recent authorizations and clearings with merchant, amount and card |
| Test environment only: run a fake authorization to check the rules decline what they should |
Related MCP server: ASG Card
Guardrails
An agent holding a card-issuing API key needs limits that don't depend on the model behaving, so the server enforces them itself:
Test by default. The live environment needs both
HIGHNOTE_ENVIRONMENT=liveandHIGHNOTE_ALLOW_LIVE=true, or the server refuses to start.Confirmation in live. Every tool that changes something only describes the change until it is called again with
confirm: true, so a client can show the user exactly what will happen first.Hard caps.
set_transaction_limitrefuses limits aboveHIGHNOTE_MAX_TRANSACTION_LIMITandissue_virtual_cardrefuses lifetimes aboveHIGHNOTE_MAX_CARD_LIFETIME_DAYS, before any request is sent.Read-only mode.
HIGHNOTE_READ_ONLY=truehides every write tool.Spend rules are enforced by Highnote at authorization time, so the limits hold even if the agent later misuses the card.
Setup
npm install
npm run buildClaude Desktop / any MCP client:
{
"mcpServers": {
"highnote": {
"command": "node",
"args": ["/path/to/highnote-mcp/dist/index.js"],
"env": { "HIGHNOTE_API_KEY": "<test API key>", "HIGHNOTE_MAX_TRANSACTION_LIMIT": "10000" }
}
}
}Variable | Default | |
| required | API key from the Highnote dashboard |
|
|
|
| unset | must be |
|
| hide write tools |
|
| largest per-transaction limit, in minor units ($500.00) |
|
| longest card lifetime |
|
| currency for amounts |
Tests
npm test # 38 tests
npm run typechecktests/tools.test.tsdrives the server through a real MCP client (in-memory transport) with a fake SDK: tool lists per mode, arguments sent to the SDK, caps, live confirmation, errors.tests/contract.test.tsruns the real Highnote SDK over HTTP against a local GraphQL server built from Highnote's published schema (tests/fixtures/highnote-schema.graphql, a snapshot from the SDK repo; refresh withnpm run schema:sync). Every request the tools make is validated and executed against that schema, so a wrong field, enum value or input shape fails the test. It caught one of mine: I had guessedAIRLINESas a merchant category, which Highnote doesn't have.
I don't have a Highnote account, so this has not been run against the real test environment yet. The contract tests check the requests against the schema, not Highnote's business rules (for example which card products allow virtual cards).
Available Tools
9 toolsclose_payment_cardClose payment cardADestructive
Permanently close a card, e.g. when the agent's workflow is finished. Cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Required in the live environment. Without it the tool only describes what it would do. | |
| paymentCardId | Yes | Highnote payment card ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, so destructiveness is known; the description reinforces it with 'Cannot be undone,' which is useful confirmation. It does not disclose the notable dry-run behavior of the confirm parameter (live-environment preview), although that is documented in the schema, nor what happens to balances or pending transactions on the card.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero waste; the core action and its irreversible nature are front-loaded before the usage example.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Adequate for a two-parameter destructive tool: schema fully documents parameters and annotations cover the safety profile. However, for an irreversible workflow-ending operation, the description never states the close/suspend distinction or the consequences for the card's remaining funds and transactions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both paymentCardId and the confirm dry-run semantics are already documented in structured data. The description adds no parameter meaning of its own, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Permanently close a card') plus the irreversibility qualifier, which implicitly separates it from the sibling suspend_payment_card. It does not name that sibling outright, so the differentiation requires the agent to infer it from 'permanently'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides one usage cue ('when the agent's workflow is finished') but no explicit when-not condition and no named alternative. The most likely confusion, close vs. suspend, is left for the agent to resolve from sibling names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_financial_accountGet financial accountARead-only
Look up a financial account with its ledger balances and the payment cards issued on it.
| Name | Required | Description | Default |
|---|---|---|---|
| financialAccountId | Yes | Highnote financial account ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already declares this is a safe read, so the bar is lower. The description adds genuine value by disclosing the response shape (ledger balances plus payment cards), but it says nothing about behavior on an unknown ID, whether the card list is truncated or paginated, or any auth requirements.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, zero filler, and the most important information (the resource being looked up) is front-loaded. Nothing could be removed without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read with no output schema, the description covers purpose and the notable return contents, which compensates for the absent output schema. Minor gaps remain around not-found behavior and whether the embedded card collection is bounded, but nothing essential to invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single required parameter with 100% schema description coverage, so the schema already documents financialAccountId as a Highnote financial account ID. The description adds no format, prefix, or sourcing guidance beyond that, which is the expected baseline-3 case when the schema carries the semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("look up") and resource ("a financial account") and even enumerates what the result contains: ledger balances and issued payment cards. It is clearly a read operation, distinguishing it from mutation siblings like issue_virtual_card or close_payment_card, but it never differentiates itself from the retrieval sibling get_payment_card.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the description tells you it looks up an account, so an agent can infer it should be called when account-level balances or attached cards are needed. There is no explicit when-not guidance, no mention of get_payment_card or list_account_activity as alternatives, and no stated prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_payment_cardGet payment cardBRead-only
Look up a payment card: status, last 4, network, form factor and expiration. Never returns the card number.
| Name | Required | Description | Default |
|---|---|---|---|
| paymentCardId | Yes | Highnote payment card ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the safety profile is covered structurally. The description adds genuinely useful context with the field enumeration and the explicit guarantee that the card number is never returned, which is the kind of security-relevant detail an agent cannot get from annotations. It does not mention error behavior for an unknown or expired card ID.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler; the returned-field list comes first and the non-disclosure guarantee follows. Every clause carries information an agent would act on.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only lookup with full schema coverage, the description covers purpose, scope of returned data, and the key data-protection boundary. The only meaningful omission is what happens on a missing or invalid card ID.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter is documented in-schema as a Highnote payment card ID, so the baseline is 3. The description adds no further meaning about the ID's format, source, or behavior when invalid.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"Look up a payment card" gives a specific verb and resource, and the field list (status, last 4, network, form factor, expiration) makes clear what the call returns. It implicitly separates itself from mutating siblings like suspend_payment_card or close_payment_card, but never names or contrasts them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance, no mention of prerequisites (e.g., needing a valid card ID from another call), and no reference to alternatives among the many sibling card tools. Usage must be inferred entirely from the word "look up".
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
issue_virtual_cardIssue virtual cardAIdempotent
Issue a new active virtual card on a financial account, e.g. one card per agent, workflow or vendor. Pair it with set_transaction_limit and restrict_merchant_categories before using it.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Required in the live environment. Without it the tool only describes what it would do. | |
| externalId | No | Your own reference, e.g. the agent or workflow ID | |
| expiresInDays | No | Card lifetime in days (default and maximum 365) | |
| idempotencyKey | No | Reuse the same key when retrying so a card is never issued twice | |
| financialAccountId | Yes | Highnote financial account ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare idempotentHint and destructiveHint=false, and the description adds real context beyond them: the card is created 'active' (immediately usable), and guardrails should be applied first, implying real spend risk. It does not mention the confirm/dry-run gate or the 365-day default, both of which live only in the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, with the core action front-loaded and the workflow recommendation following. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a state-changing financial tool with no output schema, the description never says what an agent gets back (e.g., a card ID needed for the follow-up set_transaction_limit call) nor references the live-environment confirm gate. Annotations cover idempotency and non-destructiveness, so this is adequate but with clear gaps for chaining calls.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are already documented including confirm, idempotencyKey, and expiresInDays. The description only adds a loose mapping for externalId ('one card per agent, workflow or vendor') and adds no new semantics for required financialAccountId; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Issue a new active virtual card on a financial account') plus the intended granularity ('one card per agent, workflow or vendor'). An agent can distinguish this from sibling tools like get_payment_card, suspend_payment_card, or simulate_authorization without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing guidance: pair with set_transaction_limit and restrict_merchant_categories 'before using it', which names siblings and orders the workflow. It lacks a when-not-to-use clause (e.g., reuse an existing card vs. issuing a new one, or test vs. live mode) but the positive guidance is concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_account_activityList account activityARead-only
List recent activity on a financial account, newest first: authorizations and clearings with merchant, amount and card.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of activities (default 20) | |
| financialAccountId | Yes | Highnote financial account ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so safety is covered. The description adds genuinely new behavioral context beyond that: results are ordered newest first and each entry carries merchant, amount and card. It does not discuss result windowing, how far back 'recent' reaches, or error behavior when the account ID is unknown, which keeps it off a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence, front-loaded with the verb and resource, that also packs in ordering and payload contents. Every clause earns its place and nothing is repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read tool with no output schema, the description carries the important return-value information (newest first, merchant/amount/card fields) that would otherwise be missing. The remaining gap is minor: no statement of how far back activity extends or what an empty result means.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both financialAccountId and limit (including its 1-100 bounds and default of 20) fully documented in the schema. The description references the account implicitly but adds no meaning beyond that. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description pairs a specific verb ('List') with a specific resource ('recent activity on a financial account') and adds scope detail: 'newest first', and the activity types 'authorizations and clearings with merchant, amount and card'. That is far more informative than the title alone. It stops short of naming a sibling to distinguish itself from, so a 4 rather than a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the tool is evidently for inspecting recent transactions on a known account, and the required financialAccountId makes that context obvious. There is no explicit when-to-use, when-not-to-use, or pointer to a sibling such as get_financial_account for account metadata. Minimum viable rather than instructive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restrict_merchant_categoriesRestrict merchant categoriesA
Create a merchant category spend rule (allow list or block list, by Highnote MerchantCategory name or MCC) and attach it to a card.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| allowed | No | Only allow these categories, e.g. COMPUTER_SOFTWARE_STORES or BETTING_CASINO_GAMBLING | |
| blocked | No | Decline these categories | |
| confirm | No | Required in the live environment. Without it the tool only describes what it would do. | |
| allowedMcc | No | Only allow these 4-digit MCCs | |
| blockedMcc | No | Decline these 4-digit MCCs | |
| paymentCardId | Yes | Highnote payment card ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full burden. It does disclose the useful behavioral fact that the call both creates a rule and attaches it to a card, but it omits whether an existing rule is replaced or appended, whether allowed and blocked may be combined, permission requirements, and idempotency behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the action, the two list modes, the identifier formats, and the attachment target. There is no redundant restatement of the tool name or the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool with no annotations and no output schema, one sentence leaves meaningful gaps: replacement-vs-additive semantics, mutual exclusivity of allow/block lists, and any confirmation of what the call returns. The dry-run behavior is only covered by the schema's confirm description, so the definition is workable but thin overall.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 86%, so the baseline is 3; the description pushes it higher by framing the two parallel parameter families ('by Highnote MerchantCategory name or MCC'), which tells the agent that allowed/blocked and allowedMcc/blockedMcc are alternate encodings of the same concept. It still says nothing about whether allowed and blocked are mutually exclusive or how conflicting entries are resolved.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource ('Create a merchant category spend rule') plus the compound effect ('attach it to a card'), and it pins the domain to merchant categories by name or MCC. That is clearly distinguishable from sibling spend-control tools such as set_transaction_limit (amount limits) or simulate_authorization (a test, not a rule).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer it is used when a card needs category-level allow/block rules, but the description never states when to choose this over set_transaction_limit, nor that it should be paired with simulate_authorization to validate the outcome. There are no explicit exclusions or prerequisites (e.g., live-environment confirmation is only discoverable in the schema).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_transaction_limitSet per-transaction limitA
Create an amount-limit spend rule and attach it to a card, so any single authorization above the limit is declined. Limits above 500.00 USD are refused by this server.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Spend rule name (default describes the limit) | |
| confirm | No | Required in the live environment. Without it the tool only describes what it would do. | |
| maximumAmount | Yes | Largest allowed authorization, in minor units | |
| paymentCardId | Yes | Highnote payment card ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden; it does disclose that this is a mutation that creates a rule and attaches it to a card, that subsequent authorizations over the limit are declined, and that a server-side cap rejects oversized limits. It omits whether an existing limit rule is replaced or duplicated, what permissions are needed, whether the rule can be later removed, and it never mentions the confirm-gated dry-run behavior that the schema flags as important in the live environment.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, and the functional outcome is front-loaded before the server-side constraint. Nothing repeats the title or the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter mutation with no annotations and no output schema, the description covers the core effect and one server constraint but leaves the mutation's blast radius vague: no statement about replacement vs. additive behavior, no mention of the confirm dry-run mode, and no hint of what is returned. Adequate to invoke correctly, thin for invoking safely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already documented and the baseline is 3. The description adds the 500.00 USD ceiling, which is genuinely useful, but it phrases it in major currency units while maximumAmount is declared in minor units, so it creates a conversion ambiguity rather than resolving one.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Create an amount-limit spend rule') and states the observable effect ('attach it to a card, so any single authorization above the limit is declined'), which is far more than a restatement of the name. It does not explicitly distinguish itself from the closest sibling, restrict_merchant_categories, which is another spend-rule creation path, so it falls one step short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the effect statement: an agent can infer this is the tool for capping per-authorization spend. It gives no guidance on when to prefer it over restrict_merchant_categories or how it relates to simulate_authorization for testing, and the 500.00 USD ceiling is stated as a hard fact rather than as a precondition the caller should check before invoking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
simulate_authorizationSimulate authorization (test environment)A
Simulate a card authorization in the Highnote test environment, e.g. to check that a card's spend rules decline what they should.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Amount in minor units, e.g. 1250 = $12.50 | |
| merchantName | No | ||
| paymentCardId | Yes | Highnote payment card ID | |
| merchantCategory | No | Highnote MerchantCategory, e.g. COMPUTER_SOFTWARE_STORES or BETTING_CASINO_GAMBLING |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully discloses that this runs in the test environment and is a simulation, but it does not say what side effects occur, whether an authorization record is created, what permissions are required, or how approval versus decline is returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single well-formed sentence with the core action and environment front-loaded. The example use case is compact and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter simulation tool with no annotations and no output schema, the description explains purpose and a test scenario but omits what the simulation returns and what side effects it has. It is adequate to start an invocation but not complete for predicting the outcome of approval or decline.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, with meaningful field descriptions for amount, paymentCardId, and merchantCategory. The description adds no parameter-level meaning beyond the schema and does not document merchantName, so the schema does most of the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Simulate a card authorization in the Highnote test environment.' It also adds a concrete example use case, checking spend rules, so an agent can identify the tool's function quickly. It does not explicitly differentiate itself from sibling card-management tools, which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear usage context by naming the test environment and explaining the example scenario: testing whether spend rules decline as expected. It does not specify when not to use the tool or name alternatives among the siblings, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suspend_payment_cardSuspend payment cardA
Temporarily suspend a card so new authorizations are declined. Reversible.
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Required in the live environment. Without it the tool only describes what it would do. | |
| paymentCardId | Yes | Highnote payment card ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the safety burden alone; it does disclose the two most important traits — new authorizations are declined and the action is reversible. It says nothing about authentication requirements, rate limits, what happens to already-authorized or pending transactions, or the dry-run gating that the schema implies via 'confirm'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, and the effect statement is front-loaded ahead of the reversibility note. Every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool with no annotations and no output schema, the description covers the essential facts: what changes, what the user-visible consequence is, and that it can be undone. Remaining gaps (permissions, treatment of in-flight authorizations) are secondary but real.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both paymentCardId and the confirm/live-environment behavior are already documented in the schema. The description adds no parameter-level meaning beyond that, which is the expected baseline when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Temporarily suspend a card') plus the concrete effect ('new authorizations are declined'), which implicitly separates it from the permanent-close sibling. It stops short of naming close_payment_card explicitly, so the distinction must be inferred from the word 'Temporarily' and 'Reversible'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The adverb 'Temporarily' and the note that the action is reversible imply when to pick this over an irreversible close, but no alternative tool is named and no precondition is stated. An agent gets the general context but must infer the when-not case on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
v0.1.0- First observed
close_payment_card - First observed
get_financial_account - First observed
get_payment_card - First observed
issue_virtual_card - First observed
list_account_activity - First observed
restrict_merchant_categories - First observed
set_transaction_limit - First observed
simulate_authorization - First observed
suspend_payment_card
TDQS
Scored across 9 tools
Each tool targets a distinct resource+action pair: authorization simulation, card/account lookups, activity listing, issuance, two clearly-scoped spend-rule types, and two distinct card-state operations. The suspend vs close overlap is disambiguated by explicit 'reversible'/'cannot be undone' wording, and the amount-limit vs merchant-category rules are clearly separated.
All nine tools follow a consistent snake_case verb_noun pattern (get_*, list_*, issue_*, set_*, restrict_*, suspend_*, close_*, simulate_*). Verb choices are meaningful and the singular/plural noun usage is coherent.
Nine tools is well-scoped for a card-issuance and spend-control domain, and every tool earns its place by covering a distinct operation. No filler or trivially duplicative tools.
Core lifecycle (issue, look up, limit, simulate, suspend, close) is covered, but suspend is described as reversible with no resume/unsuspend tool, and spend rules can be created but not listed, updated, or removed. These dead ends will block agents that need to reverse or audit their changes.
Maintenance
Related MCP Connectors
Give your AI agent a spending limit: approval controls and single-use virtual cards.
Prepaid virtual cards for AI agents: one-time cards, spend caps, human approvals.
Payment infrastructure for AI agents: spending rules, approval flows, single-use virtual cards.
AI agent spending controls. Set limits, blocklists, and caps. Approve transactions from your phone.
Related MCP Servers
- -licenseNot gradedqualityFmaintenanceEnables AI agents to manage and use prepaid virtual Visa cards with hard budget limits for secure online transactions. It provides tools for creating cards, checking balances, and retrieving payment credentials with human-in-the-loop approvals.1-

ASG Cardofficial
AlicenseNot gradedqualityFmaintenanceVirtual MasterCards for AI agents. Issue and manage cards via MCP.15MIT
Shatale MCP Serverofficial
AlicenseAqualityAmaintenanceAI-native payment infrastructure that enables AI agents to make purchases, issue virtual cards, and manage spending within delegated budgets and policy controls.7447 npmMIT
CardOS MCP Serverofficial
AlicenseAqualityCmaintenanceEnables AI assistants to issue and manage virtual cards, check balances, pull transactions, file disputes, and start KYC via the CardOS API.2616 npmMIT