mcpField
C
CodeDiag

CodeDiag

ローカル
sabahattink.github.ioセキュリティ23 日前に更新

CodeDiag について

CodeDiag は、Node.js プロジェクトの API ルート保護とプロジェクト全体の状態を調べる、オフライン実行可能な CLI です。重大度、位置、修正案を付けて問題を報告し、CI やコードレビュー向けの形式で出力します。

主な機能

  1. 01ルートの認証と入力検証を分析
  2. 02セキュリティリスクと露出した秘密情報を検査
  3. 03依存関係とプロジェクト設定を監査
  4. 04テスト、カバレッジ、構成を確認
  5. 05JSON、SARIF、HTML などでレポート出力
  6. 06スキャン比較とスコア履歴の記録

活用シーン

  1. 01認証や入力検証のない API ルートの特定
  2. 02リリース前のセキュリティ・依存関係確認
  3. 03Git の指定リビジョンからの変更ファイルだけをレビュー
  4. 04スキャン結果とスコアの継続的な追跡

設定

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

mcp.json · 共通設定
{
"mcpServers": {
"sabahattink-codediag": {
"command": "npx",
"args": [
"-y",
"@sabahattink/codediag"
]
}
}
}
起動コマンドnpx -y @sabahattink/codediag

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

パッケージ
npm@sabahattink/codediag0.13.0

ツール

3

掲載時のツール一覧 · 2 日前に更新

パラメーター型必須説明
pathstringいいえプロジェクトディレクトリの絶対パス。サーバーの作業ディレクトリがプロジェクトと異なる場合があるため、指定してください。相対パスはその作業ディレクトリを基準に解決されます。既定値はその作業ディレクトリです。
checkenumいいえauth:認証チェックのないルート。validation:入力検証のないルート。both(既定値)。auth | validation | both
maxResultsintegerいいえ返すルートの最大数です。デフォルトは 100 です。

詳細

codediag

codediag

あなたの API ルートのうち、誰でも呼び出せるものはどれですか?
Next.js、SvelteKit、React Router、Express、 Fastify、Hono、Elysia、NestJS、tRPC に対応した認証・バリデーションの網羅状況に加え、セキュリティ、依存関係、テスト、 構造のチェックも行います。コマンドは 1 つ、アカウント不要、オフラインで実行できます。

npm ダウンロード数 CI ライセンス


codediag のデモ


インストール

npx @sabahattink/codediag scan .

これで完了です。設定は任意で、アカウントもサーバーも不要です。また、--no-audit を指定するとスキャンを完全にオフラインで実行できます。

グローバルにインストールすることもできます。これにより、以下のすべての例で使用する codediag コマンドが PATH に追加されます。

npm install -g @sabahattink/codediag

パッケージ名について: npm で旧名称 codediag の所有権を移管している間は、@sabahattink/codediag として公開されています。インストール後も CLI バイナリの名称は codediag です。スコープなしの名称が再び利用可能になった場合は、移行のお知らせを掲載します。

チェック項目

codediag はスタックを自動検出し、5 つのアナライザーを実行します。各検出結果には、安定したルール ID(ルールリファレンス)、重要度、該当する場合は場所、推奨される修正方法が含まれます。

API の健全性 NestJS · Express · Fastify · Hono · Elysia · Next.js · SvelteKit · React Router · tRPC

