Sell
Stdio servers and packages
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.
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; // falseThe 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
paidwrappersell()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 withoutpaid(). - 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.