mtg价格au
MCP服务器用于查找澳大利亚魔术:收集卡零售价格。检查 MTG日期 和 澳大利亚卡中心 同时。
用例
快速评估Facebook拍卖或市场上的价格是否物有所值:
- 查看列表: *“MH1 NM的否定力——65澳元”*
- 问克劳德: *“65美元是否定力MH1的好价格吗?”*
- 克劳德打电话来
get_au_price适用于MTGMate+卡中心的澳大利亚零售 - 克劳德给出了一个结论:好交易/公平/定价过高vs零售
注: 此工具用于个人非商业用途。它为个人卡查找抓取公开列出的零售价格——它不是为批量数据收集或商业价格聚合而设计的。
设置
需要Python 3.11+和 紫外线.
uv sync使用克劳德代码注册
claude mcp add mtg-prices-au --scope user -- /bin/bash -c "cd /path/to/mtg-prices-au && .venv/bin/python -m src.server"替换 /path/to/mtg-prices-au 以及此存储库的实际路径。
这将在中生成以下条目 ~/.claude.json:
{
"mcpServers": {
"mtg-prices-au": {
"command": "/bin/bash",
"args": ["-c", "cd /path/to/mtg-prices-au && .venv/bin/python -m src.server"],
"type": "stdio"
}
}
}注: 这cd &&使用包装器代替cwd字段,因为VS代码扩展名 忽略cwd,当多个MCP服务器共享同一个MCP服务器时,会导致模块路径冲突-m src.server入口点。
工具: get_au_price
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
card_name | string | Yes | 卡片名称(例如“否定力”) |
set_code | string | 否 | 设置要筛选的代码(例如“MH1”) |
返回两个商店的澳元定价、库存水平和所有可用打印件。当 set_code 省略,返回所有打印结果,并突出显示每家商店最便宜的库存选项。如果一个存储失败,另一个存储的结果仍然会返回。
拆分和双面卡名(例如“磨损”)会自动处理——正面名称用于查找。
结果将缓存5分钟(如果一个源失败,则缓存1分钟)。缓存的响应包括 "cached": true 和 "lookup_time_ms": 0.
示例响应
{
"card_name": "Force of Negation",
"lookup_time_ms": 950,
"mtgmate": {
"url": "https://www.mtgmate.com.au/cards/Force_of_Negation",
"cheapest_in_stock": {
"name": "Force of Negation",
"set_name": "Modern Horizons",
"set_code": "MH1",
"collector_number": "52",
"price_aud": 87.0,
"stock": 4,
"url": "https://www.mtgmate.com.au/cards/Force_of_Negation/MH1/52",
"finish": "Nonfoil"
},
"all_printings": [...]
},
"cardhub": {
"url": "https://thecardhubaustralia.com.au/search?type=product&q=Force%20of%20Negation",
"cheapest_in_stock": {
"name": "Force of Negation",
"set_name": "Modern Horizons",
"set_code": "MH1",
"collector_number": "52",
"price_aud": 80.01,
"available": true,
"url": "https://thecardhubaustralia.com.au/products/force-of-negation-52-modern-horizons",
"finish": "Nonfoil",
"condition": "Near Mint"
},
"all_printings": [...]
}
}发展
# Run tests
uv run pytest -v
# Run a single test
uv run pytest tests/test_mtgmate.py::TestFetchCardPrices::test_cheapest_in_stock_selected -v
# Run the server directly (stdio)
uv run python -m src.server运作原理
MTG日期
MTGMate将所有卡定价数据以JSON格式嵌入React组件中(FilterableTable)在每张卡的列表页面上。服务器提取这种结构化数据,而不是抓取渲染的HTML,这既更可靠,又能在一个请求中为我们提供价格、库存计数、集合信息和完成类型。
关键细节:
- React JSON的价格如下 分 (例如。
8700=87.00澳元) - 始终使用所有打印列表页面(
/cards/Card_Name)--特定打印页面的JSON-LD定价已过时 - 需要一个Firefox用户代理标头(MTGMate对默认Python请求返回403)
- HTTP通过
urllib.request(stdlib),通过正则表达式提取的React props(不需要HTML解析库) - React JSON中包含缺货打印(
stock: 0)然后回来了all_printings
澳大利亚卡中心
Card Hub是一家Shopify商店。服务器使用两个Shopify JSON端点,不需要HTML解析:
- 搜索建议API (
/search/suggest.json)--发现与卡名匹配的产品(最多10个结果) - 产品JSON (
/products/{handle}.js)--获取每种产品的变体定价
关键细节:
- 产品JSON中的价格 分 (例如。
8422=84.22澳元) - 每种产品都有不同的状态(接近薄荷色,轻微演奏)x表面处理(无箔、箔)
- 从Shopify产品标签中提取设置代码(例如。
"MH1","2X2") - 可用性是布尔值(无库存计数)
- 产品提取同时运行(最多2名工人通过
ThreadPoolExecutor) - 仅限Stdlib(
urllib,json)--没有其他依赖关系
已知限制
- Card Hub建议API上限为10个结果。 具有许多打印的卡(例如基本焊盘、Sol Ring)可能会返回不完整的卡中心数据。当达到此限制时,服务器会记录。
- Card Hub可以提取多种产品。 每次打印都需要单独的
.js端点获取。这些并行运行(一次2个),但一张打印次数多的卡仍然比MTGMate的单请求方法花费更长的时间。结果将缓存5分钟,以避免冗余请求。 - 集合代码提取是启发式的。 Card Hub集合代码是从Shopify产品标签(大写字母数字字符串)推断出来的。这工作可靠,但如果Card Hub添加新的大写短标签,则可能会误判标签。
废钞
我们通过艰难的方式学到的东西——如果刮刀坏了,这很有用。
MTG日期
- 该网站不是服务器呈现的。 MTGMate是一个Rails+React应用程序。卡数据存在于
data-react-propsJSON属性FilterableTablediv,不在渲染的HTML中。如果抓取中断,请检查此组件是否已重命名或替换为客户端API获取。 - 两种页面类型,不同的数据。 列表页面(
/cards/Card_Name)有React道具和当前价格。具体打印页(/cards/Card_Name/SET/num)JSON-LD定价可能过时(观察到同一张卡的JSON-LD价格为83美元,而实际价格为87美元)。始终使用列表页面。 - 设置筛选的URL不存在。
/cards/Card_Name/SET(没有收集器编号)返回404。获取完整列表后,在客户端按设置代码过滤。 - 需要用户代理。 MTGMate将HTTP 403返回为默认的Python/cill用户代理字符串。Firefox UA标头绕过了这一点。无需Cloudflare,无需JS渲染,无需Cookie。
- 价格以美分为单位。 React JSON将价格存储为以美分为单位的整数(例如。
8700= $87.00).特定打印页面上的JSON-LD将它们存储为十进制字符串(例如。"83.00").
澳大利亚卡中心
- 这是一家Shopify商店。 这
/search/suggest.json和/products/{handle}.js端点是标准的Shopify。如果Card Hub从Shopify迁移出去,刮刀将完全断裂。 - 产品标题对卡片元数据进行编码。 格式
"Card Name (collector#) [Set Name]"是一致的,但不能保证。如果标题与预期模式不匹配,解析器会优雅地回退(返回没有设置元数据的卡片名称)。 - 标签包含设置的代码。 Shopify标签如
["MH1", "Modern Horizons", "R", ...]是设定代码的来源。标签排序无法保证,因此提取器会获取第一个2-5个字符的大写字母数字标签,该标签不是已知的非集合代码(条件等级、常见缩写)。 - 跳过零价格变体。 Card Hub使用价格=0作为“未定价”的标志,而不是“免费”。
