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の形状は決して変わりません。
クイックスタート
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 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