{"description":"Describe the data or process you need in natural language, pay with x402 and receive an OCI image that fetches, processes, stores and serves it over MCP.","name":"Agentic Data Platform","url":"https://34-78-125-37.sslip.io","version":"dc40479","x-adp":{"delivery":{"also":["manifest","test_report"],"archive":{"field":"artifact.archive","format":"docker-archive","use":"for a runner that cannot pull the image: download artifact.archive.url with the order token (Authorization: Bearer or X-Order-Token), check artifact.archive.sha256, then docker load -i"},"format":"oci-image","reference":"image@sha256 digest"},"endpoints":{"mcp":"https://34-78-125-37.sslip.io/mcp","orders":"https://34-78-125-37.sslip.io/v1/orders","quotes":"https://34-78-125-37.sslip.io/v1/quotes","recover":"https://34-78-125-37.sslip.io/v1/orders/recover"},"error_codes":["validation_error","not_found","method_not_allowed","quote_not_found","quote_expired","quote_not_ready","unsupported_request","busy","payment_missing","payment_invalid","payment_expired","payment_replayed","order_not_found","token_required","order_not_awaiting_payment","artifact_not_ready","challenge_invalid","challenge_expired","signature_invalid","internal_error"],"how_to_buy":["GET /openapi.json for the full API description.","POST /v1/quotes {intent, hints?}; if status is needs_info, follow the next text of the response and fill in answer_with (questions come in the Claude Agent SDK AskUserQuestion shape).","POST /v1/orders {quote_id}: the 402 response lists the exact price; sign an x402 authorization and repeat the request with the PAYMENT-SIGNATURE header. Store the token from the 202 response (it also lists status_url and artifact_url): it is shown only then, a repeated request returns the same order without a token, and a lost token comes back only through recover.","Poll GET /v1/orders/{id} with 'Authorization: Bearer \u003ctoken\u003e', or with 'X-Order-Token: \u003ctoken\u003e' when your HTTP tool strips Authorization; the status shows the phase and an updated estimate. On payment_required sign a fresh authorization and POST it to /v1/orders/{id}/payment.","When delivered, GET /v1/orders/{id}/artifact for the image reference, manifest and test report; run the image with the manifest's configuration; secrets are supplied only at docker run.","Lost token: POST /v1/orders/recover with the order_id, then sign the returned EIP-712 challenge with the paying wallet."],"mcp":{"endpoint":"https://34-78-125-37.sslip.io/mcp","how_to_buy":["Call discover for sources, prices and error codes (this card).","Call quote {intent, hints?}; on needs_info call quote again with quote_id, intent and answers.","Call order {quote_id}: isError with PaymentRequired lists the price; sign accepts[0] and call order again with the PaymentPayload in params._meta[\"x402/payment\"]. Store the token from the result: it is shown only once.","Call order_status {order_id, token, wait_seconds} until status is delivered; on payment_required sign payment_required.accepts[0] and call order_payment with the new PaymentPayload.","Call artifact {order_id, token} for the image reference, manifest and test report, and the settlement in _meta[\"x402/payment-response\"]; pull and run the image by reference.","Lost token: recover_start {order_id}, sign the EIP-712 challenge with the paying wallet, recover_finish {challenge_id, signature}."],"payment":{"payment":"send the PaymentPayload in params._meta[\"x402/payment\"] of the same tool call","payment_required":"a paid tool called without payment returns isError with the PaymentRequired document in structuredContent and, JSON-encoded, in content[0].text","protocol":"x402 v2 MCP transport","settlement":"Settlement is deferred: the order call only verifies the payment and returns no x402/payment-response. The platform settles after a tested build (a failed build charges nothing); the settlement shows as status delivered and as _meta[\"x402/payment-response\"] on the artifact result."},"results":"Every tool returns the JSON body of the matching HTTP endpoint as structuredContent and, identical, as content[0].text; its next text names HTTP endpoints, a last text block names the MCP tool to call next. Errors set isError and carry the same machine-readable code as HTTP.","tools":[{"description":"Free. The agent card: sources, storage, prices, payment profile, error codes and how to buy (GET /.well-known/agent-card.json).","name":"discover"},{"description":"Free. Describe the data you need in plain language and get a fixed price (POST /v1/quotes). If status is needs_info, call quote again with quote_id, intent and answers (answer_with shows the shape).","name":"quote"},{"description":"Paid with x402 (v2 MCP transport). Without _meta[\"x402/payment\"] it returns isError with the PaymentRequired document; sign accepts[0] and call order again with the same quote_id and the PaymentPayload in params._meta[\"x402/payment\"]. Returns order_id and the order token, shown only once: store it. Repeating a paid call returns the same order without a token and never charges twice (POST /v1/orders). Settlement is deferred: the order call only verifies the payment and returns no x402/payment-response. The platform settles after a tested build (a failed build charges nothing); the settlement shows as status delivered and as _meta[\"x402/payment-response\"] on the artifact result.","name":"order"},{"description":"The order's status, phase and updated estimate for the token holder (GET /v1/orders/{id}). wait_seconds holds the call until the status changes. Unknown and foreign orders answer order_not_found.","name":"order_status"},{"description":"Paid with x402. For an order in payment_required (its authorization expired before settlement): sign payment_required.accepts[0] again and send it in params._meta[\"x402/payment\"]; same price, no rebuild (POST /v1/orders/{id}/payment). The paying wallet may omit the token.","name":"order_payment"},{"description":"The delivered image reference (image@sha256), manifest and test report for the token holder (GET /v1/orders/{id}/artifact). Pull the image by reference; secrets are supplied only at docker run. The settlement is in _meta[\"x402/payment-response\"].","name":"artifact"},{"description":"Free. Lost the order token: get an EIP-712 challenge for the order, to be signed by the paying wallet (POST /v1/orders/recover, step 1).","name":"recover_start"},{"description":"Free. Send the paying wallet's signature over the challenge and get a fresh order token; the old one stops working (POST /v1/orders/recover, step 2).","name":"recover_finish"}],"transport":"streamable-http, stateless (no session; POST JSON-RPC)"},"openapi":"https://34-78-125-37.sslip.io/openapi.json","order_error_codes":["build_failed","builder_unavailable","deadline_missed","payment_expired","payment_invalid","payment_settle_failed"],"order_states":["accepted","building","testing","ready","settling","delivered","failed","settle_failed","payment_required"],"outputs":["mcp"],"payment":{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","authorization":"short-lived authorizations are fine: if the order reaches payment_required, sign a fresh one and POST it to /v1/orders/{id}/payment (the paying wallet can do this without the order token)","mandate_headroom":"keep room for the price twice while the first authorization expires","network":"eip155:8453","payTo":"0x3912DD80afAEC83F1AfE1520ad3224Ca8BE0496b","protocol":"x402","request_headers":["PAYMENT-SIGNATURE","X-PAYMENT"],"response_header":"PAYMENT-REQUIRED","scheme":"exact","settlement":"after a tested build; failures before settlement charge nothing","unit":"asset smallest unit (USDC: 6 decimals)"},"price_model":{"base":"100","new_capability_surcharge":"0","note":"the exact price is in the quote and is frozen when you order","per":"order (one image)","per_step":"0","work_kinds":{"build_new":"building a new capability: slower and pricier (adds new_capability_surcharge)","compose":"assembling known steps from the platform's library"}},"sources":[{"type":"weather_api","status":"supported","description":"Current weather per city from Open-Meteo, or from a recorded fixture WEATHER_BASE_URL points at.","content":["json"],"credentials":[{"env":"WEATHER_BASE_URL","description":"Weather API base URL; omit for live Open-Meteo","secret":false,"required":false}],"params":[{"name":"cities","description":"Cities to fetch the weather for"}],"example_intent":"Every hour fetch the weather for Prague and Brno, flag readings above 30 °C, and expose them over MCP."},{"type":"google_drive","status":"supported","description":"A Google Drive folder (recursive): Google Docs, text and .vtt transcripts, PDFs, audio recordings.","content":["google docs","text","vtt","pdf","audio"],"credentials":[{"env":"GOOGLE_SA_JSON","description":"Service-account key JSON; the account needs read access to the folder","secret":true,"required":true}],"params":[{"name":"folder_id","description":"Drive folder ID"}],"example_intent":"Every night pull meeting transcripts from Drive folder X, extract action items with owners, expose over MCP."},{"type":"confluence","status":"supported","description":"A Confluence space with its pages and attachments; scans and images go through OCR. Classic or scoped Atlassian API tokens (scoped ones through https://api.atlassian.com/ex/confluence/\u003ccloudId\u003e/wiki).","content":["pages","pdf attachments","image attachments"],"credentials":[{"env":"CONFLUENCE_BASE_URL","description":"Site URL, e.g. https://example.atlassian.net/wiki","secret":false,"required":true},{"env":"CONFLUENCE_USER","description":"Account e-mail the API token belongs to","secret":true,"required":true},{"env":"CONFLUENCE_API_TOKEN","description":"Atlassian API token with read access to the space","secret":true,"required":true}],"params":[{"name":"space_key","description":"Confluence space key"}],"example_intent":"Pull our Confluence space ENG with attachments and build a map of teams, systems and owners, with sources cited."},{"type":"http_files","status":"supported","description":"An archive of files behind an HTTP(S) listing: HTML, PDF and scanned images.","content":["html","pdf","images"],"credentials":[{"env":"HTTP_FILES_BASE_URL","description":"Archive root URL (https only)","secret":false,"required":true},{"env":"HTTP_AUTH_TOKEN","description":"Bearer token if the archive needs one","secret":true,"required":false}],"params":[{"name":"path","description":"Listing path under the base URL; default is the root"}],"example_intent":"Index the retro magazine archive over HTTP, classify the items and extract the BASIC listings."},{"type":"http_json","status":"supported","description":"Any JSON REST API (GET) polled on a schedule, shaped by the order alone: paths, records, ids, pagination; one item per record, so unchanged records are skipped. Optional API-key authentication.","content":["json"],"credentials":[{"env":"API_BASE_URL","description":"API root URL (https only)","secret":false,"required":true},{"env":"API_KEY","description":"API key or token, if the API needs one (bearer by default)","secret":true,"required":false}],"params":[{"name":"path","description":"Request path under the base URL (or paths: several); no host or query"},{"name":"query","description":"Fixed non-secret query parameters"},{"name":"records","description":"Dotted path to the record array in each response"},{"name":"id_field","description":"Record field holding its stable, unique id; required when records change (the default, a hash of the record, turns an edited record into a new one)"},{"name":"revision_field","description":"Record field that changes with the record, e.g. updated_at (default: a hash)"},{"name":"pagination","description":"none, cursor, page, offset, link_header or next_url"},{"name":"max_pages","description":"Pages per path, default 100, at most 1000; an API with more pages fails the run"},{"name":"auth","description":"Header or query parameter API_KEY goes in (default Authorization: Bearer)"}],"example_intent":"Every hour poll our orders API, flag orders above 10000 EUR, and expose them over MCP."},{"type":"sftp","status":"supported","description":"A directory on an SFTP server (read only); the host key must be pinned.","content":["text","logs","pdf","any file"],"credentials":[{"env":"SFTP_HOST","description":"Host name or address","secret":false,"required":true},{"env":"SFTP_PORT","description":"Port, default 22","secret":false,"required":false},{"env":"SFTP_USER","description":"User name","secret":false,"required":true},{"env":"SFTP_PRIVATE_KEY","description":"Private key; use this or SFTP_PASSWORD","secret":true,"required":false},{"env":"SFTP_PASSWORD","description":"Password; use this or SFTP_PRIVATE_KEY","secret":true,"required":false},{"env":"SFTP_HOST_KEY","description":"Server public key (authorized_keys format); connecting without it is refused","secret":false,"required":true}],"params":[{"name":"remote_path","description":"Directory to read"}],"example_intent":"Daily, load the reports from /exports on our SFTP server and make them searchable."},{"type":"sharepoint","status":"on_request","description":"A SharePoint site or document library through Microsoft Graph (not in the connector library yet).","content":["office documents","pdf","pages"],"credentials":[{"env":"SHAREPOINT_TENANT_ID","description":"Azure AD tenant ID","secret":false,"required":true},{"env":"SHAREPOINT_CLIENT_ID","description":"App registration client ID","secret":false,"required":true},{"env":"SHAREPOINT_CLIENT_SECRET","description":"App registration client secret","secret":true,"required":true}],"params":[{"name":"site","description":"Site URL or ID"},{"name":"library","description":"Document library name"}],"example_intent":"Pull the policies library from our SharePoint site and answer questions about them with citations."},{"type":"logs","status":"on_request","description":"Text or JSON-lines log files from a read-only mounted directory (not in the connector library yet; logs on SFTP or HTTP are covered by those sources).","content":["text logs","json lines"],"credentials":[{"env":"LOGS_DIR","description":"Path of the mounted read-only log directory inside the container","secret":false,"required":true}],"params":[{"name":"pattern","description":"File glob, default *.log"}],"example_intent":"Read the application logs from the mounted directory every 5 minutes and report error spikes."}],"storage":[{"scheme":"file://","description":"SQLite database plus the original files under that path; the path must be a persistent mounted volume"},{"scheme":"postgres://","description":"A Postgres database supplied by the buyer; the image creates its tables on first start. Warehouse plans (the company map) need none: they use the Postgres baked into the image, kept on the /data volume"},{"scheme":"s3://","description":"An S3 bucket and prefix supplied by the buyer (AWS or an S3-compatible endpoint that honors conditional writes); credentials in AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY and AWS_REGION, one running container per prefix"},{"scheme":"bigquery://","description":"BigQuery tables in an existing dataset of the buyer (project/dataset), queryable there; the service-account key in BIGQUERY_SA_JSON needs roles/bigquery.dataEditor on the dataset and roles/bigquery.jobUser on the project; one running container per namespace"}]}}
