Reference: Management MCP
The control plane for providers, spoken as MCP over JSON-RPC 2.0.
- Endpoint:
POST /mcp - Protocol version:
2025-06-18 - Transport: JSON-RPC 2.0 (one request object per call)
This is not a paid relay. It creates and manages endpoints. The paid MCP wrapper for buyers lives at
/m/{provider}/{server}(see Concepts).
Methods
| Method | Auth | Purpose |
|---|---|---|
ping | none | liveness |
notifications/* | none | accepted, no response |
initialize | required | handshake; returns capabilities + instructions |
tools/list | required | the tool catalog (below) |
tools/call | required | invoke a tool |
The whole protected resource (everything except
ping/notifications) challenges unauthenticated requests with 401 +WWW-Authenticate— that’s what makes an MCP client (Claude) start the OAuth login flow at connect time.
Authentication
Sell / custodial tools/call require a bearer token — either:
- an OAuth access token (
emoauth_…) from connecting in Claude (guide), or - an automation key (
empk_…).
Send it as Authorization: Bearer <token>. When one of those tools is called
without it, /mcp returns HTTP 401 with a WWW-Authenticate: Bearer resource_metadata="…" header that points an MCP client at the OAuth discovery
metadata. Browse/buy tools need no bearer (see below).
Auth is per-capability. initialize, tools/list, and the browse/buy tools
(search_marketplace, get_endpoint_sample, quote_endpoint, call_endpoint,
call_mcp_tool) work with no account — buying is authorized by the payment
credential in the args (signed X-PAYMENT / buy-job spk_). The sell and
custodial wallet/budget tools require a verified-email account; calling one
without it returns the 401 OAuth challenge. Email is set only by completing the magic
link, so a non-null email is, by construction, verified.
Tools
| Tool | Args | Description |
|---|---|---|
get_profile | — | Your public profile (/u/<handle>): name, profile_type, bio, avatar_url, website_url, social_links, verified, + completeness meter. |
update_profile | any of: slug, name, profile_type (individual|team|company), bio, avatar_url, website_url, social_links | Edit your public profile; only provided fields change. slug is your handle (the /u/<slug> page + /r/<slug>/… call URLs; lowercase [a-z0-9-], 2–39 chars, unique, not reserved) — changing it breaks call URLs buyers saved, so claim a good one early. social_links (when sent) replaces the whole map; empty string clears a field. Verified is team-granted, not settable here. |
list_endpoints | — | All your endpoints (relays + wrappers) with status + relay URLs. Excludes deleted. |
create_api_relay | name, slug, origin_url, method, price_usd, networks, pay_to, free?, description?, public_listing?, join_card?, origin-auth?, sample/trust? | Create a paid API relay over an HTTP origin. Set free:true (then price_usd/pay_to aren’t needed) to give it away — buyers call it with no payment, no settlement, no fee. join_card (strongly advised) declares the join handles — see Join cards. |
create_mcp_wrapper | name, slug, origin_url, networks, pay_to, tools[], public_listing?, join_card?, origin-auth?, sample/trust? | Wrap an upstream MCP server, pricing each tool. join_card with accepts/returns makes the tools composable in agents’ fusion plans. |
create_dataset | name, slug, download_url, price_usd, networks, pay_to, sample_rows?, columns_schema?, format?, license?, description?, public_listing?, join_card?, synthetic?, synthetic_method?, synthetic_source?, synthetic_fidelity?, synthetic_privacy? | List a downloadable dataset (an API relay whose origin returns a download link); sample_rows become the free preview. format ∈ csv|parquet|jsonl|json|zip|…. join_card (strongly advised) declares which columns buyers can join on — see Join cards. For synthetic data set synthetic=true + provenance (method/source required). See Selling datasets. |
publish_endpoint | endpoint_id | Publish (status → active); with public_listing adds to the marketplace. For a trial_safe API relay this also runs the origin probe → builds the sample. |
update_endpoint | endpoint_id + any of: name, description, origin_url, method, price_usd, networks, pay_to, free, join_card, auth_type/auth_value/auth_header_name, sample/trust fields | Edit an endpoint; only provided fields change. auth_type:"none" clears origin auth. free:true clears pricing (makes it free); free:false + price_usd + networks + pay_to makes a free endpoint paid again. join_card={…} sets/replaces the join card; join_card={} clears it. |
pause_endpoint | endpoint_id | Pause (status → disabled): off the relay + marketplace. |
resume_endpoint | endpoint_id | Resume (status → active). |
delete_endpoint | endpoint_id | Soft-delete: hidden, offline, slug freed; payment history kept. |
list_automation_keys | — | Your keys (prefix + lifecycle only; secret never returned). |
revoke_automation_key | key_id | Revoke a key so it can no longer authenticate. |
Buyer tools (discover + buy data)
| Tool | Args | Description |
|---|---|---|
whoami | — | Who you’re authenticated as: slug, email, email_verified, can_sell. authenticated:false when browsing anonymously. Open (no auth) — use it to confirm which account/email the connector is acting as. |
search_marketplace | query?, type?, joinable_on?, limit? | Find endpoints to buy; each result carries price + the free sample + join_card/fusion_ready/joins_with. type = api|mcp|dataset (download link) |synthetic (data labeled synthetic, with provenance). joinable_on (e.g. "domain") returns only listings whose join card offers a matching handle — how an agent finds data that fuses with data it already holds (full flow: Data fusion). No payment. |
get_endpoint_sample | provider, endpoint | One endpoint’s full sample (schema + synthetic example + axes + the join_card — plan a fusion before paying; per-tool schemas for MCP). No payment. |
get_wallet | — | Your managed wallet(s): chain, deposit address, on-chain USDC balance. |
create_wallet | chain | Create a managed wallet (base|solana|stellar); returns a one-time mnemonic/key. |
create_buy_job | chain, label?, budget_usd?, max_per_call_usd?, ttl? | Advanced/optional — mints a capped, disposable spk_ to delegate bounded spend to a separate agent. Most buyers just fund a wallet + confirmed=true. |
list_buy_jobs / close_buy_job | chain [, key_id] | List jobs (budget/spent/remaining) / revoke one. |
get_buy_policy / set_buy_policy | max_per_call_usd?, confirm_above_usd?, clear? | Read/set standing account guardrails: calls over the cap are refused; calls over the confirm threshold need confirmed:true. |
quote_endpoint | provider, endpoint, tool? | Get the x402 accepts (price, network, payTo, nonce) to sign yourself (BYO wallet). No spend. |
call_endpoint | provider, endpoint, params?, body?, confirmed?, signed_payment?, spending_key? | Buy one API-relay call (spends USDC). Simple way: funded managed wallet + confirmed=true → pays from your wallet (no job). Or signed_payment (BYO), or a buy-job spending_key (delegated). With no payment + no confirm it forwards a free trial if offered, else a price quote (needs_payment) — never spends. |
call_mcp_tool | provider, server, tool, args?, spending_key?|signed_payment?, confirmed? | Buy one MCP-wrapper tool call (per-tool priced). Returns the tool result + receipt. |
Full agent buy flow: Buying with the connector.
Origin-auth fields (shared by create/update): auth_type ∈
bearer | api_key | basic | custom (+ none on update to clear), auth_value,
auth_header_name (required for api_key/custom).
Sample / trust fields (shared by create/update; all optional with safe defaults — see Publishing):
| Field | Default | Meaning |
|---|---|---|
protection | synthetic | what the buyer-facing example contains: synthetic | redacted | real |
trial_safe | false | provider asserts the call has no side effects — required to probe (build the sample from a live call) and to offer free trials |
sample_request | — | body/params used to probe the origin (and shown as the example input) |
example | — | declared sample {input, output} — paste one real output and we infer the schema, no probe needed |
output_schema | — | advanced: declare the response JSON Schema directly |
free_trial_calls | 0 | unpaid live calls a buyer may make to see real data (0–20; needs trial_safe) |
free_trial_daily_cap | — | per-endpoint/day ceiling bounding your origin cost for trials |
delivery | inline | download marks the endpoint a dataset (origin returns a download link) — see Selling datasets |
dataset_format / dataset_license | — | dataset listing metadata (e.g. csv, CC-BY-4.0) |
dataset_synthetic / dataset_provenance | false / — | mark any endpoint (live API or dataset) as synthetic; provenance {method, source_modeled, fidelity, privacy} is required when synthetic and surfaced to buyers. Find via search_marketplace(type="synthetic") |
Two sample-related actions are REST-only (no MCP tool yet), under the provider dashboard:
| Method | Path | Purpose |
|---|---|---|
| POST | /dashboard/endpoints/{id}/probe | re-run the origin probe → rebuild the sample; returns the generated sample for preview (API relays, trial_safe) |
| POST | /dashboard/endpoints/{id}/introspect | MCP wrappers: fill per-tool input schemas from the upstream’s free tools/list |
Example call
POST /mcp
Authorization: Bearer emoauth_…
Content-Type: application/json
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "create_api_relay",
"arguments": {
"name": "Weather", "slug": "weather",
"origin_url": "https://api.example.com/v1/weather",
"method": "GET", "price_usd": "0.02",
"networks": ["eip155:8453"], "pay_to": "0xYourWallet"
}
}
}
Result content is JSON (in a text content block + structuredContent). Errors use
JSON-RPC error objects; -32001 = authentication required.
The exact input schema for each tool is returned by tools/list (inputSchema).