AST 解析(正規表現ではなく ts-morph)により、アプリが実際に公開するルートを分析します。

  • NestJS: グローバルガード(useGlobalGuards、 APP_GUARD)、独自の UseGuards ベースのデコレーター、@Public()形式の 除外指定などの認証ガード。リクエストボディ用の DTO クラス(any、Record、 インターフェースは不可)と、ValidationPipe によって検証が強制されているかどうか。 Swagger ドキュメントと戻り値の型。
  • Express: express()、Router()、型付きパラメーターから解決されるルーター。 ルート上の認証および検証ミドルウェア、先に呼び出される router.use()、ファイルをまたいでマウントされる app.use(path, mw, router)。 一元化されたエラーハンドリングとヘルスエンドポイント。
  • Fastify: fastify.get() と fastify.route() のルートを、 register() で登録されたプラグイン、fastify-plugin のカプセル化、 @fastify/autoload のディレクトリー(fastify-cli プロジェクトで使われる ディレクトリープレフィックス、autoPrefix、オートフックを含む)をたどって 解決します。 ルートまたはそのコンテキスト上の onRequest/preHandler 認証フック、 変更を伴うルートのボディスキーマ、setErrorHandler、ヘルスエンドポイント。
  • Hono: new Hono() アプリ、basePath()、app.route() でマウントされた サブアプリのルートを、ファイルをまたいで登録順に再現します。ルートまたは それ以前の一致する app.use() 上の認証ミドルウェア(jwt()、bearerAuth()、 basicAuth()、または独自のミドルウェア)、zValidator などのボディ バリデーター、onError、ヘルスエンドポイント。
  • Elysia: new Elysia() インスタンス上のルート、prefix、group()、 use() でマウントされたプラグイン(関数型プラグインを含む)を、Elysia の フックスコープに従い、登録順に再現します。プラグインのフックがそれを使用する インスタンスに届くのは、scoped または global({ as: 'scoped' }、 .as('scoped'))の場合のみです。onBeforeHandle()、401 を返す derive() または resolve()、guard()、better-auth の { auth: true } などの認証マクロ、 onRequest()、またはハンドラー内のチェックによる認証。ルートに既存の認証 フックが適用されていない場合、検出結果では、そのフックがプラグイン内にとどまった のか、ルートの後に置かれていたのかを示します。ルートオプションまたは guard() 内の ボディスキーマ(TypeBox、Zod、またはその他の Standard Schema)、onError、 ヘルスエンドポイント。
  • Next.js: App Router と Pages Router の API ハンドラーを対象とし、 フロントエンドのみのプロジェクトは減点しません。ミドルウェア(Next.js 16 の proxy.ts)が、そのパスへの匿名リクエストを別の場所へ誘導する場合に限り、 ルートを保護していると判定します。各ルートについて、matcher、pathname チェック、next-auth、Clerk の protect()、Auth.js の authorized コールバック、 Supabase の updateSession() などのヘルパーが返す処理を評価します。
  • SvelteKit: +server エンドポイントとフォームアクションを対象とし、 src/routes のルート ID を使用します。sequence() とパスまたはルート ID の ガードを介した handle フック内、あるいはハンドラーとその呼び出すヘルパー内の 認証。認証チェックがレイアウトの load にしかなく、アクションやエンドポイントでは 実行されない場合は、その旨を示します。ボディの検証と、svelte.config.js で 無効にされた CSRF オリジンチェック。
  • React Router と Remix: app/routes.ts または Remix v2 のフラットルート ファイルにあるアクションとローダーを対象とします。アクション、そのヘルパー、 またはルートの middleware 内の認証。親のローダーまたはルート自身のローダーに 認証チェックがあるだけの場合は、どちらもアクションの前には実行されないため、 別のルールで判定します。フォームおよび JSON ボディのスキーマ検証。
  • tRPC: initTRPC からビルダーチェーンを経由して解決されるプロシージャ、 protectedProcedure などのエクスポートされたビルダー、ファイルをまたぐネストまたは マージされたルーター(~/ パスエイリアスを含む)を対象とします。認証 ミドルウェアのないミューテーション(名前ではなく、ミドルウェアが何をチェック するかで判定)、何でも受け入れる .input() パーサー、スタックトレースを公開する エラーフォーマッターまたは isDev: true を検出します。すべてのプロシージャの 前段にある認証も有効です。匿名の呼び出し元を拒否する createContext、 Express または Hono のマウント前の認証ミドルウェア、Fastify プラグイン全体に 適用される認証フック、Auth.js を含む Next.js の middleware.ts(Next.js 16 の proxy.ts)が tRPC ルートへの匿名リクエストを拒否する場合が該当します。 チェックは、tRPC をホストするサーバー(T3/Next.js、Express、Fastify、Hono、 Elysia、SvelteKit)の内部で実行され、スタンドアロンの tRPC サーバーは独自の スタックとして扱います。サインアップなど、意図的に公開されたミューテーションは、 理由を記した codediag-ignore-next-line ディレクティブがあれば許容されます。
