MCP HeartbeatTHE MCP OBSERVATORY
Public workspace

Explore

Evidence for your next connection.

Independent measurements of remote MCP servers. Every observation has a timestamp.

Read-only probes

MCP server · Code & DevOps

XP Tickets

Live-event ticket exchange for agents: quote, buy, make offers, bid, and sell, with escrow.

Checks passed
13 / 22

1 failed · 8 not measured

Median response
636 ms

Median of successful probes over 7 days

30-day uptime
Not measured

Share of countable probes over 30 days, including daily rollups. Auth challenges are excluded.

Discovered tools
36

Tool definitions returned by this server

Independent monitoring

Health & checks

Status history

Outdated check

Last connection measurement is over 24 hours old. Current availability is unknown.

Last checked
Check summary by test group
Test areaPassedFailedUnmeasured
ConnectionCan a client connect and discover tools?
500
Reliability & speedDoes it respond consistently and quickly?
004
Access & authenticationWhat is required to use this server?
102
Tool qualityAre the tool definitions usable by an agent?
400
Publisher identityCan the publisher be traced to its source?
312

Unmeasured means there is not enough evidence to decide. How these checks work

Inspect individual checks 22 recorded

Core

  • Pass
    Reachable

    Latest probe returned HTTP 200 in 636 ms.

  • Pass
    Valid handshake

    protocolVersion 2025-11-25, serverInfo.name XP.

  • Pass
    Lists tools

    tools/list returned 36 tools.

  • Pass
    Current protocol

    Negotiated 2025-11-25. The bar is 2025-06-18 or newer.

  • Pass
    HTTPS

    The endpoint URL is https.

Performance

  • Not measured
    Fast (p50)

    Median latency 636 ms over 1 samples in 7 days. The bar is 1000 ms. Need at least 5 samples.

  • Not measured
    Consistent (p95)

    95th percentile 636 ms over 1 samples in 7 days. The bar is 3000 ms. Need at least 20 samples.

  • Not measured
    Reliable (uptime)

    1 of 1 attempts returned a tool list in 30 days (100%). The bar is 99%. Need at least 30 samples.

  • Not measured
    Stable tool list

    Fewer than two successful probes in 30 days, so tool-list stability is not measured.

Access

  • Pass
    Open access

    tools/list succeeded with no credential, and the record declares none.

  • Not measured
    Standard auth

    Auth is not required, so the OAuth metadata check does not apply.

  • Not measured
    Free tier cited

    No publisher quote has been checked.

Tools

  • Pass
    Tools described

    Every tool description is at least 20 characters.

  • Pass
    Valid input schemas

    Every inputSchema is a JSON Schema object.

  • Pass
    Parameters documented

    119 of 119 parameters have a description (100%). The bar is 80%.

  • Pass
    Safety hints

    Every tool sets readOnlyHint or destructiveHint.

Publisher

  • Pass
    Verified namespace

    Listed in the Official MCP Registry.

  • Pass
    Website matches publisher

    The website host matches the reverse-domain namespace.

  • Fail
    Source repo linked

    No repository URL is on file.

  • Not measured
    Repo owner matches

    This namespace is not an io.github login, so the owner comparison does not apply.

  • Pass
    Recently updated

    Updated 2026-10-09T12:47:43.412164Z, within 180 days.

  • Not measured
    Open-source licence

    No GitHub repository to ask about a licence.

Start using XP Tickets

Connect to this server

Choose your client, copy the configuration, then enable the server in your client’s MCP settings.

Run this command in your terminal, then restart Claude Code.

Claude Code

claude mcp add --transport http xp-tickets https://mcp.xp.tickets/mcp

Capabilities

Tools 36

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.

Discovered
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.

Discovered
buy_listing_now

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.

Discovered
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'.

Discovered
cancel_my_listing

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.

Discovered
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.

Discovered
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.

Discovered
check_listing

