🚀 CodeSentinel MCP Server
CodeSentinelは、Model Context Protocol (MCP) 向けの包括的なコード品質分析サーバーです。Claude Codeやその他のMCP互換クライアントと統合し、セキュリティの脆弱性、誤解を招くパターン、不完全なコードを検出し、良い実践を強調します。
🚀 クイックスタート
AIコーディングアシスタントは、意図せずに微妙な問題を引き起こす可能性があります。例えば、ハードコードされたシークレット、空のcatchブロック、残されたTODOプレースホルダー、またはエラーを隠すパターンなどです。CodeSentinelは品質ゲートとして機能し、問題が本番環境に到達する前に、5つのカテゴリーにまたがる93の異なるパターンを分析します。
✨ 主な機能
- 検証対応型検出:多くのパターンには検証手順が含まれており、誤検出を減らします。
- LLM最適化出力:AIによる消費とアクションに適した構造化されたJSON出力。
- バランスの取れた分析:問題と強みの両方を検出し、公平なコード評価を行います。
- 多言語対応:TypeScript、JavaScript、Python、Go、Rust、Javaなどの多くの言語で動作します。
なぜTree-sitterやASTベースのツールではないのか?
CodeSentinelは意図的にパターンベースのアプローチを採用しており、AST解析ではなく、以下の理由があります。
解決する問題が異なる
従来のリンター(ESLint、tree-sitter)は構文エラーとスタイル違反を検出します。CodeSentinelは意味的に誤解を招くパターンを検出します。つまり、以下のようなコードです。
- 構文的に有効(すべてのリンターを通過)
- 構造的に正しい(有効なAST)
- しかし、AIエージェントが一般的に生成する深刻な問題を隠している
ASTツールが見逃す例
try { riskyOperation(); } catch(e) { }
function validateUser() { return true; }
const users = response.data || [];
if (error) { return null; }
各アプローチが検出する内容
| 問題の種類 |
AST/Tree-sitter |
CodeSentinel |
| 構文エラー |
はい |
いいえ(目的ではない) |
| セミコロンの欠落 |
はい |
いいえ |
| 未使用の変数 |
はい |
いいえ |
| 空のcatchブロック |
部分的に |
はい |
| サイレントなエラーの返却 |
いいえ |
はい |
| 偽の成功レスポンス |
いいえ |
はい |
| TODO/プレースホルダーコード |
いいえ |
はい |
| エラーを隠すフォールバック |
いいえ |
はい |
| ハードコードされたシークレット |
限定的 |
はい |
| 誤解を招くコメント |
いいえ |
はい |
実際の問題: エージェントの振る舞い
AIコーディングエージェントは、見た目は正しいが微妙な欺瞞を含むコードを生成します。
- "エラーを消す" - 空のcatch、サイレントな返却、飲み込まれた例外
- プレースホルダー実装 -
return true、return []、TODOコメント
- 誤った信頼パターン -
|| [] フォールバックで取得失敗を隠す
- 抑制の乱用 -
@ts-ignore、eslint-disable で型エラーを隠す
これらのパターンはすべてのリンターを通過し、正常にコンパイルされます。ASTツールは有効な構造を見ますが、パターンベースの検出のみがコードの背後にある意味的な意図を捉えます。
いつ何を使うか
| ツール |
使用目的 |
| ESLint/TSLint |
スタイルの一貫性、構文ルール、未使用のコード |
| Tree-sitter |
構文ハイライト、コードナビゲーション、リファクタリング |
| TypeScript |
型安全、コンパイル時エラー |
| CodeSentinel |
エージェントが生成した欺瞞、エラーの隠蔽、不完全な実装 |
CodeSentinelはこれらのツールを補完し、それらが構造的に検出できないものを捉えます。
📦 インストール
npmから
npm install -g code-sentinel-mcp
ソースから
git clone https://github.com/salrad22/code-sentinel.git
cd code-sentinel
npm install
npm run build
💻 使用例
Claude Codeとの使用方法
クイックセットアップ
claude mcp add code-sentinel -- npx code-sentinel-mcp
グローバルにインストールされている場合
claude mcp add code-sentinel -- code-sentinel
手動設定
Claude CodeのMCP設定ファイル (~/.claude/claude_desktop_config.json) に追加します。
{
"mcpServers": {
"code-sentinel": {
"command": "npx",
"args": ["code-sentinel-mcp"]
}
}
}
リモートサーバー (Cloudflare Workers)
CodeSentinelは、Cloudflare Workers上のリモートMCPサーバーとしても利用できます。ローカルインストールは必要ありません!
クイック接続 (Claude Code)
claude mcp add-remote code-sentinel https://code-sentinel-mcp.sharara.dev/sse
または、Streamable HTTPエンドポイントを使用します(新しいクライアントに推奨)。
claude mcp add --transport http code-sentinel https://code-sentinel-mcp.sharara.dev/mcp
エンドポイント
| エンドポイント |
プロトコル |
説明 |
https://code-sentinel-mcp.sharara.dev/mcp |
Streamable HTTP |
推奨 |
https://code-sentinel-mcp.sharara.dev/sse |
Server-Sent Events |
レガシーサポート |
https://code-sentinel-mcp.sharara.dev/ |
HTTP GET |
ヘルスチェック / サーバー情報 |
Cloudflareでのセルフホスティング
独自のインスタンスをデプロイします。
cd cloudflare
npm install
npm run dev
npm run deploy
要件:
- Cloudflareアカウント(無料プランでも可)
- Wrangler CLI (
npm install -g wrangler)
wrangler login で認証
サーバーは持続的なMCP接続にDurable Objectsを使用します。データベースは必要ありません。
利用可能なツール
analyze_code
すべての問題と強みを含む構造化されたJSONを返す完全な分析。プログラムによる処理に最適です。
パラメータ:
code (文字列、必須): 分析するソースコード
filename (文字列、必須): 言語検出用のファイル名(例: "app.ts")
返り値: 問題、強み、および要約統計を含むJSONオブジェクト。
generate_report
視覚的なHTMLレポートを含む完全な分析。人間によるレビューに最適です。
パラメータ:
code (文字列、必須): 分析するソースコード
filename (文字列、必須): 言語検出用のファイル名
返り値: Markdown要約と完全なHTMLレポート。
check_security
セキュリティに焦点を当てた分析のみ。具体的に脆弱性を監査したい場合に使用します。
パラメータ:
code (文字列、必須): チェックするソースコード
filename (文字列、必須): ファイル名
返り値: セキュリティ問題のリスト、または見つからなかったことの確認。
check_deceptive_patterns
エラーを隠すまたは誤った信頼を生み出すコードパターンをチェックします。
パラメータ:
code (文字列、必須): チェックするソースコード
filename (文字列、必須): ファイル名
返り値: 見つかった欺瞞パターンのリスト。
check_placeholders
TODO、ダミーデータ、および不完全な実装を見つけます。
パラメータ:
code (文字列、必須): チェックするソースコード
filename (文字列、必須): ファイル名
返り値: 見つかったプレースホルダーコードのリスト。
analyze_patterns
アーキテクチャ、デザイン、および実装パターンについてコードを分析します。パターンの使用、不一致を検出し、実行可能な提案を提供します。
パラメータ:
code (文字列、必須): 分析するソースコード
filename (文字列、必須): 言語検出用のファイル名
level (文字列、オプション): 分析するパターンレベル:
architectural: システム構造パターン(レイヤリング、モジュール)
design: ギャング・オブ・フォーパターン(シングルトン、ファクトリー、オブザーバー)
code: 実装イディオム(エラーハンドリング、非同期パターン)
all: すべてのレベル(デフォルト)
query (文字列、オプション): 分析を絞り込む自然言語クエリ(例: "エラーハンドリングはどのように行われていますか?")
返り値: 検出されたパターン、不一致、提案、および実行可能なアクションアイテムを含むLLM最適化JSON。
analyze_design_patterns
ギャング・オブ・フォー(GoF)デザインパターンの集中分析。オブジェクト指向プログラミングの構造を理解するのに最適です。
パラメータ:
code (文字列、必須): 分析するソースコード
filename (文字列、必須): 言語検出用のファイル名
返り値: 信頼度、位置、および実装詳細を含む検出されたデザインパターン。
具体的な使用例
Claudeにコードを分析させる例を示します。
このコードの品質問題を分析してください:
const API_KEY = "sk-abc123456789";
async function fetchData() {
try {
const response = await fetch(url);
return response.json();
} catch (e) {
// TODO: handle error
}
}
CodeSentinelは以下を検出します。
- 重大 (CS-SEC003): ソースコードにハードコードされたOpenAI APIキー
- 高 (CS-DEC001): エラーをサイレントに飲み込む空のcatchブロック
- 低 (CS-PH001): 不完全な実装を示すTODOコメント
検出カテゴリ
セキュリティ問題 (CS-SEC)
| ID |
パターン |
| SEC001 |
ハードコードされたシークレット(APIキー、トークン、パスワード) |
| SEC002 |
GitHubトークン |
| SEC003 |
OpenAI APIキー |
| SEC004 |
AWSアクセスキー |
| SEC005-010 |
SQLインジェクションパターン |
| SEC011-015 |
XSS脆弱性 |
| SEC016 |
コマンドインジェクション(eval、exec) |
誤解を招くパターン (CS-DEC)
| ID |
パターン |
| DEC001-003 |
空/コメントのみのcatchブロック |
| DEC010-012 |
サイレントなPromiseの拒否 |
| DEC020-025 |
エラーを隠すフォールバック( |
| DEC030+ |
リンターの抑制、偽の成功レスポンス |
プレースホルダー (CS-PH)
| ID |
パターン |
| PH001-005 |
TODO/FIXME/HACK/XXX/NOTEコメント |
| PH010-015 |
ラムダ文、プレースホルダーテキスト |
| PH020-025 |
テスト/ダミーデータ(test@example.com、password123) |
| PH030+ |
console.logデバッグ、デバッガーステートメント |
エラーとコードの悪臭 (CS-ERR)
| ID |
パターン |
| ERR001-005 |
緩い等価性(==)、型強制の問題 |
| ERR010-015 |
ヌル参照のリスク |
| ERR020-025 |
非同期アンチパターン |
| ERR030+ |
基数なしのparseInt、ループ内の配列変更 |
強み (CS-STR)
| ID |
パターン |
| STR001-005 |
TypeScriptの厳密な型付け |
| STR010-015 |
適切なエラーハンドリングパターン |
| STR020-025 |
テストカバレッジの指標 |
| STR030+ |
ドキュメント、入力検証 |
スコアリングアルゴリズム
品質スコア(0-100)は以下の式で計算されます。
Score = 100 - (critical × 25) - (high × 15) - (medium × 5) - (low × 1) + (strengths × 2)
| 深刻度 |
減点 |
| 重大 |
-25点 |
| 高 |
-15点 |
| 中 |
-5点 |
| 低 |
-1点 |
| 強み |
+2点(ボーナス) |
サポートされる言語
CodeSentinelはファイル拡張子から言語を検出します。
| 拡張子 |
言語 |
.ts, .tsx |
TypeScript |
.js, .jsx |
JavaScript |
.py |
Python |
.go |
Go |
.rs |
Rust |
.java |
Java |
.kt |
Kotlin |
.swift |
Swift |
.cs |
C# |
.cpp, .c |
C/C++ |
.php |
PHP |
.vue |
Vue |
.svelte |
Svelte |
CodeSentinelの拡張
CodeSentinelはデータ駆動型のパターンシステムを使用しており、パターン定義と正規表現の生成を分離しています。これにより、新しいパターンの追加が容易になり、保守性が向上します。
プロジェクト構造
src/
├── patterns/
│ ├── types.ts # パターン設定の型定義
│ ├── builders.ts # 設定から正規表現を生成する関数
│ ├── compiler.ts # 定義を実行可能なパターンにコンパイルする
│ └── definitions/
│ ├── security.ts # セキュリティ脆弱性パターン
│ ├── deceptive.ts # エラーを隠すパターン
│ ├── placeholders.ts # 不完全なコードパターン
│ ├── errors.ts # コードの悪臭パターン
│ └── index.ts # すべての定義をエクスポートする
├── analyzers/
│ ├── core.ts # コンパイルされたパターンを使用する統一されたアナライザー
│ ├── security.ts # セキュリティアナライザー(コアに委任)
│ ├── deceptive.ts # 欺瞞アナライザー(コアに委任)
│ ├── placeholders.ts # プレースホルダーアナライザー(コアに委任)
│ ├── errors.ts # エラーアナライザー(コアに委任)
│ └── strengths.ts # 強みアナライザー
└── index.ts # MCPサーバーのエントリーポイント
新しいパターンの追加
手動で正規表現を書く代わりに、検出する内容を定義し、システムが正規表現を生成します。
{
id: 'CS-DEC001',
pattern: /catch\s*\([^)]*\)\s*\{\s*\}/g,
title: 'Empty Catch Block',
}
{
id: 'CS-DEC001',
title: 'Empty Catch Block',
description: 'Silently swallowing errors makes debugging impossible.',
severity: 'high',
category: 'deceptive',
suggestion: 'At minimum, log the error. Better: handle it appropriately.',
match: {
type: 'catch_handler',
behavior: 'empty'
}
}
利用可能なマッチタイプ
| マッチタイプ |
説明 |
例の設定 |
empty_block |
空のcatch/finally/promiseブロック |
{ type: 'empty_block', constructs: ['catch', '.catch'] } |
function_call |
関数/メソッド呼び出し |
{ type: 'function_call', names: ['eval', 'exec'] } |
returns_only |
特定の値を返すreturn文 |
{ type: 'returns_only', values: ['null', '[]', '{}'] } |
contains_text |
コメント/文字列内のテキスト |
{ type: 'contains_text', terms: ['TODO', 'FIXME'], context: 'comment' } |
fallback_value |
フォールバックパターン |
{ type: 'fallback_value', operators: ['||'], values: ['[]'] } |
catch_handler |
Catchブロックの動作 |
{ type: 'catch_handler', behavior: 'empty' } |
promise_catch |
Promise .catch()の動作 |
{ type: 'promise_catch', behavior: 'returns_silent' } |
comment_marker |
TODO/FIXME/HACKマーカー |
{ type: 'comment_marker', markers: ['TODO', 'FIXME'] } |
string_literal |
文字列内のパターン |
{ type: 'string_literal', patterns: ['password', 'secret'] } |
secret_pattern |
APIキーとトークン |
{ type: 'secret_pattern', kind: 'github' } |
url_pattern |
URLパターン |
{ type: 'url_pattern', protocol: 'http', excludeLocalhost: true } |
suppression_comment |
リンターの抑制 |
{ type: 'suppression_comment', tools: ['ts-ignore', 'eslint-disable'] } |
type_cast |
型キャスト |
{ type: 'type_cast', targets: ['any'] } |
comparison |
比較演算子 |
{ type: 'comparison', operators: ['==', '!='] } |
loop_pattern |
ループパターン |
{ type: 'loop_pattern', kind: 'while_true' } |
raw_regex |
複雑なパターンのためのエスケープハッチ |
{ type: 'raw_regex', pattern: 'your-regex', flags: 'gi' } |
パターンを追加する手順
- カテゴリを選択 - セキュリティ、欺瞞、プレースホルダー、またはエラー
- 定義ファイルを開く -
src/patterns/definitions/<category>.ts
- 適切なマッチタイプを使用して新しいパターン定義を追加
- ビルド -
npm run build
- テスト - MCPインスペクターを使用して検出を検証
パターン定義の構造
{
id: string;
title: string;
description: string;
severity: Severity;
category: Category;
suggestion?: string;
match: MatchConfig;
verification?: {
status: 'needs_verification' | 'confirmed';
assumption?: string;
confirmIf?: string;
falsePositiveIf?: string;
}
}
開発
npm install
npm run build
npm run watch
npm run inspector
コントリビューション
コントリビューションを歓迎します!以下の手順に従ってください。
- リポジトリをフォークする
- 機能ブランチを作成する
- 既存の形式に従ってパターンを追加する
- プルリクエストを送信する
📄 ライセンス
MIT
リンク