セキュリティ

ハードコードされた認証情報、.gitignore による .env の保護、Helmet、レート制限、オープンな CORS、脆弱なパスワードハッシュ化、パスワードの直接比較を検出します。実行時のシンク(eval、new Function、シェルコマンド、生の SQL、TLS 検証の無効化)を AST から検出し、変数、分割代入、再代入、自作のヘルパー関数やサービスへの最大 2 回の呼び出しを通じてリクエストデータを追跡します。そのため、const cmd = req.query.cmd; exec(cmd) は重大な問題となり、別のファイルで exec を呼び出す run に対する run(req.query.cmd) も同様です。リクエストデータは、コンストラクターを通じてクラスが保存するフィールド、map/forEach のコールバック、for...of ループ、インターフェースまたはインジェクショントークンを介した NestJS プロバイダーまで追跡されます。tRPC プロシージャの input もリクエストデータであり、.input(schema) で検証された後も同様です。ファイルパス、送信リクエストのホスト、リダイレクト、HTML レスポンスに到達するリクエストデータは、それぞれパストラバーサル、SSRF、オープンリダイレクト、反射型 XSS として報告されます。テンプレートとしてコンパイルされるリクエストデータやオブジェクトのパスとして使われるリクエストデータは、テンプレートインジェクションまたはプロトタイプ汚染として報告されます。none を許可する JWT オプションや有効期限を無視する JWT オプション、httpOnly/secure のないセッション Cookie も検出します。JSON、YAML、Dockerfile、.npmrc、Git が追跡する .env ファイルからもシークレットを検索しますが、報告にその値が含まれることはありません。--secret-history(または .codediag.yml の secretHistory)を指定すると、最近のコミットで追加された行も検索し、コミット後に削除された認証情報を検出します。これらの情報はすべてのクローンに残るため、secret-in-git-history として報告されます。結果はクローンの深さによって異なるため、デフォルトでは無効です。Supabase プロジェクトでは、supabase/migrations を順番に再生し、行レベルセキュリティなしで API に公開されているテーブルを重大な問題(supabase-table-without-rls)として検出します。また、using または with check が true の書き込みポリシーも重大な問題(supabase-permissive-policy)として検出します。セキュリティ分析を参照してください。

依存関係

対応する npm、pnpm、Yarn Classic、または Yarn Berry の監査を実行します(--no-audit を指定するとスキップされます。audit: production は実際に配布する依存関係のみを確認します)。各脆弱性の検出結果に、影響を受けるパッケージとその勧告を表示し、ロックファイルと packageManager の整合性を確認し、非推奨のパッケージを検出して、エンジン仕様と必須スクリプトを検証します。モノレポのロックファイルは、最大 3 つの親ディレクトリまで検索します。監査に成功すると、ロックファイルと package.json をキーとして node_modules/.cache/codediag に 1 時間保存され、繰り返しのスキャンで再利用されます(Dependencies の概要に保存状況が表示されます)。新たに監査を実行するには、そのディレクトリを削除してください。pnpm はどのパッケージからでもワークスペース全体のロックファイルを監査するため、ロックファイルを共有するパッケージでは監査は 1 回だけ実行され、各パッケージにはそのパッケージ自身の依存関係に関連する勧告のみが報告されます。

テスト

テストファイルとフレームワーク(Jest、Vitest、Mocha、Ava、node:test)、テストとソースの比率、統合テストのディレクトリ、カバレッジを確認します。coverage-summary.json がある場合は、行/ステートメントで 80%、関数/分岐で 70% の基準に照らして測定します。それ以外の場合、CodeDiag は Jest、Vitest、node:test、c8、nyc の設定に実際のカバレッジしきい値があるかを確認します。

構成

README の内容、lint とフォーマットの設定(ワークスペースのルートから継承した設定も含む)、解決済みの TypeScript 厳格モード、NestJS の機能モジュール、.env.example などの環境テンプレート。

スコアリング

