mcpField
D
DNS MCP Server

DNS MCP Server

ローカル
github.com/mcloseセキュリティ13 週間前に更新

DNS MCP Server について

DNS MCP Serverは、SOCアナリストやサイバーセキュリティ調査向けのネットワーク対応MCPサーバーです。DNS、メール認証、脅威インテリジェンス、RDAPの検査に加え、分析用プロンプトとOAuth保護を備えています。

主な機能

  1. 01DNS検索とDNSSECチェーン検証
  2. 02SPF、DMARC、DKIM、DANE、TLSAの検査
  3. 03IPとドメインのレピュテーション検査
  4. 04ASN、ファストフラックス、リゾルバー改ざん分析
  5. 05RDAP登録情報の検索
  6. 06分析用プロンプトとセッション統計

活用シーン

  1. 01SOC調査でのドメイン確認
  2. 02メール認証とDNSSEC状態の監査
  3. 03IPまたはドメインの評判確認
  4. 04登録情報とDNS呼び出し状況の確認

MCP 対応

DNSセキュリティ、メール認証、脅威インテリジェンス、RDAP、可観測性のツールと4種類の分析用プロンプトをMCPクライアントに提供します。Streamable HTTPで接続し、OAuthベアラートークンを検証します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"mclose-dns": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"docker.io/mclose/dns-mcp:1.3.4"
]
}
}
}
起動コマンドdocker run -i --rm docker.io/mclose/dns-mcp:1.3.4

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
ocidocker.io/mclose/dns-mcp:1.3.4

ツール

ツール一覧はまだ取得されていません

ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。

詳細

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 つの利点:

  1. ネットワーク経由でアクセス可能 — ホストされた MCP サーバーは、ローカルのサブプロセスを起動できるクライアントに限らず、あらゆるクライアントにサービスを提供できます。
  2. OAuth で保護 — Pocket ID の JWKS に対してベアラー JWT を検証します。whoami を介して、ユーザーごとの ID をツールから利用できます。
  3. ライブラリを中心に設計 — 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 のバージョンとコミットハッシュ
whoamiJWT クレームから取得した、認証済みユーザーの ID
DNS
ツール説明
dns_queryDoH を介した標準 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_validateIANA ルートトラストアンカーから対象までの DNSSEC チェーンを完全にたどります。すべてのゾーンカットで暗号学的検証を実施します。構造化された verdict、ゾーンごとの検出結果、イベント記録を返します
nsec_infoNSEC / NSEC3 の不存在証明を分析 — ゾーンウォーク可能性の評価、NSEC3 ハッシュパラメーター、オプトアウトの検出
メールセキュリティ
ツール説明
check_spf再帰的な include 解決を伴う SPF レコードの解析(RFC 7208 の 10 回のルックアップ制限)
check_dmarcDMARC ポリシーを取得し、組織ドメインへのフォールバックを行います
check_dkimセレクターとドメインの組み合わせに対する DKIM 公開鍵レコードの検証
enumerate_dkim_selectors既知のセレクター名を使ってドメインの DKIM キーを調査し、解決できたセレクターを返します
check_daneドメインのすべての MX ホストについて DANE TLSA レコードを取得
check_tlsa_<port>._<proto>.<host> に対する単独の TLSA レコードルックアップ
脅威インテリジェンス
ツール説明
check_rbl8 つの DNS ベース RBL(Spamhaus ZEN、SpamCop、UCEProtect L1/L2、Mailspike、PSBL、Barracuda、SORBS)を使った IP レピュテーションの確認
check_dblDNS ベースのドメインブロックリスト(Spamhaus DBL、URIBL、SURBL)を使ったドメインレピュテーションの確認
cymru_asnTeam Cymru DNS サービスを介した ASN ルックアップ — BGP プレフィックス、組織、国
check_fast_flux高速フラックスの検出 — A/AAAA クエリを繰り返し、IP のローテーションと短い TTL を特定します
detect_hijacking再帰リゾルバーをテストして改ざんを検出 — NXDOMAIN ワイルドカード、DNSSEC の処理、ID
登録情報
ツール説明
rdap_lookupRDAP を介したドメイン登録データの取得(最新の 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_auditSPF、DKIM、DMARC、MTA-STS、BIMI を監査し、A から F までの評価と優先順位付きの推奨事項を提示します
dnssec_chain_auditIANA ルートから対象まで、DNSSEC の信頼チェーンを完全に監査します
soc_email_forensics生メールを対象にしたフィッシングのフォレンジック分析です。結果は TRUSTABLE / SUSPICIOUS / PHISHING / FURTHER ANALYSIS REQUIRED のいずれかです
nist_800_81r3_auditNIST 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_tlsrpt
  • check_ct_logs(crt.sh 経由の Certificate Transparency ログの列挙)
  • timestamp_converter、reverse_dns
  • enumerate_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 buildDocker イメージを再ビルドします
make rebuildキャッシュを使わず、完全にクリーンな状態からビルドします
make lintpre-commit run --all-files(ruff のチェックとフォーマット)
make import-checkイメージをビルドし、その中で create_server() を実行して、ツールが登録されることを確認します
make shellコンテナ内でインタラクティブシェルを起動します
make deployGitHub にプッシュし、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

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。