mcp-phish
mcp-phish
api.phish.net v5およびphish.in v2 APIを単一の型付きツールインターフェースでラップするMCPサーバーです。 セットリスト、楽曲、ジャムチャート、レビュー、オーディオにわたる12種類のツールを提供します。すべてのレスポンスは固定されたPydanticモデルを通じて整形されるため、上流のAPI変更があってもワイヤフォーマットは安定して維持されます。
FastMCPとStreamable HTTPトランスポート上に構築されています。信頼できるLAN内やTailscale ACLの背後で実行するように設計されており、MCPレベルの認証は組み込まれていません。
なぜこれが必要か
現在、Phish.netとphish.inのエコシステムは、メンテナンスされていないラッパーや場当たり的なスクリプトの小さな集合体に過ぎません。これらをきれいに統合しているものはありません。mcp-phishは、MCP対応クライアント(Claude Code、Claude Desktop、カスタムエージェントなど)に対し、ファンが実際に尋ねる質問(特定の日付のセットリスト、楽曲の初演とギャップ、トラックのオーディオURL、ツアーのジャムチャートヒットなど)に対して、焦点を絞った適切に型付けされたインターフェースを提供します。
ソースは変更される可能性があります(ライブAPI → キャッシュ → ボールト)。しかし、MCPクライアントに返されるPydanticの形状は決して変わりません。
Related MCP server: mcp-umphreys
クイックスタート
docker run --rm \
-p 3705:3705 \
-e STUB_MODE=true \
ghcr.io/pete-builds/mcp-phish:latestサーバーはデフォルトでスタブモードで起動します。現実的なモックデータを返し、ネットワークアクセスやAPIキーは不要です。Claude Codeに登録します:
claude mcp add phish --transport http --scope user --url http://localhost:3705/mcp次にClaudeにこう尋ねてください:"What was the setlist on 12/30/95?"。すると、Madison Square Gardenでの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"で固定されているため、上流の変更は黙って形状が変わるのではなく、バリデーションエラーとなります。
スタブモードとリアルモード
モード | 使用場面 | 動作 |
スタブ ( | 開発、デモ、APIキー未取得時 | 代表的な公演(12/30/95 MSG, 11/17/97 Denver, 12/31/24 MSG)に対する現実的なモックペイロード。すべてのツールはリアルモードと同じPydantic形状を返します。 |
リアル ( | phish.net APIキーを使用した本番環境 | api.phish.net v5およびphish.in v2とHTTPS通信を行います。 |
モードの切り替えは設定変更であり、コード変更ではありません。同じ12種類のツール、同じレスポンス形状です。
キャッシュ
mcp-phishは、ディスク上(/data/phish-cache.db, aiosqlite)に(endpoint, params_hash)をキーとする不透明なキーバリューストアを保持します。すべてのエントリには単一のTTL(CACHE_TTL_SECONDS、デフォルトは86400 = 24時間)が適用されます。ヒットした場合は、上流への呼び出しは行われません。
このキャッシュは正規化されたデータストアではありません。上流のレート制限を回避し、LLMによる繰り返し探索を高速化するために、生のJSONレスポンスを保持しているだけです。一時的なものとして扱ってください。
スロットリング
すべての上流呼び出しは、設定可能な定常レートを持つインスタンスごとのトークンバケットを通過します:
変数 | デフォルト | 備考 |
|
| api.phish.net v5の1秒あたりのリクエスト数。 |
|
| phish.in v2の1秒あたりのリクエスト数。 |
バケットはプロセス内で行われます。複数のコンテナ間で調整は行われません。トークンの状態はhealth()で公開されるため、Claude Codeセッションから残量を確認できます。
設定
すべての設定は環境変数(および存在する場合は.envファイル)から読み込まれます。Pydanticが起動時にバリデーションを行い、無効な値がある場合は即座に失敗します。
変数 | 型 | デフォルト | 必須 | 備考 |
| bool |
| いいえ |
|
| string |
| リアルモードのみ | api.phish.net/keys/で無料取得可能。 |
| string |
| いいえ | 任意。レート制限を緩和。 |
| string |
| いいえ | テスト用オーバーライド。 |
| string |
| いいえ | テスト用オーバーライド。 |
| string |
| いいえ | aiosqliteファイルパス。 |
| int |
| いいえ | デフォルト24時間。 |
| float |
| いいえ | 1秒あたりの定常レート。 |
| float |
| いいえ | 1秒あたりの定常レート。 |
| 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形状に投影します。キャッシュ以外の状態は保持しません。2つのPhish API以外のクラウドサービスは呼び出しません。
セキュリティ上の注意
mcp-phishは、信頼できるLAN、Tailscale上、または認証付きのリバースプロキシの背後で実行してください。サーバー自体はMCPクライアントを認証しません。
APIキーはコンテナの環境変数内にのみ存在します。ログに記録されたり、レスポンスにエコーされたり、ディスクに書き込まれたりすることはありません。
コンテナはUID 1000で実行され、シェルやホームディレクトリはなく、読み取り専用のルートファイルシステム(
/tmpはtmpfs)で、no-new-privilegesが設定されています。/dataキャッシュボリュームのみが書き込み可能なパスです。Pythonの依存関係は、ハッシュロックされた
requirements.lockからpip --require-hashesでインストールされます。ベースイメージは最初のタグ付きリリース前にダイジェストで固定されます。公開されるイメージはマルチアーキテクチャ(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データプロジェクトのフェーズ1です。上記で文書化されたPydanticコントラクトは、将来のフェーズでもバイト単位で同一に保たれます。
フェーズ2 — Postgresボールト + 夜間ETLハイドレーション。
フェーズ3 — このMCPのためのボールトバックエンドの読み取りパス。ホットウィンドウは直近の公演をライブで読み取り、古いものはボールトから読み取ります。
フェーズ4 — セットリスト予測ゲーム(別リポジトリ)。
フェーズ5 — MCP上のチャット + ダッシュボードUI(別リポジトリ)。
フェーズのステータスはhttps://github.com/pete-builds/mcp-phish/issuesで確認できます。
謝辞
コーパスを公開し、機械可読な状態に保ってくれているphish.netおよびphish.inの運営者に感謝します。このラッパーはどちらのプロジェクトとも提携していません。彼らのレート制限と利用規約を尊重してください。
ライセンス
MIT。
貢献
Issueやプルリクエストを歓迎します。PRを作成する前に:
ruff check,ruff format --check,mypy src/mcp_phishがクリーンであることを確認してください。テストを追加または更新し、カバレッジを80%以上に保ってください。
ローカルで
pytestを実行し、スイートがパスすることを確認してください。CHANGELOG.mdの[Unreleased]見出しの下を更新してください。
This server cannot be deployed
Maintenance
Related MCP Connectors
Full Spotify Web API coverage - albums, artists, playlists, player controls, and more.
Search MusicBrainz artists, releases, works, labels; resolve ISRC/ISWC/barcode; fetch cover art.
Access SEC filings, insider transactions, and financial data via the ShareSEER API.
Audio features + harmonic set-building for tracks by name/ISRC. Spotify audio-features replacement.
Related MCP Servers
- AlicenseAqualityAmaintenanceSearch concert setlists, artists, venues, tours, and cities from setlist.fm via natural language. Provides 16 read-only tools for exploring live music data.20749 npm1MIT
- AlicenseNot gradedqualityAmaintenanceEnables querying Umphrey's McGee setlist data including shows, songs, jam charts, and guest appearances through natural language.MIT
- FlicenseAqualityDmaintenanceExposes Foursquare/Swarm check-in data and user activity through 13 tools, enabling user management, check-in history, venue details, mayorships, lists, and cross-user search.13-
- AlicenseAqualityCmaintenanceEnables interaction with the full public ListenBrainz API, exposing 37 tools for listens, stats, playlists, radio, social, and cover art over stdio.37BSD Zero Clause