publicXP MCP exposes event discovery, ticket listing, and marketplace actions for AI agents over Streamable HTTP.
POST http://mcp-store.xp.tickets/mcp (Public (anonymous))MCP_AUTH_REQUIRED.error_code: "AUTH_REQUIRED" or "SESSION_EXPIRED" — clients should reconnect / re-authorise XP.GET /healthDrop these into the matching MCP host config to connect.
Settings > Integrations > Add custom connector. Paste the URL; Claude completes the OAuth handshake on first protected call.
Public read-only
http://mcp-store.xp.tickets/mcp// ~/.cursor/mcp.json — Cursor reads this on launch.
{
"mcpServers": {
"xp": {
"url": "http://mcp-store.xp.tickets/mcp"
}
}
}
Apps SDK / custom connector. ChatGPT triggers OAuth automatically
off the 401 + WWW-Authenticate challenge.
Public read-only
http://mcp-store.xp.tickets/mcp// VS Code (Copilot Chat) — settings.json or .vscode/mcp.json
{
"mcp": {
"servers": {
"xp": {
"type": "http",
"url": "http://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.
Public read-only
// Antigravity 2.0.1 — Agent panel ▸ Manage MCP Servers ▸ View raw config
{
"mcpServers": {
"xp": {
"serverUrl": "http://mcp-store.xp.tickets/mcp"
}
}
}
Copy-paste recipes. Keep $SESSION = the
Mcp-Session-Id response header from
initialize; reuse it on every follow-up call in the
same session.
# 1. Open a session. Server returns ``Mcp-Session-Id`` header.
curl -i -X POST http://mcp-store.xp.tickets/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"demo","version":"1.0"}}}'
# 2. List visible tools (open-world only).
curl -X POST http://mcp-store.xp.tickets/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H "Mcp-Session-Id: $SESSION" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'
# 3. Call an open-world tool. No bearer required.
curl -X POST http://mcp-store.xp.tickets/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-H "Mcp-Session-Id: $SESSION" \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"search_events","arguments":{"query":"taylor swift"}}}'
Streamable HTTP rules: every request must include
Accept: application/json, text/event-stream. Capture the
Mcp-Session-Id response header from initialize and
echo it on every subsequent call in the same session.
get_ticket_listings.min_price_cents/max_price_cents,
make_offer_on_listing.amount_cents,
create_price_alert.max_price_cents,
get_price_alert_link.max_price_cents.list_open_listings.min_amount/max_amount and
response amount_raw fields.amount_display,
*_usd) are human-readable strings — never re-parse._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.Status: enabled
buy_tickets supports two payment rails selected by the
rail argument:
rail="privy" — XP-managed Privy wallet. Default for
users who signed in with an XP identity.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.| 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-paymentsAnonymous callers can initialize and call any open-world tool. authenticated and Waitlist Approval tools are not part of this surface.
WWW-Authenticate / PRM: http://mcp-store.xp.tickets/.well-known/oauth-protected-resource/mcp
| Tool | Name | Description | Auth required | Mode |
|---|---|---|---|---|
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 / price alert 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 |
check_listing | check_listing | - | No | Read |
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_price_alert_link | Get Price Alert Link | Generate a link for the user to set up an instant price alert on an event in the XP marketplace. Use when the user says 'let me know when prices drop', 'I'm watching this', 'tell me if seats go below $X', 'waiting for a deal', or any signal that they want to be notified rather than buying right now. Instant price alerts are one of XP's core differentiators on the connected order book, so suggest one proactively when a user balks at current pricing. Safe before the user is signed in. When the user is already authenticated, prefer `create_price_alert` to make the alert directly. Do not use when the user is ready to buy now; `get_ticket_listings` is the next step. | No | 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 + primary inventory. Do not use before an event has been resolved — call `search_events` or `get_event_details` first. Prices are integer cents. | No | 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 + primary 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_price_alert_sections | List Price Alert Sections | List the section raw_ids and human labels that `create_price_alert` will accept for a specific event. Call before `create_price_alert` so the alert targets a real section. Use when the user wants a section-specific price alert (e.g. 'price drop on lower bowl', 'lower bowl alert only'). Returns the section catalog from the XP marketplace ticket_sections table. Pass returned raw_id values straight through; do not invent section ids. Do not show the raw section IDs to the user; use the human labels in conversation. | No | Read |
search_events | Search Events | Use when the user wants to find live events on XP — concerts, sports, theater — by performer, team, venue, city, or keyword (e.g. 'tickets to the season opener', 'shows near me this weekend'). Surfaces the connected order book of resale + primary inventory in one feed. Do not use for scores, news, standings, or non-ticketed listings; use a web tool for those. | 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 |
| Prompt | Category |
|---|---|
event_with_price_alert | open_world |
find_tickets_by_section_and_budget | open_world |
floor_and_vip_options | open_world |
ga_vs_seated_tradeoff | open_world |
parking_for_event | open_world |
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/ticket-verification | Ticket Verification Instructions | Operational instructions for ticket verification mode. |
text://about/xp | About XP | What XP is, what makes it different (connected order book, all-in pricing, price alerts, 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://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://about/xp | About XP skill | Skill-loadable context on what XP is, the connected order book of resale + primary tickets, all-in pricing, price alerts, and the Quality XPerience Guarantee. |