Skip to main content
Glama

mcp-phish

CI License: MIT Python MCP

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

ツールリファレンス

ツール

ソース

機能

search_shows

phish.net

年、会場、都市/州/国で公演を検索します。

get_show

phish.net

公演詳細:セットリスト、評価、レビュー数、会場。

recent_shows

phish.net

直近のN公演を新しい順に取得します。

search_songs

phish.net

タイトルの一部で楽曲カタログを検索します。

get_song

phish.net

楽曲レコード:初演、最終演奏、ギャップ、合計回数。

song_history

phish.net

楽曲の全演奏履歴を新しい順に取得します。

jam_chart

phish.net

編集者が選定した注目すべきジャム。

get_reviews

phish.net

公演に対するユーザーレビュー。

get_audio

phish.in

公演のトラックリスト、MP3 URL、演奏時間。

get_track

phish.in

IDによるオーディオトラックの取得。

search_audio_tracks

phish.in

特定の楽曲スラッグの全録音バージョン。

health

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"で固定されているため、上流の変更は黙って形状が変わるのではなく、バリデーションエラーとなります。

スタブモードとリアルモード

モード

使用場面

動作

スタブ (STUB_MODE=true, デフォルト)

開発、デモ、APIキー未取得時

代表的な公演(12/30/95 MSG, 11/17/97 Denver, 12/31/24 MSG)に対する現実的なモックペイロード。すべてのツールはリアルモードと同じPydantic形状を返します。

リアル (STUB_MODE=false)

phish.net APIキーを使用した本番環境

api.phish.net v5およびphish.in v2とHTTPS通信を行います。PHISHNET_API_KEYが必須で、PHISHIN_API_KEYは任意です。

モードの切り替えは設定変更であり、コード変更ではありません。同じ12種類のツール、同じレスポンス形状です。

キャッシュ

mcp-phishは、ディスク上(/data/phish-cache.db, aiosqlite)に(endpoint, params_hash)をキーとする不透明なキーバリューストアを保持します。すべてのエントリには単一のTTL(CACHE_TTL_SECONDS、デフォルトは86400 = 24時間)が適用されます。ヒットした場合は、上流への呼び出しは行われません。

このキャッシュは正規化されたデータストアではありません。上流のレート制限を回避し、LLMによる繰り返し探索を高速化するために、生のJSONレスポンスを保持しているだけです。一時的なものとして扱ってください。

スロットリング

すべての上流呼び出しは、設定可能な定常レートを持つインスタンスごとのトークンバケットを通過します:

変数

デフォルト

備考

THROTTLE_PHISHNET_RPS

5

api.phish.net v5の1秒あたりのリクエスト数。

THROTTLE_PHISHIN_RPS

10

phish.in v2の1秒あたりのリクエスト数。

バケットはプロセス内で行われます。複数のコンテナ間で調整は行われません。トークンの状態はhealth()で公開されるため、Claude Codeセッションから残量を確認できます。

設定

すべての設定は環境変数(および存在する場合は.envファイル)から読み込まれます。Pydanticが起動時にバリデーションを行い、無効な値がある場合は即座に失敗します。

変数

型

デフォルト

必須

備考

STUB_MODE

bool

true

いいえ

falseの場合、リアルモードの認証情報が必要。

PHISHNET_API_KEY

string

""

リアルモードのみ

api.phish.net/keys/で無料取得可能。

PHISHIN_API_KEY

string

""

いいえ

任意。レート制限を緩和。

PHISHNET_BASE_URL

string

https://api.phish.net/v5

いいえ

テスト用オーバーライド。

PHISHIN_BASE_URL

string

https://phish.in/api/v2

いいえ

テスト用オーバーライド。

CACHE_DB_PATH

string

/data/phish-cache.db

いいえ

aiosqliteファイルパス。

CACHE_TTL_SECONDS

int

86400

いいえ

デフォルト24時間。

THROTTLE_PHISHNET_RPS

float

5.0

いいえ

1秒あたりの定常レート。

THROTTLE_PHISHIN_RPS

float

10.0

いいえ

1秒あたりの定常レート。

MCP_HOST

string

0.0.0.0

いいえ

バインドアドレス。

MCP_PORT

int

3705

いいえ

リッスンポート。

LOG_LEVEL

enum

INFO

いいえ

DEBUG, INFO, WARNING, ERROR, CRITICALのいずれか。

LOG_FORMAT

enum

json

いいえ

本番はjson、ローカル開発はtext。

完全な例は.env.exampleにあります。

MCPクライアントの設定

Claude Code

claude mcp add phish --transport http --scope user --url http://<host>:3705/mcp

Claude 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.13

Dependabotが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を作成する前に:

  1. ruff check, ruff format --check, mypy src/mcp_phishがクリーンであることを確認してください。

  2. テストを追加または更新し、カバレッジを80%以上に保ってください。

  3. ローカルでpytestを実行し、スイートがパスすることを確認してください。

  4. CHANGELOG.mdの[Unreleased]見出しの下を更新してください。

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Search concert setlists, artists, venues, tours, and cities from setlist.fm via natural language. Provides 16 read-only tools for exploring live music data.
    20
    749 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables querying Umphrey's McGee setlist data including shows, songs, jam charts, and guest appearances through natural language.
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Exposes 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
    -
  • A
    license
    A
    quality
    C
    maintenance
    Enables interaction with the full public ListenBrainz API, exposing 37 tools for listens, stats, playlists, radio, social, and cover art over stdio.
    37
    BSD Zero Clause