DNS MCP Server について
DNS MCP Serverは、SOCアナリストやサイバーセキュリティ調査向けのネットワーク対応MCPサーバーです。DNS、メール認証、脅威インテリジェンス、RDAPの検査に加え、分析用プロンプトとOAuth保護を備えています。
主な機能
- 01DNS検索とDNSSECチェーン検証
- 02SPF、DMARC、DKIM、DANE、TLSAの検査
- 03IPとドメインのレピュテーション検査
- 04ASN、ファストフラックス、リゾルバー改ざん分析
- 05RDAP登録情報の検索
- 06分析用プロンプトとセッション統計
活用シーン
- 01SOC調査でのドメイン確認
- 02メール認証とDNSSEC状態の監査
- 03IPまたはドメインの評判確認
- 04登録情報とDNS呼び出し状況の確認
MCP 対応
DNSセキュリティ、メール認証、脅威インテリジェンス、RDAP、可観測性のツールと4種類の分析用プロンプトをMCPクライアントに提供します。Streamable HTTPで接続し、OAuthベアラートークンを検証します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
DNS MCP サーバー
MCP を介して、AI アシスタント向けにリアルタイムの DNS セキュリティ分析を提供します。チャットセッションを離れることなく、DNSSEC チェーン検証、メール認証の状態、登録情報など、実務担当者と同じ方法でドメインを調査する機能をアシスタントに提供します。
サイバーセキュリティの専門家が、SOC の調査ワークフロー向けに開発しました。おもちゃではありません。コマンドラインで実行するクエリと同じものを、MCP 互換のあらゆるアシスタントからリアルタイムで利用できます。
アーキテクチャ(2.0.0)
dns-mcp は、Pocket
ID を介して OAuth を使用する Streamable HTTP MCP サーバーです。ツールの実装は、すべての DNS ロジックを担う Python ライブラリ dns_tool の薄いラッパーです。サーバー自体は約 430 行のコードで、認証の初期化、ツールの登録、プロンプトの読み込みを行います。
Claude.ai / Claude Code / any MCP client
│
│ Streamable HTTP + OAuth bearer (JWT)
▼
Caddy reverse proxy (TLS, DNS-01 / Let's Encrypt)
│
▼
dns-mcp container (FastMCP, OAuth verifier)
│
▼
dns_tool library (DoH client, validators, parsers)
│
▼
doh.lab.deflationhollow.net (Unbound DoH resolver, optional)
以前の stdio のみのアーキテクチャと比べた 3 つの利点:
- ネットワーク経由でアクセス可能 — ホストされた MCP サーバーは、ローカルのサブプロセスを起動できるクライアントに限らず、あらゆるクライアントにサービスを提供できます。
- OAuth で保護 — Pocket ID の JWKS に対してベアラー JWT を検証します。
whoamiを介して、ユーザーごとの ID をツールから利用できます。 - ライブラリを中心に設計 —
dns_toolは独立して公開され、再利用できます。同じコードが CLI、この MCP サーバー、そして(将来的には)REST API で利用されます。
以前の stdio アーキテクチャは、移植時の参考として server.py.legacy に残されています。remote ブランチ(mcp-shim Go ブリッジ)は非推奨です。
ツール
dns-mcp 2.0.0 は現在、19 個のツールを公開しています。1.x の stdio アーキテクチャにあった追加の 10 個のツールは、dns_tool への移植待ちです。未完了の作業を参照してください。
メタ
| ツール | 説明 |
|---|---|
ping | サーバーの稼働時間、現在のタイムスタンプ、dns_tool のバージョンとコミットハッシュ |
whoami | JWT クレームから取得した、認証済みユーザーの ID |
DNS
| ツール | 説明 |
|---|---|
dns_query | DoH を介した標準 DNS ルックアップ — 20 種類のレコード(A、AAAA、MX、TXT、NS、SOA、CNAME、PTR、SRV、CAA、DNSKEY、DS、RRSIG、NSEC、NSEC3、TLSA、SSHFP、HTTPS、SVCB、NAPTR)。オプションの subnet を指定すると、EDNS Client Subnet ヒント(RFC 7871)を送信します。ecs ブロックには、応答が実際にそのヒントに合わせて調整されたかどうかが示されます |
dnssec_validate | IANA ルートトラストアンカーから対象までの DNSSEC チェーンを完全にたどります。すべてのゾーンカットで暗号学的検証を実施します。構造化された verdict、ゾーンごとの検出結果、イベント記録を返します |
nsec_info | NSEC / NSEC3 の不存在証明を分析 — ゾーンウォーク可能性の評価、NSEC3 ハッシュパラメーター、オプトアウトの検出 |
メールセキュリティ
| ツール | 説明 |
|---|---|
check_spf | 再帰的な include 解決を伴う SPF レコードの解析(RFC 7208 の 10 回のルックアップ制限) |
check_dmarc | DMARC ポリシーを取得し、組織ドメインへのフォールバックを行います |
check_dkim | セレクターとドメインの組み合わせに対する DKIM 公開鍵レコードの検証 |
enumerate_dkim_selectors | 既知のセレクター名を使ってドメインの DKIM キーを調査し、解決できたセレクターを返します |
check_dane | ドメインのすべての MX ホストについて DANE TLSA レコードを取得 |
check_tlsa | _<port>._<proto>.<host> に対する単独の TLSA レコードルックアップ |
脅威インテリジェンス
| ツール | 説明 |
|---|---|
check_rbl | 8 つの DNS ベース RBL(Spamhaus ZEN、SpamCop、UCEProtect L1/L2、Mailspike、PSBL、Barracuda、SORBS)を使った IP レピュテーションの確認 |
check_dbl | DNS ベースのドメインブロックリスト(Spamhaus DBL、URIBL、SURBL)を使ったドメインレピュテーションの確認 |
cymru_asn | Team Cymru DNS サービスを介した ASN ルックアップ — BGP プレフィックス、組織、国 |
check_fast_flux | 高速フラックスの検出 — A/AAAA クエリを繰り返し、IP のローテーションと短い TTL を特定します |
detect_hijacking | 再帰リゾルバーをテストして改ざんを検出 — NXDOMAIN ワイルドカード、DNSSEC の処理、ID |
登録情報
| ツール | 説明 |
|---|---|
rdap_lookup | RDAP を介したドメイン登録データの取得(最新の WHOIS 代替) |
可観測性
| ツール | 説明 |
|---|---|
session_stats | 現在のプロセスにおけるツールごとの呼び出し統計(count、error_count、mean_ms、max_ms、first/last_called のタイムスタンプ)、セッションの稼働時間、呼び出し総数を取得します。モジュールレベルの状態で、コンテナの再起動時にリセットされます。dns_mcp/tracking.py を利用しています。 |
reset_stats | すべてのツール呼び出し統計を消去し、セッションの時計をリセットします。 |
下流の利用者(例:~/projects/yahoo のバッチフォレンジック)では、各調査でどの DNS ツールが参照されたかを記録するため、最後のツールとして
session_stats を呼び出します。統計辞書が空の場合は、アナリストの LLM が DNS による検証なしで判定を出した「コールドリード」を示します。
ツール記述子
19 個すべてのツールで、パラメーター記述子に Pydantic の Field を使用しています。LLM には次の情報が表示されます。
- パラメーターごとの説明:パラメーターの意味を説明します
Literal[...]列挙型:レコードタイプとプロトコルを指定します(文字列からの推測は不要です)- 正規表現パターン:FQDN 構文、IPv4 のドット区切り形式、DKIM セレクター形式を検証します
- 長さと範囲の制約:ポートは 1~65535、FQDN は最大 253 文字など
制約はツール記述子の JSON Schema で示され、MCP 境界では FastMCP によって適用されます。無効な入力は dns_tool が呼び出される前に拒否されます。型エイリアスの定義については、src/dns_mcp/server.py を参照してください。
アナリストプロンプト
4 つのアナリストプロンプトテンプレートがサーバーに付属しています。プロンプトに対応する MCP 互換クライアントであれば、一覧表示して呼び出せます。
| プロンプト | 内容 |
|---|---|
email_security_audit | SPF、DKIM、DMARC、MTA-STS、BIMI を監査し、A から F までの評価と優先順位付きの推奨事項を提示します |
dnssec_chain_audit | IANA ルートから対象まで、DNSSEC の信頼チェーンを完全に監査します |
soc_email_forensics | 生メールを対象にしたフィッシングのフォレンジック分析です。結果は TRUSTABLE / SUSPICIOUS / PHISHING / FURTHER ANALYSIS REQUIRED のいずれかです |
nist_800_81r3_audit | NIST SP 800-81r3 に準拠したドメインのセキュリティ態勢監査です |
プロンプトの呼び出しには、クライアント側での UI 対応が必要です。Claude Code では /mcp__dns-mcp__<prompt_name> として表示されます。Claude.ai のウェブ版では、スラッシュコマンドの選択メニューからプロンプトを利用できます。プロンプトに対応していないクライアントでは、ツールを必要に応じて直接使用してください。
使用例
アシスタントに「example.com のメールセキュリティ態勢を確認して」と尋ねます。
アシスタントは check_spf、check_dmarc、check_dane を順に呼び出し、完全な分析結果を返します。
✅ SPF: Hard fail (-all), 3 lookups (under RFC limit)
✅ DMARC: p=reject, pct=100 — full enforcement, aggregate reporting configured
✅ DANE: TLSA records present and DNSSEC-validated
dig コマンドをコピー&ペーストする必要はありません。タブを切り替える必要もありません。質問は 1 つだけです。
クイックスタート
前提条件
- Docker
- Pocket ID インスタンス(または Dynamic Client Registration に対応する任意の OIDC プロバイダー)
- TLS 終端に対応するリバースプロキシ(Caddy、nginx など)
- リバースプロキシを指すドメイン名
1. Pocket ID
Pocket ID の UI で管理者 API キーを発行します:Settings → API Keys → Create new
key。必要に応じてこのサービスだけを失効できるよう、名前を dns-mcp にします。キーの値をコピーします(表示されるのは一度だけです)。
2. .env
POCKET_ID_BASE_URL=https://pocketid.example.com
POCKET_ID_API_KEY=<the key from step 1>
SERVER_URL=https://dns-mcp.example.com
3. デプロイ
git clone https://github.com/mclose/dns-mcp.git
cd dns-mcp
docker compose up -d
イメージでは、バージョンを指定した依存関係として dns_tool をインストールします(URL は pyproject.toml に固定されています)。直接開発する場合は make build も利用できます。
4. リバースプロキシ
コンテナはポート 8000(HTTP)で待ち受けます。TLS 終端を行うプロキシの背後に配置してください。
dns-mcp.example.com {
reverse_proxy dns-mcp:8000 {
flush_interval -1 # required for Streamable HTTP / SSE
}
}
mclose/gateway(dns-mcp.lab.deflationhollow.net を提供する Caddy + DNS-01 の構成)を使用する場合は、既存のパターンに合わせて conf.d/dns-mcp.conf を配置してください。
5. 接続
https://dns-mcp.example.com/mcp を MCP クライアントのコネクターとして追加します。初回接続時に OAuth フローが実行されます。Claude.ai は Pocket ID にリダイレクトされるため、認証すると、サーバーが Pocket ID インスタンスに DCR クライアントを作成し、JWT を返します。以降のツール呼び出しでは、その JWT がベアラートークンとして送信され、サーバーは Pocket ID の JWKS を使って検証します。
未対応の作業
1.x の stdio アーキテクチャにある 11 個のツールは、まだ
dns_tool に移植されていないため、2.0.0 には登録されていません。
check_caa(CNAME チェーンの追跡とワイルドカード委任の検出を含む)check_zone_transfer(AXFR 列挙)check_bimi、check_mta_sts、check_smtp_tlsrptcheck_ct_logs(crt.sh 経由の Certificate Transparency ログの列挙)timestamp_converter、reverse_dnsenumerate_dkim_selectors、dns_dig_style、dns_query_dot
参照実装は server.py.legacy にあります。各移植では、関数を適切な
dns_tool モジュール(dns_tool.email、dns_tool.intel など)に移動し、
ライブラリ側にテストを追加して、src/dns_mcp/server.py に 1 行の
ラッパーを登録します。
ファイル構成
dns-mcp/
├── src/dns_mcp/
│ ├── __init__.py
│ ├── __main__.py # entrypoint — create_server().run(transport="streamable-http")
│ ├── config.py # pydantic-settings Settings class
│ ├── auth.py # JWKSTokenVerifier + JWTAccessToken
│ └── server.py # FastMCP app: OAuth routes + 16 tools + 4 prompts (~430 lines)
├── prompts/ # MCP analyst prompt text files
├── tests/ # pytest unit tests (legacy — pending rewrite)
├── tools/ # operator scripts (smoke tests, deploy helpers)
├── server.py.legacy # 1.x stdio server (5,095 lines), reference for 11 deferred tool ports
├── compose.yaml
├── Dockerfile
├── pyproject.toml # dns_tool URL-pinned to dist tarball
└── Makefile # build/lint/import-check
日々の作業
| コマンド | 内容 |
|---|---|
make build | Docker イメージを再ビルドします |
make rebuild | キャッシュを使わず、完全にクリーンな状態からビルドします |
make lint | pre-commit run --all-files(ruff のチェックとフォーマット) |
make import-check | イメージをビルドし、その中で create_server() を実行して、ツールが登録されることを確認します |
make shell | コンテナ内でインタラクティブシェルを起動します |
make deploy | GitHub にプッシュし、VPS の post-receive フックを実行します |
make logs | コンテナログを末尾まで表示します |
make status | コンテナのステータスを表示します |
セキュリティ
- シェル実行なし — すべての DNS 処理は
dns_tool(内部では dnspython)、RDAP はrequestsを使用します - すべてのツール呼び出しで Pocket ID JWKS に対する OAuth ベアラー JWT 検証を行います
- Pydantic の
Field制約を MCP の境界で適用し、無効な入力はdns_toolに到達する前に拒否します - 非 root コンテナユーザー(
claude、uid 1000) - SPF の再帰制限を適用します(RFC 7208)
- RDAP:タイムアウトは 10 秒、リダイレクトは最大 3 回です
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。