NeoSatoshi Card Recognition

io.github.Cookiebreed由 GitHub 帳號 Cookiebreed 發布v0.7.0更新於 Nov 4, 2026

Identify trading and football cards in a photo, search and correct them, with Cardmarket prices.

概覽

AI 產生的概覽

透過 NeoSatoshi API 辨識照片中的集換式卡牌與足球卡,回傳系列、編號、稀有度與 Cardmarket 價格,並可匯出結果。

可以做什麼
  • 辨識本機圖片、公開圖片網址或 base64 資料中的卡牌,支援寶可夢、航海王、Lorcana、遊戲王、魔法風雲會、星際大戰:無限、數碼寶貝與足球卡
  • 批次辨識某個資料夾中的 JPEG/PNG 照片,並在該資料夾寫入新的 CSV 或 JSON 檔案
  • 搜尋卡牌目錄,並把辨識錯誤的卡牌更正為正確的目錄卡牌
  • 依 id 取得單張卡牌以更新價格,並列出支援的遊戲與匯出預設集
  • 將最多 20 次辨識結果匯出為 CSV/JSON,或 TCGPowerTools、Shopify、eBay Seller Hub 格式檔案
適用情境
適合讓助理依照片整理卡牌收藏、查詢 Cardmarket 價格與系列資訊、修正辨識錯誤的卡牌,或產生試算表與電商平台上架檔案,省去手動輸入。
執行需求
以 npm 套件 neosatoshi-card-mcp 透過 stdio 在本機執行,需要 Node.js 18 或更新版本。可選 NEOSATOSHI_API_KEY(需付費 NeoSatoshi 方案);未設定時使用公開示範金鑰,每個網路每天 10 次辨識。可選 NEOSATOSHI_ALLOWED_DIRS 限制可讀取圖片的資料夾。需要連線至 NeoSatoshi API 的網路存取。
安裝前請注意
使用自己的金鑰時,辨識、卡牌搜尋與查詢會消耗付費額度(每張辨識到的卡 1 點,每次搜尋或查詢 0.5 點);示範金鑰每個網路每天僅 10 次辨識。照片、圖片網址或 base64 資料會傳送到 NeoSatoshi API,圖片網址由 API 自行抓取。recognize_folder 會在所讀取的資料夾中寫入新的 CSV/JSON 檔案;建議設定 NEOSATOSHI_ALLOWED_DIRS 限制助理可傳送的檔案範圍。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 NeoSatoshi Card Recognition,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。

其他 MCP 客戶端

參照 儲存庫 中的啟動說明。

README

NeoSatoshi Card Recognition MCP server

MCP server for the NeoSatoshi card recognition API: lets Claude, Cursor, Codex and other MCP clients identify Pokémon, One Piece, Disney Lorcana, Yu-Gi-Oh!, Magic: The Gathering, Star Wars: Unlimited, Digimon Card Game and football (soccer) cards in a photo (binder pages work, football one card per photo) and get set, number, rarity, Cardmarket ID and daily prices as JSON (football: player, release and parallel), and search the card catalog.

  • Transport: stdio
  • npm package: neosatoshi-card-mcp, binary neosatoshi-card-mcp
  • Node.js 18 or newer

Tools

recognize_cards

ArgumentTypeDescription
image_pathstringLocal .jpg, .jpeg or .png, at most 12 MB (football 4 MB). ~ is expanded.
image_urlstringPublic https:// URL of a JPEG or PNG. Forwarded to the API as is; the server never downloads it.
image_base64stringBase64 JPEG or PNG, a data:image/...;base64, prefix is accepted.
tcgenumpokemon (default), onepiece, lorcana, yugioh, magic, star_wars_unlimited, digimon, football

| include_images | boolean | Also return the catalog image of up to 10 recognised cards (from our CDN, at most 4 MB together), so the assistant can compare them with the photo. Default false. |

Give exactly one of image_path, image_url, image_base64. The result has a short text summary per card, the full API response as JSON text, and the same response as structuredContent. API errors come back as tool errors with the API's error code and message.

Example summary line:

