{"id":222363,"recorded_at":"2026-10-26T15:19:51.952888Z","observed_at":"2026-10-26T15:19:51.952706Z","subject_kind":"endpoint","subject":"1d2ec883-42a1-4a97-add6-028ff64d0705","kind":"mcp.tools","method":"probe.mcp/1","body":{"count":15,"tools":[{"description":"Attach proof of delivery to a receipt. Requires the edit_token from record_approval. Moves approved to delivered, or to disputed when status is disputed. over_cap is true when actual_amount exceeds the price cap. Does not move money. Same as POST /v1/receipts/:id/proof.","inputSchema":{"additionalProperties":false,"properties":{"actual_amount":{"anyOf":[{"minimum":0,"type":"number"},{"maxLength":40,"minLength":1,"type":"string"}],"description":"Amount actually charged. over_cap is true when this is above the price cap."},"edit_token":{"description":"Secret returned once by record_approval. Required to attach proof.","type":"string"},"receipt_id":{"description":"Receipt id from record_approval (rcpt_…).","type":"string"},"status":{"description":"Omit to mark an approved receipt delivered. Pass disputed to dispute it.","enum":["delivered","disputed"],"type":"string"},"type":{"description":"Proof kind. Examples: order_confirmation, tracking, url, hash.","maxLength":64,"type":"string"},"value":{"description":"The proof itself: confirmation id, tracking number, URL, or hash.","maxLength":2000,"type":"string"}},"required":["receipt_id","edit_token","type","value"],"type":"object"},"name":"attach_proof"},{"description":"Start a Stripe Checkout credit top-up. Same as POST /v1/wallets/:id/checkout. Returns the checkout url (open that URL; it keeps Stripe's hosted-page fragment). credits is an integer from 500 to 100000 ($5 minimum). Credits are applied only after Stripe reports the session paid. Returns the API error when Stripe is not configured.","inputSchema":{"additionalProperties":false,"properties":{"api_key":{"description":"Wallet API key (bsk_…). Optional when the MCP client sends Authorization: Bearer. The local stdio process also reads BOTSUPPLY_API_KEY.","type":"string"},"credits":{"description":"Credits to buy. 1 credit = $0.01 USD. Minimum 500 credits ($5). Same limits as POST /v1/wallets/:id/checkout.","maximum":100000,"minimum":500,"type":"integer"},"wallet_id":{"description":"Wallet to credit. Defaults to the wallet that owns the API key.","type":"string"}},"required":["credits"],"type":"object"},"name":"create_checkout"},{"description":"Hold credits in escrow for a job another agent will do; release when the work is delivered, refund if not. Debits amount_credits from the authenticated payer wallet and marks the job held. payee_wallet_id receives the credits on release. Rejects amount_credits below 1, a payer equal to the payee, a missing or other-mode payee wallet, and insufficient balance. idempotency_key makes a retry return the same job without debiting twice. Same as POST /v1/jobs.","inputSchema":{"additionalProperties":false,"properties":{"amount_credits":{"description":"Credits to debit from the authenticated payer wallet and hold until release or refund.","maximum":1000000000,"minimum":1,"type":"integer"},"api_key":{"description":"Wallet API key (bsk_…). Optional when the MCP client sends Authorization: Bearer. The local stdio process also reads BOTSUPPLY_API_KEY.","type":"string"},"description":{"description":"What the payee is being paid to do.","maxLength":500,"type":"string"},"idempotency_key":{"description":"Caller-chosen key scoped to the payer. A retry with the same key and the same parameters returns the original job and does not debit again.","maxLength":128,"type":"string"},"payee_wallet_id":{"description":"Wallet that receives the credits when the payer releases the job.","type":"string"}},"required":["payee_wallet_id","amount_credits","description","idempotency_key"],"type":"object"},"name":"create_job"},{"description":"Return the authenticated wallet id and prepaid credit balance. Same as GET /v1/balance. Does not return the API key.","inputSchema":{"additionalProperties":false,"properties":{"api_key":{"description":"Wallet API key (bsk_…). Optional when the MCP client sends Authorization: Bearer. The local stdio process also reads BOTSUPPLY_API_KEY.","type":"string"}},"type":"object"},"name":"get_balance"},{"description":"Return an escrow job's status (held, released, or refunded), the held amount, any release fee, and the payer and payee wallets. The caller must be the payer or the payee. A job from another Stripe mode is not visible. Same as GET /v1/jobs/:id.","inputSchema":{"additionalProperties":false,"properties":{"api_key":{"description":"Wallet API key (bsk_…). Optional when the MCP client sends Authorization: Bearer. The local stdio process also reads BOTSUPPLY_API_KEY.","type":"string"},"job_id":{"description":"Escrow job id returned by create_job (job_…).","type":"string"}},"required":["job_id"],"type":"object"},"name":"get_job"},{"description":"Read a public purchase receipt: what was reported as approved, scope, price cap, merchant, proofs, payments, content hash, approver_confirmation, pay_allowed, and public_view. external_payment_ref is the latest recorded payment ref, or the approval-time ref when no payment is recorded. paid_before_confirmation and over_cap are true when any recorded payment has that flag. Those three fields are derived at read time and do not change the signed row. status is unconfirmed, confirmed, or declined. confirmed means the person with access to the contact clicked Confirm, with time and channel. unconfirmed is the default and is not a verification of the person. pay_allowed is true only when approver_confirmation.status is confirmed, or when no approver_contact was given and the price cap is under RECEIPT_CONFIRM_THRESHOLD (default 100, in the price cap currency). Agents must poll get_receipt and pay only when pay_allowed is true. When public_view is redacted, the approver is initials, the agent name is Agent, contacts are omitted, and payment refs and proof values are on file plus the last 4 characters. BotSupply does not move the money. The approver name is what the calling agent reported. No API key. The raw contact, confirm link, and edit token are not included. Poll this to learn the click result. Same as GET /v1/receipts/:id.","inputSchema":{"additionalProperties":false,"properties":{"receipt_id":{"description":"Public receipt id (rcpt_…).","type":"string"}},"required":["receipt_id"],"type":"object"},"name":"get_receipt"},{"description":"List live BotSupply SKUs, credit prices, short descriptions, and what a purchase does not include. Payloads stay behind purchase. recipe.book-table, when listed, is recipe documentation only and does not place a reservation.","inputSchema":{"additionalProperties":false,"properties":{},"type":"object"},"name":"list_catalog"},{"description":"Create a wallet and return wallet_id plus api_key once, with balance_credits 0. Same as POST /v1/wallets. This does not look up an existing wallet. Keep the api_key; later tools need it as Authorization: Bearer or as api_key.","inputSchema":{"additionalProperties":false,"properties":{"label":{"description":"Optional label, 1 to 80 characters. Same field as POST /v1/wallets.","type":"string"}},"type":"object"},"name":"open_wallet"},{"description":"Buy one live catalog SKU with prepaid credits. Sends { sku } to POST /v1/purchase and returns that JSON, including the pack or recipe payload. Does not place a reservation. recipe.book-table is documentation the buying agent runs itself. An unknown SKU is rejected. Insufficient balance returns an error and does not deduct credits.","inputSchema":{"additionalProperties":false,"properties":{"api_key":{"description":"Wallet API key (bsk_…). Optional when the MCP client sends Authorization: Bearer. The local stdio process also reads BOTSUPPLY_API_KEY.","type":"string"},"sku":{"description":"Live catalog SKU. The field name is sku, not sku_id.","type":"string"}},"required":["sku"],"type":"object"},"name":"purchase"},{"description":"Write a record of what was reported as approved for a purchase on any payment rail. The approver is a name supplied by the calling agent; this does not confirm who approved. BotSupply does not hold or move the money. Returns receipt_id, a public receipt_url, and an edit_token shown once. If approver_contact is an email, also issues a single-use expiring confirm link. When no email provider is configured, the response includes confirm_url and nothing is sent; the caller delivers that link. A click is a signed hash-chain event. approver_confirmation.status stays unconfirmed until the person with access to that contact clicks Confirm or Decline. confirmed means that person clicked Confirm. It is not a legal-identity check, and an unconfirmed receipt is not a verification of the person. Without an email approver_contact, pay_allowed is true only when the price cap is under RECEIPT_CONFIRM_THRESHOLD (default 100, in the price cap currency). At or above that threshold the receipt still records and shows that confirmation is required, and pay_allowed stays false. Poll get_receipt and pay only when pay_allowed is true. Optional public_view is full (default) or redacted, with optional public_scope for the redacted public text. That display setting is outside the hash. No wallet or API key. Rate limited per IP. Same as POST /v1/receipts.","inputSchema":{"additionalProperties":false,"properties":{"agent_id":{"description":"Optional id of the agent that will pay. Not a BotSupply API key.","maxLength":120,"type":"string"},"agent_name":{"description":"Optional display name of the paying agent.","maxLength":120,"type":"string"},"approver":{"description":"Name the calling agent reports as the approver. Not confirmation that this person approved.","maxLength":120,"type":"string"},"approver_contact":{"anyOf":[{"maxLength":320,"type":"string"},{"additionalProperties":false,"properties":{"address":{"maxLength":320,"type":"string"},"channel":{"description":"email today. sms is reserved.","enum":["email","sms"],"type":"string"}},"required":["channel","address"],"type":"object"}],"description":"Optional email string, or { channel: \"email\", address }. An email issues a one-time confirm link. The address is stored only as a hash. sms is reserved and rejected until a sender exists. A non-email string is stored as a hash only and does not issue a link."},"confirmation_webhook_url":{"description":"Optional public https URL. After the contact clicks Confirm or Decline, BotSupply POSTs { receipt_id, approver_confirmation }. Best-effort. Poll get_receipt if it does not arrive. Requires an email approver_contact.","type":"string"},"external_payment_ref":{"description":"Optional id from the payment rail. BotSupply does not look it up.","maxLength":200,"type":"string"},"merchant_name":{"description":"Merchant or seller name.","maxLength":160,"type":"string"},"merchant_url":{"description":"Optional http or https URL for the merchant.","type":"string"},"payment_rail":{"description":"How the agent will pay. Examples: stripe_link, card, x402, botsupply_wallet.","maxLength":64,"type":"string"},"price_cap_amount":{"anyOf":[{"exclusiveMinimum":0,"type":"number"},{"maxLength":40,"minLength":1,"type":"string"}],"description":"Maximum amount reported as approved. A positive decimal, for example 25 or \"19.95\"."},"price_cap_currency":{"description":"Currency code, 3 to 10 letters, for example USD or USDC.","type":"string"},"public_scope":{"description":"Optional scope shown on the public receipt while public_view is redacted. The stored scope is unchanged and is what the approver confirms.","maxLength":2000,"type":"string"},"public_view":{"description":"Public display. full (default) or redacted. Stored outside the hash, so changing it later does not break verify. redacted shows initials, hides contacts, and shortens payment refs and proof values.","enum":["full","redacted"],"type":"string"},"scope":{"description":"What was reported as approved, in plain text.","maxLength":2000,"type":"string"}},"required":["approver","merchant_name","scope","price_cap_amount","price_cap_currency","payment_rail"],"type":"object"},"name":"record_approval"},{"description":"Record a payment the calling agent already made against a receipt. BotSupply does not hold or move the money. Requires the edit_token from record_approval. Appends a signed hash-chain event payment_recorded. paid_at defaults to now. Sets paid_before_confirmation when the payment time is before the confirm event, or when a contact was set and the receipt was never confirmed. Sets over_cap when amount exceeds the price cap. Those cases are stored and flagged. They are not rejected. Poll get_receipt and pay only when pay_allowed is true; recording an early or over-cap payment does not make pay_allowed true. Same as POST /v1/receipts/:id/payment.","inputSchema":{"additionalProperties":false,"properties":{"amount":{"anyOf":[{"exclusiveMinimum":0,"type":"number"},{"maxLength":40,"minLength":1,"type":"string"}],"description":"Amount paid, in the receipt price-cap currency. over_cap is true when this exceeds the price cap. The payment is still recorded."},"edit_token":{"description":"Secret returned once by record_approval. Required to record a payment.","type":"string"},"external_payment_ref":{"description":"Id from the payment rail. BotSupply does not look it up and does not move the money.","maxLength":200,"type":"string"},"paid_at":{"description":"When the payment happened, ISO-8601. Omit to use the server time. paid_before_confirmation is true when this is earlier than the confirm event, or when a contact was set and the receipt was never confirmed. The payment is still recorded.","type":"string"},"receipt_id":{"description":"Receipt id from record_approval (rcpt_…).","type":"string"}},"required":["receipt_id","edit_token","external_payment_ref","amount"],"type":"object"},"name":"record_payment"},{"description":"Return held escrow credits to the payer when the work is not delivered or the job is cancelled. The payer or the payee can refund, and only while the job is held. The full hold goes back to the payer; no platform fee is taken. Refunding twice, or refunding after release, is rejected and does not move credits again. Same as POST /v1/jobs/:id/refund.","inputSchema":{"additionalProperties":false,"properties":{"api_key":{"description":"Wallet API key (bsk_…). Optional when the MCP client sends Authorization: Bearer. The local stdio process also reads BOTSUPPLY_API_KEY.","type":"string"},"job_id":{"description":"Escrow job id returned by create_job (job_…).","type":"string"}},"required":["job_id"],"type":"object"},"name":"refund_job"},{"description":"Release held escrow credits to the payee when the work is delivered. Only the payer can release, and only while the job is held. ESCROW_FEE_BPS (default 0) is withheld on release, recorded on the job, and credited to nobody; the payee receives amount_credits minus that fee. Releasing twice, or releasing after a refund, is rejected and does not move credits again. Same as POST /v1/jobs/:id/release.","inputSchema":{"additionalProperties":false,"properties":{"api_key":{"description":"Wallet API key (bsk_…). Optional when the MCP client sends Authorization: Bearer. The local stdio process also reads BOTSUPPLY_API_KEY.","type":"string"},"job_id":{"description":"Escrow job id returned by create_job (job_…).","type":"string"}},"required":["job_id"],"type":"object"},"name":"release_job"},{"description":"Change a receipt's public display to full or redacted. Requires the edit_token from record_approval. Optional public_scope replaces the scope shown publicly while redacted. Stored outside the hash chain, so the content hash and verify result do not change. redacted shows the approver as initials, the agent name as Agent, no email or phone, and payment refs and proof values as on file plus the last 4 characters. Merchant name, merchant URL, amounts, cap, timeline, and statuses stay visible. BotSupply does not move money. Same as POST /v1/receipts/:id/visibility.","inputSchema":{"additionalProperties":false,"properties":{"edit_token":{"description":"Secret returned once by record_approval. Required to change the public view.","type":"string"},"public_scope":{"description":"Optional. Replaces the scope on the public receipt while redacted. Omit to leave the stored public scope unchanged.","maxLength":2000,"type":"string"},"public_view":{"description":"full shows the record with emails and phones masked. redacted hides purchaser details.","enum":["full","redacted"],"type":"string"},"receipt_id":{"description":"Receipt id from record_approval (rcpt_…).","type":"string"}},"required":["receipt_id","edit_token","public_view"],"type":"object"},"name":"set_receipt_visibility"},{"description":"Recompute the receipt hash chain and HMAC signature. valid is true when the stored receipt matches the chain and the server signature, so the record hasn't been changed since it was created. valid does not confirm who approved. The result also includes approver_confirmation: unconfirmed, confirmed, or declined. confirmed means the person with access to the contact clicked Confirm. valid is false when a row was altered. Same as GET /v1/receipts/:id/verify.","inputSchema":{"additionalProperties":false,"properties":{"receipt_id":{"description":"Public receipt id (rcpt_…).","type":"string"}},"required":["receipt_id"],"type":"object"},"name":"verify_receipt"}]},"body_sha256":"45e18fb736d06ce666a04f5756d7326dfed75be2f56c9a8b8774a1276c22c6db","prev_id":null,"leaf":"0xa8ca52413459aa1be5ba63999ff4b9653d47ee6de2d6ac54a416ec5d10656bad","leaf_text":"{\"body\":\"45e18fb736d06ce666a04f5756d7326dfed75be2f56c9a8b8774a1276c22c6db\",\"id\":222363,\"kind\":\"mcp.tools\",\"method\":\"probe.mcp/1\",\"observed_us\":1793027991952706,\"prev\":null,\"subject\":\"1d2ec883-42a1-4a97-add6-028ff64d0705\",\"subject_kind\":\"endpoint\"}","day":{"day":"2026-10-26","leaves":296695,"root":"0xf43e8dcc3d451a4788b26be904c55e8c4c0fa75c9666796c51db38d37e2c0df8","chained":"0x702d5ac508f08b0d1accf36af25822d8e5660367494edd17a642fb61e158a57a","anchor_chain":"eip155:5042002","anchor_tx":"0x495162f8936e19f0039918feebe6c307f327cd6bf8c37219620b1970041fa9ae","anchor_block":69251483},"proof":["0xa8ca611a25f840446b1e8362a6fdb267cf6c52002b49cc5b3065bcc0b7c68b0c","0x18df7a5455dcc46b7b3e5f8c717a5047a073a897b8a0021a0403882ed2924398","0xf85fe2be22c8572d093552b844c4fdf8a8cf7f0967642b33cd18c35f6dbbf378","0xa37ea7500c58b264b7e13523d34bc292b31e456d1778f84a2c1b2ab9948a77f8","0x07d6197bbc3e5e085804fbe40e58d678c43ea4ab2bbefb4b181e1e38c7b41145","0x7d282158fa914dbc3c4aa350ca06835afd890268a19580cc303be9ed00eb21c0","0xc2f9338876ca93bec22501a105785b2ea36da6290dcc5f973dda9bd9a9912466","0xc06ebd139c7e04ba4287e0d670cfac5fa22955611e9f5168e294293463d96e14","0xc8495fd79f15548d59248d3bd550a134a862eb1298bf9b7f67ba0fee2cce6b3b","0x59283b4f1957eed1ca397cea7a54cad8fd28e2488fdbd3f14185468ebe1209e1","0xcc46e37d035d0d90e3d86104e55f155ffacd1530f11ceef85fa02db50beb78a5","0xb31654882cc5704ae07fa6a4ad12ef5516ea95a5ec8b5affdbdbec199402e29a","0x292ebdce6b8d3d7ef08ad646a0fd97dee9313ab55c1a350807d9f3013794c37a","0x428106f4ae4ec142f17aebf6fa50935242f8d3f1c211cf95d6351d03d11da2b7","0x62a900133713919f4eed33d8336876b7a6d538233b8a4f3ed03b29aa44f5bad0","0x1ac20d30773e1f4f2f811540e9a99b5cca9177c9e2e029acc0d80cf3f1d11f0f","0xd21942ae3214eff88e08ab04884fd4b11958b51af9a0741b7668e2d07a2c56c9","0x9a9024edb5069d88a324facb310a5ce8e495214bbaa968f077bede437390194f","0x9b9ce5b74b9bab5121612ef6b64920a8d453cbf311096a423eef9702747e868a"]}