XP MCP Documentation

Back to landing

Client config — start here

Drop these into the matching MCP host config to connect.

Claude (web + desktop)

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 or sell.

https://mcp-store.xp.tickets/mcp

Cursor

// ~/.cursor/mcp.json — Cursor reads this on launch.
{
  "mcpServers": {
    "xp": {
      "url": "https://mcp-store.xp.tickets/mcp"
    }
  }
}

ChatGPT

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 or sell.

https://mcp-store.xp.tickets/mcp

VS Code (Copilot Chat)

// VS Code (Copilot Chat) — settings.json or .vscode/mcp.json
{
  "mcp": {
    "servers": {
      "xp": {
        "type": "http",
        "url": "https://mcp-store.xp.tickets/mcp"
      }
    }
  }
}

Antigravity (2.0.1+)

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 or sell.

// Antigravity 2.0.1 — Agent panel ▸ Manage MCP Servers ▸ View raw config
{
  "mcpServers": {
    "xp": {
      "serverUrl": "https://mcp-store.xp.tickets/mcp"
    }
  }
}

Overview

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.

Connection Details

Quickstart (cURL)

Copy-paste recipes. Each request stands alone.

Gated — Bearer required, full tool surface

# Acquire $TOKEN via OAuth 2.1 + PKCE first (see OAuth & Discovery).
# tools/list returns the full surface once authenticated.
curl -X POST https://mcp-store.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-store.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.

Conventions and gotchas

Money units

Dates and timezones

Error contract

Scope vs role

Payments — stripe_link (default), Privy, x402 and MPP rails

Status: enabled

buy_tickets supports four payment rails selected by the rail argument. Use stripe_link, the default, unless the user asks for another:

SettingValue
Networksolana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp
USDC mintEPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v

Registered facilitators

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.

IdAdapterAuth Fee payerURL
payai (default)payaibearerbuyer-pays-feeshttps://facilitator.payai.network

Two-turn flow

# 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

Buyer-side signer (your responsibility)

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.

Facilitator selection

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.

Read more

OAuth & Discovery

Endpoints published for MCP clients that perform Dynamic Client Registration (DCR) and the OAuth 2.1 + PKCE handshake.

PurposeURL
Authorizationhttps://xp.tickets/xp-mcp/authorize
Token exchangehttps://api.xp.tickets/mcp/token
Dynamic Client Registrationhttps://api.xp.tickets/oauth/register
Token revocationhttps://api.xp.tickets/oauth/revoke
JWKShttps://api.xp.tickets/.well-known/jwks.json
UserInfohttps://api.xp.tickets/mcp/userinfo
Muse Callback URLhttps://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

Token lifetimes

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 tiers

Access tierCoverageTools
Open AccessDiscovery — events, venues, performers, ticket listings, market reads. No auth required.check_listing, get_event_details, get_market_read, get_price_history, get_recent_sales, get_seat_map, get_ticket_listings, get_venue_details, resolve_intent, search_events, search_market, search_performers, search_venues
AuthenticatedCaller's XP account — tickets, purchases, wallet, plus the marketplace: open-listing offers, acceptance, and listing management. Bearer token + OAuth scope.accept_offer, add_my_sources, auth_status, buy_listing_now, buy_tickets, cancel_my_listing, cancel_my_offer, cancel_my_open_offer, create_listing, get_discovery_plan, get_listening_assignment, get_my_listing_status, get_my_offers, get_my_orders, get_my_tickets, get_my_wallet, get_open_listing, get_open_offer, get_order_status, get_user_account, list_muted_listings, list_my_listings, list_my_open_offers, list_open_listings, mute_listing, reject_offer, 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.

OAuth Scopes (runtime mapping)

ScopeRuntime tool coverage
openidClient ID Access
mcpBaseline MCP transport access (required for MCP requests)
read:ticketsget_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:accountauth_status, get_my_orders, get_my_tickets, get_my_wallet, get_order_status, get_user_account, list_muted_listings
write:ticketsbuy_tickets
write:listingsaccept_offer, cancel_my_listing, create_listing, reject_offer
read:bidsget_my_listing_status, get_my_offers, get_open_listing, get_open_offer, list_my_listings, list_my_open_offers, list_open_listings
write:bidsbuy_listing_now, cancel_my_offer, cancel_my_open_offer
emailNo runtime tool mapping currently
profileNo runtime tool mapping currently
Surface: open to browse, sign in to transact — 43 tools, 13 prompts, 21 docs

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-store.xp.tickets/.well-known/oauth-protected-resource/mcp