Poll the current status and action feed for the listing tied to this call's correlation id. IDENTITY: the correlation id is never a tool argument. It must ride the ``X-XP-Correlation-Id`` HTTP header on every MCP request, exactly like on every other tool call for this job. A missing/invalid header returns a structured error (below) instead of failing the call -- this tool is open-world (no bearer/OAuth needed); holding the correlation id (an unguessable v4 uuid) is itself the access control. ARGS since: the ``cursor`` value returned by the previous call for this same correlation id. Omit (or pass null) on the first call to fetch the full action feed from the beginning. Must be >= 0; a negative value returns ``{"error": "invalid_since"}``. POLL LOOP: store ``cursor`` per correlation id in your own cache/store, send it back as ``since`` on the next call, and render only the new ``actions`` entries onto your own timeline -- the array already excludes anything at or before ``since`` and is empty when nothing changed. ``listing`` is a snapshot for cheap "current state" display only (quantity, bid count, bucket, ...); do not diff it yourself for history -- ``actions`` is the exact, ordered record (a bid placed and rescinded between two polls still yields both events). RESULT SCHEMA (``found: false`` -> every other field is null/absent; an unrecognized correlation id is not an error, just an empty result):: { "correlation_id": "<uuid>", "found": true, "verified": true, # identity confirmed when the listing was created "event_id": 406, # last event this correlation looked at "listing": { # null until a listing exists for this id "swap": "d5b03i1rbqqa", # public listing identifier (sell/checkout URLs) "created_at": "2026-08-12T14:00:00+00:00", "status_bucket": "open", # see BUCKETS below "event_id": 406, "quantity": 2, "bid_count": 3, "top_bid_amount": 12000, # cents, open bids, null if none "accepted_bid_amount": null, # cents, set once a bid is accepted "sold": false, "last_activity_at": "2026-08-12T14:05:00+00:00" }, "actions": [ # everything after `since`, oldest first, [] if nothing new {"id": 91234, "event": "listing_created", "at": "2026-08-12T14:00:00+00:00"}, {"id": 91288, "event": "bid_placed", "at": "2026-08-12T14:03:10+00:00", "amount": 12000} ], "cursor": 91301, # send back as `since` on the next call "actions_truncated": true # present+true only when 50+ new rows; call again with `cursor` to page } BUCKETS (listing.status_bucket) open - accepting bids, none accepted yet awaiting_tickets - a bid was accepted; seller hasn't transferred tickets yet buyer_has_tickets - tickets transferred; seller payout not yet finalized seller_payout - funds are ready to release to the seller zombies - stalled, no forward progress -- needs attention closed - terminal: cancelled, expired, or fully settled EVENT VOCABULARY (actions[].event; only bid/sale events carry `amount`, in cents) listing_created, bid_placed, bid_rescinded, bid_accepted, bid_rejected, tickets_transferred, funds_claimed, listing_cancelled, listing_expired, sale_completed NOTE: no separate payout-completion signal exists -- the agent-forward payout rail is retired; sellers claim funds normally (funds_claimed). FAILURES: this tool never raises and never returns an auth error (401). {"error": "missing_correlation_header", "message": "..."} - header missing/invalid {"error": "invalid_since"} - since < 0 {"error": "status_unavailable"} - backend down/slow/non-200

Discovered
create_listing

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.

Discovered
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.

Discovered
get_market_read

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.

Discovered
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.

Discovered
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.

Discovered
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.

Discovered
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.

Discovered
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.

Discovered
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.

Discovered
get_open_offer

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.

Discovered
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.

Discovered
get_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.

Discovered
get_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.

Discovered
get_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.

Discovered
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.

Discovered
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.

Discovered
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.

Discovered
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.

Discovered
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.

Discovered
list_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.

Discovered
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.

Discovered
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.

Discovered
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.

Discovered
resolve_intent

Find the XP event a post means, from the words it uses. XP decides the match, not the reader. Returns ranked candidates [{event_id, name, venue, city, date_utc, score (0-1), why, facts: {country, hours_until (null when the date or time is TBD), date_tbd, started, same_day}}], `ambiguous` (why no single event wins, e.g. "3 nights at Sphere", else null), `match` (matched, ambiguous or not_in_catalog: only whether XP found the event). A postponed event or a date more than two years out counts as TBD. Parking listings and cancelled events never match, and a tribute, themed or inspired show or a season-ticket package matches only when the post says so. An upcoming, certain show beats a past or if-necessary one unless the post names that date. same_day means within 24 hours, or today at the venue when only the time is TBD. Duplicate listings resolve to one event.

Discovered
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.

Discovered
search_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.

Discovered
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.

Discovered
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.

Discovered

Recent measurements

Probe history

View status
Latest stored probes. Raw probe rows are kept for 14 days.
CheckedResultResponseTools
Connected636 ms36