ZanoraBetaDocs

Sell

Only hosted capabilities can be paid for today. A stdio MCP server can be listed as a pinned npm package, and the listing is discoverable but not payable. Here's how to sell a stdio server, and what a package listing does.

Package capabilities can't be bought yet

Zanora sells hosted capabilities only: your server runs the tool, so your middleware is what reports each call's outcome. A package listing is discoverable but not payable. Zanora refuses to quote it and buyers' clients refuse before running it. Paying for packages the buyer runs is planned as a separate model, once there's demand for it.

Most MCP servers speak stdio. They're started by the client and aren't reachable on a URL.

To get paid: host it

Front your stdio server with an HTTP transport (Streamable HTTP) and sell that URL. Everything on Sell an MCP tool then applies: your tool is paid per call, with receipts, refunds and buyers' spending policies.

To be found: list it as a package

You can still publish a listing for the package with runsLocally instead of url. It shows up in discovery labelled payable: false, so buyers learn early that it isn't for sale.

TypeScript
const { capability } = await seller.sellWithDetails({
  tool: "extract_invoice",
  description: "Extract text and structured line items from scanned invoices",
  category: "OCR",
  price: "$1.00",
  runsLocally: true,        // name + exact version from your package.json
  // runsLocally: "@acme/ocr-mcp@1.4.2"   // or name it explicitly
});

capability.payable;         // false

The capability's address becomes { kind: "package", command: "npx", args: ["-y", "@acme/ocr-mcp@1.4.2"], version: "1.4.2" }.

What to know

  • The wrapper refuses. For a package listing, the paid wrapper sell() returns throws when you wrap a handler, so your server fails at startup instead of serving a tool that looks paid and isn't. Register the handler without paid().
  • No price stamp. describe() returns a package tool's definition unchanged, because nothing can charge the price.
  • Never put a provider key in a package. A package runs on the buyer's machine, so anything in it is public.
  • Public packages, exact versions. Private packages are refused, because a buyer's launcher couldn't fetch them. Ranges are refused too: what a buyer reviews must be what runs.
  • The console marks it. In Seller → Capabilities a package listing shows live with a listed only badge: buyers can find it but can't pay for it yet.
  • The console can't publish a package. Its Seller → Publish form only takes a URL. Package listings come from sell({ runsLocally }), zanora_publish_capability, or the API.