Tools

ToolNameDescriptionAuth requiredMode
accept_offerAccept OfferAccepts one buyer's offer on the caller's own listing on XP -- 'accept the $200 offer on my tickets'. The offer comes from a buyer, not from XP. Accepting is a sale and cannot be undone: the seller then transfers the tickets through XP to that buyer by a deadline XP sets at acceptance, and missing it can cancel the sale and forfeit the payout. The deadline is per sale, not a fixed window; the result carries it, or says XP has not set it yet. confirm=false returns a preview of the offer; confirm=true accepts it, and only that call returns success=true. identifier and offer_uuid come from get_my_listing_status. Requires sign-in and the write:listings scope.Yes (OAuth scope)Write (destructive)
add_my_sourcesAdd My Feeds-Yes (OAuth scope)Write
auth_statusAuth StatusWhether the user is signed in to the XP marketplace, for 'am I logged in?' or 'can you see my tickets?'. When they are, returns the account email, granted scopes, tier roles and whether a wallet is connected. When they are not, the call is refused with the same sign-in challenge as the account tools.Yes (OAuth scope)Read
buy_listing_nowBuy Listing at the AskBuys a fan listing on XP outright at the seller's asking price, without an offer -- 'buy it now', 'take it at the ask'. Only listings with an asking price can be bought this way, and the purchase is refused if the ask changed since the preview. confirm=false returns a preview of the total; confirm=true completes the sale at once, paid from the caller's XP USDC balance, and commits the seller. The x402 rail is for buy_tickets and does not apply here. identifier comes from list_open_listings or get_open_listing. Requires sign-in.Yes (OAuth scope)Write (destructive)
buy_ticketsBuy TicketsBuy tickets from a get_ticket_listings listing (event_id, uvid, quantity) on XP. Two calls: confirm=false returns a preview with the all-in total; confirm=true, once the person approves, completes the order and returns its order_uuid. Four payment rails, chosen with rail: 'stripe_link' (the default) pays by card on a Stripe-hosted checkout page, where the preview returns payment_link and checkout_session_id and confirm=true takes that checkout_session_id; 'privy' pays USDC from the person's XP wallet, signed by the server; 'x402' takes a Solana USDC payment the caller signs, passed as payment_proof; 'mpp' pays by card with a Stripe Shared Payment Token over the Machine Payments Protocol, sent in params._meta['org.paymentauth/credential'] or as payment_credential. Requires sign-in and the write:tickets scope, plus read:account for the balance check on 'privy'.Yes (OAuth scope)Write (destructive)
cancel_my_listingTake Listing DownTakes down one of the caller's own listings on XP -- 'take my listing down', 'I sold them elsewhere'. Buyers can no longer make an offer on it, every open offer on it is rejected, and those buyers are notified that it was removed. A listing with an accepted offer is an agreed sale and cannot be taken down here; XP support handles it. confirm=false returns a preview; confirm=true removes the listing, which cannot be undone. Relisting is a new create_listing. Requires sign-in.Yes (OAuth scope)Write (destructive)
cancel_my_offerCancel My OfferCancels one of the caller's offers on a single XP listing -- 'pull my offer', 'cancel my bid'. An open offer resting across events is cancelled with cancel_my_open_offer. offer_uuid is the offer's bid_uuid or its buyer swap id. confirm=false returns a preview; confirm=true cancels it, and only that call returns success=true. Requires sign-in and the write:bids scope.Yes (OAuth scope)Write (destructive)
cancel_my_open_offerCancel My Open OfferCloses one of the caller's open offers on XP to new fills -- 'cancel that open offer', 'stop waiting on those'. Fills it already took are completed purchases and stay. An offer on a single listing is cancelled with cancel_my_offer. confirm=false returns a preview; confirm=true cancels it. Requires sign-in.Yes (OAuth scope)Write (destructive)
check_listingcheck_listing-NoRead
create_listingList Tickets for SaleLists tickets the seller holds for sale on XP -- 'sell my two seats for Friday', 'list section 104 row C'. Buyers then make an offer on the listing, and the seller answers with accept_offer or reject_offer; the tickets transfer only after an offer is accepted. is_ada, is_obstructed_view and is_sro are required inputs with no default. confirm=false returns a preview of the section, row, seats and those three flags; confirm=true creates the listing. A new listing is reviewed before it goes live: listing_state in the result is live, in_review or not_accepted, and only a live listing is visible to buyers. Requires sign-in.Yes (OAuth scope)Write (destructive)
get_discovery_planGet Discovery Plan-Yes (OAuth scope)Write
get_event_detailsGet Event DetailsThe full card for one event on XP: venue, performers, date, images and an all-in price preview. event_id comes from search_events or search_market. The tickets themselves are in get_ticket_listings.NoRead
get_listening_assignmentGet Listening Job-Yes (OAuth scope)Write
get_market_readRead the MarketWhat one event is trading at on XP -- 'how much are tickets?'. By seat level, floor first: each level's get-in, then each section's rows front to back, a row shown only when it is cheaper than every row in front of it. Prices are all-in per ticket at the party size (quantity). fan_listings counts the fan listings open to offers on the event; their asks are not included. Clubs, suites, obstructed-view and standing-only seats are left out and named in left_out; get_ticket_listings includes them. event_id comes from search_events or search_market.NoRead
get_my_listing_statusGet My Listing StatusOne of the caller's own listings on XP, seen as the seller -- 'any new offers on my tickets?'. Returns the state, seats, disclosures, visible_to_buyers and the open offers on it, with amounts in dollars (amount_usd). visible_to_buyers, not the state, says whether buyers can see the listing. When is_seller is true, each open offer carries actions for accept_offer and reject_offer. When the listing has sold and awaits the seller's transfer, the result carries the transfer instructions and the remaining obligation. identifier comes from create_listing, list_my_listings or list_open_listings. Requires sign-in and the read:bids scope.Yes (OAuth scope)Read
get_my_offersGet My OffersThe offers the caller has placed on XP listings, as open or completed -- 'show my bids', 'did any of my offers settle?'. Rejected, lapsed and refunded offers are left out. Paged: 25 by default, up to 200 with limit, and offset to continue; pagination.total counts only the offers shown, and has_more marks further pages. Open offers resting across events are in list_my_open_offers. Requires sign-in.Yes (OAuth scope)Read
get_my_ordersGet My OrdersThe caller's orders on XP, newest first: status, fulfilment status, delivery method, in-hand date, event, seats and the all-in total in dollars -- 'where is my order?', 'when do my tickets arrive?'. get_order_status reads one order by its order_uuid and get_my_tickets lists tickets already delivered; offers the caller placed are in get_my_offers and listings they are selling in list_my_listings. Requires sign-in.Yes (OAuth scope)Read
get_my_ticketsGet My TicketsTickets already delivered to the caller's XP account, paged -- 'my tickets', 'pull up my seats for tonight'. Orders not yet delivered are in get_my_orders; tickets the caller is selling are in list_my_listings. Requires sign-in.Yes (OAuth scope)Read
get_my_walletGet My WalletThe caller's XP wallet: its address, whether one is connected (wallet_connected) and the USDC balance -- 'how much USDC do I have?'. That balance funds offers, buy_listing_now and buy_tickets with rail 'privy'. Requires sign-in and the read:account scope.Yes (OAuth scope)Read
get_open_listingGet Open ListingOne fan listing on XP open to offers, by the identifier from list_open_listings -- 'tell me more about those tickets'. Returns the full listing record; buy_listing_now buys it at its asking price. Requires sign-in and the read:bids scope.Yes (OAuth scope)Read
get_open_offerOpen Offer DetailOne of the caller's open offers on XP by id, at any status, with the fills it has taken -- 'did that offer get my tickets?'. Covers the filled and rescinded offers that list_my_open_offers leaves out. Requires sign-in.Yes (OAuth scope)Read
get_order_statusGet Order StatusOne of the caller's orders on XP by order_uuid (from buy_tickets or get_my_orders) -- 'did that go through?'. Returns status, fulfilment status, delivery method, in-hand date, event, seats and the all-in total in dollars. The recent list is in get_my_orders. Requires sign-in.Yes (OAuth scope)Read
get_price_historyPrice HistoryOne event's daily closing get-in on XP: the lowest all-in asking price per ticket in dollars, one point per day, oldest first, over 1 to 90 days (default 30) -- 'are prices going up?', 'should I wait for a price drop?'. This is the asking side over time; what tickets sold for is in get_recent_sales. History is recorded only for events someone is tracking, so an empty result is common and means no record, not a flat price. event_id comes from search_events or search_market.NoRead
get_promptGet PromptRender a prompt by name into model messages (JSON with messages array).Yes (OAuth scope)Read
get_recent_salesRecent SalesRecent completed sales for one event on XP: the per-ticket price and how long ago each sale cleared -- 'what did tickets actually sell for?'. An empty result means no verified sales in the window. Asking prices over time are in get_price_history. event_id comes from search_events or search_market.NoRead
get_seat_mapSeat MapThe venue seating chart for one event, as an image -- 'where is section 104?', 'show me the map'. It is the venue layout, showing where each section sits in the building, and not a photograph of the view from a seat. Some venues have no chart; the section and row from get_ticket_listings still identify the seats. event_id comes from search_events, search_market or get_event_details. No sign-in needed.NoRead
get_ticket_listingsGet Ticket ListingsThe tickets on sale for one event on XP: section, row, quantity and the all-in price per ticket in dollars (per_ticket_usd), filterable by quantity, price, section, general admission and parking -- 'cheap seats', 'parking for the game'. event_id comes from search_events, search_market or get_event_details; each listing's uvid is what buy_tickets takes. error_code NO_INVENTORY: the event has nothing listed right now, and retrying will not change that. NO_MATCHING_TICKETS: tickets exist but none fit the filters. EVENT_NOT_FOUND: the event_id is wrong.NoRead
get_user_accountGet User AccountThe caller's XP account as shown on the XP account page: name, email, wallet, order history and referral stats -- 'my account', 'my referral link', 'how much have I spent?'. Order status is in get_my_orders; delivered tickets are in get_my_tickets. Requires sign-in.Yes (OAuth scope)Read
get_venue_detailsGet Venue DetailsOne venue on XP and its upcoming events with all-in prices -- 'what's playing at the Garden this month?'. venue_id comes from search_venues. Tickets to one of those events are in get_ticket_listings.NoRead
list_muted_listingsList Muted ListingsThe listing identifiers the caller has muted on XP -- 'what have I hidden?'. Muting is a per-user view setting and does not change the listing itself. Muted listings are left out of list_open_listings and hidden on xp.tickets; get_market_read counts every fan listing, muted or not. Requires sign-in.Yes (OAuth scope)Read
list_my_listingsList My ListingsThe caller's own listings on XP, grouped by lifecycle category (active, pending, has_open_bids, awaiting_seller_transfer_proof and more) -- 'show the tickets I'm selling'. Paged per category: each category returns one page with its own pagination totals, has_more marks a further page, and offset pages on or state_category narrows to one category. Requires sign-in and the read:bids scope.Yes (OAuth scope)Read
list_my_open_offersMy Open OffersThe caller's open offers on XP that are still live -- 'what offers do I have out?'. An open offer buys at the caller's price whenever a matching fan listing appears. Filled offers show up as tickets in get_my_tickets; filled and rescinded offers are read by id with get_open_offer. Requires sign-in.Yes (OAuth scope)Read
list_open_listingsList Open ListingsFan listings on XP open to offers, filterable by event, performer and whole-listing amount -- 'what's open near me this weekend?'. Listings the caller muted are left out. Each listing's identifier is what get_open_listing and buy_listing_now take; buy_listing_now buys a listing outright at its asking price. Event inventory at listed prices is in get_ticket_listings. Requires sign-in and the read:bids scope.Yes (OAuth scope)Read
list_promptsList PromptsList available MCP prompts (workflows) for clients that only support tools/call.Yes (OAuth scope)Read
mute_listingMute ListingMutes or unmutes one listing for the caller on XP -- 'hide this one', 'stop showing me that', 'unmute that listing'. Muting changes only the caller's view: the listing stays open, offers on it stand, and the seller and other buyers see no change. Muted listings are left out of list_open_listings. Sets the state passed rather than toggling, so repeating a call is safe. Requires sign-in.Yes (OAuth scope)Write
reject_offerReject OfferRejects one buyer's offer on the caller's own listing on XP -- 'reject the lowball offer on my tickets'. confirm=false returns a preview of the offer; confirm=true rejects it, and only that call returns success=true. identifier and offer_uuid come from get_my_listing_status. Requires sign-in and the write:listings scope.Yes (OAuth scope)Write (destructive)
resolve_intentResolve Event From Post-NoRead
search_eventsSearch EventsFind events in XP's catalog (concerts, sports, theater, comedy) by performer, team, venue, city or keyword, with optional date, metro and genre filters -- 'shows near me this weekend', 'Taylor Swift tour dates'. Returns event cards with an all-in price preview. search_market runs the same search and adds what each event is trading at; search_performers and search_venues find a performer or venue on its own.NoRead
search_marketSearch the MarketThe same event search as search_events, plus what each event is trading at on XP: its all-in get-in price per ticket and how many fan listings are open to offers on it -- 'tickets to the season opener', 'seats near me under $100'. Suits questions where price is part of the ask; search_events suits finding an event. The fan listings themselves are in list_open_listings.NoRead
search_performersSearch PerformersFind a performer (artist, team or comedian) on XP by name, with optional genre or sport filters -- 'Phish', 'the Lakers'. Returns performer cards, not events; search_events with the performer's name returns their upcoming events.NoRead
search_venuesSearch VenuesFind a venue on XP by name, city, state or metro -- 'arenas in Brooklyn', 'venues near me'. Returns venue records, not events; get_venue_details returns a venue's upcoming events.NoRead
submit_discovered_sourcesSuggest Resale Sources-Yes (OAuth scope)Write
submit_seller_leadsSubmit Seller Leads-Yes (OAuth scope)Write

