Drop these into the matching MCP host config to connect.
On claude.ai: Settings > Connectors > Add custom connector. Paste the URL below. A connector added on the web also shows up in the Claude mobile apps. Claude asks you to sign in to XP the first time an action needs your account.
Browse without signing in. Sign in to buy, make offers or sell.
https://mcp.xp.tickets/mcp// ~/.cursor/mcp.json — Cursor reads this on launch.
{
"mcpServers": {
"xp": {
"url": "https://mcp.xp.tickets/mcp"
}
}
}
On chatgpt.com: Settings > Apps > Advanced settings, turn on Developer mode, then Create and paste the URL below. ChatGPT asks you to sign in to XP the first time an action needs your account.
Browse without signing in. Sign in to buy, make offers or sell.
https://mcp.xp.tickets/mcp// VS Code (Copilot Chat) — settings.json or .vscode/mcp.json
{
"mcp": {
"servers": {
"xp": {
"type": "http",
"url": "https://mcp.xp.tickets/mcp"
}
}
}
}
Agent panel › Manage MCP Servers ›
View raw config opens mcp_config.json.
Antigravity uses serverUrl (not url like
Cursor) and completes OAuth automatically off the 401 +
WWW-Authenticate challenge — no static token required.
If auto-OAuth stalls, add
"headers": { "Authorization": "Bearer <token>" }
as a fallback.
Browse without signing in. Sign in to buy, make offers or sell.
// Antigravity 2.0.1 — Agent panel ▸ Manage MCP Servers ▸ View raw config
{
"mcpServers": {
"xp": {
"serverUrl": "https://mcp.xp.tickets/mcp"
}
}
}
XP MCP exposes event discovery, ticket listing, and marketplace actions for AI agents over Streamable HTTP.
Five things an agent does here, and what pays for each:
Every write previews before it commits: call once to see the terms,
again with confirm=true to commit.
get_market_read returns the ticket price
matrix partners get from the Exchange API: each seat level's
get-in, floor first, and each section's rows front to back.
POST https://mcp.xp.tickets/mcp (open to browse, sign in to transact)error_code: "AUTH_REQUIRED" or "SESSION_EXPIRED" — clients should reconnect / re-authorise XP.GET /healthCopy-paste recipes. Each request stands alone.
# Acquire $TOKEN via OAuth 2.1 + PKCE first (see OAuth & Discovery).
# tools/list returns the full surface once authenticated.
curl -X POST https://mcp.xp.tickets/mcp \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
# Authenticated tool. 401 if bearer missing/invalid.
curl -X POST https://mcp.xp.tickets/mcp \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"get_my_tickets","arguments":{}}}'
Streamable HTTP rules: every request must include
Accept: application/json, text/event-stream. The server is
stateless: no initialize handshake or
Mcp-Session-Id is needed, and any request can reach any
replica.
make_offer_on_listing.amount_per_ticket_usd
and create_standing_bid.amount_per_ticket_usd (whole dollars per ticket),
get_ticket_listings.min_price_usd/max_price_usd,
list_open_listings.min_amount_usd/max_amount_usd
(whole-listing totals).per_ticket_usd, total_usd,
amount_per_ticket_usd, usdc_balance and the unsuffixed
dollar fields (price_range, get_in_per_ticket).total_usd:
amount_mu in an x402 quote (micro-USDC a wallet signs verbatim) and
amount_minor in a stripe_link or MPP preview (Stripe's cents).
Read total_usd; do no arithmetic on them._meta.context.today from the most recent tool
response instead of guessing. _meta.context.tz_offset is
the server's UTC offset; resolve against the user's timezone when
known.WWW-Authenticate: Bearer ... resource_metadata="…"
— bearer missing/invalid/revoked. Restart OAuth or refresh the token.
Distinct flavors: error="invalid_token"
(refresh) vs no error attr (start fresh OAuth). On a
tools/call the challenge also names the scope to request,
e.g. scope="read:account", so a host can step up
from an anonymous quote to a signed-in call in one round trip.error_code: "AUTH_REQUIRED" /
"SESSION_EXPIRED": the bearer was
accepted by the MCP server but rejected upstream. The server rewrites
these into a transport 401 so MCP clients refresh — handle the same
as case 1.WWW-Authenticate: Bearer error="insufficient_scope", scope="…"
naming the full scope set, plus a JSON-RPC -32003 body
with upgrade_url. Re-authorize once with that scope.Status: enabled
buy_tickets supports four payment rails selected by the
rail argument. Use stripe_link, the default,
unless the user asks for another:
rail="stripe_link" — the default
(what you get when you omit rail). Pay by
card on a Stripe-hosted Checkout page. Two-turn flow:
preview returns payment_link and
checkout_session_id; after the user pays, call again with
confirm=true and checkout_session_id to get
order_uuid and stripe_payment_intent.rail="privy" — XP-managed Privy wallet, for users
who signed in with an XP identity and fund purchases in USDC.rail="x402" — agent-held Solana wallet over the
x402 protocol with
USDC. Two-turn flow: preview returns an x402.accepts[0]
PaymentRequirements envelope; settle accepts a base64
payment_proof.rail="mpp" — pay by card with a Stripe
Shared Payment Token over the
Machine Payments Protocol MCP
binding. Two-turn flow: preview returns challenges[];
confirming without a credential answers JSON-RPC
-32042 (Payment Required) carrying the same challenges, and
a rejected credential answers -32043 with a replacement
challenge to retry against. Present the credential in
params._meta["org.paymentauth/credential"], or in the
payment_credential argument when your client cannot send
_meta. Echo back the challenge you were given — the charge
is keyed on it.| Setting | Value |
|---|---|
| Network | solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp |
| USDC mint | EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v |
The agent picks one per call via the facilitator arg on
buy_tickets; the preview envelope returns
facilitators_available with these entries. Omit the arg to
use the default. No auto-fallback — on failure, retry with a different
id. fee_payer = facilitator's sponsoring Solana pubkey,
injected into extra.feePayer at preview so the buyer
signs with the correct payerKey. Empty (italic
buyer-pays-fees) means the buyer keypair pays gas.
| Id | Adapter | Auth | Fee payer | URL |
|---|---|---|---|---|
payai (default) | payai | bearer | buyer-pays-fees | https://facilitator.payai.network |
# Turn 1 — preview (no wallet)
buy_tickets(event_id=<id>, uvid=<uvid>, quantity=<n>,
confirm=False, rail="x402")
# → returns x402.accepts[0] (PaymentRequirements) + facilitators_available
# You sign accepts[0] locally with your own Solana wallet (see signer below).
# Turn 2 — settle (optionally pick a facilitator id from facilitators_available)
buy_tickets(event_id=<id>, uvid=<uvid>, quantity=<n>,
confirm=True, rail="x402", payment_proof="<b64>",
facilitator="payai") # or another id from facilitators_available
XP does not ship a signing client. You hold the buyer keypair; build
the signed envelope locally per the x402 v2 SVM exact
scheme spec.
Reference shape in TypeScript:
// Inputs: accepts (= preview.x402.accepts[0]) + your Solana Keypair `buyer`.
// Output: base64 string → pass as `payment_proof` on the settle turn.
import {
ComputeBudgetProgram, Connection, Keypair, PublicKey,
TransactionMessage, VersionedTransaction,
} from "@solana/web3.js"
import {
createTransferCheckedInstruction, getAssociatedTokenAddressSync,
} from "@solana/spl-token"
const conn = new Connection(SOLANA_RPC_URL, "confirmed")
const mint = new PublicKey(accepts.asset)
const payTo = new PublicKey(accepts.payTo)
const amount = BigInt(accepts.amount) // micro-USDC, 6 decimals
const USDC_DECIMALS = 6
// Facilitator-sponsored fees: read feePayer from envelope. When present,
// buyer signs ONLY the transfer authority; facilitator co-signs gas at
// /settle. When absent (legacy buyer-pays-fees), buyer pays gas too.
const feePayer = new PublicKey(accepts.extra?.feePayer ?? buyer.publicKey)
const buyerAta = getAssociatedTokenAddressSync(mint, buyer.publicKey)
const payToAta = getAssociatedTokenAddressSync(mint, payTo)
// Pre-flight (recommended): assert buyer ATA balance ≥ amount, merchant ATA
// exists, and — only when buyer === feePayer — buyer has SOL for gas.
// Instructions MUST follow the x402 SVM exact order:
// [ComputeBudget.setComputeUnitLimit, setComputeUnitPrice, TransferChecked].
// No ATA-create. Token-2022 is allowed by the spec but verify facilitator support.
const ix = [
ComputeBudgetProgram.setComputeUnitLimit({ units: 20_000 }),
ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 1 }),
createTransferCheckedInstruction(
buyerAta, mint, payToAta, buyer.publicKey, amount, USDC_DECIMALS,
),
]
const { blockhash } = await conn.getLatestBlockhash("confirmed")
const msg = new TransactionMessage({
payerKey: feePayer, // facilitator's pubkey when sponsored
recentBlockhash: blockhash,
instructions: ix,
}).compileToV0Message()
const tx = new VersionedTransaction(msg)
tx.sign([buyer]) // partial sign — leave feePayer slot empty
const envelope = {
x402Version: 2,
scheme: accepts.scheme,
network: accepts.network,
payload: { transaction: Buffer.from(tx.serialize()).toString("base64") },
accepted: accepts,
extensions: {},
}
const payment_proof = Buffer.from(JSON.stringify(envelope), "utf-8").toString("base64")
// → pass payment_proof to buy_tickets(confirm=True, rail="x402", payment_proof, ...)
Adapt to your language of choice (Python: solana-py /
solders; Rust: solana-sdk). The on-the-wire
shape is what matters; XP only consumes the base64 payment_proof
string.
Each preview returns a facilitators_available list with
the registered facilitator ids; the agent picks one per call by passing
facilitator=<id>. Ids match
^[a-z][a-z0-9_]*$ and double as the human-readable handle.
The signed payment_proof is identical across facilitators
modulo the extra.feePayer slot. No auto-fallback
— on failure (FACILITATOR_UNAVAILABLE /
SETTLE_UNKNOWN), re-preview with a different
facilitator id and re-sign.
text://help/x402-paymentsEndpoints published for MCP clients that perform Dynamic Client Registration (DCR) and the OAuth 2.1 + PKCE handshake.
| Purpose | URL |
|---|---|
| Authorization | https://xp.tickets/xp-mcp/authorize |
| Token exchange | https://api.xp.tickets/mcp/token |
| Dynamic Client Registration | https://api.xp.tickets/oauth/register |
| Token revocation | https://api.xp.tickets/oauth/revoke |
| JWKS | https://api.xp.tickets/.well-known/jwks.json |
| UserInfo | https://api.xp.tickets/mcp/userinfo |
| Muse Callback URL | https://agent.meta.ai/api/hatch/oauth/callback |
| Callback (clients that cannot host their own redirect) | https://mcp.xp.tickets/auth/callback |
Muse registers https://agent.meta.ai/api/hatch/oauth/callback as its redirect_uri. A client that cannot host a redirect may register the MCP server callback above instead; that page renders the returned code and state for copying into a token exchange, so it suits manual and first-run setup rather than an ongoing delivery path. Clients that can host a redirect should register their own.
Issuer: https://api.xp.tickets · Audience: xp-mcp
Published scopes_supported: openid mcp read:tickets read:account write:tickets write:listings read:bids write:bids email profile
The token response carries expires_in for the access token (30 days in production). Every response also carries a refresh_token: refresh tokens are single-use, rotate on each refresh, and live 90 days, so refresh before expires_in elapses. A client that lets both lapse must run the authorization flow again; registering a second client does not revive the first one's tokens.
| Access tier | Coverage | Tools |
|---|---|---|
| Open Access | Discovery — events, venues, performers, ticket listings, market reads. No auth required. | auth_status, check_listing, get_event_details, get_market_read, get_price_history, get_recent_sales, get_seat_map, get_ticket_listings, get_venue_details, search_events, search_market, search_performers, search_venues |
| Authenticated | Caller's XP account — tickets, purchases, favorites, wallet, plus the marketplace: open-listing offers, acceptance, and listing management. Bearer token + OAuth scope. | accept_offer, add_my_sources, buy_listing_now, buy_tickets, cancel_my_listing, cancel_my_offer, create_listing, create_standing_bid, get_discovery_plan, get_listening_assignment, get_my_bids, get_my_context, get_my_listing_status, get_my_orders, get_my_tickets, get_my_wallet, get_open_listing, get_order_status, get_standing_bid, get_user_account, list_muted_listings, list_my_favorites, list_my_listings, list_my_standing_bids, list_open_listings, make_offer_on_listing, mute_listing, reject_offer, rescind_standing_bid, submit_discovered_sources, submit_seller_leads |
There are no roles. No XP role affects MCP access, and none can be applied for: any signed-in XP account reaches every authenticated tool, marketplace included, with OAuth scopes as the only per-tool gate.
Which tiers a caller actually reaches is a property of the deploy, not of the account: public serves open access only, gated requires a bearer for all of it, and hybrid serves open access anonymously while a valid bearer adds the authenticated tier on the same connection.
OAuth scopes define what an issued token is allowed to call.
| Scope | Runtime tool coverage |
|---|---|
openid | Client ID Access |
mcp | Baseline MCP transport access (required for MCP requests) |
read:tickets | get_event_details, get_market_read, get_price_history, get_recent_sales, get_seat_map, get_ticket_listings, get_venue_details, search_events, search_market, search_performers, search_venues |
read:account | get_my_context, get_my_orders, get_my_tickets, get_my_wallet, get_order_status, get_user_account, list_muted_listings, list_my_favorites |
write:tickets | buy_tickets |
write:listings | accept_offer, cancel_my_listing, create_listing, reject_offer |
read:bids | get_my_bids, get_my_listing_status, get_open_listing, get_standing_bid, list_my_listings, list_my_standing_bids, list_open_listings |
write:bids | buy_listing_now, cancel_my_offer, create_standing_bid, make_offer_on_listing, rescind_standing_bid |
email | No runtime tool mapping currently |
profile | No runtime tool mapping currently |
Anonymous callers can initialize and call any open-world tool, with no sign-in. Sending a valid Bearer on the same endpoint additionally unlocks the authenticated surface, so tools/list / prompts/list / resources/list return different catalogues to anonymous and signed-in callers. Calling an authenticated tool without a Bearer returns 401 + WWW-Authenticate, which is what starts the OAuth flow. A Bearer that is present but invalid or expired always 401s rather than falling back to anonymous, so a stale token prompts a refresh instead of quietly losing tools.
WWW-Authenticate / PRM: https://mcp.xp.tickets/.well-known/oauth-protected-resource/mcp
| Tool | Name | Description | Auth required | Mode |
|---|---|---|---|---|
accept_offer | Accept Offer | Accepting sells to a buyer and starts a clock: the offer comes from a buyer on XP, not from XP. Once it's accepted, the seller must transfer the tickets through XP to that buyer by a deadline XP sets at that moment. Missing it can cancel the sale and forfeit the payout. The deadline is per sale, not a fixed window -- do not quote a countdown of your own. The accept result carries the real one, or says plainly when XP has not set it yet; pass that on. From XP's connected resale order book. Two-phase write on the XP live offer book. Use when an authenticated seller wants to accept a specific bid on their listing (e.g. 'accept the $200 offer on my tickets'). Call with `confirm=False` first to preview which offer will be accepted; call with `confirm=True` only after the user explicitly approves. Acceptance is irreversible. Do not use without the two-phase preview-then-confirm flow. Only confirm=True submissions return success=true. Requires auth and write:listings scope. Seller-facing: you are accepting a buyer's offer on your own listing. | Yes (OAuth scope) | Write (destructive) |
add_my_sources | Add My Feeds | - | Yes (OAuth scope) | Write |
auth_status | Auth Status | Use ONLY when the user explicitly asks whether they are signed in to the XP marketplace (e.g. 'am I logged in?', 'am I connected to my tickets?'), or after a protected tool already returned AUTH_REQUIRED and the user wants the current state re-checked. Do NOT call this as a preflight before account / my tickets / wallet / favorites / referral / order tools — calling auth_status first swallows the 401 those tools would emit on the connected order book and prevents the MCP client from triggering OAuth. Always call the requested protected tool directly; the client will start sign-in on 401. Read-only. Returns authenticated boolean, tier roles, and a wallet flag — never raw tokens. | No | Read |
buy_listing_now | Buy Listing at the Ask | From XP's connected order book of resale listings. Use when an authenticated buyer wants a fan listing outright at the seller's published asking price, rather than negotiating -- 'buy it now', 'take it at the ask', 'just buy me those tickets to the game'. Only listings that carry an asking price can be bought this way; for one without an ask, use make_offer_on_listing. Two-phase: confirm=false previews the total so it can be read back to the user, confirm=true buys. A confirm here completes the sale immediately -- the money leaves the caller's XP USDC balance and the seller is committed. Pays from the caller's XP USDC balance; the x402 rail does not apply to fan listings, only to buy_tickets. Requires auth. | Yes (OAuth scope) | Write (destructive) |
buy_tickets | Buy Tickets | Use when the user wants tickets to an event on the XP marketplace (connected order book). Four payment rails are supported. Use 'stripe_link' (the default — omit `rail` to get it) unless the user asks for another: pay by CARD on a Stripe-hosted Checkout page; the preview returns payment_link and checkout_session_id — open the link for the user, then call again with confirm=true and checkout_session_id; the result includes stripe_payment_intent. Other rails, by name only: 'privy' (server-signed USDC transfer from the user's delegated Privy embedded wallet), 'x402' (agent-signed Solana USDC transfer via the x402 protocol — use only if the caller can build and sign Solana x402 'exact' payloads), and 'mpp' (pay by CARD with a Stripe Shared Payment Token over the Machine Payments Protocol binding; present the credential in params._meta['org.paymentauth/credential'], or in the payment_credential argument when your client cannot send _meta). Requires `write:tickets` scope (and `read:account` for the balance preflight when using granular scopes). Call once with confirm=false to preview the total, then call again with confirm=true after the user explicitly approves. | Yes (OAuth scope) | Write (destructive) |
cancel_my_listing | Take Listing Down | Use when a seller wants to remove their own listing from the XP marketplace -- 'take my listing down', 'delist those', 'I sold them elsewhere', 'cancel that listing'. Closes the listing so buyers can no longer make an offer on it. Every open offer on the listing is REJECTED and those buyers are notified that it was removed -- say so before committing, since someone waiting on an answer gets a no. Cannot be used once the seller has accepted an offer: that is an agreed sale, and XP support handles it from there. Two-phase: confirm=false previews, confirm=true removes it. Cannot be undone -- relisting means calling create_listing again. Requires auth; works only on the caller's own listing. | Yes (OAuth scope) | Write (destructive) |
cancel_my_offer | Cancel My Offer | From XP's connected resale order book. Two-phase write on the XP live offer book. Use when an authenticated buyer wants to rescind their outstanding offer on an XP marketplace listing (e.g. 'cancel my offer to make an offer at a lower price', 'pull my bid'). Call with `confirm=False` first to preview which offer will be rescinded; call with `confirm=True` only after the user explicitly approves. Pass bid_uuid from make_offer_on_listing (or the buyer swap id from the same response; the server resolves it). Only confirm=True submissions return success=true. Requires auth and write:bids scope. Do not use for browse / discovery; this is a marketplace transaction tool that mutates an active bid. For standard buy-now ticket purchases without a bid in flight, use `search_events` and `get_ticket_listings`. | Yes (OAuth scope) | Write (destructive) |
check_listing | check_listing | - | No | Read |
create_listing | List Tickets for Sale | Use when the user wants to sell tickets they hold on the XP marketplace -- 'sell my two seats for Friday', 'list section 104 row C', 'put my tickets up'. Creates the listing that buyers (other fans on XP) then make an offer on; the seller answers those with accept_offer and reject_offer. Tickets are not transferred now -- transfer happens after an offer is accepted. Ask the seller whether the seats are accessible (ADA), obstructed view or standing room only: all three are required, never assumed. Two-phase: confirm=false previews so the section, row, seats and those three can be read back to the user, confirm=true creates it. A new listing is REVIEWED before it goes live. The result carries listing_state -- live, in_review or not_accepted -- and only `live` means buyers can see it. Do not tell the user their tickets are for sale unless it says live. Requires auth. | Yes (OAuth scope) | Write (destructive) |
create_standing_bid | Rest a Standing Offer | Creates a STANDING OFFER -- that is the term to use when speaking to the user; the tool keeps `standing_bid` only because the stored records do. Use when the user wants to make an offer at their own price across one or more events and sections and wait for it to fill, rather than paying an asking price now -- e.g. 'offer 80 a seat for any of these nights', 'let me know if something in 104 comes up at my number'. The offer rests on XP's live offer book and fills itself when a matching fan listing appears, so it needs no listing to exist yet. Worth knowing before resting one: when a matching listing is already open, an offer on it (make_offer_on_listing) gets an answer the user will see -- accept, reject or counter -- while a standing offer waits for supply that may never arrive. Check what is open first (list_open_listings, or get_market_read for one event). Both are valid; resting a price where nobody is selling yet is what this tool is for. Say which you did. Two-phase: call with confirm=false to preview the total commitment, then confirm=true once the user agrees. Price is whole dollars per ticket -- XP refuses cents so every fill passes per-ticket validation. Fills take whole lots and cannot strand a remainder. Requires auth. | Yes (OAuth scope) | Write (destructive) |
get_discovery_plan | Get Discovery Plan | - | Yes (OAuth scope) | Write |
get_event_details | Get Event Details | Use when an event ID is in hand and the user wants the full event card before browsing tickets to that event — venue, performers, fee-inclusive price preview, images. Pulls from the XP marketplace catalog. Cache the result for the conversation rather than re-calling for the same event_id. Do not use to list ticket inventory; `get_ticket_listings` is the right tool for seat-level data. | No | Read |
get_listening_assignment | Get Listening Job | - | Yes (OAuth scope) | Write |
get_market_read | Read the Market | Use when the user wants to understand what an event is trading at, not just browse rows. Returns XP's ticket price matrix from the connected order book: per seat level, floor first, each section's rows front to back, a row shown only when it is cheaper than every row in front of it, fee-inclusive per ticket at the party size; plus the fan listings open to offers. Say that fans are selling into this event, so the user can make an offer below the ask; a specific cheapest fan ask is not yet surfaced, so do not lead with one. Do not describe the market with averages, medians, or maximum asks. | No | Read |
get_my_bids | Get My Bids | Use when an authenticated user wants to see the bids they have placed on the XP marketplace — e.g. 'show my bids', 'what offers did I make?', 'tickets to the shows where I'm bidding', 'did any of my bids settle?'. Returns bids classified as open or completed using the same outcome engine as the admin reporting page; rejected/lapsed/refunded bids are hidden. Paged: returns 25 by default, up to 200 with `limit`, and `offset` to continue. `pagination.total` counts only the bids the user can actually see, so when has_more is set say they are seeing a page rather than every bid they have. Read-only. Requires OAuth. | Yes (OAuth scope) | Read |
get_my_context | What XP Knows | Use once the user has settled on an event, before quoting prices, to see what they already told XP: budget per ticket, quantity, date flexibility, and any saved notes. Stops you asking twice for something they said before, e.g. re-asking a budget right before you help them make an offer on the XP marketplace. Read-only: nothing said in this conversation is stored, so a new budget only persists if it becomes a resting commitment -- see create_standing_bid. Use saved notes to shape what you say, never read them back verbatim. | Yes (OAuth scope) | Read |
get_my_listing_status | Get My Listing Status | If the listing has sold and is awaiting the seller's ticket transfer, the result carries the transfer instructions and remaining obligation -- surface those first, ahead of anything else. From XP's connected resale order book. Use when an authenticated seller wants to poll their listing on XP — open bids, state, seats — before deciding to accept or reject an offer (e.g. 'any new bids on my tickets to the season opener?'). Surfaces the seller view of the live offer book. After create_listing, call it to confirm what XP stored (seats, disclosures) and whether buyers can see it: trust visible_to_buyers, not the state. Open-bid amounts are dollars in amount_usd. When is_seller is true, each offer includes actions mapping to accept_offer and reject_offer. Requires auth and read:bids scope. Seller-facing: this polls your own listing. A buyer browsing open listings uses list_open_listings. | Yes (OAuth scope) | Read |
get_my_orders | Get My Orders | Show the authenticated user their own orders on the XP marketplace and where each one stands. Use when the user asks about a purchase they already made -- 'where is my order', 'did my tickets go through', 'what did I buy for Saturday', 'when do my tickets arrive'. Newest first; returns status, vendor fulfilment status, delivery method, in-hand date, event, seats and fee-inclusive total. Money is in dollars. Requires auth. Do NOT use for tickets already delivered to the account -- `get_my_tickets` is the direct answer there. Not for seller-side listings (`list_my_listings`) or offers the user placed (`get_my_bids`). | Yes (OAuth scope) | Read |
get_my_tickets | Get My Tickets | Show the authenticated user the tickets currently delivered to their XP marketplace account, all backed by XP's Quality XPerience Guarantee. Use when the user says 'my tickets', 'what tickets do I have', 'pull up my seats for tonight', or asks about an upcoming event they've already bought. Surfaces only delivered tickets — pending swaps and seller-side listings appear in `list_my_listings`. Requires auth. Do not use to list past orders or browse the marketplace; this is strictly delivered tickets on the user's account. | Yes (OAuth scope) | Read |
get_my_wallet | Get My Wallet | Use when an authenticated user wants their XP marketplace Privy embedded-wallet address and USDC balance (e.g. 'what's my wallet for tickets to tonight?', 'how much USDC before I make an offer?'). Returns the wallet address, a `wallet_connected` flag, and the USDC balance — never the raw bearer token. Read-only; requires auth and read:account scope. Used to fund offers on the live offer book. | Yes (OAuth scope) | Read |
get_open_listing | Get Open Listing | From XP's connected resale order book. Use when a listing identifier is in hand and a buyer wants the full record for one open listing on the XP marketplace before they make an offer (make_offer_on_listing) or buy it at the ask (buy_listing_now). Returns one row from the live offer book. Requires auth and read:bids scope. This is the offer/negotiation surface -- for a plain buy-now at the asking price without an offer, use search_events and get_ticket_listings instead. | Yes (OAuth scope) | Read |
get_order_status | Get Order Status | Get the status of one of the authenticated user's orders on the XP marketplace, by the order_uuid that buy_tickets returned. Use right after a purchase, or when the user asks about a specific order -- 'did that go through', 'is my order confirmed', 'when do my tickets arrive'. Returns status, vendor fulfilment status, delivery method, in-hand date, event, seats and fee-inclusive total. Money is in dollars. Requires auth; only the caller's own orders are visible. Without an order_uuid, use `get_my_orders` for the recent list. | Yes (OAuth scope) | Read |
get_price_history | Price History | Use when the user asks whether prices for an event are rising or falling, whether to buy now or wait for a price drop, or what an event has been doing lately. Returns the daily closing get-in price on the XP marketplace, one point per day, oldest first, with the fee-inclusive per-ticket price in dollars. This is the asking side over time -- what tickets actually sold for is `get_recent_sales`, and the two must not be conflated. An empty history is a real answer and a common one: XP records history only for events someone is tracking, so a quiet event has no line rather than a flat one. | No | Read |
get_prompt | Get Prompt | Render a prompt by name into model messages (JSON with messages array). | Yes (OAuth scope) | Read |
get_recent_sales | Recent Sales | Use when the user asks what tickets actually sold for on an event, or before claiming nothing has traded. Returns recent completed deals from the XP marketplace with the per-ticket price and how long ago each cleared. An empty result is a real answer: no verified transfers in the window. Useful before deciding whether to make an offer or wait for a price drop. One sale is one sale -- do not generalise from a single clear. | No | Read |
get_seat_map | Seat Map | Use when the user asks where a section is, what the venue looks like, or wants to see the layout before picking seats on the XP marketplace -- 'where is 104', 'show me the map', 'is that behind the stage'. Returns the venue seating chart as an image. This is the venue LAYOUT -- where each section sits in the building. It is NOT a photograph of the view from a seat and must never be described as one. Not every venue has a chart; when one is missing say so plainly, and note that the section and row from `get_ticket_listings` still describe the seats exactly. No sign-in required. | No | Read |
get_standing_bid | Standing Offer Detail | Use when the user asks about one specific standing offer on the XP marketplace -- whether it filled, how much of it is left, or 'did that offer get my tickets'. Returns the offer at any status along with the fills it has taken, so it answers for filled and rescinded offers that `list_my_standing_bids` does not show. Requires auth. | Yes (OAuth scope) | Read |
get_ticket_listings | Get Ticket Listings | Use when the user wants to see ticket options and fee-inclusive prices for a specific XP event after `search_events` (e.g. 'cheap seats', 'parking for the game'). Pulls the live offer book of resale inventory. Do not use before an event has been resolved — call `search_events` or `get_event_details` first. Prices are dollars: each ticket row carries per_ticket_usd. error_code NO_INVENTORY means the event is real but has nothing listed right now: do not retry, give the user the event page or another date. NO_MATCHING_TICKETS means tickets exist but none fit the filters: widen or drop them. EVENT_NOT_FOUND means the event_id is wrong: resolve it again with `search_events`. | No | Read |
get_user_account | Get User Account | Pull the authenticated user's XP marketplace account card — profile, wallet, email, name, order history, and referral stats. Use when the user asks 'what have I bought from XP', 'my account', 'my tickets to past games', 'my orders', 'my referral link', or 'how much have I spent'. Returns the profile shown on the XP account page. Read-only; requires auth. Do not use for tickets currently delivered to the account; `get_my_tickets` is more direct. | Yes (OAuth scope) | Read |
get_venue_details | Get Venue Details | Pull full venue info from XP plus the upcoming-events calendar at that venue, with live pricing from the connected order book of resale inventory. Use after `search_venues`, or when the user asks 'what's coming up at the venue', 'what's playing at the Garden', 'shows at the venue this month'. Returns the upcoming-events feed so the agent can offer next-step `get_ticket_listings` calls. Do not use to fetch ticket inventory for a specific event; `get_ticket_listings` is the right tool for seat-level data. | No | Read |
list_muted_listings | List Muted Listings | Use when the user asks what they have hidden or muted on the XP marketplace, or before muting so you do not tell them you muted something that was already muted. Returns the listing identifiers this user has muted. Muting is per-user and never touches the listing itself. It hides the listing on xp.tickets; list_open_listings and get_market_read do NOT filter muted listings, so read this list before showing the user listings to make an offer on. Requires auth. | Yes (OAuth scope) | Read |
list_my_favorites | List My Favorites | Use when an authenticated user wants the performers they've favorited on the XP marketplace (e.g. 'show my favorites going to a game this weekend', 'who am I following on near me events?'). Read-only; requires auth and read:account scope. Pair with `search_events` to find tickets to favorite performers on the connected order book. Paged: returns 25 by default, up to 200 with `limit`, and `offset` to continue. Some accounts follow thousands of performers, so when pagination.has_more is set say the user is seeing a page rather than everyone they follow. | Yes (OAuth scope) | Read |
list_my_listings | List My Listings | Paged: a large book comes back one page per lifecycle category, and the result carries pagination totals per category. When has_more is set, say so -- never present a page as the whole book -- and either page on with offset or narrow with state_category. From XP's connected resale order book. Use when an authenticated seller wants to see their listings on the XP marketplace bucketed by lifecycle (e.g. 'show my tickets I'm selling', 'what's open in my seller queue'). Surfaces seller-side categories that gate next steps in the live offer book. Requires auth and read:bids scope. Seller-facing: these are your own listings. A buyer browsing what's for sale uses list_open_listings; a plain buy-now uses search_events and get_ticket_listings. | Yes (OAuth scope) | Read |
list_my_standing_bids | My Standing Offers | Use when the user asks what offers they have resting on the XP marketplace, what they are waiting on, or before they make an offer so you do not stack a duplicate. A standing offer buys at the user's price whenever a matching fan listing appears, without them watching for it. Live offers only -- filled ones have become tickets (`get_my_tickets`) and rescinded ones are history; both stay reachable by id through `get_standing_bid`. Requires auth. | Yes (OAuth scope) | Read |
list_open_listings | List Open Listings | From XP's connected order book of resale listings. Use when a buyer wants to browse fan listings open to offers on XP (e.g. 'what's open near me this weekend', 'open listings with active offers'), then make an offer with make_offer_on_listing or buy one outright with buy_listing_now. Filterable by event, performer, and amount. Requires auth and read:bids scope. This is the offer/negotiation surface -- for a plain buy-now at the asking price without an offer, use search_events and get_ticket_listings instead. | Yes (OAuth scope) | Read |
list_prompts | List Prompts | List available MCP prompts (workflows) for clients that only support tools/call. | Yes (OAuth scope) | Read |
make_offer_on_listing | Make Offer on Listing | From XP's connected resale order book. Two-phase write on the XP live offer book. Use when the user wants to make an offer on an open XP listing (e.g. 'make an offer of $50 on this'). Call with `confirm=False` first to preview the fee-inclusive total (no bid placed); call with `confirm=True` only after the user explicitly approves the previewed amount. Only confirm=True submissions return success=true. Do not use without the two-phase preview-then-confirm flow. Requires auth and write:bids scope. Do not use for browse / discovery; this is a marketplace transaction tool that places real money at risk. For standard buy-now ticket purchases without a bid, use `search_events` and `get_ticket_listings`. | Yes (OAuth scope) | Write (destructive) |
mute_listing | Mute Listing | Use when the user says they are not interested in a listing on the XP marketplace, wants to stop seeing it, or wants a muted one back -- e.g. 'hide this one', 'stop showing me that', 'unmute that listing', or after deciding not to make an offer on it. Muting affects only this user's view of the live offer book. It does not close the listing, withdraw an offer, or change anything for the seller or other buyers. Sets the state you pass rather than toggling, so repeating a call is safe. Requires auth. | Yes (OAuth scope) | Write |
reject_offer | Reject Offer | From XP's connected resale order book. Two-phase write on the XP live offer book. Use when an authenticated seller wants to reject a specific bid on their tickets to a listing (e.g. 'reject the lowball offer on my tickets'). Call with `confirm=False` first to preview which offer will be rejected; call with `confirm=True` only after the user explicitly approves. Do not use without the two-phase preview-then-confirm flow. Only confirm=True submissions return success=true. Requires auth and write:listings scope. Seller-facing: you are rejecting a buyer's offer on your own listing. | Yes (OAuth scope) | Write (destructive) |
rescind_standing_bid | Rescind Standing Offer | Use when the user no longer wants a standing offer resting on the XP marketplace -- 'cancel that standing offer', 'stop waiting on those', or they would rather make an offer on something open instead. Closes it to new fills. Fills it already took are completed purchases and are not undone. Two-phase: confirm=false previews, confirm=true commits. Requires auth. | Yes (OAuth scope) | Write (destructive) |
search_events | Search Events | Catalog search for discovery: find live events on XP -- concerts, sports, theater -- by performer, team, venue, city, or keyword (e.g. 'shows near me this weekend', 'Taylor Swift tour dates'). Returns event cards from the XP catalog with a fee-inclusive price preview, for browsing and navigation. When the question is what an event is trading at -- the marketplace get-in price and whether fans are selling into it -- use search_market instead. To look up a performer or venue by name on its own, use search_performers or search_venues. Not for scores, news, standings, or non-ticketed listings. | No | Read |
search_market | Search the Market | The live market read for an event: per event, the fee-inclusive marketplace get-in price and whether fans are currently selling into it (how many open listings). Reach for this, not search_events, whenever price is the question or the user might make an offer rather than pay the asking price (e.g. 'tickets to the season opener', 'cheap seats near me'). It tells you an event has open fan listings worth an offer; for the listings themselves use list_open_listings. For plain discovery with no price read -- just finding the event, performer, or venue -- use search_events instead. Do not use for scores, news, or standings. | No | Read |
search_performers | Search Performers | Find a performer (artist, team, comedian) on the XP marketplace by name. Use when the user names a specific performer (e.g. 'tickets to Taylor Swift', 'Lakers season opener', 'Phish tour dates'). Returns performer cards from the XP catalog — not events. Pair with `search_events` once a performer is selected to surface their upcoming events on the connected order book. Do not use for general 'events near me' queries; `search_events` handles those better. | No | Read |
search_venues | Search Venues | Use when the user wants to find a venue by name, city, or area on XP (e.g. 'venues near me', 'arenas in Brooklyn', 'what's at the venue level downtown'). Returns venue records from the XP marketplace catalog — not tickets. Do not use to answer ticket-price questions once the event is known; call `get_ticket_listings` instead. | No | Read |
submit_discovered_sources | Suggest Resale Sources | - | Yes (OAuth scope) | Write |
submit_seller_leads | Submit Seller Leads | - | Yes (OAuth scope) | Write |
| Prompt | Category |
|---|---|
add_my_feeds | authenticated |
confirm_make_offer | authenticated |
discover_sources | authenticated |
find_tickets_by_section_and_budget | open_world |
floor_and_vip_options | open_world |
ga_vs_seated_tradeoff | open_world |
manage_my_listings | authenticated |
marketplace_deal_finder | authenticated |
parking_for_event | open_world |
seller_offer_action_confirmed | authenticated |
start_listening | authenticated |
venue_events_and_tickets | open_world |
weekend_deals_near_me | open_world |
| URI | Name | Description |
|---|---|---|
text://instructions/ticket-agent | Ticket Agent Instructions | Operational instructions for the ticket agent. |
text://instructions/market-read | Market Read Instructions | How to read the XP market for a fan: which price to lead with, how to describe areas of a building, what never to claim, and when an offer beats paying the ask. |
text://instructions/ticket-verification | Ticket Verification Instructions | Operational instructions for ticket verification mode. |
text://instructions/marketplace-agent | Marketplace Agent Instructions | Operational instructions for the marketplace/offers agent: browsing open offers, placing bids, and managing seller listings. |
text://instructions/listener-node | Listener Node Instructions | Good Listener playbook for nodes: read assigned sources read-only, match XP events, submit leads. |
text://instructions/oauth-flow | OAuth Flow Instructions | Authentication model: the MCP client handles OAuth out of band; the agent does not direct users to URLs or call any sign-in tool. |
text://help/scopes-reference | Scopes Reference | Reference table of OAuth scopes and which tools each scope unlocks. |
text://glossary/marketplace | Marketplace Glossary | Canonical mappings between preferred (listing/offer) and legacy (swap/bid) marketplace vocabulary. |
text://about/xp | About XP | What XP is, what makes it different (connected order book, all-in pricing, standing offers, Quality XPerience Guarantee), when to use XP, and the voice the agent should adopt with users. |
text://about/catalog | XP Catalog Coverage | High-level view of XP catalog: sports leagues, music genres, geographies, and primary/partner inventory sources. |
text://help/comparison | XP vs Alternatives | Guidance for when an agent should route a user to XP vs the primary box office vs other secondary marketplaces. |
text://about/signing-in | Signing in to XP | What signing in to an XP account unlocks (their tickets, orders, wallet, offers, and the marketplace), and how the user signs in through their MCP host. One endpoint: signing in adds tools, it does not move the connection. |
text://help/mpp-payments | MPP Payments (card) | How to purchase tickets with a Stripe Shared Payment Token over the Machine Payments Protocol MCP binding: the two-turn challenge-then-credential flow, what -32042 and -32043 mean, and why the challenge must be echoed back unchanged. |
text://help/stripe_link-payments | stripe_link Payments (card, Stripe-hosted) | How to purchase tickets by card on a Stripe-hosted Checkout page when your client cannot mint a Shared Payment Token: preview for payment_link and checkout_session_id, the user pays, then confirm for order_uuid and stripe_payment_intent. |
text://help/x402-payments | x402 Payments | How to purchase tickets via the x402 Solana-USDC payment rail: what you need, the two-turn quote-then-pay flow, and XP's idempotency and settlement guarantees. |
text://context/now | Server Time Context | Authoritative server clock as JSON ({today, now_utc, tz_offset}); use for relative-date resolution and freshness checks. tz_offset shows the server UTC offset so agents can adjust to the user's timezone. Same source as _meta.context on every tool envelope. |
| URI | Name | Description |
|---|---|---|
skill://instructions/ticket-agent | Ticket Agent skill | Same markdown as text://instructions/ticket-agent; use this URI when the client surfaces skill-scoped resources. |
skill://instructions/market-read | Market Read skill | Same markdown as text://instructions/market-read; use this URI when the client surfaces skill-scoped resources. |
skill://instructions/listener-node | Listener Node skill | Same markdown as text://instructions/listener-node; use this URI when the client surfaces skill-scoped resources. |
skill://instructions/marketplace-agent | Marketplace Agent skill | Same markdown as text://instructions/marketplace-agent; use this URI when the client surfaces skill-scoped resources. |
skill://about/xp | About XP skill | Skill-loadable context on what XP is, the connected order book of resale tickets, all-in pricing, standing offers, and the Quality XPerience Guarantee. |