1. Cinderace ex | Scarlet & Violet Black Star Promos (PR-SV) #163 | Promo | en | Cardmarket 796939 | trend 3.59 EUR | confidence 0.85 | 5 alternatives

Digimon line (alternative arts share the card number; the printing id and its variant follow the set):

1. WarGreymon | RELEASE SPECIAL BOOSTER Ver.1.0 [BT01-03] (BT1) #BT1-025 | BT1-025_P1 Alternative Art | SR | en | Cardmarket 620026 | trend 16.85 EUR | TCGplayer 9.54 USD | confidence 1

Digimon Card Game (digimon), English and Japanese: recognised by card number and name. When the picture cannot tell the alternative arts apart, print_unconfirmed is true, card_id is dg-c-<number> without a price, and the printings come as alternatives, each with its price, to pick with correct_card. Cardmarket prices (EUR) for English and Japanese printings, TCGplayer (USD) for English only. Older Digimon products (the 1999 card game, the 2000 trading cards) are not recognised.

Football line (no prices yet, the parallel is a suggestion a person should confirm):

1. Niklas Beste | 2025-26 Topps Chrome Bundesliga #BA-NBE | Base Cards Autograph Variation | Sport-Club Freiburg | parallel Gold Wave Refractor /50 (suggested, confirm it) | serial 37 | 2 alternatives | no price yet

When the client sends a progress token (Claude Code, Claude Desktop and most clients do), the detection is streamed and each card is reported as soon as it is recognised: on an 8 card Lorcana page the first card came after about 8 seconds, all eight after 11.

The API identifies cards; it does not grade condition (a PSA, BGS or CGC slab, for football also SGC, comes back with the grade read from the label). One card usually takes about 4 seconds, about 10 to 12 seconds on the first request after a quiet period; a binder page with 9 cards about 17 seconds; a football card about 6 to 25 seconds. The client waits up to 120 seconds.

recognize_folder

ArgumentTypeDescription
folderstringLocal folder with the photos (not its subfolders). ~ is expanded.
tcgenumOne game per folder. Default pokemon.
max_filesintegerAt most this many photos, in name order. Default 20, at most 100.
outputenumcsv (default), json (API format) or both, written as a new file into the folder.

One detection per photo, one credit per detected card. Existing files are never overwritten. It stops early on errors that would fail every photo (no credits, invalid key, demo limit). CSV columns: file, card_index, name, tcg, language, set_name, set_code, number, rarity, cardmarket_id, cardmarket_trend_eur, cardmarket_avg30_eur, tcgplayer_market_usd, confidence, graded, season, subset, parallel, request_id. Cells that start with =, +, - or @ get a leading ' so a spreadsheet does not run them.

search_cards

Search the card catalog; results are full card objects like a detection returns (set, number, rarity, Cardmarket product ID, daily prices, images), at most 10, with has_more but no total. With request_id and card_index from recognize_cards it is a free correction search (5 per detected card within 24 hours, at most 5 results). Without them it is the paid card search: 0.5 credits when it returns a card.

Football: {"tcg": "football", "q": "kane chrome 2023"}, only q (the player, optionally with set or season words), no language, set or number, no prices yet. Each result carries ref for get_card.

correct_card

