ZanoraBetaDocs

Packages

Every environment variable, tool and resource in @zanora/mcp, for both the buyer and seller profiles.

Terminal
npx -y @zanora/mcp          # stdio. stdout carries the protocol; logs go to stderr

Environment

VariableProfileRequiredDefaultMeaning
ZANORA_ROLEbothnobuyerbuyer or seller. Never guessed from other variables
ZANORA_API_KEYbothyes¹—workspace key (buyer) or provider key (seller)
ZANORA_GATEWAY_URLbothnohttps://api.zanora.dev
ZANORA_AGENT_KEY_FILEbuyeryes²—path to the wallet's ed25519 private key PEM
ZANORA_AGENT_KEYbuyeryes²—the PEM inline (escaped \n accepted)
ZANORA_WALLET_IDbuyernoderivedneeded only if the workspace has several agent wallets
ZANORA_AGENT_IDbuyernothe agent's name (its wallet's owner id), else the wallet idthe agent name on payment proofs and approvals
ZANORA_MAX_PRICE_MICROSbuyernononeper-call ceiling in micro-dollars. 5.00 is rejected; write 5000000 for $5.00. The old ZANORA_MAX_PRICE_MINOR (cents) is refused at startup
ZANORA_APPROVAL_ELICITATIONbuyernoonoff to never prompt the user about held spends
ZANORA_ALLOW_LOCAL_PACKAGESbuyernononecomma-separated packages this agent may run, e.g. @acme/ocr-mcp,@acme/tts@2.1.0. Packages aren't payable yet, so this doesn't affect purchases
ZANORA_SELLER_HEADERSbuyerno—JSON keyed by seller origin: {"https://seller.example":{"authorization":"Bearer …"}}
ZANORA_SALES_POLL_MSsellerno20000how often to check for changes while a resource is subscribed. Minimum 5000
ZANORA_HOMEbuyerno~/.zanorawhere setup stored the agent's credentials. Read whenever ZANORA_API_KEY isn't set, which supplies the key, wallet, agent name, key file and gateway

¹ Required on any real deployment, unless npx -y @zanora/mcp setup stored credentials in ZANORA_HOME (buyer only). Without either, every tool returns UNAUTHORIZED. ² One of the two, or the stored credentials. The seller profile refuses a wallet key.

Every value is checked at startup. A bad value fails immediately with the variable's name.

Buyer tools

ToolArgumentsSpends
zanora_discoverquery?, category?, protocol?, maxPriceMicros?, maxLatencyMs?, limit?
zanora_capabilitycapabilityId
zanora_invokecapabilityId, body (the request body; for MCP, the tool's arguments), method?, maxPriceMicros? (can only lower the ceiling). endpoint? and tool? only for an id this session hasn't seen; prefer zanora_capability✓
zanora_wallet_balance—
zanora_wallet_ledgerlimit?: the most recent N entries (1–200, default 20)
zanora_purchaseslimit?, after?
zanora_receiptreceiptId
zanora_rate_providerproviderId, transactionId, rating (1–5)
zanora_deposit_addresses—
zanora_request_fundingamountMicros (string micro-dollars). Creates a one-time card payment link for a person to pay; moves no money itself
zanora_approval_statusapprovalId

Resources: zanora://wallet, zanora://purchases.

Seller tools

ToolDoes
zanora_provider_statusverification, suspension, reputation, and why nothing is selling
zanora_request_verificationasks to be verified (note?, contact?)
zanora_publish_capabilitypublishes one capability (endpoint, or runsLocally for a package listing that isn't payable)
zanora_publish_capabilitiespublishes several at once
zanora_update_capabilityedits the price, wording, tags, schema or latency
zanora_list_capabilitiesyour listings, including deprecated ones
zanora_deprecate_capabilitywithdraws a capability
zanora_salesreceipts for your sales (limit?, after?)
zanora_earningssettlement wallet balance
zanora_payout_destinationsreads your payout destinations
zanora_rail_transactionsyour payouts, where each was sent, and their state

Resources, all subscribable: zanora://sales, zanora://earnings, zanora://catalogue.

Protocol details

  • Every tool declares an outputSchema and returns structuredContent. Errors carry no structured content.
  • zanora_invoke sends four named progress steps when the client provides a progress token.
  • Long lists page with after and return nextCursor.
  • Where the client supports elicitation, zanora_invoke can ask the user to approve a held spend, or to fund an empty wallet.

Embedding it

TypeScript
import { createZanoraMcpServer, loadConfigFromEnv } from "@zanora/mcp";

const { server } = createZanoraMcpServer(await loadConfigFromEnv());
await server.connect(myTransport);
// Seller profile: createZanoraSellerMcpServer(loadSellerConfigFromEnv())