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 or sell.
https://mcp-store.xp.tickets/mcp// ~/.cursor/mcp.json — Cursor reads this on launch.
{
"mcpServers": {
"xp": {
"url": "https://mcp-store.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 or sell.
https://mcp-store.xp.tickets/mcp// VS Code (Copilot Chat) — settings.json or .vscode/mcp.json
{
"mcp": {
"servers": {
"xp": {
"type": "http",
"url": "https://mcp-store.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 or sell.
// Antigravity 2.0.1 — Agent panel ▸ Manage MCP Servers ▸ View raw config
{
"mcpServers": {
"xp": {
"serverUrl": "https://mcp-store.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-store.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-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.
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. | 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 |
| Authenticated | Caller'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.
| 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 | auth_status, get_my_orders, get_my_tickets, get_my_wallet, get_order_status, get_user_account, list_muted_listings |
write:tickets | buy_tickets |
write:listings | accept_offer, cancel_my_listing, create_listing, reject_offer |
read:bids | get_my_listing_status, get_my_offers, get_open_listing, get_open_offer, list_my_listings, list_my_open_offers, list_open_listings |
write:bids | buy_listing_now, cancel_my_offer, cancel_my_open_offer |
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-store.xp.tickets/.well-known/oauth-protected-resource/mcp
| Tool | Name | Description | Auth required | Mode |
|---|---|---|---|---|
accept_offer | Accept Offer | Accepts 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_sources | Add My Feeds | - | Yes (OAuth scope) | Write |
auth_status | Auth Status | Whether 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_now | Buy Listing at the Ask | Buys 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_tickets | Buy Tickets | Buy 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_listing | Take Listing Down | Takes 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_offer | Cancel My Offer | Cancels 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_offer | Cancel My Open Offer | Closes 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_listing | check_listing | - | No | Read |
create_listing | List Tickets for Sale | Lists 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_plan | Get Discovery Plan | - | Yes (OAuth scope) | Write |
get_event_details | Get Event Details | The 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. | No | Read |
get_listening_assignment | Get Listening Job | - | Yes (OAuth scope) | Write |
get_market_read | Read the Market | What 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. | No | Read |
get_my_listing_status | Get My Listing Status | One 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_offers | Get My Offers | The 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_orders | Get My Orders | The 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_tickets | Get My Tickets | Tickets 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_wallet | Get My Wallet | The 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_listing | Get Open Listing | One 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_offer | Open Offer Detail | One 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_status | Get Order Status | One 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_history | Price History | One 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. | 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 | Recent 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. | No | Read |
get_seat_map | Seat Map | The 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. | No | Read |
get_ticket_listings | Get Ticket Listings | The 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. | No | Read |
get_user_account | Get User Account | The 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_details | Get Venue Details | One 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. | No | Read |
list_muted_listings | List Muted Listings | The 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_listings | List My Listings | The 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_offers | My Open Offers | The 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_listings | List Open Listings | Fan 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_prompts | List Prompts | List available MCP prompts (workflows) for clients that only support tools/call. | Yes (OAuth scope) | Read |
mute_listing | Mute Listing | Mutes 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_offer | Reject Offer | Rejects 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_intent | Resolve Event From Post | - | No | Read |
search_events | Search Events | Find 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. | No | Read |
search_market | Search the Market | The 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. | No | Read |
search_performers | Search Performers | Find 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. | No | Read |
search_venues | Search Venues | Find 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. | 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 |
discover_and_listen | 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, open offers, Quality XPerience Guarantee), and when to use XP. |
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, open offers, and the Quality XPerience Guarantee. |