🤖

MCP-scanでMCP Serverのトラフィックを監視、特定の操作をブロックしてみる

に公開

GitHubの公式MCP Serverの脆弱性に関する記事を見ていた時に MCP-scan というMCPセキュリティツールが気になった。
https://explorer.invariantlabs.ai/docs/mcp-scan/

MCP-scanというツールはMCP Serverのトラフィックを監視したり、Guardrailsというものを設定するとMCP Serverの特定の操作をブロックすることができます。

実際にMCP-scanを用いてGitHub MPC Serverの特定のtoolsを利用しようとした際に操作をブロックしてくれるのか試してみました。

環境

ディレクトリ構成・ファイル

.
├── .env # GitHubのPATを設定
└── .gemini
   └── settings.json # Gemini CLIでGitHub MCP Serverを利用する設定
.env
GITHUB_PAT=<GitHubのPATを設定する>
.gemini/settings.json
{
    "mcpServers": {
        "github": {
            "command": "docker",
            "args": [
                "run",
                "-i",
                "--rm",
                "-e",
                "GITHUB_PERSONAL_ACCESS_TOKEN",
                "ghcr.io/github/github-mcp-server"
            ],
            "type": "stdio",
            "env": {
                "GITHUB_PERSONAL_ACCESS_TOKEN": "$GITHUB_PAT"
            }
        }
    }
}

MCP Serverのトラフィックが監視されていることを確認する

MCP-scanを起動する。起動する際にGemini CLIのsetting.jsonを指定します。

MCP-scan起動
mcp-scan proxy ./.gemini/settings.json

MCP-scanを実行したまま、Gemini CLIで自分が所有しているリポジトリ一覧を表示するように指示するとMCP-scanの方でMCP Serverのトラフィックが出力される。

例えばGemini CLIに「自分が所有するリポジトリを5つ表示して」という指示を出した時はGitHub MCP Serverの search_repositories を用いてリポジトリ情報を取得しているのがわかる。

Guardrailsでルールを設定して特定のトラフィックをブロックする

Guardrailsという機能を用いてルールに合致したトラフィックがあった場合、そのトラフィックをブロックすることができる。

ルールは ~/.mcp-scan/guardrails-config.ymlに記載して設定する。

~/.mcp-scan/guardrails-config.yml
# issueの一覧取得をブロックしたい場合
gemini-cli-mcp-client: # MCP Client名
  servers:
    github-mcp-server: # MCP Server名
      tools:
        list_issues:
          enabled: false # falseを指定することでブロックする

上記設定をした後にMCP-scanとGemini CLIを再起動する。
Gemini CLIで「リポジトリのissue一覧を表示して」という指示を出すと、list_issuesを実行する時にGuardrailsのルールに合致するため実行自体がブロックされる。

また、特定のリポジトリだけ実行をブロックしたい場合など詳細に設定したい場合は Custom guardrails としてルールを設定することができる。

~/.mcp-scan/guardrails-config.yml
gemini-cli-mcp-client:
  servers:
    github-mcp-server:
      guardrails:
        custom_guardrails:
          - name: "til Repository list_issues Block"
            id: "list_issues Block"
            action: block
            # list_issues実行時の引数をチェックして、ルールに合致する場合はブロックする
            # この場合、リポジトリがtilで所有者がsndstudy(自分)の場合はブロックする
            content: |
              raise "list_issues Block" if:
                (call: ToolCall)
                call is tool:list_issues
                "til" == call.function.arguments.repo and "sndstudy" == call.function.arguments.owner

ルールに合致するものだけ実行がブロックされる。


他にもデフォルトのルールとして秘匿情報が含まれている場合なども検知することができる。
https://explorer.invariantlabs.ai/docs/mcp-scan/guardrails/#default-guardrails

まとめ

MCP-scanを用いることでMCP Serverのトラフィックを監視したり、操作をブロックすることができた。今後もMCP Serverを用いるときはこのようなツールを用いて安全に利用していければと思う。

参考リンク

Discussion