各アナライザーは0〜100点でスコアを付けます。加重平均によって評価が決まります。

API Health: 25%  ·  Security: 30%  ·  Dependencies: 20%  ·  Testing: 15%  ·  Structure: 10%
A+AB+BCDF
95+90+85+80+70+60+<60

デフォルトでは、アナライザーのスコアにスコアリングバージョン2を使用します。各アナライザーは100点から始まり、検出項目ごとに重要度の重み(criticalは25、warningは8、infoは2)を差し引きます。同じルールに該当する検出項目が複数ある場合、2つ目以降の減点は前の半分となるため、1つのルールによる減点は最大で重みの2倍です。根本原因も報告される検出項目(たとえば、テストがまったくない場合の「テストディレクトリがない」)はinfoに格下げされ、causedByで関連付けられ、減点されません。package.jsonがない場合のように、アナライザーが評価対象を何も得られない場合は、そのアナライザーのスコアが0になります。

失点はすべて、JSON出力のscoreBreakdown、HTMLおよびMarkdownレポート、ならびに--verboseを指定した場合の各アナライザーの項目に記載されます。以前の「チェック合格」スコアを次のリリースまで維持するには、scoring: { version: 1 }を設定してください。

CLI

codediag scan .                    # Full report
codediag scan . --format json      # JSON (for CI/CD)
codediag scan . --format sarif     # SARIF 2.1.0 (for code scanning)
codediag scan . --format md        # Markdown (for PRs)
codediag scan . --format svg       # SVG score badge
codediag scan . --format html > codediag-report.html  # Interactive dashboard
codediag scan . --format fixes > codediag-fixes.md     # Review checklist
codediag scan . --format prompt > codediag-prompt.txt  # Review-only AI handoff
codediag scan . --ci               # JSON output + exit code
codediag scan . --threshold 80     # Exit 1 below 80 in any output mode
codediag scan . --fail-on critical # Exit 1 on any active critical finding
codediag scan . --quiet            # Score only
codediag scan . --verbose          # All issues and the score breakdown
codediag scan . --no-audit         # Offline: skip the package manager audit
codediag scan . --update-baseline .codediag-baseline.json  # Record accepted findings
codediag scan . --ci --baseline .codediag-baseline.json    # Fail only on new findings
codediag scan . --compare previous.json   # Score change, new and fixed findings
codediag scan . --changed-since origin/main  # Only files this branch changes
codediag scan . --workspaces              # Every monorepo package, combined
codediag scan . --history .codediag/history  # Record scans, show the trend
codediag scan . --secret-history         # Also secrets removed but still in Git history
codediag rules                     # List every rule
codediag explain open-cors         # Explain a rule and how to suppress it
codediag init                      # Create .codediag.yml
codediag mcp                       # Serve MCP on stdio for AI agents

リポジトリ用のバッジを生成します。

codediag scan . --format svg > codediag.svg
推移と変更されたファイル

--compareには以前のJSONレポートを指定でき、スコアと各アナライザーの差分、新たに検出された項目(NEWおよびisNew: trueのマーク付き)、修正された項目が表示されます。すべての出力形式で使用でき、HTMLレポートには変更パネルと「New」フィルターが追加され、SARIFでは結果にbaselineStateが付与されます。

codediag scan . --format json > reports/main.json      # on main
codediag scan . --compare reports/main.json --verbose  # on your branch

--changed-since <revision>を指定すると、Gitのリビジョンとの差分があるファイルにスキャン対象を絞り込みます。対象には、マージベース以降のコミット、ステージ済みおよび未ステージの編集、新しい未追跡ファイルが含まれます。該当ファイルの検出項目のみが報告・採点されるため、スコアはプロジェクト全体ではなく変更内容を表し、レポートには対象外となったほかの箇所の検出項目数も表示されます。

codediag scan . --changed-since origin/main --threshold 90

--history <directory>を指定すると、推移を記録できます。各スキャンはディレクトリ内に保存され(codediag-<timestamp>.json)、レポートには直近50回分のスキャンのスコアが表示されます。ターミナルとMarkdownではスパークラインとして、HTMLレポートでは表表示付きのグラフとして表示されます。履歴を保持するには、ディレクトリをコミットするか、CIでキャッシュしてください。

