Conduit Agentic Commerce
Measured conclusion: Alive, not deep-tested. L2 outcome: not_attempted.
Search multi-merchant supply, checkout, and track orders via MCP.
| Author | app.aiconduit |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Alive, not deep-tested |
| L1 liveness | alive |
| L1 latency | 79 ms |
| Last measured | 2026-10-26 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"Conduit Agentic Commerce": {
"url": "https://mcp.aiconduit.app/mcp",
"transport": "streamable-http"
}
}
}
Measured tools (25)
agent_createRegister an agent (ES256 P-256 public JWK JSON string + optional payment rails + destination). BEFORE: list ~/.conduit identity files — if any exist, reuse agent_id (do NOT register again unless the human asked for a new agent). AFTER: write persist.path (version, agent_id, public_key, private_key as JWKs; also handle, friendly_name, role_description, human_description; chmod 0600; write ~/.conduit/active). Then agent_update with default_destination+postcode before supply_search. Optional friendly_name / human_description / role_description / avatar only if the human stated them — never invent; omit avatar and the server assigns a random invader+gradient. Omit handle to auto-generate (e.g. parcel-watcher-12).
Parameters:
public_key(required) — string — ES256 P-256 public JWK as a JSON string (kty=EC, crv=P-256, x, y). Not PEM, hex, or base64url-wrapped JSON. Keep the matching private JWK only in ~/.conduit/{handle}.credentials.json.avatar— Identity mark. Omit unless the human chose it — server assigns a random invader+gradient. { kind:"glyph", glyph:"invader"|emoji, tint?:invader color, gradient } or { kind:"image", src }. Tint only for invader. Do not store in the credentials file.handle— string — Optional display handle (lowercase kebab); omit to auto-generate e.g. parcel-watcher-12preferences— Optional agent preference bagfriendly_name— string — Human-facing label (≠ handle), e.g. EU Restock Botpayment_rails— array — Optional rail keys to seed, e.g. ["x402"]business_profile— Optional business profile metadata objectrole_description— string — Self-instruction for this agent only, e.g. manage EU supplieshuman_description— string — Description shown to humans on the org dashboarddefault_destination— object — Where orders ship. postcode + country is enough for supply_search and delivery estimates; add address, locality and region so checkout links arrive prefilled.
Hints: read-only no · destructive no · idempotent no · open-world yes
agent_authenticateTwo-step re-auth. Call with agent_id only → ES256-sign nonce → call again with nonce+signature. Prefer keys from ~/.conduit ({handle}.credentials.json or legacy credentials.json; CONDUIT_CREDENTIALS_PATH pins one file). After success, merge name/role/description into that file; never overwrite private_key; keep session_token in memory. Do not agent_create if identity files already exist unless the human asked for a new agent.
Parameters:
agent_id(required) — string — Agent id from the chosen ~/.conduit credentials file, e.g. agt_...nonce— string — Challenge nonce from the first agent_authenticate call (omit to request one)signature— string — Signature of the nonce with the agent private key (omit with nonce to get challenge)
Hints: read-only no · destructive no · idempotent no · open-world no
agent_updatePatch handle, rails, default_destination (postcode required for ships-to), friendly_name, human_description, role_description, avatar (glyph+gradient or small image), business profile, or preferences. Set avatar only if the human chose it. Does not accept permissions — a human enables capabilities in Hub Agent settings.
Parameters:
agent_id(required) — string — Agent id to patch, e.g. agt_...avatar— Identity mark. Omit unless the human chose it — server assigns a random invader+gradient. { kind:"glyph", glyph:"invader"|emoji, tint?:invader color, gradient } or { kind:"image", src }. Tint only for invader. Do not store in the credentials file.handle— string — New display handle (lowercase kebab)preferences— Preferences patchfriendly_name— string — Human-facing label (≠ handle), e.g. EU Restock Botpayment_rails— array — Replacement rail key listsession_token— string — Session token from agent_authenticate — required whenever agent_id is passedbusiness_profile— Business profile patchrole_description— string — Self-instruction for this agent only, e.g. manage EU supplieshuman_description— string — Description shown to humans on the org dashboarddefault_destination— object — Where orders ship. postcode + country is enough for accurate search; add address, locality and region so checkout links arrive prefilled instead of blank.
Hints: read-only no · destructive no · idempotent no · open-world yes
agent_organizationread-onlyRead the linked organization (name, slug, country, default address) and members (user_id, name, role, email) for an agent. Returns org_not_linked when organization_id is unset — do not invent join_org. Use members to target agent_notify.
Parameters:
agent_id(required) — string — Agent id whose linked organization to readsession_token— string — Session token from agent_authenticate — required whenever agent_id is passed
Hints: read-only yes · destructive no · idempotent yes · open-world no
agent_notifyEmail Hub users in this agent’s linked organization (never addresses outside the org). to=all or { user_id } / { role } / { email } matching agent_organization members. Optional actions (Hub URLs only), severity, idempotency_key. Channel is email.
Parameters:
agent_id(required) — string — Linked agent sending the messageto(required) — Who to notify: "all", { user_id }, { user_ids }, { role }, { roles }, or { email } matching an org member. Never an address outside the org.title(required) — string — Subject line, max 120 charactersbody(required) — string — Plain-text body, max 4000 characters. Conduit wraps HTML; do not send markup.actions— array — Optional buttons, max 3. Hosts outside Conduit are rejected.channel— string — Delivery channel. Email only — omit or pass emaildry_run— boolean — If true, resolve recipients and from-address without sending or storingorder_id— string — Optional order correlationseverity— string — info (default), warning, or urgent — affects subject prefix and accentsearch_id— string — Optional search correlationsession_token— string — Session token from agent_authenticate — required whenever agent_id is passedidempotency_key— string — Replay key — same agent + key returns the original notify_id without sending again
Hints: read-only no · destructive no · idempotent yes · open-world no
agent_outreachEmail outside addresses (suppliers, carriers). to is a string email, { email }, or { emails } (max 5). Not to=all and not a Hub user_id / role — those are agent_notify. Linked agents set Reply-To to an org member (default OWNER). No action buttons. Channel is email.
Parameters:
agent_id(required) — string — Authenticated agent sending the noteto(required) — Outside address(es): a string email, { email }, or { emails } (max 5). Not to=all and not a Hub user_id / role — those are agent_notify.title(required) — string — Subject line, max 120 charactersbody(required) — string — Plain-text body, max 4000 characters. URLs stay escaped text, not buttons.channel— string — Delivery channel. Email only — omit or pass emaildry_run— boolean — If true, resolve recipients and from-address without sending or storingorder_id— string — Optional order correlationreply_to— Linked only: who receives replies. { email } or { role } matching a member. Omit to default to the OWNER. Unlinked agents have no Reply-To.search_id— string — Optional search correlationsession_token— string — Session token from agent_authenticate — required whenever agent_id is passedidempotency_key— string — Replay key — same agent + key returns the original outreach_id without sending again
Hints: read-only no · destructive no · idempotent yes · open-world yes
agent_report_issueReport unexpected tool errors or confusing Conduit outcomes for AX review (agent_report_issue — not order_feedback). Pass message (required), optional kind=bug|confusing|wrong_data|blocked, plus agent_id, tool, error, detail, search_id, order_id, session_id, and/or context. Dedupes open reports with the same tool+error+correlation. Does not change reputation.
Parameters:
message(required) — string — Required: what went wrong or what confused you (expected vs actual). Keep actionable. This is agent_report_issue — not order_feedback.kind— string — Triage kind (default confusing): bug | confusing | wrong_data | blockedtool— string — MCP tool that failed or confused you, e.g. supply_search or order_executeerror— string — Error code from the prior tool response when present, e.g. offer_not_in_cachedetail— string — Optional longer detail (response excerpt, unexpected field). Do not include private_key.context— object — Optional structured extras (args summary, badge, etc.). Secrets are stripped.agent_id— string — Agent id from credentials when available (omit placeholders like "agent_id")order_id— string — order_id for correlation when the issue is order-relatedsearch_id— string — search_id for correlation when the issue is search-relatedsession_id— string — Optional session id; Conduit also picks up x-conduit-session-id from the transportsession_token— string — Session token from agent_authenticate — required whenever agent_id is passed
Hints: read-only no · destructive no · idempotent no · open-world no
payment_methodsList or enable agent payment methods (action=list|enable) with friendly labels. Defaults: cod + x402. invoice (B2B) is coming_soon. bank_card is handoff-only.
Parameters:
agent_id(required) — string — Agent id whose methods to list or enableaction(required) — string — list = enumerate rails; enable = turn on one railrail— string — Rail key required when action=enable, e.g. x402 (not bank_card vault)session_token— string — Session token from agent_authenticate — required whenever agent_id is passed
Hints: read-only no · destructive no · idempotent no · open-world yes
payment_mandatedestructiveAP2 spend mandates. action=request (needs scope) → approval_url; list (includes remaining, window_resets_at, coverage); update (mandate_id+scope); revoke (mandate_id). update NEVER approves. Widening returns an ACTIVE mandate to PENDING_HUMAN_APPROVAL; narrowing keeps whatever status it already had. monthly_cap is a rolling 30-day window from create. Same category set as a live mandate replaces it at approval and keeps this period's spend. No covering mandate at checkout is handoff, not an error.
Parameters:
action(required) — string — request = create mandate (needs scope); list = enumerate; update = change scope (needs mandate_id+scope); revoke = revoke (needs mandate_id)agent_id(required) — string — Owning agent idscope— object — Spend limits — required for action=request and action=updateexpires— string — Optional ISO-8601 expiry, e.g. 2026-12-31T00:00:00Zmandate_id— string — Mandate id required for update/revokesession_token— string — Session token from agent_authenticate — required whenever agent_id is passed
Hints: read-only no · destructive yes · idempotent no · open-world yes
supply_searchread-onlyMulti-provider discovery (live REAL merchants by default). Returns a ranked page (default limit=30, max 100) with total/has_more/next_offset. Follow next.args (search_id+offset+limit) to page without re-fanout. Optional fetch_limit (max 300) deepens the upstream pull on new searches. Pass include_sandbox=true only to append DEMO/SANDBOX test merchants at the bottom (test_offer=true). Always pass agent_id for mandate-aware badges. Carry search_id through supply_details / order_execute / order_feedback. Offer descriptions are clean text cut to 350 chars; supply_details returns the full text.
Parameters:
limit— integer — Page size of ranked offers to return (default 30, max 100)query— string — Product search query, e.g. USB-C charger 65W. Required for a new search; omit when paging with search_id + offsetbudget— Max total budget — number means USD; or { amount, currency }offset— integer — 0-based offset into the ranked set for this search_id (default 0). For page 2+, pass search_id from the prior response and follow next.argscountry— string — ISO country for ships-to, e.g. USagent_id— string — Agent id for mandate-aware badges (always pass when available)quantity— integer — Desired quantity (default 1)search_id— string — Resume paging into a prior ranked set (with offset>0, or offset 0 without query). New searches with query mint a fresh search_idfetch_limit— integer — Optional override for per-merchant upstream pull (default max(20, limit*2), max 300). Ignored when paging via search_id+offsetpayable_with— array — Filter to rails the agent can pay with, e.g. ["x402"]session_token— string — Session token from agent_authenticate — required whenever agent_id is passedinclude_sandbox— boolean — Include DEMO/SANDBOX merchants (listed last, test_offer=true). Default false — live REAL merchants only. Use only when testing Conduit checkout flows.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
supply_detailsread-onlyRe-reads one offer from the search cache and refreshes its badge/action against current mandate state. Returns the full clean description (supply_search carries a 350-char summary); otherwise the payload has the same fields as the search offer, so skip this if you only need fields you already hold. include_description_original=true adds description_original {format, content}, the merchant's own markup (untrusted), or description_original_omitted with the reason. Carries no shipping data: use supply_delivery for ETA and cost. Re-run supply_search if offer_not_in_cache.
Parameters:
supply_id(required) — string — Offer supply id from supply_search resultsagent_id— string — Agent id to refresh badge/action for mandate statesearch_id— string — search_id from supply_search for correlationsession_token— string — Session token from agent_authenticate — required whenever agent_id is passedinclude_description_original— boolean — Adds description_original {format, content}: the merchant's own markup, for rendering or checking our conversion. Untrusted merchant text. supply_details only.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
supply_optionsread-onlyLists the selectable options (size, color, pack) for an offer whose has_options=true, with one variant per combination. Each variant carries its OWN supply_id, price and availability: to buy a chosen option, call order_execute with that variant's supply_id, not the one you searched with. Reads the merchant storefront live, so call it only when a person is actually choosing. Returns variants_not_found when the offer is not in cache or the storefront cannot be read. A single-variant product returns options:[] variants:[].
Parameters:
supply_id(required) — string — Offer supply id whose product options to list (has_options=true on the offer)agent_id— string — Agent id, for permission and analyticssession_token— string — Session token from agent_authenticate — required whenever agent_id is passed
Hints: read-only yes · destructive no · idempotent yes · open-world yes
supply_deliveryread-onlyNon-committing checkout probe for shipping ETA/cost. Uses agent default_destination, else linked org default address, or country override. status describes how far the merchant checkout got: ready_for_complete (priced and completable), incomplete (merchant returned partial rates, quote may firm up at checkout), requires_escalation (merchant wants a human at checkout, so this offer is handoff-only however its badge reads). needs_interaction=true means the same. None of these block a handoff; they predict whether autonomous completion can work.
Parameters:
supply_id(required) — string — Offer supply id from supply_search / supply_detailsregion— string — Optional region/state overrideaddress— string — Street override. Many merchants will not quote shipping without it.country— string — ISO country override, e.g. US (else agent/org destination)agent_id— string — Agent id — uses agent destination else org default when country omittedlocality— string — City override. Needed with street for a real delivery quote.quantity— integer — Units to price shipping for (default 1)postal_code— string — Postal/ZIP override for the probe destinationsession_token— string — Session token from agent_authenticate — required whenever agent_id is passed
Hints: read-only yes · destructive no · idempotent yes · open-world yes
order_executeHandoff or autonomous checkout. Handoff continue_url is a Conduit /handoff/{org_slug}/{order_id} link: open it as returned (records the open, then redirects to the merchant). Autonomous needs badge payable_now (covering mandate fits). No covering mandate, or a spent covering budget, still returns a handoff with continue_url (handoff_reason). Use idempotency_key. Prefer supply_delivery when only comparing delivery.
Parameters:
agent_id(required) — string — Owning agent idsupply_id(required) — string — Offer supply id to purchasecarrier— string — The shipping rate to buy, as the option's own `title` from supply_delivery. Conduit selects it on the merchant checkout, so the buyer opens the page on that rate instead of the merchant's default, which is the cheapest one. A title the merchant does not quote for this address leaves its default in place, and the response says so via shipping_selected.pay_with— string — Rail key to pay with when multiple are enabledquantity— integer — Units to buy (default 1)search_id— string — search_id from supply_search for correlationsession_token— string — Session token from agent_authenticate — required whenever agent_id is passedidempotency_key— string — Client idempotency key — reuse to safely retry the same executepayment_term_id— string — Payment term id from supply_details payment_terms[] (e.g. net 30). Omit to pay immediately
Hints: read-only no · destructive no · idempotent yes · open-world yes
order_listread-onlyList orders for an agent ({ orders }). Optional status or open_only filter.
Parameters:
agent_id(required) — string — Owning agent id whose orders to liststatus— string — Optional status filter: PENDING, CONFIRMED, IN_TRANSIT, DELIVERED, ABANDONED (or CANCELLED), FAILED, DISPUTEDopen_only— boolean — If true, only in-flight orders (PENDING, CONFIRMED, IN_TRANSIT). Ignored when status is set.session_token— string — Session token from agent_authenticate — required whenever agent_id is passed
Hints: read-only yes · destructive no · idempotent yes · open-world yes
order_trackread-onlyHonest deal-type-aware status (never fabricates carrier scans). Requires owning agent_id.
Parameters:
order_id(required) — string — Order id to trackagent_id(required) — string — Owning agent id (required for authorization)session_token— string — Session token from agent_authenticate — required whenever agent_id is passed
Hints: read-only yes · destructive no · idempotent yes · open-world yes
order_eventsread-onlyLifecycle timeline — transitions only. Pair with order_track. Requires owning agent_id.
Parameters:
order_id(required) — string — Order id whose lifecycle events to listagent_id(required) — string — Owning agent id (required for authorization)session_token— string — Session token from agent_authenticate — required whenever agent_id is passed
Hints: read-only yes · destructive no · idempotent yes · open-world yes
order_update_statusAgent manual correction or degraded handoff recovery. note required except cancelled. Owning agent_id required.
Parameters:
order_id(required) — string — Order id to updateagent_id(required) — string — Owning agent id (required for authorization)status(required) — string — New status, e.g. PENDING, CONFIRMED, SHIPPED, DELIVERED, CANCELLEDnote— string — Required note except when status=CANCELLEDcarrier— string — Carrier name when attaching trackingsearch_id— string — Optional search_id for analytics correlationtracking_id— string — Carrier tracking id when recovering handofftracking_url— string — Carrier's public tracking page for tracking_id, when you have it. Never invent one.session_token— string — Session token from agent_authenticate — required whenever agent_id is passedhandoff_endpoint— string — Merchant handoff/status endpoint URL for poll recoveryexternal_checkout_id— string — Merchant checkout id to recover degraded handoff polling
Hints: read-only no · destructive no · idempotent no · open-world yes
order_disputeread-onlyRefund/chargeback/report paths for an order. Requires owning agent_id.
Parameters:
order_id(required) — string — Order id to resolve refund/chargeback/report paths foragent_id(required) — string — Owning agent id (required for authorization)session_token— string — Session token from agent_authenticate — required whenever agent_id is passed
Hints: read-only yes · destructive no · idempotent yes · open-world yes
order_feedbackAttest delivery outcome (outcome=on_time|late|never_arrived|damaged|wrong_item). Requires owning agent_id. Can supersede a system-derived score once; a second agent attestation returns already_recorded. Poor outcomes next→order_dispute. Omit quality/carrier_rating if unknown.
Parameters:
order_id(required) — string — Order id to attestagent_id(required) — string — Owning agent id (required for authorization)outcome(required) — string — Observed fulfillment outcome. Sets status (on_time/late→DELIVERED, damaged/wrong_item→DISPUTED, never_arrived→FAILED) and reputation.notes— string — Free-text delivery/quality notesquality— number — Product quality 1-5 — omit if unknown (do not invent)search_id— string — Optional search_id for analytics correlationsession_token— string — Session token from agent_authenticate — required whenever agent_id is passedcarrier_rating— number — Carrier rating 1-5 — omit if unknown; used in reputation when provided
Hints: read-only no · destructive no · idempotent no · open-world yes
inventory_levelsread-onlyWhat your organization has on hand, by location, in its own connected system (ERP). Pass skus or query. Every number carries as_of and basis (live | memo | cached) — say how old it is, do not imply it is now. Needs inventory permission. This is your OWN stock; a supplier's stock is supply_availability.
Parameters:
agent_id(required) — string — Agent id; its organization owns the connected systemskus— array — Item codes in your own system, e.g. ["CART-6040"]. Pass skus or queryfresh— boolean — Ask the system now instead of reading the last value (slower, rate limited)query— string — Free-text item search in your own system, e.g. "carton"connection_id— string — Which connected system, when the org has severalsession_token— string — Session token from agent_authenticate — required whenever agent_id is passed
Hints: read-only yes · destructive no · idempotent yes · open-world yes
inventory_replenishmentread-onlyItems below their minimum in your own system, least days of cover first, with what is already inbound and the usual vendor and last price. Each row carries a search_hint: pass its query and quantity straight to supply_search, then supply_availability before ordering. Optional location scopes to one warehouse. Needs inventory permission.
Parameters:
agent_id(required) — string — Agent id; its organization owns the connected systemfresh— boolean — Ask the system now instead of reading the last valuelocation— string — Warehouse or store name to scope the worklist, e.g. "Jebel Ali". Omit for allconnection_id— string — Which connected system, when the org has severalsession_token— string — Session token from agent_authenticate — required whenever agent_id is passed
Hints: read-only yes · destructive no · idempotent yes · open-world yes
inventory_suppliersread-onlyFor items in your own system, the vendors on file and what you last paid, so a quote can be compared against history. Needs inventory permission. Does not contact any vendor.
Parameters:
agent_id(required) — string — Agent id; its organization owns the connected systemskus(required) — array — Item codes in your own system whose usual vendors and last prices to readconnection_id— string — Which connected system, when the org has severalsession_token— string — Session token from agent_authenticate — required whenever agent_id is passed
Hints: read-only yes · destructive no · idempotent yes · open-world yes
supply_availabilityread-onlyWhether one offer can fill a quantity: verdict can_fill | split | out_now | unknown, with what is on hand, what is inbound, and as_of + basis. Suppliers choose how precisely they share stock, so the verdict may come from a band or a yes/no rather than a number. fresh=true asks the supplier now (needs agent_id, rate limited per agent and per organization); without fresh it reads the last value. Call this before order_execute on any connector offer.
Parameters:
supply_id(required) — string — Offer supply id from supply_search / supply_detailsfresh— boolean — Ask the supplier now rather than reading the last value. Needs agent_id, and is rate limited per agent and per organizationquote— boolean — Also return the supplier's exact total with tax for this quantity, computed without saving anything. Needs agent_id and an account with the supplieragent_id— string — Agent id. Required for fresh, and it is what reveals your negotiated pricesquantity— integer — Quantity to fill (default 1)session_token— string — Session token from agent_authenticate — required whenever agent_id is passed
Hints: read-only yes · destructive no · idempotent yes · open-world yes
inventory_purchase_orderAfter order_execute confirms a supplier order, record the matching DRAFT purchase order in your own system so the books match. Always a draft: a person confirms it there. Idempotent per order_id — calling twice returns the same draft, never a second one. Needs both inventory and checkout permission. Never creates a vendor or a product: lines that match nothing come back as unmatched_lines for a person to add.
Parameters:
agent_id(required) — string — Agent id; needs both inventory and checkout permissionorder_id(required) — string — Conduit order id of a supplier order already placed with order_executeconnection_id— string — Which connected system, when the org has severalsession_token— string — Session token from agent_authenticate — required whenever agent_id is passed
Hints: read-only no · destructive no · idempotent yes · open-world yes
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.