prodlint について
prodlintは、AI生成アプリの本番投入準備を確認する静的解析ツールです。設定やLLMを使わず、52個のルールでセキュリティ、信頼性、性能、AIコード品質を検査します。
主な機能
- 01本番準備度を調べる52ルール
- 02セキュリティ・信頼性・性能の検査
- 03AI生成コード品質の検査
- 04JSON、SARIF、ベースライン出力
- 05具体的な修正ヒント
活用シーン
- 01出荷前にAI生成アプリをスキャン
- 02CIで重大な問題を検出してビルドを停止
- 03スキャン結果をGitHub Code Scanningに送信
MCP 対応
prodlintには、読み取り専用のscanとscan-webツールを備えたMCPサーバーがあります。MCPクライアントはプロジェクトのディレクトリやウェブサイトを検査し、スコア、カテゴリ別結果、検出内容を取得できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
2掲載時のツール一覧 · 1 日前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| path | string | はい | スキャンするプロジェクトディレクトリの絶対パス |
| ignore | array | いいえ | 無視する Glob パターン |
詳細
prodlint
バイブコーディングで作成したアプリを本番環境に対応させます。
バイブコーディングで作成したアプリ向けの静的解析ツールです。Cursor、v0、Bolt、Copilot が生み出す、存在しないインポート、認証の欠落、ハードコードされたシークレット、検証されていないサーバーアクションなど、セキュリティ、信頼性、パフォーマンス、AI の品質に関する問題を検出します。設定不要、LLM 不要、52 個のルールを備えています。
npx prodlint
prodlint v0.10.4
Scanned 148 files · 2 critical · 5 warnings · 1 info
src/app/api/checkout/route.ts
12:1 INFO No rate limiting — anyone could spam this endpoint and run up your API costs rate-limiting
28:5 WARN Empty catch block silently swallows error shallow-catch
src/actions/submit.ts
5:3 CRIT Server action uses formData without validation next-server-action-validation
↳ Validate with Zod: const data = schema.safeParse(Object.fromEntries(formData))
src/lib/db.ts
1:1 CRIT Package "drizzle-orm" is imported but not in package.json hallucinated-imports
Scores
security 72 ████████████████░░░░ (8 issues)
reliability 85 █████████████████░░░ (4 issues)
performance 95 ███████████████████░ (1 issue)
ai-quality 90 ██████████████████░░ (3 issues)
Overall: 82/100 (weighted)
2 critical · 5 warnings · 4 info
なぜ必要なのか?
バイブコーディングは、最も速くアプリを構築できる方法です。素早くリリースするには、コードがコンパイルできるだけでなく、本番環境に対応できているかを把握する必要があります。ハードコードされたシークレット、存在しないパッケージ、認証の欠落、XSS の脆弱性は、型チェックを通過して一見正しく見えますが、本番環境に対応できているわけではありません。
prodlint は、TypeScript や ESLint がチェックしない点、つまり バイブコーディングで作成したアプリが本番環境に対応できているかどうかをチェックします。
インストール
npx prodlint # Run directly (no install)
npx prodlint ./my-app # Scan specific path
npx prodlint --json # JSON output for CI
npx prodlint --sarif # SARIF 2.1.0 for GitHub Code Scanning
npx prodlint --summary # Quick pass/fail + top 3 blockers
npx prodlint --profile startup # Only critical findings
npx prodlint --profile strict # All findings including info
npx prodlint --baseline .prodlint-baseline.json # Only new findings
npx prodlint --ignore "*.test.ts" # Ignore patterns
npx prodlint --min-severity warning # Only warnings and criticals
npx prodlint --quiet # Suppress badge output
または、インストールします:
npm i -D prodlint # Project dependency
npm i -g prodlint # Global install
4 カテゴリにわたる 52 個のルール
セキュリティ(27 個のルール)
| ルール | チェック内容 |
|---|---|
secrets | ソースコードにハードコードされた API キー、トークン、パスワード |
auth-checks | 認証のない API ルート |
env-exposure | サーバー専用のシークレットに対する NEXT_PUBLIC_ の使用 |
input-validation | 検証されていないリクエストボディの使用 |
cors-config | Access-Control-Allow-Origin: *。ワイルドカードと認証情報の併用は重大な問題として扱われます |
unsafe-html | ユーザーデータを使った dangerouslySetInnerHTML |
sql-injection | 文字列補間を使った SQL クエリ(ORM を考慮) |
open-redirect | redirect() に渡されるユーザー入力 |
rate-limiting | レートリミッターのない API ルート |
phantom-dependency | node_modules にあるが package.json に記載されていないパッケージ |
insecure-cookie | httpOnly/secure/sameSite が設定されていないセッション Cookie |
leaked-env-in-logs | console.log 呼び出し内の process.env.* |
insecure-random | トークン、シークレット、セッション ID に使用される Math.random() |
next-server-action-validation | Zod/スキーマによる検証なしで formData を使用するサーバーアクション |
env-fallback-secret | ハードコードされたフォールバック値を持つ、セキュリティ上重要な環境変数 |
verbose-error-response | API レスポンスに漏えいするエラースタックトレースやメッセージ |
missing-webhook-verification | 署名検証のない Webhook ルート |
server-action-auth | 認証チェックなしでミューテーションを行うサーバーアクション |
eval-injection | eval()、new Function()、動的コード実行 |
next-public-sensitive | シークレット環境変数への NEXT_PUBLIC_ プレフィックスの付与 |
ssrf-risk | サーバーコード内の fetch に渡される、ユーザーが制御する URL |
path-traversal | サニタイズされていないユーザー入力を使ったファイルシステム操作 |
unsafe-file-upload | ファイルの種類やサイズを検証しないファイルアップロードハンドラー |
supabase-missing-rls | RLS を有効にせずにマイグレーションで実行する CREATE TABLE |
deprecated-oauth-flow | OAuth Implicit Grant(response_type=token) |
jwt-no-expiry | 有効期限なしで署名された JWT トークン |
client-side-auth-only | クライアントコンポーネント内のパスワード比較または認証ロジック |
信頼性(11 ルール)
| ルール | チェック内容 |
|---|---|
hallucinated-imports | package.json に含まれていないパッケージのインポート |
error-handling | try/catch を使用しない非同期処理 |
unhandled-promise | await も .catch も使用していない未処理の Promise |
shallow-catch | エラーを握りつぶす空の catch ブロック |
missing-loading-state | ローディング状態を設定せずにデータを取得するクライアントコンポーネント |
missing-error-boundary | 対応する error.tsx がないルートレイアウト |
missing-transaction | $transaction を使用しない複数の Prisma 書き込み |
redirect-in-try-catch | try/catch 内の redirect() — Next.js の redirect は例外をスローし、catch がそれを握りつぶします |
missing-revalidation | DB を変更するが revalidatePath を呼び出さないサーバーアクション |
missing-useeffect-cleanup | サブスクリプションやタイマーを使用しているが、クリーンアップの return がない useEffect |
hydration-mismatch | サーバーコンポーネントのレンダリングパスにある window/Date.now()/Math.random() |
パフォーマンス(6 ルール)
| ルール | チェック内容 |
|---|---|
no-sync-fs | API ルート内の readFileSync |
no-n-plus-one | ループ内のデータベース呼び出し |
no-unbounded-query | 上限のない .findMany()/.select('*') |
no-dynamic-import-loop | ループ内の import() |
server-component-fetch-self | 自身の API ルートからデータを取得するサーバーコンポーネント |
missing-abort-controller | タイムアウトまたは AbortController を使用しない Fetch/axios 呼び出し |
AI 品質(8 ルール)
| ルール | チェック内容 |
|---|---|
ai-smells | any 型、console.log、増え続ける TODO コメント |
placeholder-content | Lorem ipsum、サンプルメールアドレス、本番コードに残った "your-api-key-here" |
hallucinated-api | .flatten()、.contains()、.substr() — AI が作り出したメソッド |
stale-fallback | 本番コードにハードコードされた localhost:3000 |
comprehension-debt | 80 行を超える関数、深いネスト、多すぎるパラメーター |
codebase-consistency | プロジェクト内で混在する命名規則 |
dead-exports | どこからもインポートされていないエクスポート関数 |
use-client-overuse | クライアント側 API を一切使用していないファイルの "use client" |
スマート検出
prodlint は、よくある誤検出を回避します。
- AST 解析 — 13 ルール(インポート、catch ブロック、redirect、try/catch 内の redirect、SSRF、パストラバーサル、JWT、HTML インジェクション、ハイドレーション、トランザクション、環境変数の漏えい、ループ、SQL)を Babel ベースで解析し、失敗時は正規表現にフォールバックします
- モノレポ対応 — npm/yarn/pnpm のワークスペース依存関係を自動的に解決します
- フレームワーク認識 — Prisma、Drizzle、Supabase、Knex、Sequelize のホワイトリストにより、SQL インジェクションの誤検出を防ぎます
- ミドルウェア検出 — Clerk、NextAuth、Supabase のミドルウェア(
middleware.ts、または Next.js 16 のproxy.ts)を検出し、認証に関する検出結果の重大度を引き下げます - ブロックコメント認識 —
/* */内のパターンは無視されます - パスエイリアス対応 —
@/、~/、および tsconfig のパスは、存在しないインポートとして検出されません - ルートの除外 — 認証、Webhook、ヘルスチェック、cron のルートは認証/レート制限チェックの対象外です
- テスト/スクリプトファイルの認識 — 本番用ではないファイルの重大度を引き下げます
- 修正案 — 検出結果には、実際に適用できる修正コードを含む
fixのヒントが表示されます
スコアリング
各カテゴリの初期スコアは 100 です。検出結果ごとの減点:
| 重大度 | 減点 | ルールごとの上限 |
|---|---|---|
| critical | -8 | 最大 1 |
| warning | -2 | 最大 2 |
| info | -0.5 | 最大 3 |
逓減:カテゴリ内の減点が 30 点を超えると、それ以降の減点は半分になります。50 点を超えると、4 分の 1 になります。
全体の加重スコア:セキュリティ 40%、信頼性 30%、パフォーマンス 15%、AI 品質 15%。最低値は 0 です。重大な検出結果が 1 件でもある場合、終了コードは 1 です。
GitHub Action
.github/workflows/prodlint.yml に追加します:
name: Prodlint
on: [pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: prodlint/prodlint@v1
with:
threshold: 50
スコアの内訳を PR コメントとして投稿し、スキャンで重大な問題が見つかった場合、またはスコアが threshold を下回った場合にビルドを失敗させます。Action の各リリースでは対応するバージョンの prodlint が実行されるため、Action を固定(@v1、バージョンタグ、またはコミット SHA)すると、スキャナーも固定されます。
| 入力 | デフォルト | 説明 |
|---|---|---|
path | . | スキャンするパス |
threshold | 0 | 合格に必要な最低スコア(0~100) |
fail-on-critical | true | スキャンで重大な問題が見つかった場合に失敗させます。false の場合は、失敗させずに問題を報告します |
ignore | 無視する glob パターンをカンマ区切りで指定します | |
comment | true | 結果を PR コメントとして投稿します |
| 出力 | 説明 |
|---|---|
score | 総合スコア(0~100) |
critical | 重大な検出事項の数 |
SARIF + GitHub Code Scanning
prodlint の結果を GitHub の Security タブにアップロードします:
- name: Run prodlint
run: npx prodlint --sarif > prodlint.sarif
- name: Upload SARIF
uses: github/codeql-action/upload-sarif@v4
with:
sarif_file: prodlint.sarif
category: prodlint
既存プロジェクトのベースライン
既存の検出事項に圧倒されることなく、prodlint を段階的に導入できます:
# Save current state as baseline
npx prodlint --baseline-save .prodlint-baseline.json
# CI only fails on NEW findings
npx prodlint --baseline .prodlint-baseline.json
MCP サーバー
Cursor、Claude Code、または MCP 互換エディターで prodlint を使用します:
Claude Code:
claude mcp add prodlint -- npx -y prodlint-mcp
Cursor / Windsurf:
{
"mcpServers": {
"prodlint": {
"command": "npx",
"args": ["-y", "prodlint-mcp"]
}
}
}
prodlint-mcp は、prodlint に組み込まれたサーバーを起動する軽量なランチャーです。prodlint のすべてのリリースとともに公開されるため、常に対応するスキャナーが実行されます。
AI に 「このプロジェクトで prodlint を実行して」 と頼むと、scan ツールが直接呼び出されます。
| ツール | 入力 | 戻り値 |
|---|---|---|
scan | path(プロジェクトディレクトリ)、任意の ignore、minSeverity(critical / warning / info)、categories、maxFindings(デフォルトは 30) | スコア、カテゴリ別スコア、重大度の高い順に並べた検出事項。maxFindings を超えても、すべての重大な検出事項が一覧表示されます。 |
scan-web | url | サイトスコア、グレード、および 14 項目のエージェント対応度チェック |
どちらのツールも、Markdown の要約と構造化出力(各ツールの outputSchema に一致する structuredContent)を返します。また、どちらも読み取り専用(readOnlyHint)としてマークされており、GitHub Copilot コードレビューなどのホステッドレビューアーが MCP ツールを呼び出す前に必要とします。
サイトスコア
デプロイ済みの任意の Web サイトで、AI エージェントへの対応度を確認できます。llms.txt、TDMRep、AgentCard、AI-Disclosure、HTTP Signatures(RFC 9421)など、新たな標準を対象とした 14 項目をチェックします。
npx prodlint --web example.com
npx prodlint --web example.com --json # JSON output
prodlint site score
example.com · 14 checks
Score: 42 C ████████░░░░░░░░░░░░
✗ AI-Disclosure Header 0/10 No AI-Disclosure header found.
✗ Content-Usage Directives 0/10 No Content-Usage directives found.
✗ TDMRep 0/10 No TDMRep found.
✗ A2A AgentCard 0/5 No agent-card.json found.
✗ ai.txt 0/5 No ai.txt found at site root.
! llms.txt 2/5 llms.txt found but missing key sections.
✓ robots.txt 10/10 robots.txt found with 15 rules.
✓ Sitemap 10/10 Valid sitemap with 42 URLs.
✓ Structured Data 10/10 Found JSON-LD structured data.
✓ OpenGraph 10/10 Complete OpenGraph tags found.
✓ Page Speed 5/5 Loaded in 0.8s.
✓ AI Bot Directives 5/5 AI-specific bot rules found.
✓ WebMCP Tools 0/5 No WebMCP tools detected.
7 passed · 5 failed · 1 warnings
Full results: https://prodlint.com/score?url=example.com
または、prodlint.com/score でスコアをインタラクティブに確認できます。
AI ツール向け
- LLM 向けドキュメント:prodlint.com/llms.txt — LLM 向けの簡潔なプロジェクト概要
- 完全なリファレンス:prodlint.com/llms-full.txt — 詳細を含む全 52 ルール
- MCP セットアップガイド:prodlint.com/mcp — Claude Code、Cursor、Windsurf の詳細なエディター設定
prodlint は、AI が生成したコードのパターンに特化して設計されています。すべてのルールで、スタイル上の細かな指摘ではなく、AI コーディングツールが一貫して生み出す本番環境での問題をチェックします。
抑制
単一の行を抑制します:
// prodlint-disable-next-line secrets
const key = "sk_test_example_for_docs"
ファイル全体を抑制します(先頭に配置):
// prodlint-disable secrets
プログラム用 API
import { scan } from 'prodlint'
const result = await scan({ path: './my-project' })
console.log(result.overallScore) // 0-100
console.log(result.findings) // Finding[]
バッジ
[](https://prodlint.com)
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。