Fastly MCP Server について
Fastly MCP Server は、AI アシスタントが Fastly API を通じてサービスを確認し、ドメインや TLS 設定の参照、トラフィックの確認、ディクショナリや ACL の管理を行えるようにする MCP サーバーです。依頼があればコンテンツのパージや設定変更も実行します。Fastly を運用する開発者や運用担当者向けです。
主な機能
- 01検索・確認・実行の 3 つのツールによる API 呼び出し
- 02stdio と HTTP の転送方式
- 03保存される秘密情報の暗号化
- 04大きな結果のローカルファイル出力
活用シーン
- 01サービス一覧の取得とドメイン・TLS 設定の確認
- 02トラフィックと使用量の確認
- 03ディクショナリと ACL の管理、コンテンツのパージ
MCP 対応
本プロジェクトは MCP サーバーであり、search、inspect、execute のツールを公開して、MCP クライアントが文書化された Fastly API メソッドを呼び出せるようにします。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Fastly MCP サーバー
Fastly MCP サーバーを使うと、MCP クライアントから Fastly API を利用できます。
Claude Desktop、Claude Code、Gemini CLI、Opencode、Qwen Code、Cline、Swival などのアシスタントに接続し、Fastly API トークンを渡してください。 そうすると、アシスタントは次のことができます。
- サービスを検索し、ドメインと TLS の設定を確認する。
- トラフィックと使用状況を確認する。
- 辞書と ACL を管理する。
- 依頼に応じてコンテンツをパージし、設定を変更する。
このプロジェクトは現在も積極的に開発されており、Fastly の Tier 1 オープンソースサポートを受けています。 サポートポリシーについては、Fastly のオープンソースに関するドキュメントをご覧ください。
ご質問やフィードバックは、Fastly 開発者ツールのコミュニティフォーラムにお寄せください。
目次
- 仕組み
- 要件
- インストール
- HTTP 経由での実行
- 複数ユーザー向けのリモートサービスの実行
- サーバーを適切に使う
- シークレットの暗号化
- トラブルシューティング
- ローカル開発
- セキュリティ
- ライセンス
仕組み
ほとんどの MCP サーバーは、操作ごとに 1 つのツールを公開します。 Fastly の API は大規模なため、このサーバーでは、アシスタントが組み合わせて使える少数のツールを使用します。
-
まず
searchを使って、キーワード、メソッド名、API クラス、HTTP パスから API メソッドを検索します。 -
次に
inspectを使って、パラメーター、戻り値の型、例など、メソッドのドキュメントを取得します。 -
詳細を確認したら、
executeを使って、API トークンを設定済みのFastlyクライアントで短い JavaScript スニペットを実行します。
これにより、バンドルされている Fastly クライアントのドキュメントに記載されたすべてのメソッドをカバーしながら、ツール一覧を小さく保てます。
要件
ランタイム
Bun または Node.js 24.12.0 以降のいずれかをインストールしてください。サーバーの実行に両方は必要ありません。 リモートモードでは Node.js を推奨します。
以下の例では、グローバルにインストールせずにパッケージをダウンロードして実行する bunx を使用します。
Node.js を使う場合は、代わりに npx を使用してください。
PATH 上にある無関係な mcp コマンドを誤って実行しないよう、パッケージ名とコマンド名を省略せずに指定してください。
bunxを使う場合:bunx -p @fastly/mcp fastly-mcpnpxを使う場合:npx -p @fastly/mcp fastly-mcp- Bun を明示的に使う場合:
bunx --bun -p @fastly/mcp fastly-mcp
--bun オプションを指定すると、Node.js の shebang に従うのではなく、Bun でパッケージを実行します。
Fastly API トークン
Fastly API トークンも必要です。 日常的に使用する場合は、アシスタントに行わせる予定の作業に適した、最小限の権限を持つトークンを作成してください。
- 調査やレポート作成には、まず読み取り専用トークンを使用します。
- アシスタントに変更を加えさせる場合に限り、書き込み権限のあるトークンを使用します。
トークンは、MCP クライアントの設定またはシェル環境で FASTLY_API_TOKEN として保持してください。
本番環境のトークンをプロンプトに貼り付けたり、リポジトリにコミットしたりしないでください。
インストール
クライアントを選択してください。
Codex · Claude Code · Claude Desktop · Gemini CLI · Opencode · Qwen Code · Cline · Swival
ほとんどの MCP クライアントでは、サーバーの起動方法を記述する JSON ブロックを受け付けます。
たとえば、次の設定では bunx でサーバーを実行し、環境変数を通じて API トークンを渡します。
{
"mcpServers": {
"fastly": {
"command": "bunx",
"args": ["-p", "@fastly/mcp", "fastly-mcp"],
"env": {
"FASTLY_API_TOKEN": "your-token-here"
}
}
}
}
MCP クライアントを起動するシェルで FASTLY_API_TOKEN をすでにエクスポートしている場合は、通常 env ブロックを省略できます(ただし、エージェントによっては必要な場合があります)。
デスクトップアプリではクライアント設定にトークンを保持するほうが簡単なことが多く、ターミナルツールではシェル環境変数を使うほうがすっきりすることが多いです。
Codex
ローカルサーバーでは、どちらのランタイムでも動作します。
同梱のプラグインは bunx を使って起動します。
- Node.js のみを使う場合: MCP の起動コマンドに
npxを指定し、同じ引数を使います。 - Bun のみを使う場合: 起動引数の
-pの前に--bunを追加します。
選択したランチャーが Codex の PATH から利用できることを確認してください。
リポジトリをプラグインマーケットプレイスとして追加し、プラグインをインストールします。
codex plugin marketplace add https://github.com/fastly/mcp
codex plugin add fastly-mcp@fastly-local
add コマンドによって、プラグインがインストールされ、有効になります。
Codex を起動する環境に FASTLY_API_TOKEN を設定し、ローカルサーバーに反映されるよう Codex を再起動してください。
プラグインはシークレットの暗号化を有効にして stdio 経由で動作するため、OAuth やホスト型 MCP エンドポイントは不要です。
プラグインがインストールされ、有効になっていることを確認します。
codex plugin list --marketplace fastly-local
Claude Code
bunx を使ってサーバーを実行します。
claude mcp add fastly -- bunx -p @fastly/mcp fastly-mcp
次に、Claude Code の起動時に使われる環境で FASTLY_API_TOKEN が利用できることを確認するか、通常の Claude Code MCP 設定でトークンを設定してください。
Claude Desktop
上記の汎用 JSON ブロックを Claude Desktop の設定ファイルに追加します。
- macOS では通常、ファイルは
~/Library/Application Support/Claude/claude_desktop_config.jsonです。 - Windows では通常、ファイルは
%APPDATA%\Claude\claude_desktop_config.jsonです。 - Linux では通常、ファイルは
~/.config/Claude/claude_desktop_config.jsonです。
ファイルを変更した後、Claude Desktop を再起動してください。
Gemini CLI
汎用 JSON ブロックを ~/.gemini/settings.json に追加します。
すでに FASTLY_API_TOKEN がエクスポートされたシェルから Gemini CLI を起動する場合は、JSON からトークンを省略できます。
Opencode
Opencode では、少し異なる形式を使います。
プロジェクト内の opencode.json、またはグローバルサーバーの場合は ~/.config/opencode/opencode.json に以下を記述します。
{
"mcp": {
"fastly": {
"type": "local",
"command": ["bunx", "-p", "@fastly/mcp", "fastly-mcp"],
"environment": {
"FASTLY_API_TOKEN": "your-token-here"
}
}
}
}
Qwen Code
汎用 JSON ブロックを ~/.qwen/settings.json、または特定のプロジェクト内の .qwen/settings.json に追加します。
Cline
Cline の MCP 設定を開き、グローバルまたはプロジェクトの MCP 設定を選択して、汎用 JSON ブロックを貼り付けます。
Swival
プロジェクト内の swival.toml に以下を追加します。
[mcp_servers.fastly]
command = "bunx"
args = ["-p", "@fastly/mcp", "fastly-mcp"]
env = { FASTLY_API_TOKEN = "your-token-here" }
Swival の実行環境に FASTLY_API_TOKEN がすでに設定されている場合、env の行は省略できます。
Swival は .swival/mcp.json から汎用 JSON ブロックを読み込むこともできます。
HTTP 経由で実行する
デフォルトでは、サーバーは stdio 経由で MCP を通信します。これは、すべてのデスクトップおよび CLI クライアントが想定する方式です。
信頼できるクライアント間で Fastly API トークンを共有するには、HTTP モードでサーバーを起動します。
bunx -p @fastly/mcp fastly-mcp --transport http
http://127.0.0.1:8231/mcp でリッスンします。デフォルトではループバックのみで、認証はありません。
その後、サーバーの URL を使ってクライアントを設定します。
{
"mcpServers": {
"fastly": {
"type": "streamable-http",
"url": "http://127.0.0.1:8231/mcp"
}
}
}
正確な形式はクライアントによって異なります。streamable-http のエントリー形式については、クライアントのドキュメントを確認してください。
リクエスト間で状態は保持されないため、スティッキーセッションの設定なしでロードバランサーの背後にサーバーを配置できます。
ループバックでの Authorization: Bearer
ループバックへのバインド時でも、FASTLY_MCP_HTTP_AUTH_TOKEN を設定できます。
設定してもセキュリティ上の問題はなく、後でループバック以外にデプロイする場合にも設定をそのまま使えます。
フラグの一覧を表示するには --help を実行
上記で説明したすべてのフラグは、bunx -p @fastly/mcp fastly-mcp --help に表示されます。
複数のユーザー向けにリモートサービスを実行する
呼び出し元ごとにそれぞれの Fastly API トークンを指定する場合は、--remote-http を使います。
リモート HTTP デプロイガイドでは、認証情報、クライアント設定、HTTPS プロキシ、Docker、systemd、サイジング、ログ記録、デプロイテストについて説明しています。
サーバーを適切に使う
Fastly API トークンを使うと、実際の本番環境の設定にアクセスできる場合があり、書き込み可能なトークンでは設定を変更できます。
サーバーが意図を推測することはないため、アシスタントによる変更を許可するかどうかを明示するのが、最も安全なワークフローです。
読み取り専用の作業
読み取り専用の作業を行う場合は、その旨を明確に伝えてください。
たとえば、変更を加えずにサービスの一覧表示、サービスのアクティブバージョンの確認、バックエンドの要約、TLS ステータスの確認、ロギングエンドポイントの調査、最近のトラフィックの報告をアシスタントに依頼します。
変更を行う
-
まず、アシスタントに操作させるサービス、ドメイン、バージョン、辞書、ACL、またはバックエンドを指定します。
-
変更を行う前に、呼び出す予定のメソッドを表示するよう依頼します。
変更がサービス設定に影響する場合は、サービスのバージョンを複製し、複製したバージョンを編集して、差分または概要を表示させ、承認してから有効化するのがおすすめです。
プロンプトの例
最初のプロンプトには、次のようなものがおすすめです。
Fastly サービスを一覧表示し、それぞれのアクティブなバージョンを表示してください。変更は行わないでください。
www.example.com を配信しているサービスを探し、そのドメイン、バックエンド、ヘルスチェックを要約してください。
1 つの URL をパージする API メソッドを調べ、実行する前に、実行予定の正確な呼び出しを表示してください。
サービス ABC123 のアクティブなバージョンを複製し、origin-api という名前のバックエンドを追加して、有効化する前に停止してください。
回答の範囲が広すぎる場合は、結果を返す前にコードで絞り込むようアシスタントに依頼してください。
対象を絞った呼び出しは確認しやすく、無関係な情報が漏れる可能性も低くなります。
Next-Gen WAF の調査
サーバーには、読み取り専用の NGWAF メソッドが追加され、次の情報を確認できます。
- アカウントとワークスペースのルール、シグナル、リスト。
- ワークスペースの設定と上位の攻撃。
- イベントの一覧と詳細。
- 保存されたリクエストの検索と詳細。
- ワークスペースの時系列データ。
Log Explorer と Insights
サーバーには、読み取り専用の Log Explorer & Insights メソッドが追加され、次の情報を確認できます。
- ステータス、パス、応答時間、POP、デバイス、またはボットで絞り込んだリクエストログ検索。
- 最もアクセスの多い URL や、応答が最も遅い URL など、すぐに使えるランキング。
- POP ごとの p95 応答時間など、独自にグループ化したメトリクス。
サービスで Log Explorer & Insights 製品を有効にする必要があります。
Fastly はこのデータをサンプリングし、7 日間保持します。 そのため、これらのメソッドは「リクエスト数はいくつでしたか」ではなく、「遅いリクエストはどのようなものでしたか」という質問に答えるものです。 正確な件数が必要な場合は、統計情報を依頼してください。
可観測性の時系列データ
サーバーには読み取り専用の時系列メソッドが追加され、次の 2 種類のデータを取得できます。
- 1 つのサービスのリクエストログ。秒、分、時間、または日単位で集計します。
- アカウント全体の、日または月単位の帯域幅や CPU 時間などのサステナビリティ指標。
リクエストログの時系列データには、Log Explorer & Insights 製品を有効にする必要があります。 これらのデータは同じサンプリング済みデータから取得されるため、合計値ではなく推定値です。
大きな結果
1 回の応答に収まる結果は、レコード数にかかわらず全件返されます。数百人のユーザーのリストも、完全な状態で返されます。
1 回の応答に収まらない大きな結果も、破棄されるわけではありません。
サーバーは結果全体を JSON ファイルに書き込み、応答には resultFile でファイルのパスを、result で短いプレビューを返します。
クエリを再実行する代わりに、全レコードが必要な場合は、そのファイルを読み込むようアシスタントに依頼してください。
保存と制限
-
保存場所: ファイルはシステムの一時ディレクトリ内の
fastly-mcp-resultsに書き込まれます。結果ごとに 1 ファイルが作成され、サーバーを実行しているアカウントだけが読み取れます。 -
サイズ: 1 ファイルの上限は 4 MB です。これを超える結果は応答内で説明され、件数を減らすようアシスタントに求められます。 同じ上限は、1 回の Fastly API 呼び出しからコードに渡されるデータにも適用されます。上限を超える応答は一部が黙って欠落した状態で返されるのではなく、ページネーションまたはフィルタリングを求めるエラーとなり、その呼び出しは失敗します。
-
保持期間: 新しいファイルから 20 個まで保持されます。サーバーがその間に稼働していたかどうかにかかわらず、各ファイルは 6 時間後に削除されます。
-
設定: 別の場所に保存するには
--result-dir <path>を使用します。機能を無効にし、大きすぎる結果を保存せずに説明だけを返すには--result-dir offを使用します。
シークレットの暗号化が有効な場合、シークレットは結果全体の暗号化を行ってから、保存またはプレビュー用に切り詰められます。 ファイルを読み込んでも、応答で隠されていた値を確認することはできません。トークンの途中で終わるプレビューでも同様です。
リモートサーバーは、呼び出し元が読み取れないため、結果ファイルを書き込むことはありません。
シークレットの暗号化
Fastly API のレスポンスには、認証情報、キー、その他の機密情報が含まれることがあります。 ローカルモードでは、デフォルトでサーバーは Fastly から返された API 出力をそのまま MCP クライアントに返します。
リモートモードでは、リモート HTTP ガイドの説明に従って、呼び出し元のトークンから導出したキーを使用し、認識されたシークレットを常に暗号化します。
暗号化の仕組み
ツールの出力がモデルに届く前に、さらに保護を加えたい場合は、シークレットの暗号化を有効にしてください。
暗号化を有効にすると、認識されたトークンはアシスタントに届く前に、{ENCRYPTED:...} のような暗号化された値に置き換えられます。
同じトークンには常に同じ暗号化値が割り当てられるため、アシスタントは後続の呼び出しでその値を参照できます。
アシスタントが暗号化された値を返すと、サーバーはツールの実行前にそれを復号します。 値が変更されている場合、途中で切り詰められている場合、または異なるキーで作成されている場合、サーバーは推測せずにエラーを返します。
結果を安全に暗号化できない場合は、結果全体が提供されません。 これは、512 文字を超えるトークン、または暗号化された値のように見えるテキストが含まれている場合に発生します。
暗号化を有効にする
bunx を使用する MCP 設定で暗号化を有効にするには、バイナリ名の後に --encrypt-secrets を追加します。
{
"mcpServers": {
"fastly": {
"command": "bunx",
"args": ["-p", "@fastly/mcp", "fastly-mcp", "--encrypt-secrets"],
"env": {
"FASTLY_API_TOKEN": "your-token-here"
}
}
}
}
環境変数を使って有効にすることもできます。
{
"mcpServers": {
"fastly": {
"command": "bunx",
"args": ["-p", "@fastly/mcp", "fastly-mcp"],
"env": {
"FASTLY_API_TOKEN": "your-token-here",
"FASTLY_MCP_ENCRYPT_SECRETS": "true"
}
}
}
}
キーと制限事項
ローカル暗号化では、サーバーの起動ごとに新しいキーが生成されるため、再起動すると暗号化された値は使えなくなります。
FASTLY_MCP_ENCRYPT_KEY に 16 バイトのキーに相当する 32 桁の 16 進数を正確に設定すると、再起動後も同じキーが使われ、以前の暗号化値も引き続き使えます。
ドメイン分離のために別の tweak 値を使用したい場合は、FASTLY_MCP_ENCRYPT_TWEAK も設定できます。
暗号化された値は、それを作成したときと同じ tweak でのみ使えます。
シークレットの暗号化は安全性を高める機能であり、完全なデータ分類システムではありません。 既知のトークンパターンに一致する値だけが暗号化されます。
引き続き最小権限の Fastly トークンを使用し、タスクに必要な場合を除いて、アシスタントにシークレットを取得させないでください。
トラブルシューティング
API 呼び出しが失敗する
ローカルサーバーで Fastly API 呼び出しが失敗する場合は、MCP サーバーから参照できる環境で FASTLY_API_TOKEN が設定されていることを確認してください。
検索と内容の確認は、同梱のドキュメントを使用するため、トークンがなくても機能します。ただし、実際の API 呼び出しにはトークンが必要です。
呼び出しが失敗すると、API が返した内容が報告されるため、通常はツールの出力そのものに答えがあります。
{
"error": "HTTP 401 Unauthorized",
"status": 401,
"body": "{\"msg\":\"Provided credentials are missing or invalid\"}",
"hint": "Fastly rejected the API token. Check that FASTLY_API_TOKEN is current and has not been revoked."
}
401 または 403 のヒントには、異なる対処が必要な次の 3 つのケースが示されます。
- トークンがサーバーに届いていません。
- Fastly が受け取ったトークンを拒否しました。
- トークンは有効ですが、その操作を実行する権限がありません。
これらのフィールドは execute 内でも利用できるため、スニペットでエラーを捕捉し、e.status または e.body を直接読み取ることができます。
メソッドが見つからない
アシスタントが適切なメソッドを見つけられない場合は、service、domain、backend、purge、tls、logging、dictionary、acl、vcl、stats などの、より広い検索語を使うように依頼するか、Fastly の API ドキュメントにある HTTP パスの一部を指定してください。
結果が予想外に空になる
結果が予想外に空の場合は、まず生の API レスポンスを返すようアシスタントに依頼してください。
Fastly クライアントのメソッドは、.result ラッパーの中ではなく、値を直接返します。
完全なデータではなくプレビューが表示される
レスポンスにデータではなくプレビューが含まれている場合は、同じレスポンス内にある resultFile パスを確認してください。1 回のレスポンスに収まらなかったため、完全な結果がそこに書き込まれています。
アシスタントにそのファイルを読み取るよう依頼するか、実行する JavaScript コードでフィルタリング、ページ分割、またはフィールドの選択を行ってください。
resultFile がない場合、結果ファイルが無効になっている(--result-dir off)か、サーバーがファイルを書き込めなかったことを示します。どちらに該当するかは hint フィールドに記載されています。
実行がタイムアウトする
各 execute 呼び出しには 30 秒の制限があるため、タイムアウトする場合は作業をより小さな呼び出しに分割してください。
ローカル開発
サーバーを実行する
サーバーのエントリーポイントは src/index.js です。
Bun は主な開発用ランタイムです:
bun run src/index.js
チェックを実行する
主なチェックは次のとおりです:
bun test
bun run lint
テストを実行するには、Bun と Node の両方をインストールしてください。
既知の Bun 1.3.11 のバグは、今後のバージョンで修正が認識されるよう、予期される失敗としてマークされています。
API ドキュメントを更新する
docs/ 内の API ドキュメントは、Fastly JavaScript クライアントに由来します。
サーバーは起動時に検索インデックスを構築するためにこのドキュメントを使用します。
package.json ではこのクライアントを特定のバージョンに固定しているため、ドキュメントは実行されるコードを常に反映します。
次のコマンドで再生成します:
bun run update-docs
引数を指定しない場合、スクリプトは固定されたバージョンに一致する release/v<version> タグを取得します。
クライアントのアップグレード時などに別のものを取得するには、ブランチまたはタグを指定してください。
アップグレード時は、package.json、package-lock.json、bun.lock の固定バージョンをまとめて変更します。
セキュリティ
セキュリティ上の問題は、SECURITY.md に記載されている Fastly のセキュリティ問題報告プロセスを通じて報告してください。
ライセンス
MIT です。詳細は LICENSE を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。