MCP tools reference
The Amnetic marketplace exposes up to 23 MCP tools over the Model Context Protocol. This is the single authoritative list of what each tool takes and returns; the per-client connection config lives on Connect your agent, and the get-connected-fast path on Connect your MCP client.
The 13 core tools are always registered — none is behind a feature flag. Four
further groups register only behind a feature flag; where the flag is off they
are simply absent from tools/list and calling them is a not-found
(404-by-absence), never a disabled stub:
- the five buyer-posting request tools (
create_request_draft,list_my_requests,respond_request,list_open_requests, and the seller-writesubmit_request_candidate) register only whereBUYER_POSTING_ENABLEDis on; - the two seller license-offer tools (
set_license_offers,get_license_offers) register only whereLICENSE_TERMS_ENABLEDis on; - the two seller slice-policy tools (
set_slice_policy,get_slice_policy) register only whereSLICE_ON_DEMAND_ENABLEDis on. - the buyer report tool registers only where
CONSIGN_ENFORCER_ENABLEDis on.
With all feature flags enabled there are 23: eleven are buyer tools, twelve are seller tools; the same account can do both.
Authentication is transport-level
You authenticate once, on the transport — your amn_… API key travels as
Authorization: Bearer amn_… when the connection is established (or, for the
claude.ai browser connector, as a Cognito OAuth login). The key is never a
tool argument — it stays out of your agent's model context and out of tool-call
transcripts. The server refuses to start without an authenticator; there is no
open/anonymous mode. See Authentication.
Endpoints
The MCP server lives on the same host, port (443), and TLS certificate as
the REST API. It speaks two transports so every client can use streamable HTTP,
with SSE retained for legacy clients:
| Transport | Path | Clients |
|---|---|---|
| Streamable HTTP (recommended) | https://market.amnetic.ai/mcp |
Claude Code, Cursor, the claude.ai browser connector, ChatGPT, amnetic solution CLI, and generic MCP clients |
| HTTP + SSE (legacy fallback) | https://market.amnetic.ai/sse |
Older SDK-only clients that do not yet speak streamable HTTP |
Buyer tools (11)
enter_market
Hand your working context into the wall and get a buy recommendation. Free and read-only — it buys nothing.
| Param | Required | Meaning |
|---|---|---|
messages |
yes | Your working conversation as a standard chat stream (roles system | user | assistant). Must include at least one user message. |
llm_model |
no | The LLM the inner agent runs on. Must exactly match a supported Claude model ID such as claude-opus-4-6 (the default), claude-sonnet-4-6, claude-opus-4-7, or claude-haiku-4-5. |
image_id |
no | The inner-agent image — a human-readable slug (e.g. code_solutions) or the raw sha256 from list_images. Defaults to the platform default. |
required_rights |
no | Buyer-declared minimum license rights, as a closed enum-only object. Request any subset of use, redistribution_scope, derived_display, training, training_serve, training_weights, term, and attribution; omitted dimensions mean “don't care.” Omitted, null, and {} all leave rights-fit inactive. This field is absent from tools/list while the counsel-gated licensing capability is dark. |
The request vocabulary is closed: use is non_commercial|commercial;
redistribution_scope is individual|entity|entity_affiliates;
derived_display is none|public; training is none|internal;
training_serve and training_weights are independently none|allowed;
term is 12|24|36|perpetual; and attribution is
required|not_required. exclusivity is not requestable. Unknown properties or
values are rejected before a market session starts.
Returns decision ("buy" or "no_match"), recommended_listings[] (each with
public catalog metadata: listing_id, document_type, title, description,
category, price_cents, currency, optional seller_name, data_format,
data_size_bytes, tags, status, created_at, updated_at, and an optional
trust band). In non-production environments where the dark
LICENSE_TERMS_ENABLED flag is on, each recommendation also has a provisional
pre-purchase license quote block with schema_version, a fully materialized
standard tier, and offers[]; every tier carries its price and
settlement-binding token, and composed tiers also carry offer_id,
offer_key, and currency. This metadata is not operative license text, a
grant, or acceptance, and remains unavailable in production pending counsel
ratification and the separate exact-text read surface. When a non-empty
required_rights object is accepted, every recommendation additionally carries
platform-computed rights_fit: band is fit, partial, no_fit, or
unknown, and best_offer appears only for fit. Its
{offer_id, offer_key, terms, price_cents, currency, token} is the normalized
selector for the selected visible quote: composed fields are copied directly;
the standard tier combines its visible terms/price/token with the listing
currency and uses offer_id: null, offer_key: "standard". This is mechanical buyer-parameterized comparison,
not a legal interpretation, permission, warranty, reservation, or grant.
That exact-text read surface is not part of this phase, so do not treat the enum
metadata as the operative terms or
purchase from it alone. offers is [] when no composed tier is live. The
response also includes recommended_total_cents and, on no-match, optional
gap_report.unmet[] class values. Gap classes are closed vocabulary
(coverage, freshness, granularity, format, price, trust, rights) and carry no
notes or prose. No raw seller id, document body, data_ref, data_dictionary,
inner-agent reason, confidence score, or other free-form inner-agent prose
crosses the wall.
While evaluating candidates inside the market, the forgetful buyer agent's
get_listing response includes a top-level license_offers array. The virtual
standard offer is always first (offer_id: null), followed by active composed
tiers; each entry carries offer_key, the fully materialized enum-only terms,
price_cents, listing currency, and a settlement-binding token. Under the
same dark licensing flag, the platform attaches that quotable ladder to the
outer recommendation after the wall returns only listing ids. The data is read
from current platform listing/offer rows — never authored by the inner agent.
After reviewing the operative terms through an available exact-text surface,
echo a composed tier's offer_id and optional token into an explicit
purchase call, or echo the standard tier's token as expect_token; the
recommendation itself is read-only and neither grants rights nor records
acceptance.
With required_rights omitted, null, or {}, recommended_total_cents
retains its historical meaning: the sum of the recommendations' top-level
standard price_cents (and an all-zero total may remain omitted). With a
non-empty requirement, it is instead the sum of each fit row's current
best_offer.price_cents; partial/no-fit/unknown rows contribute zero, and the
field is emitted explicitly even when the active sum is 0. Either total is
advisory snapshot arithmetic, not a checkout amount or settlement promise.
To act on a fit, review the operative exact text, then echo
rights_fit.best_offer.offer_id (omit/null for standard) and
rights_fit.best_offer.token as expect_token into purchase. Purchase
re-resolves current state; only its minted grant is license evidence. If an
asynchronous card quote drifts after payment, fulfillment may finish
funded_only: the payment remains spendable, nonwithdrawable wallet credit and
no license grant is minted.
A seller account's own listings are excluded from that same account's
enter_market recommendations and in-wall listing reads. Settlement also refuses
self-purchase, so this filter is defense in depth and not the money-path guard.
Daily enter_market session quota is consumed only when the final response is
decision: "buy" and recommended_listings contains at least one listing.
no_match, rejected requests, setup failures, timeouts, and platform faults do
not consume the daily session quota, although concurrency limits still apply
while a session is running.
Tool errors are sanitized. When available, branch on structured error_code
instead of parsing text. Public codes include auth_failed,
invalid_request, unsupported_model, unknown_image,
insufficient_credit, no_candidates, balance_unavailable, rate_limited,
buyer_context_invalid, agent_artifact_invalid, sandbox_unavailable,
budget_exhausted, buyer_cancelled, platform_terminated, and
platform_error. Error responses never include seller body content,
inner-agent prose, raw stream details, stack traces, bearer tokens, presigned
URLs, or other platform internals. Some errors include a debug_id you can
share with support.
The examination-ceiling N, suggestion-budget B, and session timeout are platform-set defaults, not parameters of this tool. Tuning them is an advanced REST/SDK concern (see the API reference).
purchase
Buy listings. The debit is atomic (all-or-nothing). A successful response
confirms ownership and returns listing metadata; retrieve bytes with
ownership_download.
By default the MCP tool uses wallet credit and can buy a bundle atomically. It
also accepts funding_mode: "card_shortfall" or "card_full" for a single
listing; card modes usually return a hosted Stripe checkout_url and settle
asynchronously after payment. card_shortfall completes synchronously on the
wallet rail if current wallet balance fully covers the item. Card modes accept
the same offer-aware selectors as wallet (offer_id, expect_token,
renew_of_grant_id), so a card-funded buyer can elect a composed/priced offer
or bounded-term renewal.
| Param | Required | Meaning |
|---|---|---|
items |
one of items / listing_ids |
Offer-aware purchase items: {listing_id, offer_id?, expect_token?, renew_of_grant_id?}. Use this for composed license tiers, quote-token assertions, or renewals. |
listing_ids |
one of items / listing_ids |
Legacy listing UUIDs to buy. Each id is equivalent to {listing_id}. Send exactly one of items or listing_ids; sending both or neither is rejected. |
funding_mode |
no | wallet (default), card_shortfall, or card_full. Card modes require exactly one item/listing and usually return checkout metadata instead of immediate ownership. |
Returns purchases[] (each with listing_id, seller_id, title,
price_cents, data_format, data_size_bytes, outcome, offer_id,
offer_key, terms_hash, and grant_id), total_cents, and
balance_cents_after for wallet purchases. Card-mode responses include
payment_method, funding_mode, status, checkout_url, session_id,
amount_cents, funded_cents, and wallet_applied_cents (the wallet amount
planned at checkout creation, rechecked at settlement). outcome is
purchased or already_licensed; skipped items are returned instead of silently
omitted. If the balance can't cover a wallet order, nothing is purchased and
nothing is debited.
Offer-level refusals return structured error_code, listing_id, and detail
fields: offer_unavailable, price_changed, or renewal_invalid.
offer_unavailable.detail.live_offers includes replacement offers with terms,
terms schema version, DLS version, price, and token.
Arbitrary uploaded-file listings must have a clean malware scan before purchase;
non-clean files are reported as unavailable and no debit occurs.
ownership_list
No arguments. Lists every listing your account already owns (with title, description, the price you paid, and when you acquired it).
Where LICENSE_TERMS_ENABLED is on (dark until the licensing terms are
counsel-ratified), each owned listing also carries a license block recording
the license evidence you hold:
{ "newest": {…grant…}, "grants": [ …newest-first history… ] }for a listing you hold a recorded grant on. Each grant view carriesgrant_id,offer_key,terms,terms_schema_version,dls_version,granted_at, and — for grants governed by the ToS draft —instrument_status: "pre_ratification". The grant view is token free (proof of what you hold, never a handle to buy again).{ "implied": true }for a listing you own with no recorded grant — the implied standard-license display convention (no grant row is synthesized).
The block is omitted entirely where the flag is off, so the wire is unchanged on the dark path.
ownership_download
| Param | Required | Meaning |
|---|---|---|
listing_id |
yes | A listing you own. |
Returns a short-lived (5-minute) presigned GET URL, plus data_format and
data_size_bytes. For text/plain payloads up to 256 KiB, the response also
includes body inline so MCP clients that cannot fetch arbitrary URLs still have
a one-call byte path. Refuses anything your account hasn't bought, or any
arbitrary uploaded file whose latest malware scan is not clean.
This tool deliberately has no format argument and returns the listing's canonical
owned artifact. Manifest-backed slice XLSX export is REST-only via
GET /api/v1/ownership/{listingId}/download?format=xlsx.
balance
No arguments. Returns your read-only credit balance in cents (e.g.
{ "balance_cents": 4200, "currency": "USD" }). There is no MCP top-up —
fund your account in the portal.
list_images
No arguments. Lists the inner-agent images selectable via enter_market's
image_id — each with an image_id, slug, name, description, and
default: true for the one used when you omit image_id.
purchase_status
| Param | Required | Meaning |
|---|---|---|
purchase_id |
yes | The UUID of one of your own purchase transactions. |
Buyer-scoped read. Returns listing_id, status, amount_cents, currency,
created_at, and completed_at. A transaction owned by another buyer is
reported not-found (no 403, so you can't enumerate other buyers' IDs).
Where LICENSE_TERMS_ENABLED is on (dark until the licensing terms are
counsel-ratified), the response also carries offer_key and terms_hash — the
licensing tier you purchased and the hash of its composed terms — for a
transaction that minted a license grant. Both are omitted where the flag is off.
report
Report a questionable record from a licensed Consign delivery without receiving
a validity verdict or correction. Available only where
CONSIGN_ENFORCER_ENABLED is on.
| Param | Required for admission | Meaning |
|---|---|---|
record_ref |
yes | The exact AMN1-… support handle carried by the delivered artifact. The platform resolves it only through your authenticated account's delivery ledger. |
record_key |
yes | The opaque key of the record being reported. |
where_encountered |
no | Where you encountered the record, such as an exported customer file. This confession field is encrypted before durable storage. |
The tool deliberately advertises a permissive arguments-object schema: missing,
unknown, and wrong-typed values all reach the no-verdict handler. Every
syntactically valid authenticated report call returns the same non-error result:
{ "status": "Logged. Under review with the data provider." }
That response does not confirm that the RecordRef, record key, delivery, or
account relationship exists, and it is not proof that a report row committed.
Account, delivery, license, and listing IDs are never accepted as tool arguments;
they are derived server-side from transport authentication and the owner-scoped
delivery ledger. RecordRefs are high-entropy, unguessable support handles in
addition to being owner-scoped. The invariant covers the MCP result bytes and
non-error status, not processing-time distributions: an admissible report may
synchronously perform KMS encryption and a durable database commit, so Report
does not claim timing secrecy. Malformed JSON-RPC, a different tool name,
non-object arguments, or a transport body over the 1 MiB listener cap is
rejected before the Report callback and remains outside the Report contract.
create_request_draft
Draft a buyer request — a public ask for information sellers can compete to
fill. Available only where BUYER_POSTING_ENABLED is on. Creating a draft
moves no money and posts nothing; the escrow bounty is reserved later, at
sign-off, which is a portal-only human approval (see the gaps below).
| Param | Required | Meaning |
|---|---|---|
title |
yes | Public one-line title of the request. |
body |
yes | Public description of the data/analysis you need. |
bounty_micro_usd |
yes | Escrow bounty in micro-USD (1 USD = 1,000,000 micro; e.g. 250000000 = $250). Must be positive. Reserved at sign-off, not on draft creation. |
expires_at |
yes | RFC-3339 timestamp; must be in the future. |
category |
no | Free-form category label. |
tags |
no | JSON array of discovery tags (e.g. ["finance","weekly"]). |
hints |
no | JSON object of structured hints about the shape of data you want. |
attribution |
no | named (default) or pseudonymous. |
acl_mode |
no | open (default) or allow (only the named access groups may see it). |
acl_group_ids |
no | Access-group IDs the request is visible to; required when acl_mode is allow (must be groups you own). |
Returns the new request_id, state ("draft"), bounty_micro_usd,
expires_at, attribution, acl_mode, and created_at.
list_my_requests
List your own requests and their current state. Available only where
BUYER_POSTING_ENABLED is on.
| Param | Required | Meaning |
|---|---|---|
limit |
no | Max requests to return (default 50). |
offset |
no | Requests to skip, for pagination (default 0). |
Returns your requests — each with request_id, title, state, category,
bounty_micro_usd, expires_at, attribution, signed_off_at (when signed
off), and created_at.
respond_request
Act on a candidate that has passed evaluation on one of your own
requests. Available only where BUYER_POSTING_ENABLED is on.
| Param | Required | Meaning |
|---|---|---|
request_id |
yes | One of your own requests (from list_my_requests). |
candidate_id |
for confirm / decline |
The candidate to act on — one that has passed evaluation on that request. |
quote_id |
for commit |
The seller's quote to commit to. |
action |
yes | confirm to settle the fill, decline to pass on the candidate, or commit to accept a seller's above-bounty quote. |
action=confirm settles the fill. A normal pass atomically releases your
escrow bounty and buys the candidate's listing at the price captured when the
seller submitted it — never a later, higher price — and closes the request. If
the seller changed the listing price (or the listing is no longer available), the
confirm is rejected and the candidate is voided; if the captured price is above
your bounty, you must have enough spendable credit to cover the difference (top
up and retry otherwise). action=decline passes on a normal candidate and keeps
the request open for others — no money moves. A normal passed candidate
remains confirmable for 72 hours from the platform-recorded pass time. At the
exact deadline it lapses; a late confirm cannot charge, and a late decline
records and returns that same lapsed outcome.
action=commit accepts a seller's quote — a bespoke, above-bounty price the
seller offered (pass quote_id instead of candidate_id). It earmarks the
top-up (the amount above your bounty) in escrow and reserves the seller's
exclusive fill window so no one else can fill the request while they produce the
work. It settles nothing yet — the purchase happens automatically at the
quoted amount when the seller delivers. You must have enough spendable credit
to cover the top-up; a quote at or under your bounty is rejected. Committing moves
no request state (it stays open). If the seller never delivers, the commitment
lapses when the window elapses and the top-up is released back to your bounty.
If the seller's pass was durably recorded inside the commitment window
(including either exact boundary), the automatic fill remains recoverable after
the wall-clock window—even after a platform restart. That qualifying pass has
earned settlement at the quoted amount: it cannot be declined or lapsed, and
an explicit confirm routes through the same quote-settlement path. Only a
commitment with no such earned pass lapses. Quote lapse releases only the quote
top-up; the base bounty stays reserved until the request fills or finally
expires.
Returns the request_state (e.g. filled after a confirm, open after a
commit), the resulting candidate_state (confirmed / declined / lapsed) or
quote_state (committed), and — on a settled confirm — the
fill_transaction_id. A request, candidate, or quote that is not yours reads as
an opaque "request not found".
The unattended fill (the automatic purchase when a committed seller delivers) and the lapse of an expired commitment are platform/worker transitions with no tool or REST route.
At the request deadline, a request with no evaluation or committed quote in
flight becomes expired and releases its base bounty. A request with in-flight
work becomes closing: new responses stop, existing work may settle, and the
base bounty is released only if the final in-flight item ends without a fill.
Seller tools (12)
Seller identity always comes from the authenticated session — never a parameter.
create_listing
List a document for sale (text/markdown body only).
| Param | Required | Meaning |
|---|---|---|
title |
yes | Public catalog title (≤200 chars). |
body |
yes | The full document content for sale (≤200000 bytes). Never shown pre-purchase. |
price_cents |
yes | Price in whole US cents. Open-market listings must be from 1 cent through $1,000,000. |
description |
no | Public catalog description (defaults to the title). |
currency |
no | 3-letter ISO-4217 code (defaults to usd). |
category |
no | Free-form category label (≤64 chars). |
document_type |
no | Free-form discriminator (the server does not branch on it). |
tags |
no | Free-form discovery tags. |
purchase_acl_mode |
no | open (default) | allow | deny. A restricted listing may be priced at $0. |
purchase_acl_groups |
no | Named access-group IDs you own; used by allow/deny. |
license_offers |
no | Compose priced licensing tiers on the new listing in the same call — an object { offers: [...], accept_licensing_terms } with the same entries as set_license_offers. Available only where LICENSE_TERMS_ENABLED is on; supplying it where licensing is off is rejected (the block is never silently dropped). See Licensing. |
Returns the new listing_id, status, and created_at. Document body only —
there is no file or CSV/XLSX/parquet dataset upload path here (see the honest gaps
below).
update_listing
| Param | Required | Meaning |
|---|---|---|
listing_id |
yes | One of your own listings. |
title / description / category / price_cents / tags / status |
no | The fields you pass are updated (status is active or inactive). |
Platform-created slice children are immutable marketplace artifacts. Attempting
to edit one returns platform_slice_frozen; deactivate an unsold child through
the slice lifecycle instead of changing its listing fields directly.
list_my_listings
No required arguments (optional limit / offset for pagination). Lists your
own listings.
set_listing_acl
| Param | Required | Meaning |
|---|---|---|
listing_id |
yes | One of your own listings. |
mode |
yes | open | allow | deny. |
group_ids |
no | Named access-group IDs you own; ignored when mode is open. |
ACL replacement is also refused with platform_slice_frozen for a
platform-created slice child.
get_listing_acl
| Param | Required | Meaning |
|---|---|---|
listing_id |
yes | One of your own listings. |
Returns the listing's mode and group_ids.
set_license_offers
Compose the priced licensing tiers on one of your own listings, alongside
the listing's standard (default) terms. Available only where
LICENSE_TERMS_ENABLED is on. Pass the full desired live offer set —
replace-set semantics, not a patch: unchanged entries keep their ids, repriced or
recomposed entries are re-versioned, dropped entries are retired, and an empty
offers list retires all. See Licensing for the dimension
vocabulary and offer_key grammar.
| Param | Required | Meaning |
|---|---|---|
listing_id |
yes | One of your own listings whose offer ladder to replace. |
offers |
yes | The full desired live offer set. Each entry is { offer_key, terms, price_cents }: offer_key is a short stable tier slug (^[a-z0-9][a-z0-9_-]{0,31}$; standard/default are reserved), terms is a { dimension: option } map overlaid on the platform defaults (omitted dimensions take their default), and price_cents is the tier price in whole US cents. An empty list retires all offers. |
accept_licensing_terms |
no | Set true to accept the current licensing terms (the version is stamped server-side — you never supply it) so offers can be composed. Required once per account before composing; idempotent once accepted; ignored when offers is empty. |
Before composing any offers your account must accept the current licensing terms.
If it has not — and you did not pass accept_licensing_terms — the call is refused
with a non-opaque message naming the version to accept and linking the instrument
(licensing_terms_acceptance_required). Returns the resulting live offers[]
(each with offer_id, offer_key, terms, terms_schema_version, dls_version,
price_cents, currency, token, and status) plus any non-fatal coherence
warnings[] (e.g. a broader tier priced at or below a narrower one). A listing you
do not own — or one that does not exist — reads as an opaque "listing not found or
not yours" (no cross-seller inventory oracle).
Offer replacement is refused with platform_slice_frozen for a platform-created
slice child; its price and legal/economic envelope were fixed at materialization.
get_license_offers
Read the priced licensing tiers on one of your own listings. Available only
where LICENSE_TERMS_ENABLED is on. Read-only; scoped to your authenticated
seller account.
| Param | Required | Meaning |
|---|---|---|
listing_id |
yes | One of your own listings whose offers to read. |
include_retired |
no | When true, also returns retired (superseded) offer rows; the default is the live set only. |
Returns offers[] in the same shape set_license_offers returns (ids, terms,
versions, price, token, status). A listing you do not own or that does not
exist reads as the same opaque "listing not found or not yours".
set_slice_policy
Configure slice-on-demand for one of your own parent listings — the
standing authorization and pricing envelope for seller-authored segments and
buyer row-match requests. Available only where
SLICE_ON_DEMAND_ENABLED is on. For the end-to-end portal workflow, see
Selling slices.
You must accept the Slice Authorization rider first. Rider acceptance is a
deliberate human act done in the seller portal / REST — it cannot be done
through this tool (there is no rider-accept MCP tool). If you have not accepted the
current rider, this call writes nothing and returns
rider_acceptance_required: true with the current rider_version and rider_url
to accept it.
Platform-created slice children cannot themselves become slice parents. The tool
returns platform_slice_frozen if called for one.
| Param | Required | Meaning |
|---|---|---|
listing_id |
yes | One of your own parent listings. |
enabled |
no | Whether slicing is enabled for this listing. |
kinds |
yes | Buyer-request allow-list: [] or ["row_match"]. An empty list still permits seller-authored segments but advertises no buyer-initiated request kind. |
key_columns |
when row_match |
1–3 parent columns matched against buyer keys. |
per_row_cents |
when enabled | Price per matched row in US cents. Fractional (sub-cent) values are allowed, e.g. 0.5 for half a cent or 5 for five cents. Must be > 0. Stored at a resolution of 1/10,000 of a cent (nearest micro-USD, half away from zero); quotes use the rounded stored rate. It is the fallback when a seller-authored slice omits an explicit price. |
min_price_cents |
yes | Per-slice price floor, in whole US cents. Must be ≥ 100 (a mandatory $1.00 floor). |
max_price_cents |
no | Optional per-slice ceiling; when set must be > 0 and ≥ min_price_cents. |
max_rows_per_slice / max_queries_per_job / max_jobs_per_buyer_per_day |
no | Enforced per-job and buyer-account + parent rolling-24-hour bounds. Values must be positive when supplied; omitted query/job values default to 500 / 3. |
max_cumulative_rows_per_buyer |
no | Reserved policy value: accepted and stored, but not enforced in this beta. Cluster-wide, cross-listing, and cumulative-row metering are deferred. |
disclosure_mode |
no | aggregate_only (default) | per_query. |
review_mode |
no | auto (default) | review (hold row_match slices for your review). |
watermark_mode |
no | manifest_only (default). |
On success returns the stored policy (ids/enums/scalars only — never any row data)
plus warnings: non-blocking cannibalization notices you should see but that do
not stop the write — for example, per-row pricing that lets a buyer reconstruct
the whole dataset below the parent price. A floor below $1.00, a missing or
non-positive per_row_cents on an enabled policy, an unknown key column, a max below the floor, a non-positive
supplied cap, or an invalid enum are errors that refuse the write.
get_slice_policy
| Param | Required | Meaning |
|---|---|---|
listing_id |
yes | One of your own parent listings. |
Read-only. Available only where SLICE_ON_DEMAND_ENABLED is on. Returns the
current policy's enabled state, buyer-request kinds, key_columns, pricing,
all usage caps, and the disclosure/review/watermark modes. A listing you do not
own — or one with no policy configured — reads as an
opaque not found (no confirm/deny). See Selling slices for
how this policy feeds the segment, activity, and review views.
seller_stats
No arguments. Returns sales count, gross revenue, marketplace fees, net earnings, balance, and withdrawable balance, plus a per-listing breakdown. It reads the withdrawable balance — it cannot initiate a payout.
Where LICENSE_TERMS_ENABLED is on, each listing also has an
offer_breakdown array ordered by offer_key:
{ "offer_key": "internal-training", "sales_count": 3,
"gross_revenue_cents": 750000 }
These are completed, grant-backed sales at the immutable amount charged for
each transaction. Renewals and paid upgrades count as new sales; retries and
funded-only checkout outcomes do not. Retired and re-versioned offer ids with
the same key roll into the same commercial tier. An enabled listing with no
grant-backed sales returns offer_breakdown: []. When licensing is off, the
field is absent from both tools/list and tool responses (the dark schema is
unchanged).
list_open_requests
Search the request board — open, unexpired buyer requests your account is
eligible to see (the same ACL-filtered, open-only projection as the seller
Request Board portal page). Available only where BUYER_POSTING_ENABLED is
on.
| Param | Required | Meaning |
|---|---|---|
query |
no | Free-text search over open requests. |
category |
no | Exact category filter. |
min_bounty_micro_usd |
no | Minimum bounty, in micro-USD (int64). |
mode |
no | text | vector | hybrid (default hybrid). |
limit |
no | Max results (default 20, capped at 100). |
Returns the ACL-filtered, open, unexpired board projection — each row with
request_id, title, body, category, tags, hints, bounty_micro_usd,
expires_at, attribution, pseudonym (present when the buyer chose
pseudonymous), and created_at. To respond as a seller, use
submit_request_candidate; the buyer confirms or
declines a passed candidate — or commits to a seller's above-bounty quote — with
respond_request.
submit_request_candidate
Respond to an open buyer request by attaching one of your own active
listings to it as a candidate the buyer may consider. This proposes a fill —
no money moves and nothing is sold; the buyer decides later. Available
only where BUYER_POSTING_ENABLED is on. The seller is your authenticated
account (identity from the token — there is no seller field), and kind is
always submitted.
| Param | Required | Meaning |
|---|---|---|
request_id |
yes | The open request you are attaching your listing to (from list_open_requests). |
listing_id |
yes | One of your own active listings to submit as a candidate. |
Returns the persisted candidate — candidate_id, request_id, listing_id,
kind (always submitted), price_micro_usd (your listing's captured price),
state, created_at, and updated_at. seller_account_id is never echoed (it
is your own verified identity).
Errors mirror the REST candidates route:
- Any request or listing you cannot use — the request does not exist, is not
open, has expired, is hidden from you by its audience, or the listing is not
yours / not active / not admissible to the request's buyer / already owned by
that buyer — reads as a single opaque
request not found. These are deliberately indistinguishable so a probing seller cannot tell one cause from another (no missing-vs-hidden-vs-unauthorized oracle). - A duplicate submission of the same listing to the same request is a distinct "a candidate for this listing already exists on this request" (409-equivalent).
- Hitting a submission-rate limit is a distinct rate message (429-equivalent): your own per-request cap names the limit, while the per-request aggregate cap across all sellers stays generic ("this request is not accepting more candidates right now").
- An empty
request_id/listing_idis a plain input error.
What has no MCP tool
Several flows are real but have no MCP tool — do them on the website/portal/REST, never reach for an invented tool:
- Sign up — website (invite-gated); see Get started.
- Mint / list / revoke API keys — the portal's Connect-plugin screen,
or
POST /api/v1/accounts/api-keysover REST. - Top up credit — the portal's Billing & credits screen (Stripe);
balanceis read-only. - File and dataset listings —
create_listingis document-body-only; arbitrary file upload and CSV/XLSX/parquet dataset intake are portal/REST paths. - Stripe-Connect payouts (onboarding, cash-out, history) —
seller_statsonly reads the withdrawable balance; payouts run through the portal/Stripe. - Signed audit-record fetch/verify — advanced REST only.
- Custom buyer-image push —
POST /api/v1/buyer/imagesover REST. - Buyer request sign-off — where buyer posting is enabled, drafting a
request (
create_request_draft), listing your requests (list_my_requests), confirming or declining a passed candidate (respond_request), browsing the board (list_open_requests), and responding as a seller by submitting a candidate (submit_request_candidate) are MCP tools. But request sign-off — the escrow-reserving, moderation-gated transition that makes an ask live — is a human, portal-only approval (three consents on the portal Requests page), never an MCP tool. Committing to a seller's quote is available now viarespond_request(action=commit); the counteroffer nod (respond_requestwill gain anodaction) does not have an MCP tool yet. enter_marketsession controls (N / B / timeout) — platform defaults; tunable only via advanced REST/SDK.
Next
- Connect your agent — per-client config for Claude Code, Cursor, Claude Desktop, the browser connector, and raw MCP consumers.
- Selling data — the seller-tool walkthrough.
- API reference — the advanced REST + SSE surface for the gaps above.