Correct a detected card to the right catalog card (card_id from a correction search or from the card's alternatives). Free, within 24 hours, 3 times per card, only for the key that made the detection.

get_card

One card by its card_id, for example to refresh a price. 0.5 credits when the card exists. For a wrong detection use search_cards with request_id and correct_card instead, both free.

Football: pass ref from the search_cards result (same key, within 24 hours). The card then comes with all parallels of its subset and their print runs. Without a valid ref the call is refused and free.

export_cards

The cards of up to 20 detections (request_ids of recognize_cards or recognize_folder, within 48 hours) as the same file the NeoSatoshi website exports, built by the website's own export code: your condition for new cards, corrections made with correct_card, your saved presets, price rules and templates apply.

  • format csv/json (default csv): the custom export. preset (a saved preset id), or fields and json_mode (api = the documented card shape, custom = your fields).
  • format tcgpowertools: the TCGPowerTools CSV for Cardmarket (your TCGPowerTools rules and saved comment; comment).
  • format shopify: the Shopify product CSV, prices in the store currency (store_currency, else read from your connected store; variant_mode).
  • format ebay: the eBay Seller Hub CSV for one site (marketplace, e.g. EBAY_DE; one_row_per_card).
  • For the last three: price_source, min_price, markup_percent and rounding, like the buttons of the website's pricing step (a markup or rounding replaces your saved price rules; markup_percent 0 = none). save_to_folder writes a new file into an allowed folder (never overwrites), otherwise the file comes back in the answer (up to 100 KB). Free, own key only (demo detections keep no cards), not for football yet. The answer names cards it left out (skipped) and cards whose price depends on a special version (warnings).

list_export_presets

Your saved export presets (plus the built-in recommended CSV) and every field id export_cards takes. Free.

list_supported_games

Games, card languages, tcg values, limits and card search prices. No API call, no cost.

Cost

CallOwn keyDemo key
recognize_cards1 credit per detected card, nothing without a card10 per day per network
search_cards (card search), get_card0.5 credits when a card comes back10 searches, 3 lookups per day per network, never charged
search_cards with request_id, correct_cardfreefree
export_cards, list_export_presetsfree, 200 exports per daynot available (demo detections keep no cards)

Configuration

VariableRequiredDescription
NEOSATOSHI_API_KEYnoYour API key from https://neosatoshi.com/dashboard/settings/settings#api-keys (any paid plan). Without it the public demo key is used: 10 detections per day per network.
NEOSATOSHI_ALLOWED_DIRSnoDirectories image_path may read from, separated by : (; on Windows). Unset means any readable image file. Set it to limit what an assistant can send.

Setup

Claude Code

bash
claude mcp add neosatoshi-cards -e NEOSATOSHI_API_KEY=your_key -- npx -y neosatoshi-card-mcp

With a directory restriction:

bash
claude mcp add neosatoshi-cards -e NEOSATOSHI_API_KEY=your_key -e NEOSATOSHI_ALLOWED_DIRS="$HOME/Pictures/cards" -- npx -y neosatoshi-card-mcp

Leave out -e NEOSATOSHI_API_KEY=... to try it with the demo key.

Claude Desktop, one click

Download neosatoshi-card-mcp.mcpb and open it: Claude Desktop installs the extension and asks for the optional API key and an optional allowed folder. Node.js comes with Claude Desktop.

Build it yourself with npm run build:mcpb (needs the dev dependencies).

Claude Desktop, by hand

Add to claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json, Windows: %APPDATA%\Claude\claude_desktop_config.json):

json
{  "mcpServers": {    "neosatoshi-cards": {      "command": "npx",      "args": ["-y", "neosatoshi-card-mcp"],      "env": {        "NEOSATOSHI_API_KEY": "your_key",        "NEOSATOSHI_ALLOWED_DIRS": "/Users/you/Pictures/cards"      }    }  }}

Cursor

~/.cursor/mcp.json (global) or .cursor/mcp.json (project):

json
{  "mcpServers": {    "neosatoshi-cards": {      "command": "npx",      "args": ["-y", "neosatoshi-card-mcp"],      "env": { "NEOSATOSHI_API_KEY": "your_key" }    }  }}

Codex CLI

~/.codex/config.toml:

toml
[mcp_servers.neosatoshi-cards]command = "npx"args = ["-y", "neosatoshi-card-mcp"]env = { NEOSATOSHI_API_KEY = "your_key" }

From source

bash
cd mcp-servernpm installnpm run buildnode dist/index.js   # speaks MCP on stdin/stdout

Point any client at node /absolute/path/to/mcp-server/dist/index.js instead of npx.

