概要
過去に作成した PaloAlto firewall の MCP サーバーや、公式が提供している kintone MCP サーバーを連携させて動作させてみました。それぞれ単体では動作させることに成功しているのですが、 MCP サーバーの強みである複数の機能を連携する機能が使ってみたかったので、やってみることにしました。
背景
もともとセキュリティ管理の一環として、 PaloAlto firewall やエンドポイントセキュリティ製品でアラートが発報された際、アラートに関連するアプリケーションが許可されているのか否かを kintone に登録しているアプリケーションホワイトリストで確認するという流れが組めれば自動化ができていいよねという話もあったので、この機会に生成AIにすべて任せて自動化してみたいという思いもあります。
想定の流れ
実際の運用では以下の図のような流れを想定しています。現状では 対応部分(Firewallの設定変更やインシデント起票など)やアラートを自動で取り込むロジックは実装されていないので、ユーザーが「アラートを取得して、関連のアプリケーションがホワイトリストと合致しているか確認して」と依頼し、 kintone からその確認結果が返却されてくるまでができれば実証実験は成功とします。
準備
MCP サーバーの登録
MCP サーバーを連携して利用するにはそもそも MCP サーバーを2つとも Gemini CLIに登録しなければなりません。./gemini/settings.jsonに以下の内容を登録して、2つの MCP サーバーを登録します。
{
"security": {
"auth": {
"selectedType": "oauth-personal"
}
},
"mcpServers": {
"kintone": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"KINTONE_BASE_URL",
"-e",
"KINTONE_USERNAME",
"-e",
"KINTONE_PASSWORD",
"ghcr.io/kintone/mcp-server:latest"
],
"env": {
"KINTONE_BASE_URL": "https://<kintone_domain>",
"KINTONE_USERNAME": "kintone_username",
"KINTONE_PASSWORD": "kintone_password"
}
},
"pafirewall-mcp": {
"command": "node",
"args": ["dist/index.js"],
"env": {
"PA_FIREWALL_URL": "https://<firewall_ip or fqdn>/",
"PA_API_KEY": "api_key"
}
}
}
}
kintone のアプリ登録
テスト的に脅威ログ20件を取得した際に含まれるアプリケーションを kintone の「ホワイトリストアプリケーション」アプリに登録をしました。どういう挙動になるか気になるので、boxnet-baseをboxnetに変えてみました。
検証
プロンプト
Gemini CLI を立ち上げて、以下のプロンプトを発行してみます。
脅威ログを20件取得して、許可されているアプリケーションかどうかをkintoneアプリのアプリケーションホワイトリストで確認して。
kintone アプリケーションのアプリIDもMCPを使って確認をして。
名前の合致があいまいなものは「不明」としたうえで、近しい結果を教えてほしい。
表形式で出力をしてほしいんだけど、カラムは脅威ログの日時、送信元IP、宛先IP、アプリケーション、脅威名、ホワイトリスト登録状況、備考でお願い。
結果
✦ 脅威ログとホワイトリストの情報を取得しました。
これらの情報を元に、アプリケーションのホワイトリスト登録状況を確認し、結果を以下の表にまとめました。
┌─────────────────────┬─────────────────┬─────────────────┬──────────────────┬───────────────────────────────────────────┬────────────────────────┬──────────────────────┐
│ 脅威ログの日時 │ 送信元IP │ 宛先IP │ アプリケーション │ 脅威名 │ ホワイトリスト登録状況 │ 備考 │
├─────────────────────┼─────────────────┼─────────────────┼──────────────────┼───────────────────────────────────────────┼────────────────────────┼──────────────────────┤
│ 2025/10/03 22:37:46 │ *.*.*.* │ *.*.*.* │ web-browsing │ ZGrab Application Layer Scanner Detection │ 登録済み (許可) │ │
│ 2025/10/01 11:08:06 │ *.*.*.* │ *.*.*.* │ openai-chatgpt │ Possible HTTP Malicious Payload Detection │ 登録済み (不許可) │ │
│ 2025/09/23 20:46:49 │ *.*.*.* │ *.*.*.* │ ms-ds-smbv3 │ Microsoft Windows NTLMSSP Detection │ 登録済み (許可) │ │
│ 2025/09/23 20:13:41 │ *.*.*.* │ *.*.*.* │ ms-ds-smbv3 │ Microsoft Windows NTLMSSP Detection │ 登録済み (許可) │ │
│ 2025/09/23 11:53:16 │ *.*.*.* │ *.*.*.* │ ms-ds-smbv3 │ Microsoft Windows NTLMSSP Detection │ 登録済み (許可) │ │
│ 2025/09/23 11:52:15 │ *.*.*.* │ *.*.*.* │ ms-ds-smbv3 │ Microsoft Windows NTLMSSP Detection │ 登録済み (許可) │ │
│ 2025/09/23 11:51:25 │ *.*.*.* │ *.*.*.* │ ms-ds-smbv3 │ Microsoft Windows NTLMSSP Detection │ 登録済み (許可) │ │
│ 2025/09/23 11:33:08 │ *.*.*.* │ *.*.*.* │ web-browsing │ Possible HTTP Malicious Payload Detection │ 登録済み (許可) │ │
│ 2025/09/18 12:11:44 │ *.*.*.* │ *.*.*.* │ web-browsing │ ZGrab Application Layer Scanner Detection │ 登録済み (許可) │ │
│ 2025/09/03 20:06:58 │ *.*.*.* │ *.*.*.* │ web-browsing │ ZGrab Application Layer Scanner Detection │ 登録済み (許可) │ │
│ 2025/09/01 14:37:04 │ *.*.*.* │ *.*.*.* │ boxnet-base │ Possible HTTP Malicious Payload Detection │ 不明 │ boxnet (許可) に類似 │
│ 2025/08/27 15:12:45 │ *.*.*.* │ *.*.*.* │ dns-base │ generic:googleaccountsservices.com │ 登録済み (許可) │ │
│ 2025/08/27 15:12:40 │ *.*.*.* │ *.*.*.* │ dns-base │ generic:googleaccountsservices.com │ 登録済み (許可) │ │
│ 2025/08/27 15:12:40 │ *.*.*.* │ *.*.*.* │ dns-base │ generic:googleaccountsservices.com │ 登録済み (許可) │ │
│ 2025/08/27 15:12:40 │ *.*.*.* │ *.*.*.* │ dns-base │ generic:googleaccountsservices.com │ 登録済み (許可) │ │
│ 2025/08/27 15:12:40 │ *.*.*.* │ *.*.*.* │ dns-base │ generic:googleaccountsservices.com │ 登録済み (許可) │ │
│ 2025/08/27 15:12:40 │ *.*.*.* │ *.*.*.* │ dns-base │ generic:googleaccountsservices.com │ 登録済み (許可) │ │
│ 2025/08/27 14:12:44 │ *.*.*.* │ *.*.*.* │ dns-base │ generic:googleaccountsservices.com │ 登録済み (許可) │ │
│ 2025/08/27 14:12:44 │ *.*.*.* │ *.*.*.* │ dns-base │ generic:googleaccountsservices.com │ 登録済み (許可) │ │
│ 2025/08/27 14:12:39 │ *.*.*.* │ *.*.*.* │ dns-base │ generic:googleaccountsservices.com │ 登録済み (許可) │ │
└─────────────────────┴─────────────────┴─────────────────┴──────────────────┴───────────────────────────────────────────┴────────────────────────┴──────────────────────┘
まとめ
今回、既存のMCPサーバー同士を連携させて検証したところ、いずれも想定どおりの出力を得られました。特に収穫だったのは、「類似アプリケーションの識別」が有効に働いた点です。たとえば、担当者がkintoneのレコード登録時にアプリ名を誤入力したケースや、「boxnet-uploading」と「boxnet-base」のように名称が紛らわしいケースを想定し、あえて「boxnet-base」を「boxnet」として登録するテストを実施しましたが、生成AIが類似候補を適切にサーチし、意図したマッチングを導いてくれました。
この結果から、MCPサーバーを拡充しながら組み合わせて使うことで、ホワイトリスト照会や誤登録の補正など、インシデント対応の実務を着実に支援できる手ごたえを得ています。今後もユースケースを増やし、精度検証と運用手順のブラッシュアップを継続していきます。
