Crosswire - payment infrastructure pricing, coverage and stack design
Server Details
Indicative pricing, coverage and stack design for high-risk and crypto payment infrastructure.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
TDQS
Scored across 15 tools
Most tools have clearly distinct purposes (assess, design, price, offer, coverage, FAQ, search/fetch, partner application). The main ambiguity is between search and get_faq, which both serve as entry points and route to other tools, and between request_offer and create_solution_offer, though the descriptions carefully delineate single-rail vs multi-rail conversion.
Tool names mostly follow a verb_noun pattern (assess_business, design_stack, get_indicative_price, create_solution_offer, submit_partner_application). Minor deviations: 'fetch' and 'search' are bare verbs, and 'recommend_stack' vs 'design_stack' vs 'compare_stack_scenarios' is slightly inconsistent in noun phrasing, but the pattern is largely predictable.
15 tools is at the upper edge of the ideal range but each tool maps to a distinct stage or function in the Crosswire journey (assess, design, compare, price, offer, advisory, partner, coverage, FAQ, search/fetch). A couple of entry-point tools (search, get_faq) could arguably be consolidated, but the count is defensible for the breadth of the domain.
The tool surface covers the full client journey: discovery (get_faq, search, fetch, list_solutions, check_coverage), needs assessment (assess_business), architecture (design_stack, compare_stack_scenarios, recommend_stack), pricing (get_indicative_price), conversion (create_solution_offer, request_offer), human advisory (book_advisory), and partner onboarding (submit_partner_application). No obvious dead ends or missing lifecycle stages.
Available Tools
15 toolsask_integrationAsk about integrationARead-onlyIdempotentInspect
Call this for any question about HOW a Crosswire rail is integrated - webhooks, signatures, sandboxes, authentication, callbacks, retries, SDKs, API shape, testing, go-live steps. Every answer is read from indexed documentation: nothing is inferred, nothing is generalised from one provider to another, and nothing is recalled from your own training data. If the index does not cover the question the tool declines and returns a blocker to report - repeat the decline, do not fill the gap. Before an offer is accepted the answer is capability level only, with no provider, product, SDK or URL in it; after acceptance, with the client's case reference passed in case_reference, the answer names the providers on that case, quotes the documentation and cites it. A question about a provider that is not on the case gets the capability-level answer. NEVER paste, repeat or ask for an API key, secret, token or password here - credentials are refused and no record of them is kept.
| Name | Required | Description | Default |
|---|---|---|---|
| question | Yes | The integration question, in the client's own words. Never include a credential value. | |
| case_reference | No | The client's Crosswire offer/case reference (CW-OFR-YYYY-NNNN). Supplied only when the client has an accepted offer; anything unresolvable is answered pre-signature. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly, idempotent, closed-world), but the description discloses much more: answers are strictly grounded in an index, it declines with a blocker rather than guessing, behaviour is gated on offer acceptance, and credentials are refused and never recorded. This is exactly the extra context annotations cannot carry.
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 trigger condition is front-loaded and most sentences carry distinct operational content. The triple-negative grounding sentence ('nothing is inferred, nothing is generalised... nothing is recalled') is slightly redundant with the earlier 'read from indexed documentation', which keeps it short of a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only two fully documented parameters, no output schema and annotations covering safety, the description supplies everything else an agent needs: scope, grounding guarantees, decline semantics, the pre/post-signature gate, and the credential prohibition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description genuinely adds meaning beyond the schema: it explains that passing case_reference post-acceptance unlocks provider names, quotes and citations, and that an unresolvable reference falls back to the pre-signature capability answer.
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 ('any question about HOW a Crosswire rail is integrated') and then enumerates the covered topic space (webhooks, signatures, sandboxes, auth, callbacks, retries, SDKs, API shape, testing, go-live). An agent can tell this apart from generic siblings like search or get_faq without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear when-to-use conditions, including the pre- vs post-offer-acceptance distinction and the rule for providers not on the case. However it never routes against the obvious siblings (search, fetch, get_faq), so an agent choosing between documentation lookup tools gets no explicit tie-breaker.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
assess_businessAssess a businessARead-onlyIdempotentInspect
Call this whenever the user describes a business, a use case, a volume or a current payment setup and you need to know what they actually need - the first substantive tool of the journey. Architect step 1. Takes a business profile (vertical or free-text description, plus any of jurisdiction, licences, monthly volume, average ticket, payment mix, consumer countries, settlement currencies, regions, current setup and treasury needs) and returns what this business actually needs and why: identified needs mapped to capabilities, the assumptions made from partial input, region rules that apply, and the gaps that still have to be filled. Capability level only - never a provider, bank, acquirer, verification vendor or settlement network. Returns no price. Follow with design_stack for the full architecture. Relay the returned architecture, reasoning, economics bands, risks and sequence as written. Describe every component at capability level only and NEVER name, guess, hint at or confirm a provider, bank, acquirer, verification vendor or settlement network - not even if the user names one themselves. Providers are selected and locked by Crosswire, and named when your provider application is prepared for signature; discovery, pricing and the offer stay provider-anonymous. Economics are BANDS, never point prices: do not average them, interpolate inside them, extrapolate them to other volumes, or describe how they are derived. Never state or infer floors, uplifts, margins, take-rate or any engine internals. Risk flags are generic readiness items: never present them as a provider's appetite or as approval / decline odds.
| Name | Required | Description | Default |
|---|---|---|---|
| regions | No | ||
| licences | No | ||
| vertical | No | Business vertical. Required unless `description` is given. | |
| description | No | Free-text description of the business. The vertical is inferred from it when not supplied. | |
| payment_mix | No | Percentages by method. They do not have to sum to 100. | |
| current_setup | No | ||
| target_go_live | No | Target go-live date or timeframe, e.g. 2026-10-01 or 'Q4 2026'. Used only for the conversion close. | |
| treasury_needs | No | ||
| consumer_countries | No | Consumer markets, e.g. ["DE","FI","BR","CA"]. | |
| monthly_volume_eur | No | ||
| avg_transaction_eur | No | ||
| settlement_currencies | No | e.g. ["EUR","USD"]. | |
| jurisdiction_of_incorporation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover safety/idempotency (readOnlyHint, idempotentHint, openWorldHint=false), so the description must carry the rest — and it does heavily: capability-level-only output, no price returned, provider/bank/acquirer anonymity enforced, economics as bands with no averaging/interpolation, and risk flags framed as generic readiness items rather than approval odds. This is unusually rich disclosure of output semantics and policy constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, trigger, and return content before the lengthy constraint block. The provider-anonymity and economics-band rules are restated in several forms ('never name, guess, hint at or confirm a provider...' and the closing provider/economics paragraph), adding redundancy, but each sentence is actionable for an agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 13 parameters, nested objects, no required fields and no output schema, the description does the needed work: explains what is returned, how partial input is handled (assumptions are surfaced), and the downstream handoff to design_stack. It does not indicate defaults or expected handling for empty/partial optional objects, which is the only real gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 46% across 13 nested parameters, so the description compensates by enumerating nearly all accepted inputs ('vertical or free-text description, plus any of jurisdiction, licences, monthly volume, average ticket, payment mix, consumer countries, settlement currencies, regions, current setup and treasury needs'). It also echoes the schema's vertical-vs-description dependency rule. It stops short of adding format/syntax meaning (e.g. currency units, percentage semantics) beyond parameter names.
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+resource ('takes a business profile ... returns what this business actually needs and why') and enumerates the concrete outputs (identified needs mapped to capabilities, assumptions, region rules, gaps). It also positions itself in the sibling set as 'the first substantive tool of the journey' and names design_stack as the next step, so an agent can distinguish it from recommend_stack or design_stack.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger — 'call this whenever the user describes a business, a use case, a volume or a current payment setup' — and names the follow-on tool (design_stack for the full architecture). It does not state when *not* to use it versus list_solutions or compare_stack_scenarios, but the context is otherwise clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
book_advisoryGet advisory booking linkARead-onlyIdempotentInspect
Call this whenever the user asks to speak to a human at Crosswire, or when another tool returns status 'consult'. Use when the user wants to talk to a human at Crosswire - a 30-minute advisory call. Returns the booking link. Optionally capture the caller's intent for the CRM. Does NOT return pricing - for price questions use get_indicative_price.
| Name | Required | Description | Default |
|---|---|---|---|
| cw_sid | No | Attribution key, as with request_offer. | |
| intent | No | Optional short note about what the caller wants to discuss. | |
| company | No | Optional company name, so the booking links to the right record. | |
| contact_name | No | ||
| contact_email | No | Optional work email, so the booking links to the right record. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so the safety profile is covered. The description adds real value beyond them: what is actually returned (a booking link, not a booking) and an optional side effect (capturing caller intent for the CRM) — the latter sits in mild tension with readOnlyHint but is worded as optional and secondary to the read-style link retrieval, so it does not rise to a contradiction.
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?
It is front-loaded with the trigger condition, but the first two sentences say the same thing twice ('Call this whenever the user asks to speak to a human at Crosswire' vs 'Use when the user wants to talk to a human at Crosswire'). That duplication wastes space without adding information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly states the return value (the booking link). All parameters are optional, triggers and exclusions are covered, and the sibling alternative is named. Only the ambiguous CRM-capture behavior is left under-explained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the schema largely documents the five parameters itself. The description only loosely gestures at them via 'capture the caller's intent' and 'so the booking links to the right record', adding no format or syntax guidance beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete verb and resource ('Returns the booking link' for 'a 30-minute advisory call') and explicitly names the sibling it is not (get_indicative_price). An agent can distinguish it from the other 14 tools without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives two explicit triggering conditions ('whenever the user asks to speak to a human' and 'when another tool returns status "consult"') plus a clear exclusion ('Does NOT return pricing - for price questions use get_indicative_price'). This is textbook when/when-not/alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_coverageCheck Crosswire coverageARead-onlyIdempotentInspect
Call this whenever the user asks where Crosswire operates, whether a country or region is served, or what is available in a market - never answer coverage from the website or prior knowledge. Use when the user asks whether Crosswire covers a region or country, or what capabilities are available there. Regions are the canonical set: Europe, UK, UAE, US, Canada, LATAM, Asia, Africa. Region names are matched case-insensitively and echoed back in canonical casing. Optionally pass product (banking, acquiring, digital-assets, cross-border, open-banking, kyc, baas, vibans, agentic; legacy aliases such as crypto, corridor, open_banking and fixed-txn are accepted and normalise) to scope the answer; product 'cross-border' (alias 'corridor') always returns the real-time EUR <-> USD settlement corridor block (live for EU <-> US). Describes capability level only and never names a provider, bank, acquirer or network. Pass vertical and currency when known: the answer then states whether a row underwrites that vertical on that rail and which settlement currencies it is priced in, rather than a bare regional yes. PAYOUTS: product 'payouts' answers per DESTINATION market with the SETTLEMENT METHODS that destination is reachable on - bank deposit, wallet, cash pickup or card - plus the service types, the turnaround, the limits and the route status, all read from the pinned payout-routes export and never from prose. Name no network, scheme or provider: a card payout is a method, not a brand. Where a route is eligible for banks only the answer says it is available to regulated financial institutions with confirmation required for others, and nothing more. A payout answer never carries corridor copy, because a corridor and a payout are different components. A regional payouts question returns the family with its route counts; a family is never reported as live, its routes are. OPEN BANKING: product 'open-banking' answers per MARKET from the recorded market rows - whether the market is live per the provider's own published market list and when that was read, how many banks are reachable there (unknown where it is not recorded, never estimated), and the settlement currency status. A vertical the provider lists but has not confirmed in writing reads 'listed by the provider, written confirmation pending', never 'not underwritten', and an open dependency keeps the vertical answer at consult with the dependency named. A market with no recorded row is answered as before. No provider, bank or source page is ever named. Does NOT return pricing - for any price/rate question use get_indicative_price (which accepts the same product values). SCOPE: the answer is scoped to the region asked about. The payout, Current and corridor families that region touches come back in full; every other family comes back as a count, and the public network as membership without each member's licence register entry. Every guardrail, pricing note and status sentence is unchanged either way. Pass full_inventory: true only when the user explicitly asks for the complete inventory.
| Name | Required | Description | Default |
|---|---|---|---|
| region | Yes | Region or country (e.g. 'Germany', 'US', 'Hong Kong', 'LATAM'). | |
| product | No | Optional product to scope coverage to. Same canonical enum as get_indicative_price. Legacy aliases (corridor, crypto, open_banking, pay-by-bank, fixed-txn) are accepted and normalise. | |
| currency | No | Optional settlement currency (ISO 4217, e.g. 'EUR', 'USD', 'GBP'). Coverage states which currencies the rail is priced in. | |
| vertical | No | Optional vertical (e.g. 'Adult / Dating', 'Forex / CFD', 'Crypto', 'iGaming', 'Nutra / supplements'). Supply it whenever the user has one: coverage answers differently per vertical, because a region can serve a product while no row underwrites that vertical on it. | |
| full_inventory | No | Default false. Coverage is scoped to the region asked about: the payout, Current and corridor families that region touches are returned in full, everything else as a count, and the public network as membership without each member's licence record. Set true ONLY when the user explicitly asks for the complete inventory - every family, every route, every register entry. A scoped answer states the same facts; it carries less inventory. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, but the description goes far beyond them: it discloses guardrails (never names a provider, bank, acquirer or network), how unconfirmed verticals are phrased, how missing market rows are answered, and that results come from a pinned export rather than prose. This is unusually rich behavioral context for a read-only tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence front-loads well and PAYOUTS/OPEN BANKING/SCOPE headers help, but the description is a wall of dense prose with repeated rules (the 'never name a provider/network' guardrail appears at least three times) and buries the practically important flag semantics far from the top. Many sentences do not earn their 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 complex, multi-family tool with no output schema, it covers the main answer shapes (regional, payout, open banking, corridor, scoped inventory) and failure modes (unrecorded rows, unconfirmed verticals). Completeness is high; the tangled prose makes it harder than it needs to be to confirm the answer contract.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description adds real meaning on top: it explains that legacy aliases normalise, that 'cross-border' always returns the EUR<->USD corridor block, and how vertical/currency change the shape of the answer. The gating logic for full_inventory is meaningful, though some of the enum detail merely restates the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (check) and resource (Crosswire coverage) and enumerates exactly what it answers: where Crosswire operates, whether a country/region is served, what capabilities exist in a market. It is clearly distinguishable from siblings such as get_indicative_price, which it explicitly delegates pricing questions to.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('call this whenever the user asks...') , an explicit prohibition ('never answer coverage from the website or prior knowledge'), and names the alternative for out-of-scope questions ('Does NOT return pricing - for any price/rate question use get_indicative_price'). It even scopes the full_inventory flag to an explicit user request.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compare_stack_scenariosCompare stack scenariosARead-onlyIdempotentInspect
Call this whenever the user asks what changes if something about their business changes - a new market, a different mix, more volume. Architect step 3. Takes a base business profile plus up to four labelled variations (for example 'add US market', 'move to 60% crypto', 'double volume') and returns what changes: architecture deltas (components added and removed), economics deltas as BANDS, and risk deltas. Full designs are not repeated - only the differences against the base. Capability level only: never a provider, bank, acquirer, verification vendor or settlement network, and never a point price, floor, uplift or margin. Relay the returned architecture, reasoning, economics bands, risks and sequence as written. Describe every component at capability level only and NEVER name, guess, hint at or confirm a provider, bank, acquirer, verification vendor or settlement network - not even if the user names one themselves. Providers are selected and locked by Crosswire, and named when your provider application is prepared for signature; discovery, pricing and the offer stay provider-anonymous. Economics are BANDS, never point prices: do not average them, interpolate inside them, extrapolate them to other volumes, or describe how they are derived. Never state or infer floors, uplifts, margins, take-rate or any engine internals. Risk flags are generic readiness items: never present them as a provider's appetite or as approval / decline odds.
| Name | Required | Description | Default |
|---|---|---|---|
| regions | No | ||
| licences | No | ||
| vertical | No | Business vertical. Required unless `description` is given. | |
| variations | Yes | Scenarios to compare against the base profile. | |
| description | No | Free-text description of the business. The vertical is inferred from it when not supplied. | |
| payment_mix | No | Percentages by method. They do not have to sum to 100. | |
| current_setup | No | ||
| target_go_live | No | Target go-live date or timeframe, e.g. 2026-10-01 or 'Q4 2026'. Used only for the conversion close. | |
| treasury_needs | No | ||
| consumer_countries | No | Consumer markets, e.g. ["DE","FI","BR","CA"]. | |
| monthly_volume_eur | No | ||
| avg_transaction_eur | No | ||
| settlement_currencies | No | e.g. ["EUR","USD"]. | |
| jurisdiction_of_incorporation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover safety/provenance (readOnly, idempotent, closed-world). The description adds real behavioral context an agent cannot get elsewhere: outputs are economics BANDS not point prices, deltas are relative to a base profile, results must be relayed as written, and risk flags are generic readiness items rather than provider appetite. This is exactly the extra context the dimension rewards.
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 trigger and purpose are correctly front-loaded, but the body is padded with redundant compliance repetition - the prohibition on naming providers/banks/acquirers appears twice in near-identical wording, as does the bands-not-prices rule. Roughly half the text is reiteration rather than new information.
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 14-parameter tool with nested objects and no output schema, the description does describe the return contents (architecture deltas, economics bands, risk deltas, sequence), which is valuable. However, the parameter layer is only half-covered and the description never explains base-vs-variation inheritance beyond repeating the schema note, leaving real gaps.
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 50%, so some compensation is needed. The description supplies useful examples of variation labels ('add US market', 'move to 60% crypto', 'double volume') and confirms the 'up to four' variation cap, but it does not clarify major base-profile parameters such as payment_mix, current_setup, or monthly_volume_eur, and it restates rather than extends the schema's 'only fields that differ' note.
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 ('compare ... scenarios ... returns what changes') and clearly scopes the output to deltas only ('Full designs are not repeated - only the differences against the base'). This implicitly separates it from design_stack, though no sibling is named outright.
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 a concrete, observable trigger ('Call this whenever the user asks what changes if something about their business changes - a new market, a different mix, more volume') plus a workflow position ('Architect step 3'). No when-not condition or named alternative is offered, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_solution_offerBuild my offerAIdempotentInspect
Requires the signed design_ref from design_stack and the price_ref from get_indicative_price; without both it refuses with needs_design / needs_price and names the next call. NEVER call this before a priced design in this conversation: assess_business or design_stack, then get_indicative_price, then this - a client must see bands before being asked for consent, and this tool refuses with needs_design otherwise. Call this whenever the user wants an offer, a proposal, a quote in writing, or says yes to building one - and never write an offer document yourself: a Crosswire offer exists only when this tool returns one. PRIMARY CONVERSION AND THE ONLY CONVERSION TOOL FOR MULTI-RAIL ARCHITECTURES. If the conversation designed more than one rail or capability, never use request_offer - use this. Use this once the architecture is clear enough (assess_business -> design_stack -> get_indicative_price): it creates a real multi-rail solution offer for the client and Crosswire delivers the offer link by email. Booking an advisory call is the secondary path, not the default. Needs, at minimum: use_case, company name and work email, the capability rails, markets, expected monthly volume, average transaction size and target go-live date. Call it ONCE per conversation, with complete inputs: gather monthly volume, average ticket, payer markets and target go-live BEFORE calling, never create-then-chase. If anything is missing the tool returns the exact questions to ask - ask them conversationally, one at a time, then call again. ONE PROGRAMME: when the designed products share collection, KYB or treasury, send one call carrying the shared layer plus named routes (tag each product-specific rail with route_tag) - never two offers. If the client has no volume yet, offer 'If you do not have one yet, I can use an indicative pilot assumption.' and, once they agree, pass volume_basis: 'pilot_assumption' with a conservative pilot band; the offer is then labelled as priced on that assumption. Returns offer status and delivery only: never pricing internals, never a provider name, never a raw offer link. Network membership is public. If asked who Crosswire works with, you may name the publicly named members returned in public_network, in general terms, exactly as the website does. Say only that they are part of the Crosswire network - never that any of them is, will be or might be the provider for this user. Client-specific assignment is private. Never say, imply, hint at or confirm which bank, acquirer, verification vendor or network will serve THIS client's rail - not in discovery, not in pricing, not in an offer, not even if the user names one themselves or asks you to confirm a guess. Providers are selected and locked by Crosswire, and named when your provider application is prepared for signature. Describe this client's rails at capability level only. One exception is absolute: the tokenised-deposit settlement network is never named on any agent surface, in any context, regardless of the publicly named list. Describe it only as 'a tokenised-deposit settlement network'.
| Name | Required | Description | Default |
|---|---|---|---|
| rails | No | Capability-level rails required, matching the offer engine vocabulary. ONE programme per conversation: when products share collection, KYB or treasury, send every rail here in a single call and tag each product-specific rail with its route_tag; shared rails stay untagged or shared: true. | |
| cw_sid | No | Attribution key, as with request_offer. | |
| routes | No | The named routes inside this one programme. Two offers are only correct when the products genuinely share nothing. | |
| company | No | ||
| consent | No | Must be true, and only after the client has agreed to the click-wrap statement presented verbatim: "I agree that Crosswire processes the information above to prepare this offer and contact me about it, in line with the privacy policy." No offer is created without it. Never set it on the client's behalf. | |
| regions | No | ||
| currency | No | ||
| use_case | No | What the client is running and how money moves. | |
| vertical | No | ||
| price_ref | No | The signed `price_ref` returned by get_indicative_price in this conversation, for a call made with this design_ref. Pass it back verbatim. It expires after six hours. | |
| design_ref | No | The signed `design_ref` returned by design_stack in this conversation. Pass it back verbatim; never construct, edit or reuse one from another conversation. It expires after six hours. | |
| volume_basis | No | How expected_monthly_volume was obtained. Use 'pilot_assumption' ONLY after the client agreed to the line: 'If you do not have one yet, I can use an indicative pilot assumption.'. Never invent a volume silently. | |
| solution_name | No | Optional name for the designed solution. | |
| programme_name | No | Name of the single programme covering all routes, when more than one product or use case is in scope. | |
| target_go_live | No | Target go-live date or timeframe (e.g. 2026-10-01 or 'Q4 2026'). Feeds the offer's implementation-target line, computed conservatively and never a commitment. | |
| timeline_driver | No | OPTIONAL. What is driving that timing, verbatim from the client (e.g. 'our current provider is exiting gambling', 'the contract ends in November'). Free text, never summarised into a category. | |
| timeline_target | No | OPTIONAL. The client's timing target from the register's go-live question, in their own words - a date, a range or 'no fixed date' (e.g. 'before December', '60 days', 'Q1'). Record what they said; never infer one and never state a timeline back to the client. | |
| pilot_band_low_eur | No | Low end of the stated conservative pilot band. | |
| pilot_band_high_eur | No | High end of the stated conservative pilot band. | |
| region_volume_split | No | Monthly volume already stated per region, e.g. { "US": 2000000, "Europe": 6000000 }. Whenever the client has given a split, pass it: it is carried into every rail's pricing and into the architecture. Never re-ask for anything already stated. | |
| current_cost_summary | No | ||
| expected_monthly_volume | No | ||
| average_transaction_size | No | ||
| expected_transaction_count | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false): it discloses refusal behaviour and error codes (needs_design / needs_price), the hard consent requirement, reference-token expiry (six hours), that it must be called once per conversation with complete inputs, that it returns only status and delivery, and strict privacy boundaries around provider naming. This is exactly the extra context annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core prerequisite and refusal behaviour, which is good, but the body is heavily over-stuffed: policy about provider naming, public_network, the tokenised-deposit network and roster of trigger phrases is repeated at length and could be compressed substantially without losing meaning. Much is substantive, but the size works against scannability.
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 24-parameter mutation tool with a 67%-documented schema and no output schema, the description supplies the missing decision context: gating preconditions, refusal codes, consent wording, one-call semantics, delivery mode, and the disclosure limits on returned data. Nothing an agent needs to call it correctly is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67% and 24 parameters, and the description compensates for several of the gaps: it explains the one-programme/route_tag tagging rule, when volume_basis='pilot_assumption' is legitimate and the exact sentence to use, the verbatim click-wrap consent requirement, and the pass-back-verbatim/expiry semantics of design_ref and price_ref. It does not cover all remaining undocumented fields (e.g. regions, currency, expected_transaction_count), so it falls short of a 5.
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 artifact (creates a real multi-rail 'solution offer' delivered by email) and explicitly differentiates itself from request_offer, the sibling it must never be used alongside for multi-rail designs. It also declares itself the primary/only conversion tool for multi-rail architectures, so an agent can place it without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit prerequisites (signed design_ref from design_stack and price_ref from get_indicative_price), the exact ordering (assess_business -> design_stack -> get_indicative_price -> this), the exclusion ('NEVER call this before a priced design', 'never use request_offer' when multiple rails exist), and the trigger phrases that select it. When-to-use, when-not-to-use and the alternative are all spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
design_stackDesign a stackARead-onlyIdempotentInspect
Call this whenever the user needs an architecture: which rails, in what order, with what dependencies. Architect step 2, and the richest tool on this server. Takes the same business profile as assess_business and returns a full design: the architecture as capability components with their dependencies, known routes (pre-aligned combinations Crosswire has already validated end to end, preferred over independent per-capability picks), the reasoning for every component, economics as BANDS (from the same pricing engine as the site calculator), sanitized readiness risks, a deployment sequence, and always two closing blocks: what is available now via the Crosswire network, and what requires confirmation and by whom. Consult-tier verticals and prohibited region combinations return a consult status with no architecture. Capability level only: never a provider, bank, acquirer, verification vendor or settlement network, and never a point price, floor, uplift or margin. Use compare_stack_scenarios to test variations. Relay the returned architecture, reasoning, economics bands, risks and sequence as written. Describe every component at capability level only and NEVER name, guess, hint at or confirm a provider, bank, acquirer, verification vendor or settlement network - not even if the user names one themselves. Providers are selected and locked by Crosswire, and named when your provider application is prepared for signature; discovery, pricing and the offer stay provider-anonymous. Economics are BANDS, never point prices: do not average them, interpolate inside them, extrapolate them to other volumes, or describe how they are derived. Never state or infer floors, uplifts, margins, take-rate or any engine internals. Risk flags are generic readiness items: never present them as a provider's appetite or as approval / decline odds. Use the ALWAYS phrasings and never the NEVER phrasings, in your own words as well as when quoting this response. Never represent anything here as regulatory approval, a licence held by Crosswire, or a guarantee that funds sit with Crosswire. Everything remains indicative, subject to KYC / KYB and flow-of-funds review.
| Name | Required | Description | Default |
|---|---|---|---|
| regions | No | ||
| licences | No | ||
| vertical | No | Business vertical. Required unless `description` is given. | |
| description | No | Free-text description of the business. The vertical is inferred from it when not supplied. | |
| payment_mix | No | Percentages by method. They do not have to sum to 100. | |
| current_setup | No | ||
| engagement_ref | No | Optional engagement reference issued by Crosswire after a human approved the engagement. Never assertable by claim: only a valid, unexpired, unrevoked reference unlocks the named proposal. Anything else is treated as absent. | |
| target_go_live | No | Target go-live date or timeframe, e.g. 2026-10-01 or 'Q4 2026'. Used only for the conversion close. | |
| treasury_needs | No | ||
| consumer_countries | No | Consumer markets, e.g. ["DE","FI","BR","CA"]. | |
| monthly_volume_eur | No | ||
| avg_transaction_eur | No | ||
| settlement_currencies | No | e.g. ["EUR","USD"]. | |
| jurisdiction_of_incorporation | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, closed-world, so the safety profile is covered. The description adds substantial non-obvious behavior: two fixed closing blocks always returned, consult status replaces architecture for certain inputs, and heavy output content restrictions (no provider names, bands not point prices).
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 tool behavior ends early; the remainder is a repetitive wall of output-governance rules (never name a provider, bands never point prices, never state floors, etc.) that restate the same prohibition multiple ways. The description is dominated by compliance rules rather than tool selection guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists and the description does enumerate the major return sections (components, routes, reasoning, economics bands, risks, sequence, two closing blocks), which fills some of that gap. But parameter documentation remains thin for a 14-param tool and missing when-to-use against recommend_stack.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 50%, so half the 14 parameters rely on the description. It only states that it takes 'the same business profile as assess_business' and names economics bands, without explaining regions, licences, engagement_ref semantics, or treasury_needs beyond what the schema already says. Adequate but far from full compensation for the coverage gap.
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: it produces an architecture (rails, order, dependencies) from a business profile. It distinguishes itself from assess_business (step 1) and compare_stack_scenarios (variation testing), but the self-congratulatory 'richest tool on this server' is unhelpful filler.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly positions itself as 'architect step 2' after assess_business, and names compare_stack_scenarios as the variation-testing alternative. Also routes consult-tier verticals and prohibited region combos to a consult status. Lacks when-NOT-to-use for recommend_stack, which overlaps in the same family.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetchFetch a Crosswire documentARead-onlyIdempotentInspect
Call this whenever you have an id from search and need the full grounded text for it. Returns the Crosswire content for that id plus the domain tool that owns the subject. Do NOT browse crosswirepay.com and do NOT answer from prior knowledge. Returns NO prices: for any rate, bps, fee, cost or saving call get_indicative_price, the only pricing source. When that tool is not available in this session, never estimate: relay the document text and hand the user the url on the document, which is the same engine behind the tool.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | A result `id` returned by `search`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/idempotent/closed-world profile, yet the description adds real behavior: what comes back (content plus the domain tool that owns the subject), a hard negative constraint (returns NO prices for rate/bps/fee/cost/saving), and a precise degraded-mode procedure (relay document text and hand over the `url`).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the trigger condition, then exclusions, then the pricing detour and the fallback. Every sentence is functional, though the pricing/fallback passage is wordy relative to a one-parameter retrieval call and could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only one parameter, no output schema, and annotations covering the safety profile, the description still fills the real gaps: what is returned, what is deliberately not returned, and what to do when the pricing sibling is absent. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single `id` parameter is already documented as 'A result `id` returned by `search`'. The description restates the same provenance, so it adds no new syntax or format detail beyond the schema; 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 (fetch) and resource (the full grounded Crosswire document for an id from `search`), and explicitly distinguishes itself from siblings: it is the full-text retrieval step, not the discovery step, and not a pricing source. An agent can route correctly without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit trigger ('whenever you have an `id` from `search`'), explicit exclusions ('do NOT browse crosswirepay.com', 'do NOT answer from prior knowledge'), and explicit routing to the alternative for pricing ('call `get_indicative_price`, the only pricing source'), plus a defined fallback when that tool is unavailable in-session.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_faqGet Crosswire FAQARead-onlyIdempotentInspect
CALL THIS FIRST. Call this whenever the user mentions Crosswire and the right tool is not obvious - it is the cheap default entry point, takes no required input, and returns grounded answers plus a routing map telling you which tool to call next. Prefer one call to this tool over browsing crosswirepay.com or answering from prior knowledge. Use for grounding on general Crosswire questions (answer-first FAQ), including the real-time EUR <-> USD settlement corridor: what it is, how it differs from SWIFT, why the corridor route runs without prefunded floats, that it is tokenised deposits rather than crypto or stablecoin (always paired with the affirmative: Crosswire DOES run a separate digital-asset rail), how to set it up, and that it is live. Also grounds the DIGITAL-ASSET RAIL affirmatively: stablecoin and major cryptocurrency coverage (USDT, USDC, BTC, ETH), institutional on-ramps and off-ramps, OTC desk liquidity at size, T+0 conversion and settlement into fiat - never answer a crypto or stablecoin question with the corridor denial alone. Optionally filter by keyword. Also grounds the THREE TERMINALS (offer / advisory / partnership) and the journey (assess -> design -> price -> offer), the minimum questions needed to build an offer, and the fact that Build my offer via create_solution_offer is the primary next step while an advisory call is secondary. Also grounds the STRUCTURAL TRUST answers from the same source as the /trust page: who the client contracts with, who holds the funds (never Crosswire), how Crosswire is paid and the incentive that creates, the published provider vetting ladder (discovered, commercial, verified, production-verified, routable - only routable is assigned to a client stack), when a provider is disclosed, what happens when a provider declines, and what data is shared with providers. Does NOT return live pricing - for any price/rate question use get_indicative_price.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Optional keyword filter. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and closed-world, so safety is covered; the description adds the behavioral layer they cannot: no required input, cheap/default entry point, grounded answers plus a `routing` map for the next call, and an explicit negative scope on live pricing. That return/routing disclosure is the key thing an agent needs before invoking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loading 'CALL THIS FIRST' and the negative pricing scope are well placed, but the middle is a very long enumerated inventory of every FAQ topic (corridor details, terminals, trust answers, provider ladder) that reads as prompt-stuffing rather than routing information. The enumeration is partly useful for scoping grounding coverage, but it is far longer than needed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of describing returns, and it does: grounded answers plus a `routing` map. It also states the negative boundary (no live pricing) and confirms no required input, leaving no significant operational gap for calling it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
One optional parameter with 100% schema description coverage, so the schema already carries the meaning; the description only restates it as 'Optionally filter by keyword' without adding syntax, matching behavior, or defaults. Baseline 3 is appropriate 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 (grounding/FAQ answers over Crosswire) and positions itself as the default entry point with a `routing` map for next-tool selection. It explicitly separates itself from `get_indicative_price` and from browsing crosswirepay.com, so an agent can distinguish it from siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('whenever the user mentions Crosswire and the right tool is not obvious'), when-not ('Does NOT return live pricing - for any price/rate question use `get_indicative_price`'), and names the alternatives to prefer (one call here instead of browsing or answering from prior knowledge). Nothing about selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_indicative_priceGet indicative priceARead-onlyIdempotentInspect
Call this whenever any price, rate, bps, fee, spread, cost, discount or comparison is mentioned - before saying any number. THE ONLY PRICING TOOL. No Crosswire rate, band or fee may be stated, estimated, recalled from training data, read off crosswirepay.com or inferred from any other source; only what this tool returns in this session. Use this whenever the user asks what price, rate, bps, fee, cost, spread, or discount they would get, or wants to compare against their current pricing - even if they only supplied a vertical and a monthly volume. Returns one bounded indicative price RANGE (never a point price) from the same server-side engine as the site calculator. Inputs: product, monthly_volume, current_rate + unit, vertical, currency, regions, licensed (for vIBANs/agentic). Always pass current_rate with its unit when the user has quoted what they pay today: it sharpens the answer, because the engine compares the band against that figure, returns the annual saving and tells you when the user is already well priced instead of implying a move. Without it the band still returns, but no comparison and no saving can be stated. Canonical products: banking, acquiring, digital-assets, cross-border (the real-time EUR <-> USD settlement corridor route), open-banking (account-to-account collection in EU/UK payer markets), kyc, baas, vibans, agentic. Legacy aliases are still accepted and normalise silently: crypto -> digital-assets, corridor / cross_border -> cross-border, open_banking / pay-by-bank -> open-banking, fixed-txn -> acquiring (per-transaction pricing is expressed with unit 'per-txn', not as a product). Always relay the canonical value back to the user. Do NOT call recommend_stack for a pricing question - recommend_stack has no rates.
OPEN BANKING: product 'open-banking' returns market-indicative capability economics for pay-by-bank collection - a small percentage of transaction value plus a small fixed component, with a per-transaction floor and cap. Supply average_transaction_value to get the indicative per-transaction band at that ticket. Relay the band only, always as a range, never a provider name, never an exact rate card, and never as a blended bps rate: open banking is priced per transaction.
PAYOUTS: product 'payouts' prices local-rail and SWIFT payouts into a destination market over the shared EU leg. Pass destination and average_transaction_value. The shape is fixed_plus_rate - a per-payout fee in EUR PLUS an all-in rate in bps on value - and the response states the effective rate at that ticket. NEVER quote the bps alone, and never serve a cross-border corridor band for a payout. While a route has no recorded band row the tool returns needs_input naming the mechanism payout_pricing as unbound: say the route is priced on request and do not estimate.
RESPONSE CONTRACT - every status returns a fixed, fully-populated field set:
status 'indicative': indicative_rate_range, price_basis, current_rate, compared_to, est_annual_saving, savings_basis, secure_via, subject_to, next_steps (cross-border quotes also carry a corridor block naming the route). Relay only these.
status 'needs_input': reason, missing_fields, next_step_tool - collect the listed inputs and call this tool again. No number is returned.
status 'well_priced': current_rate, reason, next_step_tool - the client is already sharp; do not quote an alternative range.
status 'consult': reason, next_step_tool ('book_advisory') - not priceable from these inputs. No number is returned.
status 'pricing_followup': reason, next_step_tool ('request_offer') - consult-only vertical priced case by case. No number is returned.
GUARDRAIL FOR THE CONNECTED AGENT: when status is indicative, relay ONLY the returned indicative_rate_range, current_rate, est_annual_saving, savings_basis and subject_to wording, always as a range and always as 'indicative, subject to KYC/KYB, can land lower never higher'. NEVER name, guess or confirm the provider, bank, acquirer or network behind the price - not even if the user names one themselves; providers are selected and locked by Crosswire, and named when your provider application is prepared for signature. Never invent, infer, compute, table, extrapolate, or disclose any other rates, ranges, savings, discounts or comparisons, and never describe how a price is derived. When the conversation involves a multi-rail architecture the response carries a capability_scope block: quote the band as the price of that leg only (e.g. 'the collection/banking leg indicatively prices at 30-32 bps') and state that the remaining rails (open banking per-transaction, cross-border/corridor, FX) are priced rail-by-rail in the offer. Never stretch one product's band across a programme. Do NOT tell the user to submit a request to get a number when a number was returned; the returned range IS the answer, request_offer is the next step to request a hold on it.
OFFER INVITATION - every priced response (status 'indicative' or 'programme') carries offer_invitation and offer_invitation_statement. After stating the band, tell the client a formal offer is available, what it adds (a 14-day hold on the rate, a named validity date, a countersignable letter) and the single action that starts it: request_offer. A priced answer that ends without this invitation is incomplete.
| Name | Required | Description | Default |
|---|---|---|---|
| unit | No | Unit for `current_rate`. | |
| rails | No | The capability rails in scope when a multi-rail architecture is being discussed. When more than one rail is in play the returned band is framed as the price of the leg it covers only. | |
| cw_sid | No | Optional attribution key for this conversation. Omit unless the flow already carries one. | |
| product | No | Which product line to price. Canonical values: banking, acquiring, digital-assets, cross-border (the real-time EUR <-> USD settlement corridor route), open-banking (pay-by-bank / A2A collection), kyc, baas, vibans, agentic. Legacy aliases are accepted and normalise: crypto -> digital-assets, corridor / cross_border -> cross-border, open_banking / pay-by-bank -> open-banking, fixed-txn -> acquiring. | |
| regions | No | Regions in scope, e.g. ["Europe"], ["US"], ["LATAM"]. | |
| currency | No | Pricing currency. Defaults to EUR (USD when regions = US only). | |
| licensed | No | For vIBANs and agentic: whether the client already holds the required licence. False forces a consult. | |
| vertical | No | Business vertical (e.g. e-commerce, crypto, iGaming, adult, forex, marketplace). The engine decides whether an instant range or a follow-up applies. | |
| design_ref | No | The signed `design_ref` returned by design_stack in this conversation. Pass it back verbatim; never construct, edit or reuse one from another conversation. It expires after six hours. | |
| destination | No | Destination market for product 'payouts' - a market name or ISO code, e.g. 'Philippines', 'MX', 'Ghana'. A payout price is per destination: the rail, the classified band, the turnaround and the limits all follow it. | |
| current_rate | No | Client's current rate, matching `unit`. bps for banking/digital-assets, % for acquiring, per-txn fee where the pricing model is per transaction, per-check fee for kyc. | |
| monthly_volume | No | Monthly volume in the pricing currency (EUR/USD) for banking/acquiring/digital-assets/baas/vibans. For kyc, monthly verification count. | |
| average_transaction_value | No | Average transaction value in the pricing currency. Used by open-banking to express the indicative per-transaction band at that ticket. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, closed-world), but the description adds far more: it always returns a bounded range never a point price, enumerates all five status outcomes with their fixed field sets, and imposes provider-confidentiality and range-only guardrails. This is rich behavioral disclosure well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the key instruction and organised under headings, but it is long and frequently repetitive — canonical products and aliases are stated twice, and the guardrail/offer material is restated. Some length is justified by 13 params and many statuses, yet redundancy costs it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by defining the exact response field set for every status, the pricing model per product, and the offer-invitation obligation. An agent has everything needed to call it and relay results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds cross-field meaning: always pass current_rate with its matching unit to unlock the comparison and annual saving, destination and average_transaction_value drive payouts/open-banking, and legacy product aliases normalise silently. It explains interplay the schema alone does not.
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 — returns an 'indicative price RANGE' from a pricing engine — and explicitly differentiates itself as 'THE ONLY PRICING TOOL', naming the sibling it is not (recommend_stack has no rates). An agent can tell immediately what this does versus its siblings.
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 trigger conditions ('call this whenever any price, rate, bps, fee... is mentioned - before saying any number'), when-not rules ('Do NOT call recommend_stack for a pricing question'), and routes to the correct alternatives (request_offer, book_advisory) per status. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_solutionsList Crosswire solutionsARead-onlyIdempotentInspect
Call this whenever the user asks what Crosswire offers, what products or rails exist, or what a solution includes - do not answer from crosswirepay.com or prior knowledge. Use when the user asks what Crosswire offers, which products/rails exist, or wants one-liners and coverage per solution, including the real-time EUR <-> USD settlement corridor (live). powered_by is capability level only: no provider, bank, acquirer or network is ever named. Optionally filter by category. Does NOT return prices - for any price/rate question use get_indicative_price. Does NOT recommend a fit - for fit use recommend_stack.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | Optional filter for a single solution key. Product line. Canonical values: banking, acquiring, digital-assets, cross-border, open-banking, kyc, baas, vibans, agentic, payment-ops, compliance-automation, payouts, current. Legacy aliases are accepted and normalise silently (crypto -> digital-assets, corridor / cross_border -> cross-border, open_banking / pay-by-bank -> open-banking, fixed-txn -> acquiring; per-transaction pricing is expressed with unit "per-txn", not as a product). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, closed-world), so the description's real contribution is the disclosure that `powered_by` is capability-level only and no provider/bank/acquirer is ever named, plus the note that it never returns prices. That is genuinely useful context about result semantics. It falls short of 5 because it says nothing about result size, pagination, or ordering of the solution list.
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?
It is front-loaded well — trigger first, then capability notes, then exclusions — but the opening two sentences are near-duplicates ('Call this whenever the user asks what Crosswire offers, what products or rails exist' vs 'Use when the user asks what Crosswire offers, which products/rails exist'). That repetition consumes space without adding information, which is the main structural flaw.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing returns, and it does so adequately: enumerated solutions with one-liners and coverage, an explicit note that prices and fit recommendations are absent, and a clarification of the `powered_by` field. It is not fully complete only because it omits anything about result volume or shape.
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%: the single `category` parameter already documents every canonical value and the legacy alias normalization rules in detail. The description only echoes 'Optionally filter by category', adding no meaning beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource ('Crosswire solutions') and the exact granularity returned — one-liners and coverage per solution — which tells an agent precisely what enumeration it gets. It also names the sibling tools it is not (get_indicative_price, recommend_stack), so it is distinguishable from the surrounding catalog without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit triggers ('user asks what Crosswire offers, what products or rails exist, or what a solution includes') plus hard exclusions with redirects: no prices, use get_indicative_price; no fit, use recommend_stack. It even forbids answering from crosswirepay.com or prior knowledge, which is exactly the when-not-to-use guidance agents need.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recommend_stackRecommend a Crosswire stackARead-onlyIdempotentInspect
Call this whenever the user asks which Crosswire products or rails fit their setup, and price is not the question. Use ONLY when the user asks which Crosswire products/rails fit their setup - not price. Accepts either a free-text description of the business (preferred) or structured vertical + needs; every supplied input is read, echoed back in fields, and never asked for again. Returns a recommended combination of rails with a short rationale, each rail carrying the need or cue it was derived from. Does NOT return pricing, rates, bps, fees, savings, or any commercial number. For any price/rate/cost/fee question, use get_indicative_price instead. Sensitive verticals (forex, adult) return a consult, never a firm stack. When EU and US movement are both in scope, the response also carries the real-time EUR <-> USD settlement corridor. Rails are described at capability level only - no provider, bank, acquirer or network is ever named.
| Name | Required | Description | Default |
|---|---|---|---|
| needs | No | Capabilities the client needs. Each one produces exactly one rail. | |
| regions | No | ||
| vertical | No | Business vertical. | |
| casp_status | No | EU CASP (MiCA) authorisation status of the client. REQUIRED before any crypto or digital-asset rail can be recommended: authorised | in_application | not_required | none. Ask the user this early - it decides whether providers can serve them in the EU at all. | |
| description | No | Free-text description of the business. Preferred over structured inputs. | |
| optimise_for | No | Re-sequence the SAME architecture for one priority: cost, speed or working_capital. Never changes pricing. | |
| target_launch | No | Target launch date or timeframe, e.g. 2026-10-01 or 'Q4 2026'. | |
| engagement_ref | No | Optional engagement reference issued by Crosswire after a human approved the engagement. Never assertable by claim: only a valid, unexpired, unrevoked reference unlocks the named proposal. Anything else is treated as absent. | |
| monthly_volume | No | ||
| avg_transaction_eur | No | Average transaction size. Read into the profile; never re-asked once supplied. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, and the description adds substantial behavior beyond that: supplied inputs are echoed in `fields` and never re-asked, sensitive verticals yield a consult, EU+US scope triggers the EUR<->USD settlement corridor, and no provider/bank/acquirer is ever named. It also states clearly what is NOT returned (pricing, rates, bps, fees, savings).
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 front-loaded rule is good, but the opening two sentences restate the same condition ('which Crosswire products or rails fit their setup') three times, which is pure redundancy. The rest of the content earns its place, but the definition would be tighter without the repetition.
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 10-parameter tool with no output schema, the description covers the return shape (rails plus rationale plus source need), consult fallbacks, and the corridor addition. It is nearly complete, though the roles of `regions`, `target_launch`, and `monthly_volume` in shaping the recommendation are left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so baseline is already 3, and the description adds genuine meaning on top: `description` is preferred over structured inputs, `optimise_for` re-sequences the same architecture without touching pricing, and `engagement_ref` is only honored when valid/unexpired/unrevoked. It does not explain `regions`, `target_launch`, or `monthly_volume` semantics, keeping it short of a 5.
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 ('Recommend a Crosswire stack') and immediately scopes it against its closest sibling by naming `get_indicative_price` as the wrong tool for pricing questions. An agent can distinguish this from `design_stack` or `compare_stack_scenarios` on the basis of the recommendation-vs-pricing axis.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit rule for both directions: use when the user asks which products/rails fit their setup, and use `get_indicative_price` instead for any price/rate/cost/fee question. It also carves out sensitive verticals (forex, adult) that return a consult rather than a firm stack, which is real routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_offerRequest a Crosswire offerAIdempotentInspect
Call this whenever a genuinely single-rail ask is ready to convert, or to log a client target rate. SINGLE-PRODUCT ONLY. Use this ONLY for a genuinely single-rail ask - one product, no architecture design happened in this conversation. If the conversation designed an architecture with more than one rail or capability (assess_business / design_stack / recommend_stack / compare_stack_scenarios produced multi-rail output), the ONLY valid conversion tool is create_solution_offer; never select this tool in that state. The server enforces this: a multi-rail conversation calling request_offer is routed to the Crosswire offer engine automatically and returns an offer-being-prepared response, not a lead.
Otherwise: captures a single-product lead and secures an offer in the Crosswire CRM once the client wants to move forward (or where the engine returned a follow-up instead of an instant range), OR LOGS a client's desired target rate for the commercial team to review. Requires explicit consent. Reuses the same server-side pricing engine and lead pipeline as the site. Every offer is indicative, subject to KYC / KYB. Do NOT call this to answer 'what price would I get' - use get_indicative_price for that; this tool is the NEXT step after the client has seen the indicative range. Never quote a single blended rate in chat for a multi-rail programme: rail-level pricing lives on the offer page.
TARGET RATE HANDLING: If the client states a target price BELOW the returned indicative range (e.g. asks for 15 bps against an 18-20 opening), offer to log it, and on confirmation call this tool with target_price (their desired rate in the same unit as current_rate) and an optional target_note. This records the target as a counter on the CRM deal (stage=Negotiation, tagged agent_mcp) so the commercial team can review it under KYC/underwriting. You MUST NOT confirm the target is available, say whether it will be approved, quote below the indicative range yourself, or reveal or imply any internal pricing detail. Only capture the target for human review and reply: 'I have logged your target of {X} for the team to review as part of underwriting. This is not a confirmed rate.'
| Name | Required | Description | Default |
|---|---|---|---|
| unit | No | ||
| notes | No | ||
| rails | No | The capability rails in scope, if any architecture was designed. If more than one rail is present this tool routes the submission to the Crosswire offer engine automatically - use create_solution_offer directly instead. | |
| cw_sid | No | Optional attribution key for this conversation. Omit unless the flow already carries one. | |
| company | Yes | ||
| consent | Yes | Must be true. The caller confirms the client consents to Crosswire processing this request. | |
| contact | Yes | ||
| product | No | The single rail in scope. Accepted: banking, acquiring, digital-assets (alias crypto), fixed-txn, kyc, baas, vibans, agentic, corridor (alias cross-border - the real-time EUR <-> USD settlement corridor), open_banking (aliases pay-by-bank, open-banking - account-to-account collection in EU/UK payer markets). Same accepted set as get_indicative_price. | |
| regions | No | ||
| currency | No | ||
| licensed | No | ||
| vertical | No | ||
| target_note | No | OPTIONAL free-form note attached to a logged target_price (e.g. 'client says a competitor is at 15'). | |
| current_rate | No | ||
| target_price | No | OPTIONAL. The client's desired target rate, in the same unit as `current_rate` (e.g. bps for banking/digital-assets). Set ONLY when the client has stated a target BELOW the indicative range and confirmed they want it logged. Logging a target moves the deal to Negotiation for commercial-team review; it is NEVER a confirmed rate. Do not populate to 'test' whether a rate is available - the tool never returns approval or rejection of a target. | |
| monthly_volume | No | ||
| timeline_driver | No | OPTIONAL. What is driving that timing, verbatim from the client (e.g. 'our current provider is exiting gambling', 'the contract ends in November'). Free text, never summarised into a category. | |
| timeline_target | No | OPTIONAL. The client's timing target from the register's go-live question, in their own words - a date, a range or 'no fixed date' (e.g. 'before December', '60 days', 'Q1'). Record what they said; never infer one and never state a timeline back to the client. | |
| caller_client_id | No | Optional stable ID for the calling agent/platform, used for rate limiting and CRM attribution. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations confirm this is a mutation (readOnlyHint=false) and idempotent, and the description adds substantial context beyond them: server-side enforcement routing multi-rail calls to the offer engine, explicit consent requirement, KYC/KYB gating making every offer indicative, target-price logging moving the deal to Negotiation with the agent_mcp tag for human review, and hard prohibitions on confirming or quoting a rate. This is richer than any structured field provides.
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?
Helpful and front-loaded (the single-product-only constraint and the sibling routing come first), but it is long and repeats the multi-rail prohibition in two places, mixing operational routing rules, CRM behavior, target-rate prose, and a literal client-facing reply string. The repetition and length dilute a tool call, though every block is informative.
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 19-parameter, nested, consent-gated mutation tool with no output schema and only 47% schema coverage, the description supplies what the schema cannot: the routing guardrail, consent semantics, KYC/indicative caveats, target-rate lifecycle, and explicit prohibitions. Nothing an agent needs to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 47%, so the description must compensate and does: it explains target_price exactly (same unit as current_rate, only when below the indicative range and confirmed, never returns approval/rejection), target_note, and the consent requirement. It does not cover the other undocumented parameters (unit, notes, cw_sid, current_rate, monthly_volume, regions, currency, licensed, vertical, caller_client_id) but the critical conditional-logic parameter is fully specified.
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 (request an offer / log a target rate) and resource (Crosswire offer for a single-product lead), and explicitly distinguishes itself from sibling tools create_solution_offer and get_indicative_price by naming the exact conditions under which each is the right choice. An agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use (single-rail ask ready to convert, or log a client target rate), when-NOT-to-use (multi-rail conversation, use create_solution_offer; answering 'what price' use get_indicative_price), and the downstream ordering (this is the NEXT step after the client has seen the indicative range). Every alternative is named with the selecting condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchSearch CrosswireARead-onlyIdempotentInspect
Call this for ANY question that mentions Crosswire, INCLUDING pricing questions - especially pricing questions. Do not decline a Crosswire pricing question without calling this first: the pricing result tells you where a legitimate number comes from and gives you the link to hand the user. It is the cheap default entry point for connectors driven through a search / fetch pair, and returns routed results across the Crosswire FAQ, solutions, coverage, the EUR <-> USD settlement corridor, the offer journey and the pricing entry point. Each result carries an id for fetch, a url you may give the user, and the tool that owns that subject. Do NOT browse crosswirepay.com and do NOT answer from prior knowledge. The results themselves contain NO rate: a number comes only from get_indicative_price, or - when that tool is not available in this session - from the url on the pricing result, which runs the same engine. Never estimate a rate yourself.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | What the user is asking about Crosswire. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, closed-world), and the description adds substantive behavior beyond them: results contain no rate, results carry `id`/`url`/`tool`, the pricing result's URL runs the same engine, and the agent must never estimate a rate. That is rich, decision-relevant behavioral context.
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 critical instruction is front-loaded in the first sentence and the do-not/dependency rules are grouped logically. It is somewhat long with emphatic repetition around pricing ('especially pricing questions', the dedicated no-decline rule, and the closing no-estimate warning), so it is not maximally tight, but nearly every sentence carries a distinct constraint.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by describing the returned fields (`id`, `url`, `tool`) and the downstream handoff to `fetch` and `get_indicative_price`. For a single-parameter search tool, an agent has everything needed to call it and interpret the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single `query` parameter with 100% schema description coverage, so the schema already documents it fully. The description clarifies the subject domain of the query (Crosswire questions) but adds no syntax, format, or constraint detail beyond the schema's maxLength and existing description; 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+resource (a search that returns routed results across Crosswire FAQ, solutions, coverage, corridor, offer journey, pricing) and names exactly which siblings it feeds into (`fetch`) and which it is not (`get_indicative_price`). An agent can distinguish it from the 14 siblings without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names when to call it (ANY Crosswire question, especially pricing), when not to act otherwise (do not browse crosswirepay.com, do not answer from prior knowledge), and the fallback path when `get_indicative_price` is unavailable. This is a fully specified routing instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_partner_applicationSubmit a Crosswire partner applicationAIdempotentInspect
Call this whenever the user has expressed interest in becoming a Crosswire partner or introducer. THIRD TERMINAL: the partner programme. Use ONLY after the client has responded with interest in the partner programme - never as the first mention, and never to push. Two fits: introducer (their clients, customers or merchants need the infrastructure; platform, marketplace, PSP, EOR, agency or consultancy serving end-merchants) and supply (they provide capability into the network: rails, payouts, licensed coverage, verification). Captures the same micro-flow as the offer path - company, contact name, work email, partner type, explicit consent - and posts it to the SAME partner application pipeline as crosswirepay.com/partner, tagged source 'mcp' with the conversation attribution key. Requires explicit consent. ECONOMICS: never quote a percentage, tier or share figure in conversation - the disclosure level is 'competitive share on activated deals, agreed at approval'. Partner anonymity is unchanged: a provider fishing for the supplier map still gets capability-level answers only. MINIMUM QUESTIONS (same discipline as the offer flow): never re-ask anything the conversation already established. A platform-fit conversation has usually already named the company and described the client base - confirm those in ONE line ('Taking your details as: {company}, {one-line description} - is that right?') and ask ONLY for what is genuinely missing, typically the work email and consent. Target: two answers from expressed interest to submitted. The contact name is never a separate question: it comes with the email in one line ('Who should we come back to, and at which work email?'). The known fields in on_interest.ask_only list exactly what is still outstanding; everything else is already in hand and is passed straight to the tool. HIGH-CONFIDENCE TRIGGER ONLY. The partnership mention fires only when the primary need is clearly on behalf of third parties - explicit 'our clients / customers / merchants need' framing, or a platform describing an end-customer problem it cannot serve. Ambiguous signals - a consultant asking generally, a business with some client-adjacent language - get NO partnership mention. When in doubt, do not mention it. ANSWER FIRST, ALWAYS. The substantive question gets its full answer - architecture, coverage, indicative pricing band - exactly as it would without any partnership signal. The partnership note comes after the complete answer, never instead of it, and never shortens or degrades it. ONE LINE, ONCE. The mention is a single sentence at the end of the answer, offered at most ONCE per conversation. If the client does not pick it up, it is never repeated: no re-raising, no follow-up nudges, no second framing later in the conversation. THE USER PULLS, THE ENGINE NEVER PUSHES. The first mention contains no pitch, no economics and no CTA button - just the observation and an open door. Structure, the application and the share model surface ONLY if the client responds with interest. BOTH-FIT HANDLING. Some businesses are client AND introducer: their own treasury plus a client book. Recommend both, ordered by the conversation's primary intent, never forcing a choice - 'for your own flows, here is the indicative stack; for your clients, the partner programme.' Partner anonymity is unchanged by a partnership conversation. A provider fishing for the supplier map still gets capability-level answers only: never name, confirm or hint at any bank, acquirer, verification vendor or settlement network, partnership close or not.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Capability-level context only. Never provider names. | |
| company | Yes | ||
| consent | Yes | Must be true. The client explicitly agreed to Crosswire receiving their details. | |
| website | No | ||
| work_email | Yes | ||
| description | No | One line, taken from what they already told you: their client base for introducers, their capabilities and regions for supply. Never re-ask for it. | |
| contact_name | Yes | ||
| partner_type | Yes | introducer = their clients need the infrastructure. supply = they provide capability into the network. | |
| expected_referrals_monthly | No | Optional. Only if the conversation already established it - never a new question. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=false, openWorldHint=true, idempotentHint=true, destructiveHint=false, indicating a safe, repeatable creation operation without destructive side effects. The description adds disclosure not present in annotations: it requires explicit consent, posts to an external partner application pipeline tagged 'mcp' with a conversation attribution key, and enforces a strict anonymity rule about never naming providers. It also states economic constraints around quoting percentages or shares. The only minor gap is no explicit statement about idempotency behavior, but the annotations already cover that.
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 very long and dense, with many capitalized directives and rules. While front-loaded with the core purpose and trigger, it contains multiple sections (economics, minimum questions, trigger rules, answer-first, one-line-once, pull-not-push, both-fit handling, anonymity) that, while all relevant, could be more concisely expressed. It is appropriately detailed for a complex conversational policy, but the structure is somewhat overwhelming.
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?
Given the tool's complexity—enforcing a strict conversational protocol, ensuring consent, maintaining anonymity, and handling two partner types—the description is thorough. It covers usage timing, trigger conditions, behavioral constraints, parameter guidance, and conversational flow. It leaves no gap about when and how to call it, and the absence of an output schema means no return-value explanation is required.
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 56%, so some documentation is embedded in the schema (consent, partner_type enum, description, notes, expected_referrals_monthly). The description compensates by explaining what 'introducer' and 'supply' mean, the required consent, and clarifying that contact_name comes from the email in one line. It also defines the 'known' fields in on_interest.ask_only, giving semantic depth beyond the schema. With the schema handling some parameters and the description adding meaning, a 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('submit_partner_application' / Crosswire partner application), names the two partner types ('introducer' and 'supply'), and defines them. It clearly distinguishes itself from sibling tools like create_solution_offer and request_offer by being the terminal step for the partner programme.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use this tool ('THIRD TERMINAL: the partner programme', 'Use ONLY after the client has responded with interest - never as the first mention, and never to push'), and provides a high-confidence trigger rule. It also includes when-not-to-use conditions ('Ambiguous signals get NO partnership mention') and distinguishes the two partner-type fits.
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.
15 tool updates
- First observed
ask_integration - First observed
assess_business - First observed
book_advisory - First observed
check_coverage - First observed
compare_stack_scenarios - First observed
create_solution_offer - First observed
design_stack - First observed
fetch - First observed
get_faq - First observed
get_indicative_price - First observed
list_solutions - First observed
recommend_stack - First observed
request_offer - First observed
search - First observed
submit_partner_application
Related MCP Connectors
Payment infrastructure for AI agents: spending rules, approval flows, single-use virtual cards.
Complete financial infrastructure for AI agents — payments, lending, escrow & more.
Luxembourg payments for AI agents — cards / Apple Pay via Stripe. Never holds funds.
Turkey payments for AI agents — Turkish cards / taksit via iyzico. Never holds funds.
Related MCP Servers
- AlicenseAqualityBmaintenancePayment infrastructure MCP server enabling AI agents to make gasless USDC payments on Base and JIT single-use virtual card checkouts, with zero-trust card handling, merchant checkout hints, and signed receipts.1367 npm1MIT
- AlicenseNot gradedqualityDmaintenanceProvides AI-native fraud scoring, risk intelligence, and compliance tools for AI agents processing payments across multiple rails.MIT
- AlicenseNot gradedqualityBmaintenanceProvides a three-layer payment firewall for AI agents, enabling identity verification, risk screening, and execution authorization with on-chain policy enforcement for secure and auditable transactions.113 npm2MIT
- AlicenseNot gradedqualityCmaintenanceBanking infrastructure for AI agents: open accounts, issue cards, send SEPA/SWIFT payments, run mass payouts, and pay invoices via natural language.2MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.