Security

  • Files: only regular files are read. Directories, devices, sockets and pipes are refused. Symlinks are resolved first and the real target is checked. Only .jpg, .jpeg and .png whose content starts with JPEG or PNG magic bytes are accepted, at most 12 MB (football 4 MB).
  • NEOSATOSHI_ALLOWED_DIRS is checked against the resolved real path, so ../ and symlinks cannot escape it. Entries that do not exist grant nothing.
  • Network: the server only calls https://europe-west1-neosatoshi.cloudfunctions.net/detectApi and .../cardsApi, and with include_images our card image CDN https://d1m1gwcombja0u.cloudfront.net (other image hosts are skipped).
  • Writing: only recognize_folder writes, and only new files named neosatoshi_cards_<date>-<time>.csv / .json into the folder it read (same NEOSATOSHI_ALLOWED_DIRS check). image_url is passed to the API, which fetches and validates it; the server itself never fetches URLs.
  • No shell execution.
  • The API key is only sent in the Authorization header. It is never logged or returned, and it is scrubbed from error messages.

Development

bash
npm installnpm test     # builds, then runs node:test (file safety and tool tests with a fake fetch, no live API calls)

Publishing notes

  • server.json is for the official MCP registry (https://registry.modelcontextprotocol.io). Its name matches the mcpName in package.json (io.github.Cookiebreed/card-recognition-mcp); the registry checks GitHub ownership for io.github.* names.
  • smithery.yaml is for Smithery.
  • mcpb/manifest.json and scripts/build-mcpb.mjs build the Claude Desktop extension; upload neosatoshi-card-mcp.mcpb to each GitHub release under that exact name.

License

MIT for this code (see LICENSE). The API is a commercial service governed by https://neosatoshi.com/termsofuse .

來源:mcp-server/README.md,提交 0576594

工具

8

recognize_cards

Recognize trading cards in a photo

Identify trading cards in a photo with the NeoSatoshi card recognition API. Games: Pokémon (default), One Piece, Disney Lorcana, Yu-Gi-Oh! TCG, Magic: The Gathering, Star Wars: Unlimited and Digimon Card Game (English, Japanese), several cards per photo (binder pages work, one game per photo), and football (soccer) cards with tcg "football" (Topps, Panini and other makers; one card front per photo, max 4 MB). Returns per card: name, language, set, number, rarity, Cardmarket product ID, daily Cardmarket prices in EUR (TCGplayer USD where available), confidence and alternatives. Football cards instead: the player, release (set, number), season, subset, teams, rookie flag, a sure flag, alternatives and the parallel (three candidates with print runs, a pick only when the recognizer is sure; a person should confirm it). No prices and no images for football yet; it takes about 6 to 25 seconds. Digimon (tcg "digimon"): recognised by card number and name; alternative arts share the number, so the printing comes from the picture or stays open (print_unconfirmed) with the printings as alternatives. TCGplayer prices only for English Digimon printings. Older Digimon products (the 1999 card game, the 2000 trading cards) are not recognised. Graded slabs (PSA, BGS, CGC, for football also SGC) fill graded with the grade read from the label. It does not grade card condition. Give exactly one image source: image_path (local .jpg/.jpeg/.png, max 12 MB, football 4 MB), image_url (public https URL, forwarded to the API) or image_base64. Uses the API key in NEOSATOSHI_API_KEY; without it, the public demo key is used (10 detections per day per network). One card usually takes about 4 seconds, about 10 to 12 seconds on the first request after a quiet period; with a progress token the cards are reported one by one while a binder page is read. include_images: true adds the catalog image of up to 10 recognised cards, to compare them with the photo.

輸入參數tcgimage_urlimage_pathimage_base64include_images

recognize_folder

Recognize every card photo in a folder

Recognize all JPEG and PNG photos in one local folder (not its subfolders), one detection per photo, in name order, and write the cards to a new CSV file (and/or a JSON file in the API format) in that folder. CSV columns: file, card_index, name, tcg, language, set_name, set_code, number, rarity, cardmarket_id, Cardmarket trend and 30 day average in EUR, TCGplayer market in USD, confidence, graded, season, subset, parallel, request_id. Costs like recognize_cards: one credit per detected card. The demo key allows only 10 detections per day, so use your own key for folders. Stops at max_files (default 20, at most 100) and on errors that would fail every photo (no credits, invalid key, demo limit). Existing files are never overwritten. With a progress token each photo is reported as it is done.

輸入參數tcgfolder必填outputmax_files

search_cards

Search the card catalog

Search the NeoSatoshi card catalog. Results are full card objects like a detection returns (set, number, rarity, Cardmarket product ID, daily prices, images), at most 10, with has_more but no total. Use it first to fix a wrong detection: pass request_id and card_index from recognize_cards. That correction search is free (5 searches per detected card within 24 hours, at most 5 results), then call correct_card. Without request_id it is the paid card search: 0.5 credits when it returns a card, nothing for no result. Query: q (a card name, at least 3 letters, optionally with the number like "charizard 4/102", or a printed code like OP01-003; Digimon: a card number alone like BT1-025 works), or set + number. Wildcards and set-only or number-only queries are refused. Football (tcg "football"): q only, the player with optional set or season words ("kane chrome 2023"), no language, set or number, no prices yet; each result carries a ref for get_card. Football detections cannot be corrected yet.

輸入參數qsettcglimitnumberlanguagecard_indexrequest_id

correct_card

Correct a detected card

Correct a card of a detection to the right catalog card. Free, within 24 hours of the detection, 3 times per card, only for the API key that made the detection. card_id comes from a correction search result or from the detected card's alternatives. Returns the full corrected card. Corrections also improve the recognition. Yu-Gi-Oh!: card_id is the passcode, set the printed code (LOB-EN001) to pick a printing. Magic: card_id is the oracle_id with set + number for the printing. One Piece: cardmarket_id picks a parallel. Digimon: card_id is a printing id (dg-BT1-025_P1, dg-ja-BT1-025_P1) or dg-c-<number> while the printing is open.

輸入參數setnumbercard_id必填languagecard_index必填request_id必填cardmarket_id

get_card

Get one card by id

Get one card by its card_id (for example to refresh its price or resolve a stored id). 0.5 credits when the card exists, nothing for an unknown card. For a wrong detection use search_cards with request_id and correct_card instead: those are free. Football: pass the ref of a search_cards result (same API key, within 24 hours); the card then comes with all parallels of its subset and their print runs. Without a valid ref the call is refused and free.

輸入參數refsettcg必填numbercard_id必填languagecardmarket_id

export_cards

Export detected cards as CSV or JSON

Export the cards of up to 20 detections (request_id of recognize_cards or recognize_folder, within 48 hours) as the same file the NeoSatoshi website exports, built by the website's own export code: your account's condition for new cards, corrections made with correct_card, your saved settings, price rules and templates. Formats: csv/json (custom export; preset = a saved preset id from list_export_presets, or fields and json_mode "api"/"custom"), tcgpowertools (the TCGPowerTools CSV for Cardmarket), shopify (the Shopify product CSV, prices in the store currency) and ebay (the eBay Seller Hub CSV for one eBay site). Price options for tcgpowertools, shopify and ebay, like the buttons of the website's pricing step: price_source, min_price, markup_percent and rounding (a markup or rounding replaces your saved price rules; 0 = no markup). tcgpowertools: comment. shopify: store_currency, variant_mode. ebay: marketplace, one_row_per_card. Cards that cannot be exported are named in the answer, never guessed. Free (no credits). Needs your own API key (demo detections keep no cards) and exports enabled for the account. Football detections cannot be exported yet. save_to_folder writes the file into a local folder (allowed by NEOSATOSHI_ALLOWED_DIRS, never overwrites); without it the file content comes back in the answer (up to 100 KB).

輸入參數fieldsformatpresetcommentroundingjson_modemin_pricemarketplacerequest_ids必填price_sourcevariant_modemarkup_percent另有 3 個

list_export_presets

List export presets and fields

Lists the account's saved export presets (from the NeoSatoshi website, plus the built-in recommended CSV) and every field id export_cards takes. Free. Needs your own API key.

無需輸入參數。

list_supported_games

List supported games

Lists the games, card languages, tcg values and limits of the NeoSatoshi card recognition API. No API call, no cost.

無需輸入參數。

版本歷史

4
  1. v0.7.0最新Nov 4, 2026
  2. v0.6.0Nov 3, 2026
  3. v0.5.0Nov 3, 2026
  4. v0.4.1Nov 3, 2026

評分

已滿足適用檢查項的 80%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通25 分
  • 已宣告認證方式10 分

    請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。

  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

    請在儲存庫或註冊中心條目中宣告授權條款。