リファレンス¶
ツール¶
health_check¶
引数なし。{status, service, version, binaries, missing, http_auth}を返す。statusは
dig/ping/mtr/whoisが全てPATH上にあり、NETDIAG_HTTP_AUTH(設定していれば)が
正しく読めれば"healthy"、そうでなければ"degraded"(該当ツールは呼び出し時にエラーになるが、
サーバー自体は起動し続ける)。http_authは{prefixes, error}で、設定したURL前方一致(ヘッダ値は
出さない)と、読めなかったときの理由。
dns_lookup(hostname, record_type="A", resolver=None, transport="plain")¶
digによるDNSレコード解決。record_type: A/AAAA/MX/TXT/NS/CNAME/
SOA/PTR/CAA。resolverを渡すとホスト既定ではなく特定のネームサーバーへ
問い合わせる(特定リゾルバへの反映確認等)。transport: "plain"(UDP/TCP 53、
既定)・"dot"(DNS over TLS、853)・"doh"(DNS over HTTPS、443)。BIND 9.18
以降のdigが必要——古いdigはdot/dohを平文DNSへ黙ってフォールバックせず、
即座に拒否する。
dnssec_check(hostname, resolver="1.1.1.1", transport="plain")¶
検証済みリゾルバへ問い合わせADビットの有無を確認。transportは上記と同様——
53番ポートが介入されている懸念がある場合、平文DNSと暗号化トランスポートでの
検証結果を比較するのに使う。
ping_host(host, count=4)¶
ICMP ping。countは1〜10にクランプ。macOSではIPv6リテラルをping6へ自動振り分け
(macOSのpingはIPv6を拒否するため)。Linuxではpingが両方式に対応しping6は
使わない。
traceroute_path(host, cycles=3)¶
mtr --reportによるホップ単位の経路/損失レポート(固定サイクル、常時実行では
ない)。cyclesは1〜10にクランプ。mtr-packetのcap_net_raw権限が必要——無い
場合はサーバーをクラッシュさせずToolErrorでクリーンに失敗する。
tcp_port_check(host, port, timeout=5.0)¶
TCPポートの開放確認——単一のhost:portへの単純なsocket接続で、ポートスキャンでは
ない。ループやレンジ引数は意図的に持たない。
http_check(url, timeout=5.0)¶
URLへHEAD/GETしステータス・リダイレクトチェーン・レイテンシを報告。
http_get(url, timeout=5.0, max_bytes=262144)¶
URLへGETしデコード済みの本文を返す。返すのはテキスト系のContent-Type(text/*・
JSON・XML・JavaScript・YAML・+json/+xml)のみで、それ以外はステータス行だけを返す。
本文はmax_bytes(上限1 MiB)で打ち切り、切れた場合はtruncatedと明記する。
リダイレクトは1ホップずつ(最大5回)追い、初回URLと同様に各ホップもループバック・
リンクローカル・unspecifiedアドレス・クラウドのメタデータ宛先なら拒否する。
呼び出し全体はtimeout * 3の実時間で打ち切る。
NETDIAG_HTTP_AUTHを設定すると、設定したhttpsの前方一致の下にあるホップには、その前方一致の
Authorizationヘッダをホップごとに判定して付ける(READMEを参照)。そのときステータス行の末尾に
auth=appliedと出る。値は返さない。
tls_cert_check(host, port=443)¶
ホストが提示する証明書を取得しsubject/issuer/有効期限/SANを報告。SNIホスティング /CDN配下のオリジンへIPアドレス直接指定するとハンドシェイクが失敗しうる——正常な TLSの挙動でツールの不具合ではない(index参照)。
whois_lookup(domain)¶
ドメインのWHOIS参照。
asn_lookup(target)¶
Team Cymruのwhoisサービスによる、IPのAS番号・国コード逆引き、またはAS番号
(AS15169や15169)の組織情報取得。APIキー・GeoIP DB不要。IPリテラルまたは
AS番号のみ受け付ける(ホスト名は不可、名前しか無い場合は先にdns_lookupで解決
すること)。
current_time(timezone="UTC")¶
指定したIANAタイムゾーン(例: Asia/Tokyo)での現在日時と曜日。date・time・
weekday(Mon〜Sun)・weekday_ja(月〜日)・weekday_index(0が月曜)・
iso・utc_offset・utc・epochを返す。
曜日を日付から自分で導くのではなくこれを呼ぶこと。曜日の算出は暦の計算であり、 間違えても静かに間違うだけで気づけない。ネットワークには一切触れず、このサーバー 自身の時計を報告するので、時刻がずれていないかの点検にもなる。
エラー¶
全ツールがValueError(不正な入力)とToolError(ラップしているコマンドの
失敗)を捕捉し、例外を投げる代わりに返す。呼び出し側は常に答えを受け取れる。
テキストを返すツールは"error: ..."という文字列を返し、dictを返す
current_timeとhealth_checkは代わりに"error"キーを持つdictを返す。
CLI¶
netdiag-mcp --version # バージョン表示
netdiag-mcp --check # バイナリの欠けとNETDIAG_HTTP_AUTHの不正を報告(どちらも無ければ終了コード0)
--checkはdig/ping/mtr/whoisのいずれかが欠けているか、NETDIAG_HTTP_AUTHを設定していて読めないと非0で終了する——
デプロイスクリプトで、サーバーが静かに劣化する前に早期失敗させるのに使える。
セキュリティ上の注意点¶
- 外部バイナリの呼び出しは全てargvリストで行い(シェル文字列は使わない)、 ツール引数がシェル構文へ抜け出すことはできない
- ホスト名/IP・ポート引数は使用前に検証・サイズ/範囲クランプされる——ツール入力は モデル駆動であり、他のtool-calling面と同様に信頼しないものとして扱う
- 全ツールが読み取り専用で、このサーバーには書き込み・変更系ツールが1つも無い