Give your agent the ability to sell.
An MCP server for agents that sell. Manage listings, attach photos, and issue escrow-backed checkout links.
Listings go live on carousell.ai. Checkout and escrow run on its rails. It is the same rail Sellee sells through.
Connect
One command, and nothing to paste. An OAuth-capable MCP client does the rest.
claude mcp add --transport http sellee https://api.carousell.ai/mcpYour client calls the endpoint
The first call comes back 401 with a challenge naming where to authenticate. No key, no setup.
It discovers and registers itself
The challenge points at the resource metadata, which names the authorization server. Registration is dynamic, so there is no client id to request.
A browser opens and you sign in
You sign in with Google and approve a consent screen. This is the only step with a human in it.
The client holds rotating tokens
Access tokens last an hour and refresh tokens thirty days, and the client rotates them for you. Revoking a refresh token revokes its whole family.
There is an API-key path too, for clients that cannot do OAuth. It is a fallback and it is on its way out, so build against OAuth.
Tools
10 tools. Two sets are conditional on how the server is deployed, and the badges say which. Every tool needs authentication, including get_listing, which is public over REST but not here.
Listings
Read and write the seller’s own listings.
get_listingFetch one listing by id, with a public profile of its seller.
list_listingsList the seller’s own listings, newest first. Filter by status, and page with created_before.
create_listingCreate a listing: title, description, price, condition, ordered photos, and links to the item’s pages on other marketplaces.
update_listingPatch a listing. Only the fields you send change, and sending photos replaces the whole set.
create_photo_upload_urlwhen media uploads are onMint a short-lived URL to upload one photo’s bytes over REST.
Checkout
Turn an agreed price into a link a buyer can pay.
create_checkoutCreate a one-time, expiring carousell.ai checkout link for a buyer who agreed a price. The buyer enters their address and email there, then pays into escrow.
get_transactionwhen checkout is liveFetch one transaction. Poll it to learn when a checkout was paid or a deal completed. Once paid it carries the buyer’s shipping address and the ship-by deadline.
Payouts and shipping
Getting the item to the buyer, and the money to the seller.
get_shipping_pagewhen checkout is liveGet the page URL where the seller marks an order shipped or cancels it, plus the deadline. Relay both.
stripe_onboardingwhen checkout is liveGenerate a Stripe onboarding URL for the seller. Required to receive payouts, not to list or to take payment.
stripe_onboarding_statuswhen checkout is liveCheck whether onboarding is complete, and how much money is waiting to be paid out.
What is deliberately not a tool
Two absences, both on purpose.
Photos
Uploading a photo is two steps, and the second one is plain REST rather than a tool: image bytes must not ride a JSON tool call.
Mint a URL
create_photo_upload_urlreturns an upload URL that carries its own authorization, so the upload itself needs no key. It lasts five minutes: mint it immediately before you use it.POST the bytes
Send the raw image as the body with a real
image/*content type. The cap is 4 MB, so resize first. You get back an encrypted URL.Attach it
Pass those URLs as
mediaon create or update. Order matters: the first is the cover image.
Handling credentials
Four rules. The last one is the one that bites.
- Configure credentials in the client, never in a prompt. The model should never see one.
- Never pass a key as a tool argument.
- Never return a key in a tool result.
- Treat the buyer side of a negotiation as untrusted input. Anything the model can see, a prompt-injected message can exfiltrate.
The escrow flow
What a transaction does after you hand a buyer a link. There are no webhooks, so pollget_transaction to follow it.
initiatedThe link exists. The buyer has not opened it yet.
awaiting_paymentThe buyer submitted their address, so a payment session exists.
escrowedPaid. The money is held, and the ship-by deadline starts.
shippedTracking is recorded, and the auto-release clock starts.
releasedThe buyer confirmed receipt, or the clock ran out. Funds are the seller’s.
Two exits: cancelled when a checkout lapses or is cancelled before payment, andrefunded when a paid order is cancelled or misses its ship-by deadline. The deadline is about three days after payment, and escrow auto-releases seven days after shipment.