Trading card prices and grading ROI for 1.5M+ Pokémon, Magic, Yu-Gi-Oh! and sports cards. Read-only.
Model Context Protocol (MCP) Server: com.cardcenteringtool/card-prices
This MCP server provides read-only access to trading card price data and grading ROI. It covers 1.5M+ Pokémon, Magic, Yu-Gi-Oh!, and sports cards, supporting queries for card pricing and returns related to grading.
🛠️ Key Features
Trading card prices
Grading ROI calculations
Coverage for 1.5M+ Pokémon, Magic, Yu-Gi-Oh!, and sports cards
Read-only access
🚀 Use Cases
Look up current or reference trading card prices
Evaluate grading-related investment returns across supported card categories
⚡ Developer Benefits
Structured, programmatic access via MCP
Data scope spans major trading card ecosystems and sports cards
⚠️ Limitations
Read-only: no write, update, or administrative operations
Use this first when the user names a trading card and wants its value, price, or whether to grade it. Searches 1.5M+ Pokémon, Magic, Yu-Gi-Oh!, One Piece, Lorcana, sports (baseball, basketball, football, hockey, soccer, wrestling, UFC and more) and entertainment cards by name, set, number and year, returning ungraded and PSA 10 market prices in USD from real sold listings. Returns card ids for get_card_prices, grading_roi and get_price_history. Do not use for sealed product, for cards you already have an id for, or for price prediction.
Parameters4
query
string
required
Card name, optionally with set, number or year. Examples: "Umbreon VMAX Evolving Skies", "1986 Fleer Jordan", "Charizard base set 4/102".
game
string
optional
Restrict to one game or sport. Omit when unsure.
set_id
string
optional
Expansion id from list_sets, to search inside one set.
limit
integer
optional
Raw schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 2,
"maxLength": 80,
"description": "Card name, optionally with set, number or year. Examples: \"Umbreon VMAX Evolving Skies\", \"1986 Fleer Jordan\", \"Charizard base set 4/102\"."
},
"game": {
"type": "string",
"enum": [
"pokemon",
"magicthegathering",
"yugioh",
"onepiece",
"lorcana",
"riftbound",
"gundam",
"dragonball",
"digimon",
"baseball",
"basketball",
"football",
"hockey",
"soccer",
"wrestling",
"ufc",
"racing",
"tennis",
"golf",
"boxing",
"marvel",
"starwars",
"gpk",
"entertainment",
"othertcg"
],
"description": "Restrict to one game or sport. Omit when unsure."
},
"set_id": {
"type": "string",
"maxLength": 60,
"pattern": "^[a-zA-Z0-9_.-]*$",
"description": "Expansion id from list_sets, to search inside one set."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 50,
"default": 10
}
},
"required": [
"query"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_card_prices
Use this when the user wants the full current value of a specific card: ungraded prices by condition (NM/LP/MP/HP) and graded prices for every company and grade on record (PSA, CGC, BGS, SGC, TAG). Requires a card id from search_cards. Prices are USD market values from real sold listings, refreshed daily. Do not use to search by name.
Parameters1
card_id
string
required
Catalog card id from search_cards, e.g. "swsh7-215" or "pricecharting-1821843".
Raw schema
{
"type": "object",
"properties": {
"card_id": {
"type": "string",
"minLength": 1,
"maxLength": 80,
"description": "Catalog card id from search_cards, e.g. \"swsh7-215\" or \"pricecharting-1821843\"."
}
},
"required": [
"card_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
grading_roi
Use this when the user asks whether a card is worth grading, submitting to PSA/CGC/BGS/SGC/TAG, or what a PSA 10 adds. Returns raw vs PSA 9 vs PSA 10 market prices, the gem premium, net profit after grading fees per outcome, expected value by gem probability, the break-even gem rate, which company pays most, and a plain-language verdict. Requires a card id from search_cards. It does not assess the condition of the user's copy.
Parameters2
card_id
string
required
Catalog card id from search_cards.
grading_fee_usd
number
optional
Grading fee to assume. Defaults to a $25 economy tier; the table also shows $50 and $150.
Raw schema
{
"type": "object",
"properties": {
"card_id": {
"type": "string",
"minLength": 1,
"maxLength": 80,
"description": "Catalog card id from search_cards."
},
"grading_fee_usd": {
"type": "number",
"minimum": 0,
"maximum": 5000,
"description": "Grading fee to assume. Defaults to a $25 economy tier; the table also shows $50 and $150."
}
},
"required": [
"card_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
get_price_history
Use this when the user asks how a card's price has changed over weeks or months, or wants a trend for the raw or a PSA-graded series. Returns dated USD market values for the last 7 to 180 days. Requires a card id from search_cards. Do not use for forecasts.
Parameters3
card_id
string
required
Catalog card id from search_cards.
days
integer
optional
grade
string
optional
PSA grade for a graded series, e.g. "10" or "9". Omit for the raw (ungraded) series.
Raw schema
{
"type": "object",
"properties": {
"card_id": {
"type": "string",
"minLength": 1,
"maxLength": 80,
"description": "Catalog card id from search_cards."
},
"days": {
"type": "integer",
"minimum": 7,
"maximum": 180,
"default": 90
},
"grade": {
"type": "string",
"maxLength": 10,
"description": "PSA grade for a graded series, e.g. \"10\" or \"9\". Omit for the raw (ungraded) series."
}
},
"required": [
"card_id"
],
"additionalProperties": false,
"$schema": "http://json-schema.org/draft-07/schema#"
}
best_cards_to_grade
Use this when the user asks which cards in a game, sport or set have the biggest payoff from grading. Ranks priced cards by expected net profit at a 50% gem rate (half PSA 10, half PSA 9, minus raw and the fee), requiring both PSA 9 and PSA 10 prices so thin-market outliers are excluded. Returns card ids for grading_roi. Do not use for a single named card.
Parameters4
game
string
required
Game or sport to rank.
set_slug
string
optional
Optional set slug (as used on /sets/<game>/<slug>) to rank inside one set.
Use this when the user asks which cards are rising, hot, spiking, crashing or trending, in one game or across all games. Returns the biggest 30-day gainers (or drops) with the percentage change, measured on the PSA 10 price where the card has one and on the raw price otherwise; moves over 300% are excluded as bad data. Do not use for a single named card or for long-term history.
Use this when the user wants cards that are both rising in price and easy to sell: recent gainers filtered to cards with at least 25 recorded sales a year and a raw price of at least $5, across all games and sports. Better than trending_cards for flipping or selling decisions. Do not use for a single named card.
Use this to find the set id for a game or sport (e.g. "Evolving Skies", "2019 Panini Prizm") before calling get_set_cards, or when the user asks which sets exist. Newest first. Do not use to price a single card.
Parameters3
game
string
required
query
string
optional
Optional substring to filter set names, e.g. "evolving" or "2019 prizm".
Use this when the user wants the most valuable cards in a specific set or a priced checklist of a set. Requires a set id from list_sets. Returns raw and PSA 10 USD prices per card. Do not use for a single named card; use search_cards instead.
Parameters4
game
string
required
set_id
string
required
Expansion id from list_sets.
sort
string
optional
"value" = most valuable first; "number" = checklist order.
Trading-card market prices and grading ROI as Model Context Protocol
tools. Read-only, no account, no API key. Powers the Midpoint Card Prices plugin in ChatGPT and works
with Claude, Claude Code, Cursor and any MCP client.
Data: 1.5M+ Pokémon, Magic, Yu-Gi-Oh!, One Piece, Lorcana, Gundam, sports and entertainment cards; USD
market values from real sold listings, refreshed daily. Same data as https://www.cardcenteringtool.com/prices.
What you can ask
Plain questions in a collector's words. The assistant picks the tool, finds the card and answers with
prices, the capture date and a link to the card page.
"What is a PSA 10 Base Set Charizard worth?" · "Is my Umbreon VMAX alt art worth grading?"
"1986 Fleer Michael Jordan raw and PSA 10 price" · "Luka Doncic Prizm Silver rookie value"
"Alpha Black Lotus price" · "LOB-001 Blue-Eyes White Dragon 1st edition" · "OP-01 Manga Luffy"
"Which Pokémon cards jumped the most this month?" · "Which rising cards actually sell?"
"Most valuable cards in Evolving Skies" · "Best basketball cards to grade"
Every answer can include raw prices by condition (NM/LP/MP/HP), the graded ladder for PSA, CGC, BGS, SGC
and TAG, the PSA 9 and PSA 10 premium over raw, net profit after $25/$50/$150 fees, expected value by gem
rate, the break-even gem rate, 7–180 days of price history, 30-day movers, liquid movers, best cards to
grade, and priced set checklists.
Coverage: Pokémon, Magic: The Gathering, Yu-Gi-Oh!, One Piece, Disney Lorcana, Riftbound, Gundam, Dragon
Ball, Digimon; baseball, basketball, football, hockey, soccer, wrestling, UFC, racing, tennis, golf, boxing;
Marvel, Star Wars, Garbage Pail Kids and other entertainment and TCG sets.
Installation
Remote server, nothing to install. Add it to any MCP client that supports HTTP servers:
ChatGPT: install Midpoint Card Prices from the plugin directory, or in Developer Mode add a
connector with the endpoint.
Claude (web, desktop, mobile): Customize → Connectors → Add custom connector → paste the endpoint.
Claude Code:claude mcp add --transport http midpoint https://mcp.cardcenteringtool.com/mcp
Cursor / Windsurf / others: paste the JSON above into the client's MCP settings.
MCP Inspector:npx @modelcontextprotocol/inspector and connect to the endpoint.
No authentication. Streamable HTTP transport. Rate limited per client IP.
Tools
search_cards
Find cards by name, set, number or year and return raw and PSA 10 USD prices with the card id.
Inputs:query, game?, set_id?, limit?
get_card_prices
Full price ladder for one card: raw by condition (NM/LP/MP/HP) and graded prices for PSA, CGC, BGS, SGC and TAG by grade.
The ladder is for the card's primary printing (variant, e.g. "holofoil"); other printings of the same id
(reverse holo, 1st edition…) come back separately under other_variants and are never mixed in. raw_note is
set when the raw ladder is out of condition order (thin data).
Inputs:card_id
grading_roi
Is this card worth grading? Raw vs PSA 9 vs PSA 10, gem premium, net profit after $25/$50/$150 fees, expected value by gem rate, break-even gem rate, which company pays most, and a plain verdict.
Inputs:card_id, grading_fee_usd?
get_price_history
Dated market values over 7 to 180 days for the raw series or a PSA grade (1–10, half grades allowed). The series
follows one printing (variant). coverage says how many of the days have a capture and how to read repeated or
sparse values: a value repeated on consecutive days is an unchanged market estimate, not a frozen market.
Inputs:card_id, days?, grade?
best_cards_to_grade
Cards with the biggest expected net profit from grading in a game or set (half PSA 10, half PSA 9, minus raw and the fee; both graded prices required).
Inputs:game, set_slug?, grading_fee_usd?, limit?
trending_cards
Biggest 30-day gainers or drops, one game or all.
Inputs:game?, direction?, min_market_usd?, limit?
liquid_movers
Rising cards (30-day change > 0) with a recorded sales count of 25+ in the last year. Each candidate's own 40-day
series is checked first (enough captures, stable baseline, no one-capture jump); unstable ones are dropped and
counted in excluded_unstable. trending_cards applies the same check. Cards whose source does not
track yearly volume are excluded unless include_unknown_volume is set.
Inputs:game?, include_unknown_volume?, limit?
list_sets
Sets and expansions for a game, newest first, with ids.
Inputs:game, query?, limit?
get_set_cards
Priced checklist or most valuable cards in a set.
Inputs:game, set_id, sort?, limit?
Every tool is read-only (readOnlyHint: true, destructiveHint: false, openWorldHint: false), returns
structuredContent with an output schema, and links back to the matching page on cardcenteringtool.com.
Card ids are the public URL keys (swsh7-215, pricecharting-1821843).
Game keys: pokemon magicthegathering yugioh onepiece lorcana riftbound gundam dragonball digimon baseball basketball football hockey soccer wrestling ufc racing tennis golf boxing marvel starwars gpk entertainment othertcg.
Discord bot
The same nine tools as slash commands (/price, /grade, /history, /trending, /movers,
/set), answered as embeds. Source in src/discord/, built by the same npm run build, run
with npm run start:discord (or Dockerfile.discord as a second Coolify app). It is a plain
HTTP client of the public server: no database, no secrets beyond the bot token. The server
labels its calls and links as client discord.
Environment: DISCORD_BOT_TOKEN, DISCORD_CLIENT_ID (both from the Discord Developer Portal →
your application → Bot / General Information), optional MCP_URL (defaults to production) and
APP_LINK (defaults to https://www.cardcenteringtool.com/go/discord). Invite URL:
https://discord.com/oauth2/authorize?client_id=<CLIENT_ID>&scope=bot%20applications.commands&permissions=2048
(Send Messages). Commands are registered globally on boot; Discord can take up to an hour to
show them in every server after the first registration.