{"name":"app.aiconduit/conduit","slug":"aiconduit-conduit","title":"Conduit Agentic Commerce","description":"Search multi-merchant supply, checkout, and track orders via MCP.","url":"https://mcp.market/server/aiconduit-conduit","rating":null,"grade":"C","score":60,"certified":false,"status":"active","category":"ecommerce","tags":["ecommerce","search"],"presence":{"score":8,"stars":null,"forks":null,"downloads_week":null,"last_push_at":null,"license":null},"uptime":{"percent":100,"checks":9,"ok":9,"last_checked_at":"2026-09-21T13:00:45.975Z","last_ok_at":"2026-09-21T13:00:45.975Z","latency_ms":218},"claimed":false,"transport":"remote","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/asmodeoux/conduit","website":"https://aiconduit.app","version":"2.0.0","remotes":[{"type":"streamable-http","url":"https://mcp.aiconduit.app/mcp"}],"packages":[],"tools":[{"name":"agent_authenticate","description":"Two-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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"agent_id":{"type":"string","description":"Agent id from the chosen ~/.conduit credentials file, e.g. agt_..."},"nonce":{"description":"Challenge nonce from the first agent_authenticate call (omit to request one)","type":"string"},"signature":{"description":"Signature of the nonce with the agent private key (omit with nonce to get challenge)","type":"string"}},"required":["agent_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"agent_create","description":"Register 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).","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"public_key":{"type":"string","description":"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."},"handle":{"description":"Optional display handle (lowercase kebab); omit to auto-generate e.g. parcel-watcher-12","type":"string"},"payment_rails":{"description":"Optional rail keys to seed, e.g. [\"x402\"]","type":"array","items":{"type":"string"}},"default_destination":{"description":"Where orders ship. postcode + country is enough for supply_search and delivery estimates; add address, locality and region so checkout links arrive prefilled.","type":"object","properties":{"country":{"description":"ISO country code, e.g. US","type":"string"},"postcode":{"description":"Postal / ZIP code. Enough for search and delivery estimates","type":"string"},"postal_code":{"description":"Alias of postcode","type":"string"},"address":{"description":"Street address. Needed for checkout to prefill","type":"string"},"street_address":{"description":"Alias of address","type":"string"},"locality":{"description":"City. Needed for checkout to prefill","type":"string"},"city":{"description":"Alias of locality","type":"string"},"region":{"description":"State / province","type":"string"},"state":{"description":"Alias of region","type":"string"},"name":{"description":"Recipient name; many merchants require it to fulfil","type":"string"},"email":{"description":"Buyer contact email for the merchant order","type":"string"},"phone":{"description":"Buyer phone in E.164, e.g. +12125550188","type":"string"}},"additionalProperties":{}},"business_profile":{"description":"Optional business profile metadata object"},"preferences":{"description":"Optional agent preference bag"},"friendly_name":{"description":"Human-facing label (≠ handle), e.g. EU Restock Bot","type":"string"},"human_description":{"description":"Description shown to humans on the org dashboard","type":"string"},"role_description":{"description":"Self-instruction for this agent only, e.g. manage EU supplies","type":"string"},"avatar":{"description":"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."}},"required":["public_key"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"agent_notify","description":"Email 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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"agent_id":{"type":"string","description":"Linked agent sending the message"},"session_token":{"description":"Session token from agent_authenticate — required whenever agent_id is passed","type":"string"},"to":{"anyOf":[{"type":"string","const":"all","description":"Every current member of the linked org"},{"type":"object","properties":{"user_id":{"type":"string","description":"One org member user_id from agent_organization"}},"required":["user_id"]},{"type":"object","properties":{"user_ids":{"type":"array","items":{"type":"string"},"description":"Org member user_ids from agent_organization"}},"required":["user_ids"]},{"type":"object","properties":{"role":{"type":"string","description":"Org role: OWNER, OPS, FINANCE, DEVELOPER, or VIEWER"}},"required":["role"]},{"type":"object","properties":{"roles":{"type":"array","items":{"type":"string"},"description":"One or more org roles"}},"required":["roles"]},{"type":"object","properties":{"email":{"type":"string","description":"Exact member email from agent_organization — not an arbitrary address"}},"required":["email"]}],"description":"Who to notify: \"all\", { user_id }, { user_ids }, { role }, { roles }, or { email } matching an org member. Never an address outside the org."},"title":{"type":"string","description":"Subject line, max 120 characters"},"body":{"type":"string","description":"Plain-text body, max 4000 characters. Conduit wraps HTML; do not send markup."},"channel":{"description":"Delivery channel. Email only — omit or pass email","type":"string"},"severity":{"description":"info (default), warning, or urgent — affects subject prefix and accent","type":"string","enum":["info","warning","urgent"]},"actions":{"description":"Optional buttons, max 3. Hosts outside Conduit are rejected.","type":"array","items":{"type":"object","properties":{"title":{"type":"string","description":"Button label, e.g. View Invoices"},"type":{"description":"Button style (default primary)","type":"string","enum":["primary","danger","ghost"]},"url":{"type":"string","description":"https URL on hub.aiconduit.app, aiconduit.app, or mcp.aiconduit.app, or a Hub path like /invoices"}},"required":["title","url"]}},"idempotency_key":{"description":"Replay key — same agent + key returns the original notify_id without sending again","type":"string"},"order_id":{"description":"Optional order correlation","type":"string"},"search_id":{"description":"Optional search correlation","type":"string"},"dry_run":{"description":"If true, resolve recipients and from-address without sending or storing","type":"boolean"}},"required":["agent_id","to","title","body"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"agent_organization","description":"Read 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"agent_id":{"type":"string","description":"Agent id whose linked organization to read"},"session_token":{"description":"Session token from agent_authenticate — required whenever agent_id is passed","type":"string"}},"required":["agent_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"agent_outreach","description":"Email 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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"agent_id":{"type":"string","description":"Authenticated agent sending the note"},"session_token":{"description":"Session token from agent_authenticate — required whenever agent_id is passed","type":"string"},"to":{"anyOf":[{"type":"string","description":"One outside email, e.g. ops@supplier.com"},{"type":"object","properties":{"email":{"type":"string","description":"One outside email"}},"required":["email"]},{"type":"object","properties":{"emails":{"type":"array","items":{"type":"string"},"description":"Up to 5 outside emails"}},"required":["emails"]}],"description":"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":{"type":"string","description":"Subject line, max 120 characters"},"body":{"type":"string","description":"Plain-text body, max 4000 characters. URLs stay escaped text, not buttons."},"channel":{"description":"Delivery channel. Email only — omit or pass email","type":"string"},"reply_to":{"description":"Linked only: who receives replies. { email } or { role } matching a member. Omit to default to the OWNER. Unlinked agents have no Reply-To.","anyOf":[{"type":"object","properties":{"email":{"type":"string","description":"Org member email from agent_organization"}},"required":["email"]},{"type":"object","properties":{"role":{"type":"string","description":"Org role, typically OWNER or OPS"}},"required":["role"]}]},"idempotency_key":{"description":"Replay key — same agent + key returns the original outreach_id without sending again","type":"string"},"order_id":{"description":"Optional order correlation","type":"string"},"search_id":{"description":"Optional search correlation","type":"string"},"dry_run":{"description":"If true, resolve recipients and from-address without sending or storing","type":"boolean"}},"required":["agent_id","to","title","body"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"agent_report_issue","description":"Report 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"message":{"type":"string","description":"Required: what went wrong or what confused you (expected vs actual). Keep actionable. This is agent_report_issue — not order_feedback."},"kind":{"description":"Triage kind (default confusing): bug | confusing | wrong_data | blocked","type":"string","enum":["bug","confusing","wrong_data","blocked"]},"agent_id":{"description":"Agent id from credentials when available (omit placeholders like \"agent_id\")","type":"string"},"session_token":{"description":"Session token from agent_authenticate — required whenever agent_id is passed","type":"string"},"tool":{"description":"MCP tool that failed or confused you, e.g. supply_search or order_execute","type":"string"},"error":{"description":"Error code from the prior tool response when present, e.g. offer_not_in_cache","type":"string"},"detail":{"description":"Optional longer detail (response excerpt, unexpected field). Do not include private_key.","type":"string"},"search_id":{"description":"search_id for correlation when the issue is search-related","type":"string"},"order_id":{"description":"order_id for correlation when the issue is order-related","type":"string"},"session_id":{"description":"Optional session id; Conduit also picks up x-conduit-session-id from the transport","type":"string"},"context":{"description":"Optional structured extras (args summary, badge, etc.). Secrets are stripped.","type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"required":["message"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"agent_update","description":"Patch 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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"agent_id":{"type":"string","description":"Agent id to patch, e.g. agt_..."},"session_token":{"description":"Session token from agent_authenticate — required whenever agent_id is passed","type":"string"},"handle":{"description":"New display handle (lowercase kebab)","type":"string"},"payment_rails":{"description":"Replacement rail key list","type":"array","items":{"type":"string"}},"default_destination":{"description":"Where orders ship. postcode + country is enough for accurate search; add address, locality and region so checkout links arrive prefilled instead of blank.","type":"object","properties":{"country":{"description":"ISO country code, e.g. US","type":"string"},"postcode":{"description":"Postal / ZIP code. Enough for search and delivery estimates","type":"string"},"postal_code":{"description":"Alias of postcode","type":"string"},"address":{"description":"Street address. Needed for checkout to prefill","type":"string"},"street_address":{"description":"Alias of address","type":"string"},"locality":{"description":"City. Needed for checkout to prefill","type":"string"},"city":{"description":"Alias of locality","type":"string"},"region":{"description":"State / province","type":"string"},"state":{"description":"Alias of region","type":"string"},"name":{"description":"Recipient name; many merchants require it to fulfil","type":"string"},"email":{"description":"Buyer contact email for the merchant order","type":"string"},"phone":{"description":"Buyer phone in E.164, e.g. +12125550188","type":"string"}},"additionalProperties":{}},"business_profile":{"description":"Business profile patch"},"preferences":{"description":"Preferences patch"},"friendly_name":{"description":"Human-facing label (≠ handle), e.g. EU Restock Bot","type":"string"},"human_description":{"description":"Description shown to humans on the org dashboard","type":"string"},"role_description":{"description":"Self-instruction for this agent only, e.g. manage EU supplies","type":"string"},"avatar":{"description":"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."}},"required":["agent_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"inventory_levels","description":"What 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"agent_id":{"type":"string","description":"Agent id; its organization owns the connected system"},"session_token":{"description":"Session token from agent_authenticate — required whenever agent_id is passed","type":"string"},"skus":{"description":"Item codes in your own system, e.g. [\"CART-6040\"]. Pass skus or query","type":"array","items":{"type":"string"}},"query":{"description":"Free-text item search in your own system, e.g. \"carton\"","type":"string"},"fresh":{"description":"Ask the system now instead of reading the last value (slower, rate limited)","type":"boolean"},"connection_id":{"description":"Which connected system, when the org has several","type":"string"}},"required":["agent_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"inventory_purchase_order","description":"After 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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"agent_id":{"type":"string","description":"Agent id; needs both inventory and checkout permission"},"session_token":{"description":"Session token from agent_authenticate — required whenever agent_id is passed","type":"string"},"order_id":{"type":"string","description":"Conduit order id of a supplier order already placed with order_execute"},"connection_id":{"description":"Which connected system, when the org has several","type":"string"}},"required":["agent_id","order_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"inventory_replenishment","description":"Items 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"agent_id":{"type":"string","description":"Agent id; its organization owns the connected system"},"session_token":{"description":"Session token from agent_authenticate — required whenever agent_id is passed","type":"string"},"location":{"description":"Warehouse or store name to scope the worklist, e.g. \"Jebel Ali\". Omit for all","type":"string"},"fresh":{"description":"Ask the system now instead of reading the last value","type":"boolean"},"connection_id":{"description":"Which connected system, when the org has several","type":"string"}},"required":["agent_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"inventory_suppliers","description":"For 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"agent_id":{"type":"string","description":"Agent id; its organization owns the connected system"},"session_token":{"description":"Session token from agent_authenticate — required whenever agent_id is passed","type":"string"},"skus":{"minItems":1,"type":"array","items":{"type":"string"},"description":"Item codes in your own system whose usual vendors and last prices to read"},"connection_id":{"description":"Which connected system, when the org has several","type":"string"}},"required":["agent_id","skus"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"order_dispute","description":"Refund/chargeback/report paths for an order. Requires owning agent_id.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"order_id":{"type":"string","description":"Order id to resolve refund/chargeback/report paths for"},"agent_id":{"type":"string","description":"Owning agent id (required for authorization)"},"session_token":{"description":"Session token from agent_authenticate — required whenever agent_id is passed","type":"string"}},"required":["order_id","agent_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"order_events","description":"Lifecycle timeline — transitions only. Pair with order_track. Requires owning agent_id.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"order_id":{"type":"string","description":"Order id whose lifecycle events to list"},"agent_id":{"type":"string","description":"Owning agent id (required for authorization)"},"session_token":{"description":"Session token from agent_authenticate — required whenever agent_id is passed","type":"string"}},"required":["order_id","agent_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"order_execute","description":"Handoff 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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"agent_id":{"type":"string","description":"Owning agent id"},"session_token":{"description":"Session token from agent_authenticate — required whenever agent_id is passed","type":"string"},"supply_id":{"type":"string","description":"Offer supply id to purchase"},"quantity":{"description":"Units to buy (default 1)","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"pay_with":{"description":"Rail key to pay with when multiple are enabled","type":"string"},"payment_term_id":{"description":"Payment term id from supply_details payment_terms[] (e.g. net 30). Omit to pay immediately","type":"string"},"carrier":{"description":"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.","type":"string"},"search_id":{"description":"search_id from supply_search for correlation","type":"string"},"idempotency_key":{"description":"Client idempotency key — reuse to safely retry the same execute","type":"string"}},"required":["agent_id","supply_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"order_feedback","description":"Attest 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.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"order_id":{"type":"string","description":"Order id to attest"},"agent_id":{"type":"string","description":"Owning agent id (required for authorization)"},"session_token":{"description":"Session token from agent_authenticate — required whenever agent_id is passed","type":"string"},"outcome":{"type":"string","enum":["on_time","late","never_arrived","damaged","wrong_item"],"description":"Observed fulfillment outcome. Sets status (on_time/late→DELIVERED, damaged/wrong_item→DISPUTED, never_arrived→FAILED) and reputation."},"quality":{"description":"Product quality 1-5 — omit if unknown (do not invent)","type":"number","minimum":1,"maximum":5},"carrier_rating":{"description":"Carrier rating 1-5 — omit if unknown; used in reputation when provided","type":"number","minimum":1,"maximum":5},"notes":{"description":"Free-text delivery/quality notes","type":"string"},"search_id":{"description":"Optional search_id for analytics correlation","type":"string"}},"required":["order_id","agent_id","outcome"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"order_list","description":"List orders for an agent ({ orders }). Optional status or open_only filter.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"agent_id":{"type":"string","description":"Owning agent id whose orders to list"},"session_token":{"description":"Session token from agent_authenticate — required whenever agent_id is passed","type":"string"},"status":{"description":"Optional status filter: PENDING, CONFIRMED, IN_TRANSIT, DELIVERED, ABANDONED (or CANCELLED), FAILED, DISPUTED","type":"string"},"open_only":{"description":"If true, only in-flight orders (PENDING, CONFIRMED, IN_TRANSIT). Ignored when status is set.","type":"boolean"}},"required":["agent_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"order_track","description":"Honest deal-type-aware status (never fabricates carrier scans). Requires owning agent_id.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"order_id":{"type":"string","description":"Order id to track"},"agent_id":{"type":"string","description":"Owning agent id (required for authorization)"},"session_token":{"description":"Session token from agent_authenticate — required whenever agent_id is passed","type":"string"}},"required":["order_id","agent_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"order_update_status","description":"Agent manual correction or degraded handoff recovery. note required except cancelled. Owning agent_id required.","write_action":true,"price_micros":0,"input_schema":{"type":"object","properties":{"order_id":{"type":"string","description":"Order id to update"},"agent_id":{"type":"string","description":"Owning agent id (required for authorization)"},"session_token":{"description":"Session token from agent_authenticate — required whenever agent_id is passed","type":"string"},"status":{"type":"string","description":"New status, e.g. PENDING, CONFIRMED, SHIPPED, DELIVERED, CANCELLED"},"note":{"description":"Required note except when status=CANCELLED","type":"string"},"tracking_id":{"description":"Carrier tracking id when recovering handoff","type":"string"},"carrier":{"description":"Carrier name when attaching tracking","type":"string"},"tracking_url":{"description":"Carrier's public tracking page for tracking_id, when you have it. Never invent one.","type":"string","format":"uri"},"external_checkout_id":{"description":"Merchant checkout id to recover degraded handoff polling","type":"string"},"handoff_endpoint":{"description":"Merchant handoff/status endpoint URL for poll recovery","type":"string"},"search_id":{"description":"Optional search_id for analytics correlation","type":"string"}},"required":["order_id","agent_id","status"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"payment_mandate","description":"AP2 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"action":{"type":"string","enum":["request","list","update","revoke"],"description":"request = create mandate (needs scope); list = enumerate; update = change scope (needs mandate_id+scope); revoke = revoke (needs mandate_id)"},"agent_id":{"type":"string","description":"Owning agent id"},"session_token":{"description":"Session token from agent_authenticate — required whenever agent_id is passed","type":"string"},"mandate_id":{"description":"Mandate id required for update/revoke","type":"string"},"scope":{"description":"Spend limits — required for action=request and action=update","type":"object","properties":{"max_per_order":{"description":"Max USD (or order currency) per single order, e.g. 50","type":"number"},"monthly_cap":{"description":"Max spend in a rolling 30-day window from when the mandate was created, e.g. 500","type":"number"},"categories":{"description":"Optional category allowlist, Google Product Taxonomy level 1. Omit or pass [] for a General mandate (catch-all for unmatched and unclassified offers). Accepts the slug, the label, or the GPT numeric id. Slugs: electronics, office-supplies, business-and-industrial, hardware, furniture, home-and-garden, cameras-and-optics, software, media, apparel-and-accessories, luggage-and-bags, health-and-beauty, food-beverages-and-tobacco, sporting-goods, toys-and-games, baby-and-toddler, animals-and-pet-supplies, vehicles-and-parts, arts-and-entertainment, religious-and-ceremonial, mature. Most specific covering mandate wins; unknown category uses General; no covering mandate is handoff.","type":"array","items":{"type":"string"}}}},"expires":{"description":"Optional ISO-8601 expiry, e.g. 2026-12-31T00:00:00Z","type":"string"}},"required":["action","agent_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"payment_methods","description":"List or enable agent payment methods (action=list|enable) with friendly labels. Defaults: cod + x402. invoice (B2B) is coming_soon. bank_card is handoff-only.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"agent_id":{"type":"string","description":"Agent id whose methods to list or enable"},"session_token":{"description":"Session token from agent_authenticate — required whenever agent_id is passed","type":"string"},"action":{"type":"string","enum":["list","enable"],"description":"list = enumerate rails; enable = turn on one rail"},"rail":{"description":"Rail key required when action=enable, e.g. x402 (not bank_card vault)","type":"string"}},"required":["agent_id","action"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"supply_availability","description":"Whether 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"supply_id":{"type":"string","description":"Offer supply id from supply_search / supply_details"},"quantity":{"description":"Quantity to fill (default 1)","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"fresh":{"description":"Ask the supplier now rather than reading the last value. Needs agent_id, and is rate limited per agent and per organization","type":"boolean"},"quote":{"description":"Also return the supplier's exact total with tax for this quantity, computed without saving anything. Needs agent_id and an account with the supplier","type":"boolean"},"agent_id":{"description":"Agent id. Required for fresh, and it is what reveals your negotiated prices","type":"string"},"session_token":{"description":"Session token from agent_authenticate — required whenever agent_id is passed","type":"string"}},"required":["supply_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"supply_delivery","description":"Non-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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"supply_id":{"type":"string","description":"Offer supply id from supply_search / supply_details"},"agent_id":{"description":"Agent id — uses agent destination else org default when country omitted","type":"string"},"session_token":{"description":"Session token from agent_authenticate — required whenever agent_id is passed","type":"string"},"quantity":{"description":"Units to price shipping for (default 1)","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"country":{"description":"ISO country override, e.g. US (else agent/org destination)","type":"string"},"postal_code":{"description":"Postal/ZIP override for the probe destination","type":"string"},"region":{"description":"Optional region/state override","type":"string"},"address":{"description":"Street override. Many merchants will not quote shipping without it.","type":"string"},"locality":{"description":"City override. Needed with street for a real delivery quote.","type":"string"}},"required":["supply_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"supply_details","description":"Re-reads one offer from the search cache and refreshes its badge/action against current mandate state. For most catalog offers the payload equals the object supply_search already returned, so skip this if you still hold that offer and only need its fields. Carries no shipping data: use supply_delivery for ETA and cost. Re-run supply_search if offer_not_in_cache.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"supply_id":{"type":"string","description":"Offer supply id from supply_search results"},"search_id":{"description":"search_id from supply_search for correlation","type":"string"},"agent_id":{"description":"Agent id to refresh badge/action for mandate state","type":"string"},"session_token":{"description":"Session token from agent_authenticate — required whenever agent_id is passed","type":"string"}},"required":["supply_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"supply_options","description":"Lists 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:[].","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"supply_id":{"type":"string","description":"Offer supply id whose product options to list (has_options=true on the offer)"},"agent_id":{"description":"Agent id, for permission and analytics","type":"string"},"session_token":{"description":"Session token from agent_authenticate — required whenever agent_id is passed","type":"string"}},"required":["supply_id"],"$schema":"http://json-schema.org/draft-07/schema#"}},{"name":"supply_search","description":"Multi-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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"query":{"description":"Product search query, e.g. USB-C charger 65W. Required for a new search; omit when paging with search_id + offset","type":"string"},"quantity":{"description":"Desired quantity (default 1)","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"budget":{"description":"Max total budget — number means USD; or { amount, currency }","anyOf":[{"type":"number","exclusiveMinimum":0,"description":"Legacy: max total budget in USD"},{"type":"object","properties":{"amount":{"type":"number","exclusiveMinimum":0,"description":"Max total in major units"},"currency":{"type":"string","minLength":1,"description":"ISO currency for budget, e.g. USD"}},"required":["amount","currency"],"description":"Max total budget in the given currency (indicative FX for other currencies)"}]},"payable_with":{"description":"Filter to rails the agent can pay with, e.g. [\"x402\"]","type":"array","items":{"type":"string"}},"country":{"description":"ISO country for ships-to, e.g. US","type":"string"},"agent_id":{"description":"Agent id for mandate-aware badges (always pass when available)","type":"string"},"session_token":{"description":"Session token from agent_authenticate — required whenever agent_id is passed","type":"string"},"include_sandbox":{"description":"Include DEMO/SANDBOX merchants (listed last, test_offer=true). Default false — live REAL merchants only. Use only when testing Conduit checkout flows.","type":"boolean"},"limit":{"description":"Page size of ranked offers to return (default 30, max 100)","type":"integer","exclusiveMinimum":0,"maximum":100},"offset":{"description":"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.args","type":"integer","minimum":0,"maximum":9007199254740991},"fetch_limit":{"description":"Optional override for per-merchant upstream pull (default max(20, limit*2), max 300). Ignored when paging via search_id+offset","type":"integer","exclusiveMinimum":0,"maximum":300},"search_id":{"description":"Resume paging into a prior ranked set (with offset>0, or offset 0 without query). New searches with query mint a fresh search_id","type":"string"}},"$schema":"http://json-schema.org/draft-07/schema#"}}],"scan":{"score":60,"grade":"C","scanned_at":"2026-09-20T16:15:37.215Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-20T16:15:37.215Z","components":{"code":{"score":-1,"max":25,"notes":["remote-only server, no package to scan"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 428ms"]},"poisoning":{"score":15,"max":15,"notes":["25 tool descriptions checked"]},"auth":{"score":3,"max":15,"notes":["open endpoint exposes 12 write-action tools with no auth"]},"maintenance":{"score":3,"max":15,"notes":["repository not readable: repo not found"]},"identity":{"score":4,"max":10,"notes":["verified namespace with website, no repo"]}},"findings":[{"id":"auth.open-write","severity":"high","component":"auth","title":"Write-action tools reachable without authentication"}],"inputs":{"probes":[{"url":"https://mcp.aiconduit.app/mcp","reachable":true,"authRequired":false,"latencyMs":428,"serverInfo":{"name":"Conduit Agentic Commerce","version":"2.0.0"}}],"packages":[],"repo":{"found":false,"owner":"asmodeoux","repo":"conduit","error":"repo not found"},"icon":{"url":"https://aiconduit.app/icon-512.png","source":"registry","width":512,"height":512},"presence":{"stars":null,"forks":null,"downloadsWeek":null,"license":null,"lastPushAt":null,"score":8}}}},"grade_history":[],"reviews":[]}