Lorcana MCP服务器
](https://lobehub.com/mcp/danielenricocahall-lorcana-mcp)
用于搜索和聚合迪士尼Lorcana卡的MCP服务器。
启动行为
启动时,服务器从以下位置获取JSON卡列表 https://danielenricocahall.github.io/lorcana-mcp/allCards.json。快照每天由刷新 data_pipeline/fetch_cards.py,它从 洛卡斯特API,将每张卡规范化为我们的内部模式,并将列表发布到 gh-pages 支。中间层将正在运行的容器与Lorcast的可用性和速率限制隔离开来——运行时从不直接调用Lorcast。
卡片以Python列表的形式保存在内存中,用于快速过滤。大约有2270张唯一的卡片(每张卡片都有一个 printings 数组的备用集/稀有集)这是轻量级的,不需要外部数据库。本地JSON文件缓存(LORCANA_CACHE_PATH,默认值 cards.json)让服务器在后续启动时跳过网络获取。
启动数据加载由以下方式控制:
LORCANA_REFRESH_ON_STARTUP:
- true:始终从API获取并重新填充存储 - false:使用现有缓存(如果可用)
LORCANA_SKIP_IF_DB_EXISTS:
- true (默认):如果缓存文件已包含卡片,则跳过API获取 - false:获取并重新填充
快速启动(无需克隆)
docker pull ghcr.io/danielenricocahall/lorcana-mcp:latest
docker run --rm -i ghcr.io/danielenricocahall/lorcana-mcp:latest要在容器重新启动时持久化卡缓存,请装载一个卷:
docker run --rm -i \
-e LORCANA_CACHE_PATH=/data/cards.json \
-e LORCANA_SKIP_IF_DB_EXISTS=true \
-v lorcana_mcp_data:/data \
ghcr.io/danielenricocahall/lorcana-mcp:latest在本地运行(stdio MCP)
uv run python main.py码头工人
塑造形象
docker build -t lorcana-mcp:latest .作为stdio MCP服务器运行
docker run --rm -i lorcana-mcp:latestDocker Compose
从作曲开始
docker compose build
docker compose run --rm -T lorcana-mcp笔记:
- 无外露端口;MCP通信通过stdio。
- 使用卷在重新启动时持久化JSON缓存。
配置
LORCANA_API(默认值:https://danielenricocahall.github.io/lorcana-mcp/allCards.json)LORCANA_CACHE_PATH(默认值:cards.json)--用于缓存取出的卡的本地文件LORCANA_HTTP_TIMEOUT_SECONDS(默认值:60)LORCANA_REFRESH_ON_STARTUP(false默认)LORCANA_SKIP_IF_DB_EXISTS(true默认)
MCP客户端设置示例
本地进程(克劳德桌面风格)
{
"mcpServers": {
"lorcana": {
"command": "uv",
"args": ["run", "python", "/absolute/path/to/lorcana-mcp/main.py"]
}
}
}已发布图像——GHCR(克劳德桌面风格,无需克隆)
{
"mcpServers": {
"lorcana": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"ghcr.io/danielenricocahall/lorcana-mcp:latest"
]
}
}
}Docker进程(克劳德桌面风格,本地构建)
{
"mcpServers": {
"lorcana": {
"command": "docker",
"args": [
"run",
"--rm",
"-i",
"lorcana-mcp:latest"
]
}
}
}Docker编写过程(克劳德桌面风格)
{
"mcpServers": {
"lorcana": {
"command": "docker",
"args": ["compose", "run", "--rm", "-T", "lorcana-mcp"]
}
}
}通过Claude CLI发布映像(全局,无需克隆)
claude mcp add --scope user \
-- lorcana docker run --rm -i \
ghcr.io/danielenricocahall/lorcana-mcp:latest通过Claude CLI——本地构建
claude mcp add --scope user \
-- lorcana docker run --rm -i lorcana-mcp:latest示例问题
连接到MCP客户端后,您可以问自然语言问题,如:
卡片查询
- “给我看所有名为Moana的卡片”
- “《毛伊岛英雄》这张卡有什么作用?”
- “查找所有传奇琥珀卡”
甲板建筑
- “至少有3种强度的最便宜的红宝石字符是什么?”
- “给我看看4美元或更低的可墨水蓝宝石卡”
- “找到有5个或更多意志力的钢铁字符”
- “祖母绿中存在哪些3孔字符?”
关键字和能力搜索
- “有多少张歌手卡5美元?”
- “第一组中有多少个逃避角色?”
- “有多少红宝石卡有鲁莽?”
- “查找文本中包含Ward的所有卡片”
- “给我看看紫水晶的移位卡”
统计和聚合
- “每组有多少张牌?”
- “所有卡片的颜色分布是什么?”
- “最常见的特征是什么?”
- “给我看看墨水曲线——每种成本有多少张卡?”
- “有多少张传奇牌是可以印的?”
交叉筛选查询
- “有多少琥珀字符有3个或更多的传说?”
- “在钢中找到具有高强度(4+)的廉价(成本2-3)字符”
- “第1组中有多少张牌具有规避性且价格低于4?”
注: 对于普通关键字查询(Evasive、Bodyguard、Shift等),请使用keyword参数——它根据结构化能力列表进行过滤,比子字符串搜索更可靠。对于特定值的查询,如Singer 5或Resist +2,使用body_text(关键字值存在于卡片的全文中,而不是能力列表中)。
MCP工具
search_cards--过滤和检索卡对象(支持response_format="toon"减少约10%的代币)count_cards--计数与过滤器匹配的卡片,但不返回完整对象aggregate_cards--卡片计数按以下方式分组cost(墨水曲线),rarity,color,set_code,或typeresolve_card--将非正式/部分/拼写错误的卡名与最近的卡进行模糊匹配(返回完整的卡数据)top_traits--所有卡片上最常见的特征export_deck--将套牌渲染为Dreamborn/Pixelborn兼容的文本套牌列表import_deck--解析Dreamborn/Pixelborn风格的牌组列表,返回已解析的牌以及任何带有模糊候选的未解析行validate_deck--对照格式规则检查一副牌(≥60张牌,最多4份,≤2支墨水);回报{legal, total_cards, inks, violations}deck_stats--计算套色的墨水曲线、颜色分割、可墨数和类型细分server_status--启动元数据(卡数、配置)
MCP提示
build_deck(colors, playstyle="balanced")--引导模型按照要求的颜色和游戏风格组装一副合法的Lorcana牌组(最少60张牌,≤2支墨水,最多4张任何一张牌)(aggressive/control/lore-race/balanced).使用上述搜索/聚合工具以及服务器指令中嵌入的规则。
TOON响应格式
search_cards 接受a response_format 论点:
"json"(默认)--卡片对象列表,与之前的版本保持不变。
示例(search_cards(name="elsa", limit=2, response_format="toon")):
cards[2]:
- id: crd_01c4835a62df4960bb973aeff81f2bb2
name: Elsa
version: Ice Maker
full_name: Elsa - Ice Maker
cost: 7
...
printings[3]{set_code,set_name,number,rarity}:
"7",Archazia's Island,69,Super Rare
C2,Lorcana Challenge Year 3,2,Promo
C2,Lorcana Challenge Year 3,6,Promo
- id: crd_04bca46a8e2d4e9ba0fbdbfc6c99e51e
name: Elsa
...外表 cards[2]: 回到每卡块的YAML风格(而不是一个表格),因为卡的形状各不相同——例如,动作和项目没有力量/意志力/知识。内部 printings[N]{...}: 由于每次打印都有相同的四个字段,因此块是完全表格化的。
基准
用以下方式测量 benchmarks/bench_toon.py 针对实时~2270卡数据集(合并后),使用tiktoken进行标记 cl100k_base (用作Claude标记器的代理):
| 查询 | 行 | JSON标记 | TOON标记 | Δ |
|---|---|---|---|---|
color="amber", limit=200 | 200 | 43,672 | 39,282 | −10.1% |
color="ruby", limit=50 | 50 | 10,446 | 9,464 | −9.4% |
card_type="action", limit=50 (稀疏列) | 50 | 10150 | 9265 | −8.7% |
body_text="when", limit=50 (长全文) | 50 | 11574 | 10380 | −10.3% |
name="elsa", limit=20 | 14 | 3,456 | 2,925 | −15.4% |
| 总计 | 79,298 | 71,316 | −10.1% |
注意:TOON在这里的相对节省比印刷整合之前要小(在PR-29之前,相同的查询显示减少了约50%)。这种差距是嵌套结构的 printings array——TOON的列式编码在顶级字段上获胜,但在每次打印条目内回落到JSON风格的编码,因此数组稀释了相对收益。与合并前的等效行数相比,绝对令牌计数仍然有意义地下降,因为每张唯一的卡现在都用一个小的打印列表表示一次,而不是作为1-3个单独的完整行。
复制 PYTHONPATH=. uv run python benchmarks/bench_toon.py (需要填充 cards.json 缓存)。
免责声明
这是一个私人的、非官方的粉丝和工程项目。它不隶属于迪士尼、Ravensburger或迪士尼Lorcana TCG团队,也不受其认可、赞助或审查。我只使用公开/社区数据源。所有迪士尼Lorcana TCG的名称、卡片文字、商标和相关知识产权均归迪士尼和Ravensburger所有。这个项目是非商业性的,只反映了我的个人观点,而不是我的雇主的观点。