Prompts

PromptCategory
add_my_feedsauthenticated
discover_and_listenauthenticated
discover_sourcesauthenticated
find_tickets_by_section_and_budgetopen_world
floor_and_vip_optionsopen_world
ga_vs_seated_tradeoffopen_world
manage_my_listingsauthenticated
marketplace_deal_finderauthenticated
parking_for_eventopen_world
seller_offer_action_confirmedauthenticated
start_listeningauthenticated
venue_events_and_ticketsopen_world
weekend_deals_near_meopen_world

Documentation resources — text://

URINameDescription
text://instructions/ticket-agentTicket Agent InstructionsOperational instructions for the ticket agent.
text://instructions/market-readMarket Read InstructionsHow 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-verificationTicket Verification InstructionsOperational instructions for ticket verification mode.
text://instructions/marketplace-agentMarketplace Agent InstructionsOperational instructions for the marketplace/offers agent: browsing open offers, placing bids, and managing seller listings.
text://instructions/listener-nodeListener Node InstructionsGood Listener playbook for nodes: read assigned sources read-only, match XP events, submit leads.
text://instructions/oauth-flowOAuth Flow InstructionsAuthentication 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-referenceScopes ReferenceReference table of OAuth scopes and which tools each scope unlocks.
text://glossary/marketplaceMarketplace GlossaryCanonical mappings between preferred (listing/offer) and legacy (swap/bid) marketplace vocabulary.
text://about/xpAbout XPWhat XP is, what makes it different (connected order book, all-in pricing, open offers, Quality XPerience Guarantee), and when to use XP.
text://about/catalogXP Catalog CoverageHigh-level view of XP catalog: sports leagues, music genres, geographies, and primary/partner inventory sources.
text://help/comparisonXP vs AlternativesGuidance for when an agent should route a user to XP vs the primary box office vs other secondary marketplaces.
text://about/signing-inSigning in to XPWhat 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-paymentsMPP 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-paymentsstripe_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-paymentsx402 PaymentsHow 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/nowServer Time ContextAuthoritative 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.

Documentation resources — skill://

URINameDescription
skill://instructions/ticket-agentTicket Agent skillSame markdown as text://instructions/ticket-agent; use this URI when the client surfaces skill-scoped resources.
skill://instructions/market-readMarket Read skillSame markdown as text://instructions/market-read; use this URI when the client surfaces skill-scoped resources.
skill://instructions/listener-nodeListener Node skillSame markdown as text://instructions/listener-node; use this URI when the client surfaces skill-scoped resources.
skill://instructions/marketplace-agentMarketplace Agent skillSame markdown as text://instructions/marketplace-agent; use this URI when the client surfaces skill-scoped resources.
skill://about/xpAbout XP skillSkill-loadable context on what XP is, the connected order book of resale tickets, all-in pricing, open offers, and the Quality XPerience Guarantee.