codediag scan . --history .codediag/history
モノレポ

--workspacesを指定すると、npm、pnpm、Yarnのワークスペース、Lernaリポジトリ、Nxワークスペースに含まれるすべてのパッケージをスキャンします(Turborepoでは、パッケージマネージャーのワークスペースを使用します)。各パッケージは個別にスタックを検出してスコアを算出します。パッケージ自身の.codediag.ymlがあればそれを使用し、なければルート設定を使用します。ルートのignoreパスはパッケージ内のパスに読み替えられます。統合レポートにはすべてのパッケージが一覧表示され、各アナライザーのスコアは実行対象となったパッケージの平均となります。合計スコアには通常のアナライザーの重みが適用されます。パッケージの監査は4つずつ実行され、その後にパッケージが分析されます。検出項目はルートからの相対パスで示され、プロジェクトレベルの検出項目はパッケージのpackage.jsonを示します。そのため、ベースライン、--compare、--changed-since、SARIF、GitHub Action(workspaces: true)をリポジトリ全体で使用できます。

codediag scan . --workspaces
codediag scan . --workspaces --format html > monorepo-report.html
codediag scan . --workspaces --package-threshold 70   # Gate every package too

統合された平均スコアでは、スコアの低いパッケージが見えなくなることがあります。packageThreshold(または--package-threshold、あるいはActionのpackage-threshold入力)を設定すると、各パッケージのスコアにも個別のしきい値が適用されます。しきい値を下回るパッケージがあるとスキャンは失敗し、そのパッケージ名がstderrとジョブの概要に表示され、すべてのレポートにマークされます。パッケージごとの.codediag.ymlで、異なるpackageThresholdを設定することもできます。

--workspacesを指定せずにワークスペースのルートをスキャンすると、単一のプロジェクトとしてスキャンされ、フラグの指定が提案されます。

レビュー優先の修正提案

CodeDiag は、アナライザーの検出結果を優先順位付きの修正チェックリストにできます。 各項目は未チェックのままで、明示的にレビューが必要です。CodeDiag がプロジェクトファイルを編集したり、推奨事項を自動適用したりすることはありません。

codediag scan . --format fixes > codediag-fixes.md

コーディングエージェントで使用する場合、--format prompt は、診断結果を信頼できないデータとして扱い、パッチを提案する前に参照先のファイルを確認するようエージェントに指示する、構造化された引き継ぎ情報を作成します。 プロンプトに含まれるのは診断メタデータのみで、ソースファイルの内容や秘密情報は含まれません。また、ユーザーが明示的に承認するまで編集を禁止します。

codediag scan . --format prompt > codediag-prompt.txt

出力仕様と推奨ワークフローについては、レビュー優先の修正提案ガイドをご覧ください。

VS Code 拡張機能

VS Code 拡張機能は同じアナライザーエンジンを実行し、場所が特定された検出結果を「問題」パネルに表示して、HTML レポート、修正計画、AI レビュープロンプトをエディターで直接開きます。各問題のクイックフィックスでは、その行またはファイルでルールを抑制する(理由は自分で入力します)か、ルールのドキュメントを開くことができます。拡張機能が Visual Studio Marketplace で公開されるまでは、成功した GitHub Actions の実行によって、インストール可能な .vsix アーティファクトが公開されます。

npm run extension:package

インストール方法、コマンド、ワークスペースの信頼境界、保存時のスキャン動作については、VS Code 拡張機能ガイドをご覧ください。

JSON 出力仕様は schema/scan-result.schema.jsonで公開されています。 互換性の保証とフィールド定義については、 JSON 出力ドキュメント をご覧ください。

コードスキャンプラットフォーム向けに、--format sarif は、安定したルール ID、ソースの場所、重大度レベル、検出結果のフィンガープリントを含む SARIF 2.1.0 を出力します。

codediag scan . --format sarif > codediag-report.sarif

フィールドの対応関係と GitHub Code Scanning のワークフローについては、SARIF 出力ドキュメントをご覧ください。すべてのルールはルールリファレンスで説明されています。

