mcp-phish
mcp-phish
一个 MCP 服务器,它将 api.phish.net v5 和 phish.in v2 API 封装在统一的类型化工具界面之下。涵盖歌单、歌曲、即兴演奏图表、评论和音频的十二个工具。每个响应都通过冻结的 Pydantic 模型进行塑形,以确保在下游 API 发生变动时,线路格式保持稳定。
基于 FastMCP 和 Streamable HTTP 传输构建。专为在受信任的局域网或 Tailscale ACL 后运行而设计 — 没有内置的 MCP 级别身份验证。
为什么
目前 Phish.net + phish.in 生态系统由少量无人维护的封装器和一次性脚本组成。没有人能干净地将两者结合起来。mcp-phish 为任何支持 MCP 的客户端(Claude Code、Claude Desktop、自定义代理)提供了一个专注且类型良好的界面,用于回答 Phish 粉丝真正关心的问题:特定日期的歌单、歌曲首演和间隔、曲目的音频 URL、巡演的即兴演奏图表热门曲目。
数据源可能会变(实时 API → 缓存 → 仓库)。但返回给 MCP 客户端的 Pydantic 形状永远不会变。
快速入门
docker run --rm \
-p 3705:3705 \
-e STUB_MODE=true \
ghcr.io/pete-builds/mcp-phish:latest服务器默认以 存根模式 (stub mode) 启动。它返回真实的模拟数据,不需要网络访问或 API 密钥。将其注册到 Claude Code:
claude mcp add phish --transport http --scope user --url http://localhost:3705/mcp然后询问 Claude:“12/30/95 的歌单是什么?”,你应该会得到麦迪逊广场花园的演出信息,包含 Mike's > Simple > Weekapaug 的律动。
要连接到真实的 API,请在 api.phish.net/keys/ 注册一个免费密钥并关闭存根模式:
docker run --rm \
-p 3705:3705 \
-e STUB_MODE=false \
-e PHISHNET_API_KEY=<your-key> \
ghcr.io/pete-builds/mcp-phish:latest工具参考
工具 | 数据源 | 功能 |
| phish.net | 按年份 + 场地 + 城市/州/国家搜索演出。 |
| phish.net | 完整演出:歌单、评分、评论数、场地。 |
| phish.net | 最近的 N 场演出,按时间倒序排列。 |
| phish.net | 按标题片段搜索歌曲目录。 |
| phish.net | 单个歌曲记录:首演、最后演奏、间隔、总数。 |
| phish.net | 歌曲的每一次表演,按时间倒序排列。 |
| phish.net | 编辑精选的著名即兴演奏。 |
| phish.net | 演出的用户评论。 |
| phish.in | 演出的曲目列表 + MP3 URL + 时长。 |
| phish.in | 按 ID 获取单个音频曲目。 |
| phish.in | 单首歌曲的所有录音版本。 |
| meta | 服务器状态、限流状态、缓存统计。 |
每个工具都返回一个带有标准信封的 JSON 字符串:
{"data": <typed payload>}或者,在失败时:
{
"error": "human-readable message",
"code": "UPSTREAM_DOWN | NOT_FOUND | INVALID_INPUT | RATE_LIMITED | INTERNAL",
"details": { "...": "..." }
}src/mcp_phish/models.py 中的 Pydantic 模型(ShowSummary, Show, SetlistEntry, Song, Performance, NotableJam, Review, Track, ShowAudio, Health)是公共契约。它们使用 extra="forbid" 进行了冻结,因此任何上游变动都会变成验证错误,而不是静默的形状更改。
存根模式 vs 真实模式
模式 | 使用场景 | 行为 |
存根 ( | 开发、演示、暂无 API 密钥 | 为少量经典演出(12/30/95 MSG, 11/17/97 Denver, 12/31/24 MSG)提供真实的模拟负载。每个工具返回与真实模式相同的 Pydantic 形状。 |
真实 ( | 生产环境,拥有 phish.net API 密钥 | 通过 HTTPS 与 api.phish.net v5 和 phish.in v2 通信。需要 |
切换模式是配置更改,而非代码更改。相同的十二个工具,相同的响应形状。
缓存
mcp-phish 在磁盘上保留一个不透明的键值缓存 (/data/phish-cache.db, aiosqlite),键为 (endpoint, params_hash)。单个 TTL 控制每个条目(CACHE_TTL_SECONDS,默认 86400 = 24小时)。命中缓存时,不会进行上游调用。
此缓存不是规范化的数据存储。它仅保存原始 JSON 响应,以保持在上游速率限制内,并使重复的 LLM 驱动探索变得快速。将其视为临时数据。
限流
每个上游调用都通过一个具有可配置稳态速率的实例内令牌桶:
变量 | 默认值 | 说明 |
|
| api.phish.net v5 每秒请求数。 |
|
| phish.in v2 每秒请求数。 |
令牌桶是进程内的。多个容器不会协调。令牌状态在 health() 中公开,以便 Claude Code 会话可以查看剩余额度。
配置
所有配置均从环境变量(以及存在时的 .env 文件)读取。Pydantic 在启动时进行验证,并在值无效时快速失败。
变量 | 类型 | 默认值 | 必需 | 说明 |
| bool |
| 否 | 为 |
| string |
| 仅在真实模式 | 在 api.phish.net/keys/ 免费获取。 |
| string |
| 否 | 可选;提高速率上限。 |
| string |
| 否 | 测试覆盖。 |
| string |
| 否 | 测试覆盖。 |
| string |
| 否 | aiosqlite 文件路径。 |
| int |
| 否 | 默认 24 小时。 |
| float |
| 否 | 每秒稳态速率。 |
| float |
| 否 | 每秒稳态速率。 |
| string |
| 否 | 绑定地址。 |
| int |
| 否 | 监听端口。 |
| enum |
| 否 |
|
| enum |
| 否 | 生产环境用 |
完整示例位于 .env.example。
MCP 客户端设置
Claude Code
claude mcp add phish --transport http --scope user --url http://<host>:3705/mcpClaude Desktop
{
"mcpServers": {
"phish": {
"transport": "streamable-http",
"url": "http://<host>:3705/mcp"
}
}
}通用配置
在 http://<host>:3705/mcp 上的 Streamable HTTP。任何支持 Streamable HTTP 传输 的 MCP 客户端都可以连接。
架构
+---------------------+ Streamable HTTP +---------------------+
| MCP Client | --------------------> | mcp-phish |
| (Claude Code, etc) | <-------------------- | (FastMCP server) |
+---------------------+ +----+--------------+-+
| |
| |
v v
+----------+--+ +-------+--------+
| api.phish.net| | phish.in/api/v2|
| v5 | | |
+--------------+ +----------------+
^
|
+----------+----------+
| aiosqlite KV cache |
| /data/phish-cache |
+---------------------+mcp-phish 是一个带有小型缓存的轻量级异步代理:它将 MCP 工具调用转换为上游 REST 调用,为配置的 TTL 缓存原始响应,并将它们投影到公共 Pydantic 形状中。除了该缓存外,它不存储任何状态。除了两个 Phish API 外,它不调用任何云服务。
安全说明
在受信任的局域网、Tailscale 上或在带有身份验证的反向代理后运行 mcp-phish。服务器本身不对 MCP 客户端进行身份验证。
API 密钥仅存在于容器的环境中。它们永远不会被记录、永远不会在响应中回显,也永远不会写入磁盘。
容器以 UID 1000 运行,无 shell,无主目录,具有 只读根文件系统 (
/tmp为tmpfs) 和no-new-privileges。/data缓存卷是唯一可写的路径。Python 依赖项使用
pip --require-hashes从哈希锁定的requirements.lock安装。基础镜像将在第一个标记版本发布前按摘要固定。发布的镜像是多架构 (amd64/arm64) 的,具有构建来源和通过
docker/build-push-action生成的 SBOM。
有关漏洞报告,请参阅 SECURITY.md。
开发
需要 Python 3.13+ 和 Docker。
# Clone + install dev deps
git clone https://github.com/pete-builds/mcp-phish.git
cd mcp-phish
python -m venv .venv && source .venv/bin/activate
pip install --require-hashes -r requirements-dev.lock
pip install -e . --no-deps
# Run the test suite
pytest
# Lint and format
ruff check src tests
ruff format src tests
# Type check (mypy strict)
mypy src/mcp_phish
# Run the server locally in stub mode
python -m mcp_phish.server
# Or build the image yourself
cp docker-compose.example.yml docker-compose.yml
docker compose up --build更新依赖项
requirements.lock 和 requirements-dev.lock 文件是哈希锁定的。编辑匹配的 .in 文件然后重新生成:
uv pip compile requirements.in --output-file requirements.lock --generate-hashes --python-version 3.13
uv pip compile requirements-dev.in --output-file requirements-dev.lock --generate-hashes --python-version 3.13Dependabot 每周为 requirements.in 级别的更新、Docker 基础镜像和 GitHub Actions 版本打开 PR。
路线图
此服务器是更大规模 Phish 数据项目的 第一阶段。上述记录的 Pydantic 契约在未来的阶段中将保持字节一致。
第二阶段 — Postgres 仓库 + 每晚 ETL 水合。
第三阶段 — 此 MCP 的仓库支持读取路径。热窗口穿透读取最近的演出直播;旧数据从仓库读取。
第四阶段 — 歌单预测游戏(独立仓库)。
第五阶段 — 基于 MCP 的聊天 + 仪表板 UI(独立仓库)。
阶段状态位于 https://github.com/pete-builds/mcp-phish/issues。
致谢
感谢 phish.net 和 phish.in 的运营者保持语料库公开且可被机器访问。此封装器与这两个项目均无关联。请尊重他们的速率限制和服务条款。
许可证
MIT。
贡献
欢迎提交问题和拉取请求。在打开 PR 之前:
确保
ruff check,ruff format --check和mypy src/mcp_phish是干净的。添加或更新测试;保持覆盖率在 80% 或以上。
在本地运行
pytest并确认套件通过。在
[Unreleased]标题下更新CHANGELOG.md。
This server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/pete-builds/mcp-phish'
If you have feedback or need assistance with the MCP directory API, please join our Discord server