Skip to content
18 changes: 18 additions & 0 deletions changelog.d/unreleased/3540.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
category: added
issues:
- 3540
affected:
- src/CodeIndex/Mcp/McpToolDefinitions.cs
- src/CodeIndex/Mcp/McpToolHandlers.cs
- src/CodeIndex/Mcp/McpServer.cs
- tests/CodeIndex.Tests/McpServerTests.cs
---

## English

- **MCP `languages` now supports CLI-compatible filters (#3540)** — `languages` accepts `indexedOnly`, `capability`, `extension`, and `alias` arguments so agents can discover supported and indexed languages the same way CLI users do.

## 日本語

- **MCP `languages` が CLI 互換のフィルタに対応しました (#3540)** — `languages` は `indexedOnly`、`capability`、`extension`、`alias` 引数を受け付け、エージェントが CLI と同じ基準で対応言語とインデックス済み言語を確認できるようになりました。
18 changes: 18 additions & 0 deletions changelog.d/unreleased/3541.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
category: added
issues:
- 3541
affected:
- src/CodeIndex/Mcp/McpToolDefinitions.cs
- src/CodeIndex/Mcp/McpToolHandlers.cs
- src/CodeIndex/Mcp/McpServer.cs
- tests/CodeIndex.Tests/McpServerTests.cs
---

## English

- **MCP `status` and `validate` now expose CLI-style health-check views (#3541)** — `status` can run scoped freshness/readiness checks with compact diagnostics, and `validate` supports severity filters plus count and compact output modes.

## 日本語

- **MCP `status` と `validate` が CLI 風の health-check view に対応しました (#3541)** — `status` は scope 指定の freshness/readiness check と compact diagnostics を返せるようになり、`validate` は severity filter と count / compact 出力に対応しました。
17 changes: 17 additions & 0 deletions changelog.d/unreleased/3542.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
category: added
issues:
- 3542
affected:
- src/CodeIndex/Mcp/McpToolDefinitions.cs
- src/CodeIndex/Mcp/McpToolHandlers.cs
- tests/CodeIndex.Tests/McpServerTests.cs
---

## English

- **MCP code-query tools now expose more CLI query controls (#3542)** — search accepts `snippetFocus`, definition/symbol/unused/hotspot tools accept visibility filters, callers/callees accept `rawKinds`, files/map expose byte-oriented and entrypoint-confidence controls, and `analyze_symbol` supports count and compact response shapes.

## 日本語

- **MCP の code-query tools が CLI query control を追加しました (#3542)** — search は `snippetFocus`、definition/symbol/unused/hotspot 系は visibility filter、callers/callees は `rawKinds`、files/map は byte-oriented/entrypoint confidence control、`analyze_symbol` は count / compact response shape に対応しました。
17 changes: 17 additions & 0 deletions changelog.d/unreleased/3543.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
category: added
issues:
- 3543
affected:
- src/CodeIndex/Mcp/McpToolDefinitions.cs
- src/CodeIndex/Mcp/McpToolHandlers.cs
- tests/CodeIndex.Tests/McpServerTests.cs
---

## English

- **MCP `index` now exposes safe advanced indexing controls (#3543)** — the tool supports dry-run planning, max-symbol limits, symlink policy, symbol-kind filters, and memory/duration diagnostics, while explicitly rejecting unsupported scoped/watch modes instead of silently widening the run.

## 日本語

- **MCP `index` が安全な advanced indexing control に対応しました (#3543)** — dry-run planning、max-symbol limit、symlink policy、symbol-kind filter、memory/duration diagnostics を扱えるようになり、未対応の scope/watch mode は silently full scan にせず明示的に拒否します。
18 changes: 18 additions & 0 deletions changelog.d/unreleased/3544.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
---
category: added
issues:
- 3544
affected:
- src/CodeIndex/Database/DbReader.Dependencies.cs
- src/CodeIndex/Mcp/McpToolDefinitions.cs
- src/CodeIndex/Mcp/McpToolHandlers.cs
- tests/CodeIndex.Tests/McpServerTests.cs
---

## English

- **MCP `deps` now exposes generated-code filtering (#3544)** — `deps` accepts `includeGenerated`, applies it to dependency source and target files, and returns generated-code scope diagnostics in structured responses.

## 日本語

- **MCP `deps` が generated-code filter に対応しました (#3544)** — `deps` は `includeGenerated` を受け付け、依存関係の source / target file の両方へ適用し、structured response で generated-code scope diagnostic を返します。
2 changes: 1 addition & 1 deletion src/CodeIndex/Cli/IndexCommandRunner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public static partial class IndexCommandRunner
internal const int MaxCommitRefCount = 64;
internal const int MaxCommitRefLength = 256;
internal const int MaxGitExcludeBytes = 256 * 1024;
private const string SymbolKindFilterMetaKey = "index_symbol_kind_filter";
internal const string SymbolKindFilterMetaKey = "index_symbol_kind_filter";
private const int ScanCheckpointVersion = 1;
private const string ScanCheckpointFileName = "scan-checkpoint.json";
private static readonly TimeSpan IndexExtractionStallTimeout = TimeSpan.FromMinutes(5);
Expand Down
8 changes: 8 additions & 0 deletions src/CodeIndex/Database/DbReader.Dependencies.cs
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,7 @@ FROM symbol_references r
// ある。call-graph 専用コマンド (`callers` / `callees`) 側では metadata
// 種別の拒否を CLI / MCP boundary で引き続き行う — そちらは別契約。
sql += $" AND {BuildGraphSupportedLanguagePredicate(cmd, "src", "depsLang")}";
AppendDependencyGeneratedFilter(ref sql, sourceFilterAlias);
if (lang != null)
sql += " AND src.lang = @lang";
if (!reverse && pathPatterns is { Count: > 0 })
Expand Down Expand Up @@ -365,6 +366,7 @@ FROM symbols s
JOIN files dst ON s.file_id = dst.id
WHERE 1 = 1";
sql += $" AND {BuildGraphSupportedLanguagePredicate(cmd, "dst", "depsTargetLang")}";
AppendDependencyGeneratedFilter(ref sql, targetFilterAlias);
if (lang != null)
sql += " AND dst.lang = @lang";
if (reverse && pathPatterns is { Count: > 0 })
Expand Down Expand Up @@ -554,4 +556,10 @@ LEFT JOIN ranked_edge_symbols
}
return results;
}

private void AppendDependencyGeneratedFilter(ref string sql, string fileAlias)
{
if (!IncludeGeneratedScope.Value && _fileColumns.Contains("generated"))
sql += $" AND COALESCE({fileAlias}.generated, 0) = 0";
}
}
4 changes: 2 additions & 2 deletions src/CodeIndex/Mcp/McpServer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2726,12 +2726,12 @@ JsonObject CreateUnknownToolResponseForMetrics()
"excerpt" => ExecuteExcerpt(id, args),
"map" => ExecuteMap(id, args),
"analyze_symbol" => ExecuteAnalyzeSymbol(id, args),
"status" => ExecuteStatus(id),
"status" => ExecuteStatus(id, args),
"outline" => ExecuteOutline(id, args),
"batch_query" => ExecuteBatchQuery(id, args),
"deps" => ExecuteDeps(id, args),
"impact_analysis" => ExecuteImpactAnalysis(id, args),
"languages" => ExecuteLanguages(id),
"languages" => ExecuteLanguages(id, args),
"validate" => ExecuteValidate(id, args),
"unused_symbols" => ExecuteUnusedSymbols(id, args),
"symbol_hotspots" => ExecuteSymbolHotspots(id, args),
Expand Down
26 changes: 14 additions & 12 deletions src/CodeIndex/Mcp/McpToolArgumentContracts.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,24 +14,26 @@ public partial class McpServer

private static IReadOnlySet<string> GetAllowedToolArguments(string toolName) => toolName switch
{
"search" => new HashSet<string>(StringComparer.Ordinal) { "query", "recipe", "listRecipes", "limit", "lang", "snippetLines", "maxLineWidth", "rawQuery", "cursor", "path", "excludePaths", "excludeTests", "includeGenerated", "since", "noDedup", "exactSubstring", "exact", "prefix", "requireBefore", "requireAfter", "rejectBefore", "rejectAfter", "guardWindow", "countOnly", "format", "project", "solution" },
"definition" => new HashSet<string>(StringComparer.Ordinal) { "query", "kind", "lang", "limit", "includeBody", "lsp_compatible", "lspCompatible", "path", "excludePaths", "excludeTests", "includeGenerated", "since", "exactName", "exact", "format", "project", "solution" },
"search" => new HashSet<string>(StringComparer.Ordinal) { "query", "recipe", "listRecipes", "limit", "lang", "snippetLines", "snippetFocus", "maxLineWidth", "rawQuery", "cursor", "path", "excludePaths", "excludeTests", "includeGenerated", "since", "noDedup", "exactSubstring", "exact", "prefix", "requireBefore", "requireAfter", "rejectBefore", "rejectAfter", "guardWindow", "countOnly", "format", "project", "solution" },
"definition" => new HashSet<string>(StringComparer.Ordinal) { "query", "kind", "lang", "limit", "visibility", "excludeVisibility", "includeBody", "lsp_compatible", "lspCompatible", "path", "excludePaths", "excludeTests", "includeGenerated", "since", "exactName", "exact", "format", "project", "solution" },
"references" => new HashSet<string>(StringComparer.Ordinal) { "query", "kind", "lang", "limit", "offset", "maxLineWidth", "lsp_compatible", "lspCompatible", "path", "excludePaths", "excludeTests", "includeGenerated", "exactName", "exact", "countOnly", "format", "project", "solution" },
"callers" or "callees" => new HashSet<string>(StringComparer.Ordinal) { "query", "kind", "rankBy", "lang", "limit", "offset", "path", "excludePaths", "excludeTests", "includeGenerated", "exactName", "exact", "countOnly", "format", "project", "solution" },
"symbols" => new HashSet<string>(StringComparer.Ordinal) { "query", "names", "kind", "lang", "limit", "path", "excludePaths", "excludeTests", "includeGenerated", "since", "exactName", "exact", "project", "solution" },
"files" => new HashSet<string>(StringComparer.Ordinal) { "query", "lang", "limit", "path", "excludePaths", "excludeTests", "includeGenerated", "since", "project", "solution" },
"callers" or "callees" => new HashSet<string>(StringComparer.Ordinal) { "query", "kind", "rawKinds", "rankBy", "lang", "limit", "offset", "path", "excludePaths", "excludeTests", "includeGenerated", "exactName", "exact", "countOnly", "format", "project", "solution" },
"symbols" => new HashSet<string>(StringComparer.Ordinal) { "query", "names", "kind", "lang", "visibility", "excludeVisibility", "limit", "path", "excludePaths", "excludeTests", "includeGenerated", "since", "exactName", "exact", "countOnly", "format", "project", "solution" },
"files" => new HashSet<string>(StringComparer.Ordinal) { "query", "lang", "limit", "path", "excludePaths", "excludeTests", "includeGenerated", "since", "orderBySize", "rawBytes", "project", "solution" },
"find_in_file" => new HashSet<string>(StringComparer.Ordinal) { "query", "path", "limit", "lang", "excludePaths", "excludeTests", "includeGenerated", "before", "after", "snippetLines", "focusLine", "focusColumn", "maxLineWidth", "exact", "regex" },
"excerpt" => new HashSet<string>(StringComparer.Ordinal) { "path", "startLine", "endLine", "before", "after", "focusLine", "focusColumn", "focusLength", "maxLineWidth", "maxOutputBytes" },
"map" => new HashSet<string>(StringComparer.Ordinal) { "limit", "lang", "path", "excludePaths", "excludeTests", "sections", "depth", "project", "solution" },
"analyze_symbol" => new HashSet<string>(StringComparer.Ordinal) { "query", "lang", "limit", "includeBody", "path", "excludePaths", "excludeTests", "includeGenerated", "exactName", "exact", "maxLineWidth", "project", "solution" },
"map" => new HashSet<string>(StringComparer.Ordinal) { "limit", "lang", "path", "excludePaths", "excludeTests", "sections", "depth", "minEntrypointConfidence", "project", "solution" },
"analyze_symbol" => new HashSet<string>(StringComparer.Ordinal) { "query", "lang", "limit", "includeBody", "path", "excludePaths", "excludeTests", "includeGenerated", "exactName", "exact", "maxLineWidth", "countOnly", "format", "project", "solution" },
"status" => new HashSet<string>(StringComparer.Ordinal) { "check", "scopes", "staleAfterSeconds", "explain", "config", "logPath", "updateCheck", "format" },
"outline" => new HashSet<string>(StringComparer.Ordinal) { "path" },
"batch_query" => new HashSet<string>(StringComparer.Ordinal) { "queries", "maxResponseBytes", "estimateOnly" },
"deps" => new HashSet<string>(StringComparer.Ordinal) { "path", "reverse", "format", "cycles", "lang", "limit", "excludePaths", "excludeTests", "project", "solution" },
"deps" => new HashSet<string>(StringComparer.Ordinal) { "path", "reverse", "format", "cycles", "lang", "limit", "excludePaths", "excludeTests", "includeGenerated", "project", "solution" },
"impact_analysis" => new HashSet<string>(StringComparer.Ordinal) { "query", "lang", "maxHops", "maxDepth", "limit", "path", "excludePaths", "excludeTests", "includeGenerated", "withPaths", "countOnly", "project", "solution" },
"validate" => new HashSet<string>(StringComparer.Ordinal) { "kind", "path", "excludePaths", "excludeTests", "project", "solution" },
"unused_symbols" => new HashSet<string>(StringComparer.Ordinal) { "kind", "lang", "limit", "path", "excludePaths", "excludeTests", "bucket", "minConfidence", "project", "solution" },
"symbol_hotspots" => new HashSet<string>(StringComparer.Ordinal) { "kind", "lang", "limit", "groupBy", "path", "excludePaths", "excludeTests", "project", "solution" },
"index" => new HashSet<string>(StringComparer.Ordinal) { "path", "rebuild", "maxFileBytes" },
"languages" => new HashSet<string>(StringComparer.Ordinal) { "indexedOnly", "capability", "extension", "alias" },
"validate" => new HashSet<string>(StringComparer.Ordinal) { "kind", "severity", "limit", "path", "excludePaths", "excludeTests", "countOnly", "format", "project", "solution" },
"unused_symbols" => new HashSet<string>(StringComparer.Ordinal) { "kind", "lang", "limit", "visibility", "excludeVisibility", "path", "excludePaths", "excludeTests", "bucket", "minConfidence", "byBucket", "project", "solution" },
"symbol_hotspots" => new HashSet<string>(StringComparer.Ordinal) { "kind", "lang", "limit", "visibility", "excludeVisibility", "groupBy", "path", "excludePaths", "excludeTests", "project", "solution" },
"index" => new HashSet<string>(StringComparer.Ordinal) { "path", "rebuild", "dryRun", "dry_run", "maxFileBytes", "maxSymbolsPerFile", "followSymlinks", "includeSymbolKind", "excludeSymbolKind", "memoryTrace", "parallelism", "commits", "changedBetween", "files", "watch", "debounce" },
"backfill_fold" => new HashSet<string>(StringComparer.Ordinal) { "dry_run", "dryRun", "force" },
"suggest_improvement" => new HashSet<string>(StringComparer.Ordinal) { "category", "language", "description", "context", "toolInvocationContext", "evidencePaths", "evidence_paths" },
_ => new HashSet<string>(StringComparer.Ordinal),
Expand Down
Loading
Loading