ガイド

ルートを保護しているように見えて、実際には保護していない認証チェックについて、出典付きで簡潔に回答します。

AI エージェント

CodeDiag の分析結果を使って、コーディングエージェントに「自分のルートのうち、誰でも呼び出せるものはどれですか?」と尋ねられます。Claude Code では、スキルと MCP サーバーを追加するプラグインをインストールします。

/plugin install codediag --marketplace sabahattink/codediag

その他の MCP クライアントは、npx -y @sabahattink/codediag mcpでサーバーを起動できます。find_unprotected_routes、scan_project、explain_ruleを提供し、オフラインで動作します。AI エージェントガイドでは Claude Code、Cursor、VS Code、Claude Desktop のセットアップ方法を説明しています。また、MCP を使用しないエージェント向けのエージェントスキルもあります。

CI/CD

# GitHub Actions (no npm install required)
- uses: sabahattink/codediag@v0
  id: codediag
  with:
    threshold: 80

この Action はスコアの注釈とジョブの概要を追加し、JSON と SARIF のレポートを書き出します。また、スコアが指定したしきい値を下回ると失敗します。comment: true(および pull-requests: write 権限)を設定すると、スコア、前回のプッシュからの変化、プルリクエストで変更されたファイルに関する検出結果を含むコメントを、プルリクエストに 1 件作成して最新の状態に保ちます。score、grade、report、sarif の出力は後続のステップで使用できます。すべての入力、出力、ワークフロー全体の例については、GitHub Action guide をご覧ください。

プルリクエストのコメント例

✅ CodeDiag:88/100(B+)

▲ 前回の実行から +4 · しきい値 80

アナライザースコア検出結果
API ヘルス92/1001
セキュリティ67/1002
依存関係100/1000
テスト98/1001
構造100/1000
変更されたファイルの検出結果(2)
ルール場所検出内容
🔴reflected-xsssrc/routes/search.ts:14リクエストデータがエスケープされずに HTML レスポンスへ書き込まれています
🟡open-redirectsrc/routes/auth.ts:31リダイレクト先がリクエストデータから取得されています

一覧にない検出結果:プロジェクト内の別の場所に 1 件あります。

既存のコードベースに CodeDiag を導入しますか?ベースラインをコミットすると、新たな検出結果があった場合にのみゲートが失敗するようになります。

- uses: sabahattink/codediag@v0
  with:
    threshold: 80
    baseline: .codediag-baseline.json   # created with --update-baseline
# npm-based GitHub Actions step
- run: npx @sabahattink/codediag scan . --ci --threshold 80
# GitLab CI
codediag:
  script: npx @sabahattink/codediag scan . --ci --threshold 80
# Pre-push hook (husky)
npx @sabahattink/codediag scan . --quiet --threshold 70

設定

任意です。.codediag.yml を作成するか、codediag init を実行してください。コマンドラインの --threshold は、設定されたしきい値より優先されます。設定されたしきい値は、そのプロジェクトをスキャンするたびに適用されます。設定ファイルがない場合、通常のスキャンは情報提供のみを行い、--ci ではデフォルトのしきい値 70 が使用されます。

threshold: 70
failOn: critical         # optional; any active critical finding fails the scan
packageThreshold: 60     # optional; each --workspaces package must reach it
ignore: [node_modules, dist, .git, coverage]
maxFileSizeKb: 512
scoring:
  version: 2
rules:
  missing-swagger: off   # or info, warning, critical
audit: true              # false skips the network audit; production skips devDependencies
secretHistory: false     # true searches the last 1000 commits for removed secrets, or give a number
analyzers:
  api: true
  security: true
  dependencies: true
  testing: true
  structure: true

不明なオプションや無効な値がある場合、黙って無視するのではなくスキャンが失敗します。ignore 内のディレクトリと glob のエントリーは、ソースファイルを検査するアナライザーに適用されます。

個々の検出結果は、理由を必須としてソース内で抑制できます。また、ベースラインを使って既存の検出結果を許容すると、CI は新しい問題がある場合にのみ失敗します。

// codediag-ignore-next-line unsafe-dynamic-code -- plugin code is signed and sandboxed

抑制、ルール設定、ベースラインをご覧ください。

ソースの検出では、階層を問わず node_modules、dist、coverage、.next、.turbo ディレクトリ、*.min.js と *.map ファイル、ドットで始まるディレクトリ、さらにプロジェクトの .gitignore ファイル(ネストされたものや、Git ルートまでの親ディレクトリにあるものを含む)に一致するすべてが常に除外されます。maxFileSizeKb を超えるコードファイルや、ミニファイされたバンドルと見られるファイルはスキップされ、JSON の skipped サマリーに報告されます。

対応スタック

スタックAPI ヘルスセキュリティ依存関係テスト構造
NestJS✅✅✅✅✅
Next.js✅✅✅✅✅
SvelteKit✅✅✅✅✅
React Router / Remix✅✅✅✅✅
Express✅✅✅✅✅
Fastify✅✅✅✅✅
Hono✅✅✅✅✅
Elysia✅✅✅✅✅
tRPC✅✅✅✅✅
Node.js—✅✅✅✅

CodeDiag の位置付け

CodeDiag は Node.js バックエンド向けの高速で説明可能なヘルスチェックであり、リンターや包括的な SAST プラットフォームの代替ではありません。これらと併用してください。

  • ESLint または Biome は、入力中にコードレベルのミスを検出します。CodeDiag は、NestJS のルートがグローバルガードで保護されているか、Express のルーターが認証を経由してマウントされているかなど、これらのツールでは確認できないプロジェクトレベルの保護策をチェックします。
  • Semgrep、CodeQL、または SonarQube は、言語全体を対象にした詳細なルールセットを実行します。CodeDiag は、ノイズが少なく、失点の理由をすべて説明するスコアを備えた、フレームワークを考慮した少数のルールに特化しています。
  • npm audit、Snyk、または Dependabot は、脆弱な依存関係を追跡します。CodeDiag はパッケージマネージャーの audit を実行し、その結果を同じレポートにまとめます。

すべての処理は 1 つのコマンドでローカルに実行でき、GitHub Code Scanning で結果を確認したい場合は SARIF を出力できます。

クリーンなスキャンが意味しないこと

CodeDiag は、各ルートに認識可能な認証チェックと入力検証があるかを確認します。結果がクリーンでも、アプリが安全であることを意味するわけではありません。

  • オブジェクトレベルの認可。 ルートでセッションを必須にしていても、ユーザー A が別の ID を送信することで、ユーザー B のレコードを読み取ったり変更したりできる場合があります。CodeDiag は、ハンドラーがデータを呼び出し元ユーザーに限定しているかを確認しません。各リソースについて、ユーザーをまたぐテストを 1 つ実施すれば、見落としを検出できます。
  • データベースへの直接アクセス。 Supabase の anon キーや Firebase のように、ブラウザーがデータベースと通信する場合、API ルートがどれほど適切に保護されていても、境界となるのは行レベルセキュリティポリシーやセキュリティルールです。CodeDiag は Supabase のマイグレーションを読み取り、RLS が設定されていないテーブルや、すべての行への書き込みを許可するポリシーを検出しますが、ポリシーの条件が適切かどうかは判断せず、稼働中のデータベースや Firebase のルールも読み取りません。
  • Next.js Server Actions はまだ分析対象ではありません。それぞれの内部で認証を確認してください。
  • 名前を基準に信頼するチェック。 requireUser() のようなヘルパーは認証チェックとして扱われます。CodeDiag はプロジェクト内のヘルパーを数回の呼び出しまでたどりますが、そのすべての経路で拒否されることは証明しません。
  • Webhook のリプレイ。 署名検証で送信者は認証されますが、CodeDiag はタイムスタンプの許容範囲や冪等性を確認しません。
  • 分析対象外のサーバー。 Koa、Hapi、Nuxt、Nitro、Astro などのサーバーは API Health の分析対象外です。それらに対しては、ルートの検出結果がないと表示する代わりに、レポートに「ルートは分析されていません」と表示します。
  • その他のランタイム。 分析対象は Node.js バックエンドのみで、Python、Go、Ruby、Java のサービスは対象外です。

ロードマップ

  • 0.2: NestJS、Express、Next.js 用のアナライザー、検証済み設定、JSON スキーマ、SARIF、HTML、SVG バッジ、修正プラン、GitHub Action、VS Code 拡張機能。
  • 0.3「Reliable Engine」: ネストした依存関係やバンドルをスキップする、gitignore を考慮した検出(CodeDiag 自身のスキャンは 15 秒から 1.3 秒に短縮)、ルールレジストリ、説明可能なスコアリング、抑制、ベースライン、オフラインスキャン、Express、NestJS、セキュリティシンク向けの高精度な修正。詳細は 変更履歴をご覧ください。
  • 0.4 および 0.5: パストラバーサル、SSRF、オープンリダイレクト、反射型 XSS のルール、GitHub Action によるプルリクエストコメント。
  • 0.6「Deep Scan」: Fastify の解析、JWT、Cookie、テンプレートインジェクション、プロトタイプ汚染、シェル起動のルール、設定ファイルおよびコミット済みの .env ファイルのシークレットスキャン、--compare と --changed-since、再設計された HTML レポート、VS Code のクイックフィックス。
  • 0.7「Across」: ヘルパーやサービスを介したファイル横断の汚染追跡、モノレポ向けの --workspaces(CLI、Action、VS Code)、Hono の解析、--history によるスコアの推移、プルリクエストコメントのベースブランチとの差分、監査アドバイザリーの詳細、audit: production。
  • 0.8「Depth」: tRPC プロシージャ、フィールド、コンストラクター、コールバック、注入されたプロバイダーを介した汚染追跡、@fastify/autoload プロジェクト、ツリーから削除されても Git 履歴には残るシークレット、パッケージごとのしきい値と --fail-on によるゲート、VS Code での修正クイックフィックス。
  • 0.9「Perimeter」: createContext における tRPC 認証、Express マウント、Next.js ミドルウェア、1 時間キャッシュされワークスペースのパッケージ全体で並行実行される監査、Action バンドルを再ビルドする Dependabot 更新。
  • 0.10「Reach」: SvelteKit と React Router/Remix の解析、Hono および Fastify のマウント前段と Auth.js ミドルウェア内における tRPC 認証、ルートごとの Next.js ミドルウェア判定、ワークスペースのロックファイルごとに 1 回実行し、パッケージごとに分割する pnpm 監査、実際のアプリでのパスワードやシークレットに関する誤検知の削減。
  • 0.11「Agents」: MCP サーバー(codediag mcp)、Agent Skill、Claude Code プラグインにより、コーディングエージェントが CodeDiag を使って保護されていないルートを見つけられます。
  • 0.12「Rows」: supabase/migrations から読み取る、行レベルセキュリティのない Supabase テーブルと、すべての行に対してオープンな書き込みポリシー。
  • 0.13「Scope」: プラグインとフックのスコープを追跡する Elysia の解析、および CodeDiag が解析しないサーバー向けの「解析対象外のルート」注記。
  • 次の予定: 計画中のフレームワーク対応、エディターの改善、より深い汚染追跡については、docs/roadmap.mdをご覧ください。

コントリビューション

開発ワークフロー、テストの要件、プルリクエストのガイドラインについては、CONTRIBUTING.mdをご覧ください。

CodeDiag のコード判定が間違っていますか?その内容が分かる最小限のスニペットを添えて、誤検知または検出漏れを報告してください。質問やアイデアは Discussionsへお寄せください。

git clone https://github.com/sabahattink/codediag.git
cd codediag
npm ci
npm run check
node dist/index.js scan /path/to/project

Conventional Commitsを使用してください:feat:、fix:、docs:、refactor:

セキュリティの脆弱性は、公開 issue ではなく、SECURITY.mdに従って非公開で報告してください。

ライセンス

MIT - Sabahattin Kalkan


codediag がユーザーより先に問題を見つけたら、⭐を付けてください

コメント

MCP は初めてですか?

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

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