dsh-code-review-graph 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/NOTICE +12 -0
- package/README.en.md +120 -0
- package/README.md +113 -2
- package/capabilities.json +1790 -0
- package/cordis.patch.yml +3 -0
- package/dist/backend.js +215 -0
- package/dist/backend.js.map +7 -0
- package/dist/client.js +103 -0
- package/dist/client.js.map +7 -0
- package/dist/html.js +17 -0
- package/dist/html.js.map +7 -0
- package/dist/index.js +511 -0
- package/dist/index.js.map +7 -0
- package/dist/refactor.js +68 -0
- package/dist/refactor.js.map +7 -0
- package/dist/safety.js +52 -0
- package/dist/safety.js.map +7 -0
- package/dist/setup.js +78 -0
- package/dist/setup.js.map +7 -0
- package/dist/workflows.js +30 -0
- package/dist/workflows.js.map +7 -0
- package/docs/capabilities.md +103 -0
- package/docs/release-0.1.1.md +30 -0
- package/docs/validation.md +161 -0
- package/engine.json +8 -0
- package/package.json +38 -4
- package/skills/build-graph/SKILL.md +26 -0
- package/skills/debug-issue/SKILL.md +23 -0
- package/skills/explore-codebase/SKILL.md +24 -0
- package/skills/refactor-safely/SKILL.md +24 -0
- package/skills/review-changes/SKILL.md +27 -0
- package/skills/review-delta/SKILL.md +25 -0
- package/skills/review-pr/SKILL.md +48 -0
|
@@ -0,0 +1,1790 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tools": [
|
|
3
|
+
{
|
|
4
|
+
"name": "build_or_update_graph_tool",
|
|
5
|
+
"description": "Build or incrementally update the code knowledge graph.\n\nCall this first to initialize the graph, or after making changes.\nBy default performs an incremental update (only changed files).\nSet full_rebuild=True to re-parse every file.\n\nRuns the blocking full_build / incremental_update work on a worker\nthread via ``_offload`` so the stdio event loop stays responsive.\nWithout that, long builds deadlocked on Windows because\n``ProcessPoolExecutor`` (used by parallel parsing) interacted badly\nwith the sync handler blocking the only event-loop thread. See:\n#46, #136, #262.",
|
|
6
|
+
"inputSchema": {
|
|
7
|
+
"type": "object",
|
|
8
|
+
"properties": {
|
|
9
|
+
"full_rebuild": {
|
|
10
|
+
"default": false,
|
|
11
|
+
"type": "boolean",
|
|
12
|
+
"description": "If True, re-parse all files. Default: False (incremental)."
|
|
13
|
+
},
|
|
14
|
+
"repo_root": {
|
|
15
|
+
"anyOf": [
|
|
16
|
+
{
|
|
17
|
+
"type": "string"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"type": "null"
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"default": null,
|
|
24
|
+
"description": "Repository root path. Auto-detected from current directory if omitted."
|
|
25
|
+
},
|
|
26
|
+
"base": {
|
|
27
|
+
"anyOf": [
|
|
28
|
+
{
|
|
29
|
+
"type": "string"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"type": "null"
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"default": null,
|
|
36
|
+
"description": "Git ref to diff against for incremental updates. When omitted,\nresolves automatically to the commit the graph was last built at,\nso one update catches everything since the last sync (not just the\nlatest commit). Pass an explicit ref to override."
|
|
37
|
+
},
|
|
38
|
+
"postprocess": {
|
|
39
|
+
"default": "full",
|
|
40
|
+
"type": "string",
|
|
41
|
+
"description": "Post-processing level: \"full\" (default), \"minimal\" (signatures+FTS only),\n or \"none\" (skip all post-processing). Use \"minimal\" for faster builds."
|
|
42
|
+
},
|
|
43
|
+
"recurse_submodules": {
|
|
44
|
+
"anyOf": [
|
|
45
|
+
{
|
|
46
|
+
"type": "boolean"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"type": "null"
|
|
50
|
+
}
|
|
51
|
+
],
|
|
52
|
+
"default": null,
|
|
53
|
+
"description": "If True, include files from git submodules.\nWhen None (default), falls back to CRG_RECURSE_SUBMODULES env var."
|
|
54
|
+
},
|
|
55
|
+
"embedding_provider": {
|
|
56
|
+
"anyOf": [
|
|
57
|
+
{
|
|
58
|
+
"type": "string"
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"type": "null"
|
|
62
|
+
}
|
|
63
|
+
],
|
|
64
|
+
"default": null,
|
|
65
|
+
"description": "Exact provider for an explicit post-build embedding\nrefresh. Must be supplied with embedding_model. Default: disabled."
|
|
66
|
+
},
|
|
67
|
+
"embedding_model": {
|
|
68
|
+
"anyOf": [
|
|
69
|
+
{
|
|
70
|
+
"type": "string"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"type": "null"
|
|
74
|
+
}
|
|
75
|
+
],
|
|
76
|
+
"default": null,
|
|
77
|
+
"description": "Exact model for an explicit post-build embedding\nrefresh. Must be supplied with embedding_provider. Default: disabled."
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
"additionalProperties": false
|
|
81
|
+
},
|
|
82
|
+
"outputSchema": {
|
|
83
|
+
"type": "object",
|
|
84
|
+
"additionalProperties": true
|
|
85
|
+
},
|
|
86
|
+
"_meta": {
|
|
87
|
+
"fastmcp": {
|
|
88
|
+
"tags": []
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"name": "run_postprocess_tool",
|
|
94
|
+
"description": "Run post-processing on existing graph (flows, communities, FTS index).\n\nUse after building with postprocess=\"none\" or \"minimal\", or to re-run\nexpensive steps independently. Signatures are always computed.\n\nOffloaded via ``_offload`` so community detection on large graphs\ndoes not block the MCP event loop. See: #46, #136, #262.",
|
|
95
|
+
"inputSchema": {
|
|
96
|
+
"type": "object",
|
|
97
|
+
"properties": {
|
|
98
|
+
"flows": {
|
|
99
|
+
"default": true,
|
|
100
|
+
"type": "boolean",
|
|
101
|
+
"description": "Run flow detection. Default: True."
|
|
102
|
+
},
|
|
103
|
+
"communities": {
|
|
104
|
+
"default": true,
|
|
105
|
+
"type": "boolean",
|
|
106
|
+
"description": "Run community detection. Default: True."
|
|
107
|
+
},
|
|
108
|
+
"fts": {
|
|
109
|
+
"default": true,
|
|
110
|
+
"type": "boolean",
|
|
111
|
+
"description": "Rebuild FTS index. Default: True."
|
|
112
|
+
},
|
|
113
|
+
"repo_root": {
|
|
114
|
+
"anyOf": [
|
|
115
|
+
{
|
|
116
|
+
"type": "string"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"type": "null"
|
|
120
|
+
}
|
|
121
|
+
],
|
|
122
|
+
"default": null,
|
|
123
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
124
|
+
},
|
|
125
|
+
"embedding_provider": {
|
|
126
|
+
"anyOf": [
|
|
127
|
+
{
|
|
128
|
+
"type": "string"
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"type": "null"
|
|
132
|
+
}
|
|
133
|
+
],
|
|
134
|
+
"default": null,
|
|
135
|
+
"description": "Exact provider for an explicit embedding refresh.\nMust be supplied with embedding_model. Default: disabled."
|
|
136
|
+
},
|
|
137
|
+
"embedding_model": {
|
|
138
|
+
"anyOf": [
|
|
139
|
+
{
|
|
140
|
+
"type": "string"
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"type": "null"
|
|
144
|
+
}
|
|
145
|
+
],
|
|
146
|
+
"default": null,
|
|
147
|
+
"description": "Exact model for an explicit embedding refresh.\nMust be supplied with embedding_provider. Default: disabled."
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
"additionalProperties": false
|
|
151
|
+
},
|
|
152
|
+
"outputSchema": {
|
|
153
|
+
"type": "object",
|
|
154
|
+
"additionalProperties": true
|
|
155
|
+
},
|
|
156
|
+
"_meta": {
|
|
157
|
+
"fastmcp": {
|
|
158
|
+
"tags": []
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
"name": "get_minimal_context_tool",
|
|
164
|
+
"description": "Get ultra-compact context for any task (~100 tokens). Always call this first.\n\nReturns graph stats, risk score, top communities/flows, and suggested\nnext tools in a single compact response. Use this as the entry point\nbefore any other graph tool to minimize token usage. Returns\n``status: not_ready`` with a build suggestion when the graph is missing,\nempty, or known to have been built at a different Git commit.",
|
|
165
|
+
"inputSchema": {
|
|
166
|
+
"type": "object",
|
|
167
|
+
"properties": {
|
|
168
|
+
"task": {
|
|
169
|
+
"default": "",
|
|
170
|
+
"type": "string",
|
|
171
|
+
"description": "What you are doing (e.g. \"review PR #42\", \"debug login timeout\")."
|
|
172
|
+
},
|
|
173
|
+
"changed_files": {
|
|
174
|
+
"anyOf": [
|
|
175
|
+
{
|
|
176
|
+
"items": {
|
|
177
|
+
"type": "string"
|
|
178
|
+
},
|
|
179
|
+
"type": "array"
|
|
180
|
+
},
|
|
181
|
+
{
|
|
182
|
+
"type": "null"
|
|
183
|
+
}
|
|
184
|
+
],
|
|
185
|
+
"default": null,
|
|
186
|
+
"description": "Explicit list of changed files. Auto-detected if omitted."
|
|
187
|
+
},
|
|
188
|
+
"repo_root": {
|
|
189
|
+
"anyOf": [
|
|
190
|
+
{
|
|
191
|
+
"type": "string"
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
"type": "null"
|
|
195
|
+
}
|
|
196
|
+
],
|
|
197
|
+
"default": null,
|
|
198
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
199
|
+
},
|
|
200
|
+
"base": {
|
|
201
|
+
"default": "HEAD~1",
|
|
202
|
+
"type": "string",
|
|
203
|
+
"description": "Git ref for diff comparison. Default: HEAD~1."
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
"additionalProperties": false
|
|
207
|
+
},
|
|
208
|
+
"outputSchema": {
|
|
209
|
+
"type": "object",
|
|
210
|
+
"additionalProperties": true
|
|
211
|
+
},
|
|
212
|
+
"_meta": {
|
|
213
|
+
"fastmcp": {
|
|
214
|
+
"tags": []
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
"name": "get_impact_radius_tool",
|
|
220
|
+
"description": "Analyze the blast radius of changed files in the codebase.\n\nShows which functions, classes, and files are impacted by changes.\nAuto-detects changed files from git if not specified.\n\nAn impacted node that calls or references the changed code directly also\ncarries the ``call_site`` (file and line) it does so at, and\n``unresolved_call_sites`` counts call sites that name a changed symbol but\nwere never bound to it, so an empty radius is not mistaken for proof.",
|
|
221
|
+
"inputSchema": {
|
|
222
|
+
"type": "object",
|
|
223
|
+
"properties": {
|
|
224
|
+
"changed_files": {
|
|
225
|
+
"anyOf": [
|
|
226
|
+
{
|
|
227
|
+
"items": {
|
|
228
|
+
"type": "string"
|
|
229
|
+
},
|
|
230
|
+
"type": "array"
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
"type": "null"
|
|
234
|
+
}
|
|
235
|
+
],
|
|
236
|
+
"default": null,
|
|
237
|
+
"description": "List of changed file paths (relative to repo root). Auto-detected if omitted."
|
|
238
|
+
},
|
|
239
|
+
"max_depth": {
|
|
240
|
+
"default": 2,
|
|
241
|
+
"type": "integer",
|
|
242
|
+
"description": "Number of hops to traverse in the dependency graph. Default: 2."
|
|
243
|
+
},
|
|
244
|
+
"max_results": {
|
|
245
|
+
"default": 500,
|
|
246
|
+
"type": "integer",
|
|
247
|
+
"description": "How many impacted nodes to traverse to. Default: 500. Each\nlist in the response also has a fixed ceiling (100 nodes, 150\nedges, 200 files) so the response size does not grow with the\nrepository; the omitted counts report the rest."
|
|
248
|
+
},
|
|
249
|
+
"repo_root": {
|
|
250
|
+
"anyOf": [
|
|
251
|
+
{
|
|
252
|
+
"type": "string"
|
|
253
|
+
},
|
|
254
|
+
{
|
|
255
|
+
"type": "null"
|
|
256
|
+
}
|
|
257
|
+
],
|
|
258
|
+
"default": null,
|
|
259
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
260
|
+
},
|
|
261
|
+
"base": {
|
|
262
|
+
"default": "HEAD~1",
|
|
263
|
+
"type": "string",
|
|
264
|
+
"description": "Git ref for auto-detecting changes. Default: HEAD~1."
|
|
265
|
+
},
|
|
266
|
+
"detail_level": {
|
|
267
|
+
"default": "standard",
|
|
268
|
+
"type": "string",
|
|
269
|
+
"description": "\"standard\" for full output, \"minimal\" for compact summary. Default: standard."
|
|
270
|
+
},
|
|
271
|
+
"resolution": {
|
|
272
|
+
"default": "all",
|
|
273
|
+
"type": "string",
|
|
274
|
+
"description": "\"all\" (default) or \"direct\" to traverse only calls bound to an indexed node."
|
|
275
|
+
}
|
|
276
|
+
},
|
|
277
|
+
"additionalProperties": false
|
|
278
|
+
},
|
|
279
|
+
"outputSchema": {
|
|
280
|
+
"type": "object",
|
|
281
|
+
"additionalProperties": true
|
|
282
|
+
},
|
|
283
|
+
"_meta": {
|
|
284
|
+
"fastmcp": {
|
|
285
|
+
"tags": []
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
},
|
|
289
|
+
{
|
|
290
|
+
"name": "query_graph_tool",
|
|
291
|
+
"description": "Run a predefined graph query to explore code relationships.\n\nAvailable patterns:\n- callers_of: Find functions that call the target\n- references_to: Find nodes that reference the target\n- callees_of: Find functions called by the target\n- imports_of: Find what the target imports\n- importers_of: Find files that import the target\n- children_of: Find nodes contained in a file or class\n- tests_for: Find tests for the target\n- inheritors_of: Find classes inheriting from the target\n- triggers_of: Find methods invoked by a scheduler or other trigger\n- triggered_by: Find schedulers or other triggers that invoke the target\n- publishers_of: Find methods that publish an event\n- listeners_of: Find methods that listen for an event\n- handlers_of: Find methods that handle an endpoint\n- endpoints_for: Find endpoints handled by a method\n- consumers_of: Find classes that consume a Spring configuration property\n- file_summary: Get all nodes in a file\n\ncallers_of, callees_of and references_to return one row per call site, each\ncarrying the ``call_site`` (file and line) the call is written at, plus a\n``resolution_split`` saying how many of those call sites are bound to an\nindexed node and how many are bare-name matches.",
|
|
292
|
+
"inputSchema": {
|
|
293
|
+
"type": "object",
|
|
294
|
+
"properties": {
|
|
295
|
+
"pattern": {
|
|
296
|
+
"type": "string",
|
|
297
|
+
"description": "Query pattern name (see above)."
|
|
298
|
+
},
|
|
299
|
+
"target": {
|
|
300
|
+
"type": "string",
|
|
301
|
+
"description": "Node name, qualified name, or file path to query."
|
|
302
|
+
},
|
|
303
|
+
"repo_root": {
|
|
304
|
+
"anyOf": [
|
|
305
|
+
{
|
|
306
|
+
"type": "string"
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
"type": "null"
|
|
310
|
+
}
|
|
311
|
+
],
|
|
312
|
+
"default": null,
|
|
313
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
314
|
+
},
|
|
315
|
+
"detail_level": {
|
|
316
|
+
"default": "standard",
|
|
317
|
+
"type": "string",
|
|
318
|
+
"description": "\"standard\" for full output, \"minimal\" for compact summary. Default: standard."
|
|
319
|
+
},
|
|
320
|
+
"max_results": {
|
|
321
|
+
"default": 100,
|
|
322
|
+
"type": "integer",
|
|
323
|
+
"description": "Maximum results to return. Default: 100."
|
|
324
|
+
},
|
|
325
|
+
"resolution": {
|
|
326
|
+
"default": "all",
|
|
327
|
+
"type": "string",
|
|
328
|
+
"description": "\"all\" (default), \"direct\" for only calls bound to an indexed\nnode, or \"unresolved\" for only the bare-name matches."
|
|
329
|
+
}
|
|
330
|
+
},
|
|
331
|
+
"required": [
|
|
332
|
+
"pattern",
|
|
333
|
+
"target"
|
|
334
|
+
],
|
|
335
|
+
"additionalProperties": false
|
|
336
|
+
},
|
|
337
|
+
"outputSchema": {
|
|
338
|
+
"type": "object",
|
|
339
|
+
"additionalProperties": true
|
|
340
|
+
},
|
|
341
|
+
"_meta": {
|
|
342
|
+
"fastmcp": {
|
|
343
|
+
"tags": []
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
"name": "get_review_context_tool",
|
|
349
|
+
"description": "Generate a focused, token-efficient review context for code changes.\n\nCombines impact analysis with source snippets and review guidance.\nUse this for comprehensive code reviews.",
|
|
350
|
+
"inputSchema": {
|
|
351
|
+
"type": "object",
|
|
352
|
+
"properties": {
|
|
353
|
+
"changed_files": {
|
|
354
|
+
"anyOf": [
|
|
355
|
+
{
|
|
356
|
+
"items": {
|
|
357
|
+
"type": "string"
|
|
358
|
+
},
|
|
359
|
+
"type": "array"
|
|
360
|
+
},
|
|
361
|
+
{
|
|
362
|
+
"type": "null"
|
|
363
|
+
}
|
|
364
|
+
],
|
|
365
|
+
"default": null,
|
|
366
|
+
"description": "Files to review. Auto-detected from git diff if omitted."
|
|
367
|
+
},
|
|
368
|
+
"max_depth": {
|
|
369
|
+
"default": 2,
|
|
370
|
+
"type": "integer",
|
|
371
|
+
"description": "Impact radius depth. Default: 2."
|
|
372
|
+
},
|
|
373
|
+
"include_source": {
|
|
374
|
+
"default": true,
|
|
375
|
+
"type": "boolean",
|
|
376
|
+
"description": "Include source code snippets. Default: True."
|
|
377
|
+
},
|
|
378
|
+
"max_lines_per_file": {
|
|
379
|
+
"default": 200,
|
|
380
|
+
"type": "integer",
|
|
381
|
+
"description": "Max source lines per file. Default: 200."
|
|
382
|
+
},
|
|
383
|
+
"repo_root": {
|
|
384
|
+
"anyOf": [
|
|
385
|
+
{
|
|
386
|
+
"type": "string"
|
|
387
|
+
},
|
|
388
|
+
{
|
|
389
|
+
"type": "null"
|
|
390
|
+
}
|
|
391
|
+
],
|
|
392
|
+
"default": null,
|
|
393
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
394
|
+
},
|
|
395
|
+
"base": {
|
|
396
|
+
"default": "HEAD~1",
|
|
397
|
+
"type": "string",
|
|
398
|
+
"description": "Git ref for change detection. Default: HEAD~1."
|
|
399
|
+
},
|
|
400
|
+
"detail_level": {
|
|
401
|
+
"default": "standard",
|
|
402
|
+
"type": "string",
|
|
403
|
+
"description": "\"standard\" for full output, \"minimal\" for\ntoken-efficient summary. Default: standard."
|
|
404
|
+
},
|
|
405
|
+
"max_results": {
|
|
406
|
+
"default": 100,
|
|
407
|
+
"type": "integer",
|
|
408
|
+
"description": "Maximum graph nodes per list and edges to return.\nDefault: 50. Each list reports its untruncated ``*_total``."
|
|
409
|
+
},
|
|
410
|
+
"max_files": {
|
|
411
|
+
"default": 25,
|
|
412
|
+
"type": "integer",
|
|
413
|
+
"description": "Maximum files listed and given source snippets.\nDefault: 25. Snippets share an 800-line budget."
|
|
414
|
+
}
|
|
415
|
+
},
|
|
416
|
+
"additionalProperties": false
|
|
417
|
+
},
|
|
418
|
+
"outputSchema": {
|
|
419
|
+
"type": "object",
|
|
420
|
+
"additionalProperties": true
|
|
421
|
+
},
|
|
422
|
+
"_meta": {
|
|
423
|
+
"fastmcp": {
|
|
424
|
+
"tags": []
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
},
|
|
428
|
+
{
|
|
429
|
+
"name": "semantic_search_nodes_tool",
|
|
430
|
+
"description": "Search for code entities by name, keyword, or semantic similarity.\n\nUses vector embeddings for semantic search when available (run embed_graph_tool\nfirst, with a provider of your choice: \"local\" needs sentence-transformers,\n\"openai\" / \"google\" / \"minimax\" / \"voyage\" need their respective env vars).\nFalls back to FTS5 / keyword matching when no matching embeddings exist for\nthe given provider.",
|
|
431
|
+
"inputSchema": {
|
|
432
|
+
"type": "object",
|
|
433
|
+
"properties": {
|
|
434
|
+
"query": {
|
|
435
|
+
"type": "string",
|
|
436
|
+
"description": "Search string to match against node names."
|
|
437
|
+
},
|
|
438
|
+
"kind": {
|
|
439
|
+
"anyOf": [
|
|
440
|
+
{
|
|
441
|
+
"type": "string"
|
|
442
|
+
},
|
|
443
|
+
{
|
|
444
|
+
"type": "null"
|
|
445
|
+
}
|
|
446
|
+
],
|
|
447
|
+
"default": null,
|
|
448
|
+
"description": "Optional filter: File, Class, Function, Type, or Test."
|
|
449
|
+
},
|
|
450
|
+
"limit": {
|
|
451
|
+
"default": 20,
|
|
452
|
+
"type": "integer",
|
|
453
|
+
"description": "Maximum results. Default: 20."
|
|
454
|
+
},
|
|
455
|
+
"repo_root": {
|
|
456
|
+
"anyOf": [
|
|
457
|
+
{
|
|
458
|
+
"type": "string"
|
|
459
|
+
},
|
|
460
|
+
{
|
|
461
|
+
"type": "null"
|
|
462
|
+
}
|
|
463
|
+
],
|
|
464
|
+
"default": null,
|
|
465
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
466
|
+
},
|
|
467
|
+
"model": {
|
|
468
|
+
"anyOf": [
|
|
469
|
+
{
|
|
470
|
+
"type": "string"
|
|
471
|
+
},
|
|
472
|
+
{
|
|
473
|
+
"type": "null"
|
|
474
|
+
}
|
|
475
|
+
],
|
|
476
|
+
"default": null,
|
|
477
|
+
"description": "Embedding model for query vectors. Must match the model used\n during embed_graph. Falls back to CRG_EMBEDDING_MODEL env var\n (local), CRG_OPENAI_MODEL (openai), or CRG_VOYAGE_MODEL (voyage)."
|
|
478
|
+
},
|
|
479
|
+
"provider": {
|
|
480
|
+
"anyOf": [
|
|
481
|
+
{
|
|
482
|
+
"type": "string"
|
|
483
|
+
},
|
|
484
|
+
{
|
|
485
|
+
"type": "null"
|
|
486
|
+
}
|
|
487
|
+
],
|
|
488
|
+
"default": null,
|
|
489
|
+
"description": "Embedding provider: \"local\" (default), \"openai\", \"google\",\n \"minimax\", or \"voyage\". Must match the provider used during\n embed_graph."
|
|
490
|
+
},
|
|
491
|
+
"detail_level": {
|
|
492
|
+
"default": "standard",
|
|
493
|
+
"type": "string",
|
|
494
|
+
"description": "\"standard\" for full output, \"minimal\" for compact summary. Default: standard."
|
|
495
|
+
}
|
|
496
|
+
},
|
|
497
|
+
"required": [
|
|
498
|
+
"query"
|
|
499
|
+
],
|
|
500
|
+
"additionalProperties": false
|
|
501
|
+
},
|
|
502
|
+
"outputSchema": {
|
|
503
|
+
"type": "object",
|
|
504
|
+
"additionalProperties": true
|
|
505
|
+
},
|
|
506
|
+
"_meta": {
|
|
507
|
+
"fastmcp": {
|
|
508
|
+
"tags": []
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
},
|
|
512
|
+
{
|
|
513
|
+
"name": "embed_graph_tool",
|
|
514
|
+
"description": "Compute vector embeddings for all graph nodes to enable semantic search.\n\nRequires: pip install code-review-graph[embeddings] (local provider only;\ncloud providers use stdlib urllib).\nDefault provider: local. Default model: all-MiniLM-L6-v2.\nOverride provider via `provider` param, model via `model` param or\nCRG_EMBEDDING_MODEL / CRG_OPENAI_MODEL / CRG_VOYAGE_MODEL env vars.\nChanging the model or provider re-embeds all nodes automatically.\n\nAfter running this, semantic_search_nodes_tool will use vector similarity\ninstead of keyword matching for much better results.\n\nRuns the blocking sentence-transformers / Gemini / HTTP inference on a\nworker thread via ``_offload`` so the stdio event loop stays\nresponsive — without that, embedding a large graph would silently hang\nthe MCP server on Windows. See: #46, #136, #262.",
|
|
515
|
+
"inputSchema": {
|
|
516
|
+
"type": "object",
|
|
517
|
+
"properties": {
|
|
518
|
+
"repo_root": {
|
|
519
|
+
"anyOf": [
|
|
520
|
+
{
|
|
521
|
+
"type": "string"
|
|
522
|
+
},
|
|
523
|
+
{
|
|
524
|
+
"type": "null"
|
|
525
|
+
}
|
|
526
|
+
],
|
|
527
|
+
"default": null,
|
|
528
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
529
|
+
},
|
|
530
|
+
"model": {
|
|
531
|
+
"anyOf": [
|
|
532
|
+
{
|
|
533
|
+
"type": "string"
|
|
534
|
+
},
|
|
535
|
+
{
|
|
536
|
+
"type": "null"
|
|
537
|
+
}
|
|
538
|
+
],
|
|
539
|
+
"default": null,
|
|
540
|
+
"description": "Embedding model. For local: HuggingFace ID/path; for openai:\n model ID (e.g. \"text-embedding-3-small\"); for google: Gemini\n model ID; for voyage: Voyage model ID (e.g. \"voyage-code-3\").\n Falls back to CRG_EMBEDDING_MODEL / CRG_OPENAI_MODEL /\n CRG_VOYAGE_MODEL env vars as appropriate."
|
|
541
|
+
},
|
|
542
|
+
"provider": {
|
|
543
|
+
"anyOf": [
|
|
544
|
+
{
|
|
545
|
+
"type": "string"
|
|
546
|
+
},
|
|
547
|
+
{
|
|
548
|
+
"type": "null"
|
|
549
|
+
}
|
|
550
|
+
],
|
|
551
|
+
"default": null,
|
|
552
|
+
"description": "\"local\" (default), \"openai\", \"google\", \"minimax\", or \"voyage\".\n \"openai\" requires CRG_OPENAI_BASE_URL + CRG_OPENAI_API_KEY +\n CRG_OPENAI_MODEL env vars and accepts any OpenAI-compatible\n endpoint (real OpenAI, Azure, new-api, LiteLLM, vLLM, etc.).\n \"voyage\" requires VOYAGE_API_KEY and defaults to voyage-code-3\n unless a model arg or CRG_VOYAGE_MODEL is supplied."
|
|
553
|
+
}
|
|
554
|
+
},
|
|
555
|
+
"additionalProperties": false
|
|
556
|
+
},
|
|
557
|
+
"outputSchema": {
|
|
558
|
+
"type": "object",
|
|
559
|
+
"additionalProperties": true
|
|
560
|
+
},
|
|
561
|
+
"_meta": {
|
|
562
|
+
"fastmcp": {
|
|
563
|
+
"tags": []
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
},
|
|
567
|
+
{
|
|
568
|
+
"name": "list_graph_stats_tool",
|
|
569
|
+
"description": "Get aggregate statistics about the code knowledge graph.\n\nShows total nodes, edges, languages, files, and last update time.\nUseful for checking if the graph is built and up to date.",
|
|
570
|
+
"inputSchema": {
|
|
571
|
+
"type": "object",
|
|
572
|
+
"properties": {
|
|
573
|
+
"repo_root": {
|
|
574
|
+
"anyOf": [
|
|
575
|
+
{
|
|
576
|
+
"type": "string"
|
|
577
|
+
},
|
|
578
|
+
{
|
|
579
|
+
"type": "null"
|
|
580
|
+
}
|
|
581
|
+
],
|
|
582
|
+
"default": null,
|
|
583
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
584
|
+
}
|
|
585
|
+
},
|
|
586
|
+
"additionalProperties": false
|
|
587
|
+
},
|
|
588
|
+
"outputSchema": {
|
|
589
|
+
"type": "object",
|
|
590
|
+
"additionalProperties": true
|
|
591
|
+
},
|
|
592
|
+
"_meta": {
|
|
593
|
+
"fastmcp": {
|
|
594
|
+
"tags": []
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
},
|
|
598
|
+
{
|
|
599
|
+
"name": "get_docs_section_tool",
|
|
600
|
+
"description": "Get a specific section from the LLM-optimized documentation reference.\n\nReturns only the requested section content for minimal token usage.\nUse this before answering any user question about the plugin.\n\nOne of the two tools that stay synchronous: it reads one bundled\nMarkdown file and touches neither the graph database nor Git, so there\nis nothing here that can hold the event loop for seconds. See\n``_offload`` for the tools that do.\n\nAvailable sections: usage, review-delta, review-pr, commands, legal,\nwatch, embeddings, languages, troubleshooting.",
|
|
601
|
+
"inputSchema": {
|
|
602
|
+
"type": "object",
|
|
603
|
+
"properties": {
|
|
604
|
+
"section_name": {
|
|
605
|
+
"type": "string",
|
|
606
|
+
"description": "The section to retrieve (e.g. \"review-delta\", \"usage\")."
|
|
607
|
+
},
|
|
608
|
+
"repo_root": {
|
|
609
|
+
"anyOf": [
|
|
610
|
+
{
|
|
611
|
+
"type": "string"
|
|
612
|
+
},
|
|
613
|
+
{
|
|
614
|
+
"type": "null"
|
|
615
|
+
}
|
|
616
|
+
],
|
|
617
|
+
"default": null,
|
|
618
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
619
|
+
}
|
|
620
|
+
},
|
|
621
|
+
"required": [
|
|
622
|
+
"section_name"
|
|
623
|
+
],
|
|
624
|
+
"additionalProperties": false
|
|
625
|
+
},
|
|
626
|
+
"outputSchema": {
|
|
627
|
+
"type": "object",
|
|
628
|
+
"additionalProperties": true
|
|
629
|
+
},
|
|
630
|
+
"_meta": {
|
|
631
|
+
"fastmcp": {
|
|
632
|
+
"tags": []
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
},
|
|
636
|
+
{
|
|
637
|
+
"name": "find_large_functions_tool",
|
|
638
|
+
"description": "Find functions, classes, or files exceeding a line-count threshold.\n\nUseful for decomposition audits, code quality checks, and enforcing\nsize limits during code review. Results are ordered by line count.",
|
|
639
|
+
"inputSchema": {
|
|
640
|
+
"type": "object",
|
|
641
|
+
"properties": {
|
|
642
|
+
"min_lines": {
|
|
643
|
+
"default": 50,
|
|
644
|
+
"type": "integer",
|
|
645
|
+
"description": "Minimum line count to flag. Default: 50."
|
|
646
|
+
},
|
|
647
|
+
"kind": {
|
|
648
|
+
"anyOf": [
|
|
649
|
+
{
|
|
650
|
+
"type": "string"
|
|
651
|
+
},
|
|
652
|
+
{
|
|
653
|
+
"type": "null"
|
|
654
|
+
}
|
|
655
|
+
],
|
|
656
|
+
"default": null,
|
|
657
|
+
"description": "Optional filter: Function, Class, File, or Test."
|
|
658
|
+
},
|
|
659
|
+
"file_path_pattern": {
|
|
660
|
+
"anyOf": [
|
|
661
|
+
{
|
|
662
|
+
"type": "string"
|
|
663
|
+
},
|
|
664
|
+
{
|
|
665
|
+
"type": "null"
|
|
666
|
+
}
|
|
667
|
+
],
|
|
668
|
+
"default": null,
|
|
669
|
+
"description": "Filter by file path substring (e.g. \"components/\")."
|
|
670
|
+
},
|
|
671
|
+
"limit": {
|
|
672
|
+
"default": 50,
|
|
673
|
+
"type": "integer",
|
|
674
|
+
"description": "Maximum results. Default: 50."
|
|
675
|
+
},
|
|
676
|
+
"repo_root": {
|
|
677
|
+
"anyOf": [
|
|
678
|
+
{
|
|
679
|
+
"type": "string"
|
|
680
|
+
},
|
|
681
|
+
{
|
|
682
|
+
"type": "null"
|
|
683
|
+
}
|
|
684
|
+
],
|
|
685
|
+
"default": null,
|
|
686
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
687
|
+
}
|
|
688
|
+
},
|
|
689
|
+
"additionalProperties": false
|
|
690
|
+
},
|
|
691
|
+
"outputSchema": {
|
|
692
|
+
"type": "object",
|
|
693
|
+
"additionalProperties": true
|
|
694
|
+
},
|
|
695
|
+
"_meta": {
|
|
696
|
+
"fastmcp": {
|
|
697
|
+
"tags": []
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
},
|
|
701
|
+
{
|
|
702
|
+
"name": "list_flows_tool",
|
|
703
|
+
"description": "List execution flows in the codebase, sorted by criticality.\n\nEach flow represents a call chain starting from an entry point\n(HTTP handler, CLI command, test function, etc.). Use this to\nunderstand the main execution paths through the codebase.",
|
|
704
|
+
"inputSchema": {
|
|
705
|
+
"type": "object",
|
|
706
|
+
"properties": {
|
|
707
|
+
"sort_by": {
|
|
708
|
+
"default": "criticality",
|
|
709
|
+
"type": "string",
|
|
710
|
+
"description": "Sort column: criticality, depth, node_count, file_count, or name."
|
|
711
|
+
},
|
|
712
|
+
"limit": {
|
|
713
|
+
"default": 50,
|
|
714
|
+
"type": "integer",
|
|
715
|
+
"description": "Maximum flows to return. Default: 50."
|
|
716
|
+
},
|
|
717
|
+
"kind": {
|
|
718
|
+
"anyOf": [
|
|
719
|
+
{
|
|
720
|
+
"type": "string"
|
|
721
|
+
},
|
|
722
|
+
{
|
|
723
|
+
"type": "null"
|
|
724
|
+
}
|
|
725
|
+
],
|
|
726
|
+
"default": null,
|
|
727
|
+
"description": "Optional filter by entry point kind (e.g. \"Test\", \"Function\")."
|
|
728
|
+
},
|
|
729
|
+
"detail_level": {
|
|
730
|
+
"default": "standard",
|
|
731
|
+
"type": "string",
|
|
732
|
+
"description": "\"standard\" (default) returns full flow data; \"minimal\"\n returns only name, criticality, and node_count per flow."
|
|
733
|
+
},
|
|
734
|
+
"repo_root": {
|
|
735
|
+
"anyOf": [
|
|
736
|
+
{
|
|
737
|
+
"type": "string"
|
|
738
|
+
},
|
|
739
|
+
{
|
|
740
|
+
"type": "null"
|
|
741
|
+
}
|
|
742
|
+
],
|
|
743
|
+
"default": null,
|
|
744
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
745
|
+
}
|
|
746
|
+
},
|
|
747
|
+
"additionalProperties": false
|
|
748
|
+
},
|
|
749
|
+
"outputSchema": {
|
|
750
|
+
"type": "object",
|
|
751
|
+
"additionalProperties": true
|
|
752
|
+
},
|
|
753
|
+
"_meta": {
|
|
754
|
+
"fastmcp": {
|
|
755
|
+
"tags": []
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
},
|
|
759
|
+
{
|
|
760
|
+
"name": "get_flow_tool",
|
|
761
|
+
"description": "Get detailed information about a single execution flow.\n\nReturns the full call path with each step's function name, file, and\nline numbers. Optionally includes source code snippets for each step.\n\nProvide either flow_id (from list_flows_tool) or flow_name to search by name.",
|
|
762
|
+
"inputSchema": {
|
|
763
|
+
"type": "object",
|
|
764
|
+
"properties": {
|
|
765
|
+
"flow_id": {
|
|
766
|
+
"anyOf": [
|
|
767
|
+
{
|
|
768
|
+
"type": "integer"
|
|
769
|
+
},
|
|
770
|
+
{
|
|
771
|
+
"type": "null"
|
|
772
|
+
}
|
|
773
|
+
],
|
|
774
|
+
"default": null,
|
|
775
|
+
"description": "Database ID of the flow."
|
|
776
|
+
},
|
|
777
|
+
"flow_name": {
|
|
778
|
+
"anyOf": [
|
|
779
|
+
{
|
|
780
|
+
"type": "string"
|
|
781
|
+
},
|
|
782
|
+
{
|
|
783
|
+
"type": "null"
|
|
784
|
+
}
|
|
785
|
+
],
|
|
786
|
+
"default": null,
|
|
787
|
+
"description": "Name to search for (partial match). Ignored if flow_id given."
|
|
788
|
+
},
|
|
789
|
+
"include_source": {
|
|
790
|
+
"default": false,
|
|
791
|
+
"type": "boolean",
|
|
792
|
+
"description": "Include source code snippets for each step. Default: False."
|
|
793
|
+
},
|
|
794
|
+
"repo_root": {
|
|
795
|
+
"anyOf": [
|
|
796
|
+
{
|
|
797
|
+
"type": "string"
|
|
798
|
+
},
|
|
799
|
+
{
|
|
800
|
+
"type": "null"
|
|
801
|
+
}
|
|
802
|
+
],
|
|
803
|
+
"default": null,
|
|
804
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
805
|
+
},
|
|
806
|
+
"max_steps": {
|
|
807
|
+
"default": 50,
|
|
808
|
+
"type": "integer",
|
|
809
|
+
"description": "Maximum steps to return; flow.total_steps reports the\nfull count. Default: 50."
|
|
810
|
+
},
|
|
811
|
+
"max_source_lines": {
|
|
812
|
+
"default": 400,
|
|
813
|
+
"type": "integer",
|
|
814
|
+
"description": "Total source lines across all steps when\ninclude_source is set. Default: 400."
|
|
815
|
+
}
|
|
816
|
+
},
|
|
817
|
+
"additionalProperties": false
|
|
818
|
+
},
|
|
819
|
+
"outputSchema": {
|
|
820
|
+
"type": "object",
|
|
821
|
+
"additionalProperties": true
|
|
822
|
+
},
|
|
823
|
+
"_meta": {
|
|
824
|
+
"fastmcp": {
|
|
825
|
+
"tags": []
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
},
|
|
829
|
+
{
|
|
830
|
+
"name": "get_affected_flows_tool",
|
|
831
|
+
"description": "Find execution flows affected by changed files.\n\nIdentifies which execution flows pass through nodes in the changed files.\nUseful during code review to understand which user-facing or critical paths\nare impacted by a change. Auto-detects changed files from git if not specified.",
|
|
832
|
+
"inputSchema": {
|
|
833
|
+
"type": "object",
|
|
834
|
+
"properties": {
|
|
835
|
+
"changed_files": {
|
|
836
|
+
"anyOf": [
|
|
837
|
+
{
|
|
838
|
+
"items": {
|
|
839
|
+
"type": "string"
|
|
840
|
+
},
|
|
841
|
+
"type": "array"
|
|
842
|
+
},
|
|
843
|
+
{
|
|
844
|
+
"type": "null"
|
|
845
|
+
}
|
|
846
|
+
],
|
|
847
|
+
"default": null,
|
|
848
|
+
"description": "List of changed file paths (relative to repo root). Auto-detected if omitted."
|
|
849
|
+
},
|
|
850
|
+
"base": {
|
|
851
|
+
"default": "HEAD~1",
|
|
852
|
+
"type": "string",
|
|
853
|
+
"description": "Git ref for auto-detecting changes. Default: HEAD~1."
|
|
854
|
+
},
|
|
855
|
+
"repo_root": {
|
|
856
|
+
"anyOf": [
|
|
857
|
+
{
|
|
858
|
+
"type": "string"
|
|
859
|
+
},
|
|
860
|
+
{
|
|
861
|
+
"type": "null"
|
|
862
|
+
}
|
|
863
|
+
],
|
|
864
|
+
"default": null,
|
|
865
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
866
|
+
},
|
|
867
|
+
"detail_level": {
|
|
868
|
+
"default": "standard",
|
|
869
|
+
"type": "string",
|
|
870
|
+
"description": "\"standard\" for full step details, \"minimal\" for per-flow\nmetadata only. Default: standard."
|
|
871
|
+
},
|
|
872
|
+
"max_flows": {
|
|
873
|
+
"default": 50,
|
|
874
|
+
"type": "integer",
|
|
875
|
+
"description": "Maximum flows to return; total reports the full count.\nDefault: 50. Pass 0 for no caller limit. Standard mode\nadditionally caps visible flows at 25 and minimal mode at 500,\nbecause a standard flow costs ~980 tokens against ~18 minimal."
|
|
876
|
+
}
|
|
877
|
+
},
|
|
878
|
+
"additionalProperties": false
|
|
879
|
+
},
|
|
880
|
+
"outputSchema": {
|
|
881
|
+
"type": "object",
|
|
882
|
+
"additionalProperties": true
|
|
883
|
+
},
|
|
884
|
+
"_meta": {
|
|
885
|
+
"fastmcp": {
|
|
886
|
+
"tags": []
|
|
887
|
+
}
|
|
888
|
+
}
|
|
889
|
+
},
|
|
890
|
+
{
|
|
891
|
+
"name": "list_communities_tool",
|
|
892
|
+
"description": "List detected code communities in the codebase.\n\nEach community represents a cluster of related code entities (functions,\nclasses) detected via the Leiden algorithm or file-based grouping.\nUse this to understand the high-level structure of the codebase.",
|
|
893
|
+
"inputSchema": {
|
|
894
|
+
"type": "object",
|
|
895
|
+
"properties": {
|
|
896
|
+
"sort_by": {
|
|
897
|
+
"default": "size",
|
|
898
|
+
"type": "string",
|
|
899
|
+
"description": "Sort column: size, cohesion, or name."
|
|
900
|
+
},
|
|
901
|
+
"min_size": {
|
|
902
|
+
"default": 0,
|
|
903
|
+
"type": "integer",
|
|
904
|
+
"description": "Minimum community size to include. Default: 0."
|
|
905
|
+
},
|
|
906
|
+
"detail_level": {
|
|
907
|
+
"default": "standard",
|
|
908
|
+
"type": "string",
|
|
909
|
+
"description": "\"standard\" (default) returns full community data;\n \"minimal\" returns only name, size, and cohesion\n per community."
|
|
910
|
+
},
|
|
911
|
+
"repo_root": {
|
|
912
|
+
"anyOf": [
|
|
913
|
+
{
|
|
914
|
+
"type": "string"
|
|
915
|
+
},
|
|
916
|
+
{
|
|
917
|
+
"type": "null"
|
|
918
|
+
}
|
|
919
|
+
],
|
|
920
|
+
"default": null,
|
|
921
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
922
|
+
},
|
|
923
|
+
"max_results": {
|
|
924
|
+
"default": 50,
|
|
925
|
+
"type": "integer",
|
|
926
|
+
"description": "Maximum communities to return; total reports the full\ncount. Default: 50."
|
|
927
|
+
},
|
|
928
|
+
"max_members": {
|
|
929
|
+
"default": 10,
|
|
930
|
+
"type": "integer",
|
|
931
|
+
"description": "Maximum member names listed per community in standard\nmode. Each community's size still reports its true member\ncount. Default: 10."
|
|
932
|
+
}
|
|
933
|
+
},
|
|
934
|
+
"additionalProperties": false
|
|
935
|
+
},
|
|
936
|
+
"outputSchema": {
|
|
937
|
+
"type": "object",
|
|
938
|
+
"additionalProperties": true
|
|
939
|
+
},
|
|
940
|
+
"_meta": {
|
|
941
|
+
"fastmcp": {
|
|
942
|
+
"tags": []
|
|
943
|
+
}
|
|
944
|
+
}
|
|
945
|
+
},
|
|
946
|
+
{
|
|
947
|
+
"name": "get_community_tool",
|
|
948
|
+
"description": "Get detailed information about a single code community.\n\nReturns community metadata including size, cohesion, dominant language,\nand member list. Optionally includes full node details for each member.\n\nProvide either community_id (from list_communities_tool) or community_name\nto search by name.",
|
|
949
|
+
"inputSchema": {
|
|
950
|
+
"type": "object",
|
|
951
|
+
"properties": {
|
|
952
|
+
"community_name": {
|
|
953
|
+
"anyOf": [
|
|
954
|
+
{
|
|
955
|
+
"type": "string"
|
|
956
|
+
},
|
|
957
|
+
{
|
|
958
|
+
"type": "null"
|
|
959
|
+
}
|
|
960
|
+
],
|
|
961
|
+
"default": null,
|
|
962
|
+
"description": "Name to search for (partial match). Ignored if community_id given."
|
|
963
|
+
},
|
|
964
|
+
"community_id": {
|
|
965
|
+
"anyOf": [
|
|
966
|
+
{
|
|
967
|
+
"type": "integer"
|
|
968
|
+
},
|
|
969
|
+
{
|
|
970
|
+
"type": "null"
|
|
971
|
+
}
|
|
972
|
+
],
|
|
973
|
+
"default": null,
|
|
974
|
+
"description": "Database ID of the community."
|
|
975
|
+
},
|
|
976
|
+
"include_members": {
|
|
977
|
+
"default": false,
|
|
978
|
+
"type": "boolean",
|
|
979
|
+
"description": "Include full member node details. Default: False."
|
|
980
|
+
},
|
|
981
|
+
"repo_root": {
|
|
982
|
+
"anyOf": [
|
|
983
|
+
{
|
|
984
|
+
"type": "string"
|
|
985
|
+
},
|
|
986
|
+
{
|
|
987
|
+
"type": "null"
|
|
988
|
+
}
|
|
989
|
+
],
|
|
990
|
+
"default": null,
|
|
991
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
992
|
+
},
|
|
993
|
+
"max_members": {
|
|
994
|
+
"default": 25,
|
|
995
|
+
"type": "integer",
|
|
996
|
+
"description": "Maximum member entries to include; the community's\nsize still reports its true member count and\nmembers_truncated marks the cut. Default: 25."
|
|
997
|
+
}
|
|
998
|
+
},
|
|
999
|
+
"additionalProperties": false
|
|
1000
|
+
},
|
|
1001
|
+
"outputSchema": {
|
|
1002
|
+
"type": "object",
|
|
1003
|
+
"additionalProperties": true
|
|
1004
|
+
},
|
|
1005
|
+
"_meta": {
|
|
1006
|
+
"fastmcp": {
|
|
1007
|
+
"tags": []
|
|
1008
|
+
}
|
|
1009
|
+
}
|
|
1010
|
+
},
|
|
1011
|
+
{
|
|
1012
|
+
"name": "get_architecture_overview_tool",
|
|
1013
|
+
"description": "Generate an architecture overview based on community structure.\n\nBuilds a high-level view of the codebase architecture by analyzing\ncommunity boundaries and cross-community coupling. Includes warnings\nfor high coupling between communities.",
|
|
1014
|
+
"inputSchema": {
|
|
1015
|
+
"type": "object",
|
|
1016
|
+
"properties": {
|
|
1017
|
+
"repo_root": {
|
|
1018
|
+
"anyOf": [
|
|
1019
|
+
{
|
|
1020
|
+
"type": "string"
|
|
1021
|
+
},
|
|
1022
|
+
{
|
|
1023
|
+
"type": "null"
|
|
1024
|
+
}
|
|
1025
|
+
],
|
|
1026
|
+
"default": null,
|
|
1027
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
1028
|
+
},
|
|
1029
|
+
"detail_level": {
|
|
1030
|
+
"default": "minimal",
|
|
1031
|
+
"type": "string",
|
|
1032
|
+
"description": "\"minimal\" (default) drops community member lists\n and aggregates cross-community edges to one row per\n community pair (typical reduction: 600KB -> <5KB);\n \"standard\" returns full per-edge detail."
|
|
1033
|
+
},
|
|
1034
|
+
"max_results": {
|
|
1035
|
+
"default": 100,
|
|
1036
|
+
"type": "integer",
|
|
1037
|
+
"description": "Maximum cross-community rows and warnings to return;\ncross_community_edges_total reports the full count. Default: 100."
|
|
1038
|
+
},
|
|
1039
|
+
"max_members": {
|
|
1040
|
+
"default": 10,
|
|
1041
|
+
"type": "integer",
|
|
1042
|
+
"description": "Maximum member names per community in standard mode.\nDefault: 10."
|
|
1043
|
+
}
|
|
1044
|
+
},
|
|
1045
|
+
"additionalProperties": false
|
|
1046
|
+
},
|
|
1047
|
+
"outputSchema": {
|
|
1048
|
+
"type": "object",
|
|
1049
|
+
"additionalProperties": true
|
|
1050
|
+
},
|
|
1051
|
+
"_meta": {
|
|
1052
|
+
"fastmcp": {
|
|
1053
|
+
"tags": []
|
|
1054
|
+
}
|
|
1055
|
+
}
|
|
1056
|
+
},
|
|
1057
|
+
{
|
|
1058
|
+
"name": "detect_changes_tool",
|
|
1059
|
+
"description": "Detect changes and produce risk-scored, priority-ordered review guidance.\n\nPrimary tool for code review. Maps git diffs to affected functions,\nflows, communities, and test coverage gaps. Returns risk scores and\nprioritized review items. Replaces get_review_context for change-aware reviews.\n\nOffloaded via ``_offload`` — runs `git diff` subprocesses and BFS\ntraversals that can take several seconds on large repos, and honours\n``CRG_TOOL_TIMEOUT``. See: #46, #136, #262.",
|
|
1060
|
+
"inputSchema": {
|
|
1061
|
+
"type": "object",
|
|
1062
|
+
"properties": {
|
|
1063
|
+
"base": {
|
|
1064
|
+
"default": "HEAD~1",
|
|
1065
|
+
"type": "string",
|
|
1066
|
+
"description": "Git ref to diff against. Default: HEAD~1."
|
|
1067
|
+
},
|
|
1068
|
+
"changed_files": {
|
|
1069
|
+
"anyOf": [
|
|
1070
|
+
{
|
|
1071
|
+
"items": {
|
|
1072
|
+
"type": "string"
|
|
1073
|
+
},
|
|
1074
|
+
"type": "array"
|
|
1075
|
+
},
|
|
1076
|
+
{
|
|
1077
|
+
"type": "null"
|
|
1078
|
+
}
|
|
1079
|
+
],
|
|
1080
|
+
"default": null,
|
|
1081
|
+
"description": "List of changed file paths (relative to repo root). Auto-detected if omitted."
|
|
1082
|
+
},
|
|
1083
|
+
"include_source": {
|
|
1084
|
+
"default": false,
|
|
1085
|
+
"type": "boolean",
|
|
1086
|
+
"description": "Include source code snippets for changed functions. Default: False."
|
|
1087
|
+
},
|
|
1088
|
+
"max_depth": {
|
|
1089
|
+
"default": 2,
|
|
1090
|
+
"type": "integer",
|
|
1091
|
+
"description": "Impact radius depth for BFS traversal. Default: 2."
|
|
1092
|
+
},
|
|
1093
|
+
"repo_root": {
|
|
1094
|
+
"anyOf": [
|
|
1095
|
+
{
|
|
1096
|
+
"type": "string"
|
|
1097
|
+
},
|
|
1098
|
+
{
|
|
1099
|
+
"type": "null"
|
|
1100
|
+
}
|
|
1101
|
+
],
|
|
1102
|
+
"default": null,
|
|
1103
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
1104
|
+
},
|
|
1105
|
+
"detail_level": {
|
|
1106
|
+
"default": "standard",
|
|
1107
|
+
"type": "string",
|
|
1108
|
+
"description": "\"standard\" for full output, \"minimal\" for\ntoken-efficient summary. Default: standard."
|
|
1109
|
+
},
|
|
1110
|
+
"max_results": {
|
|
1111
|
+
"default": 25,
|
|
1112
|
+
"type": "integer",
|
|
1113
|
+
"description": "Maximum changed functions, test gaps, and changed files\nto return; the matching *_total fields report the full counts.\nDefault: 25."
|
|
1114
|
+
},
|
|
1115
|
+
"max_flows": {
|
|
1116
|
+
"default": 20,
|
|
1117
|
+
"type": "integer",
|
|
1118
|
+
"description": "Maximum affected flows to embed. Embedded flows carry\nper-flow metadata only — use get_affected_flows_tool for step\ndetail. Default: 20."
|
|
1119
|
+
}
|
|
1120
|
+
},
|
|
1121
|
+
"additionalProperties": false
|
|
1122
|
+
},
|
|
1123
|
+
"outputSchema": {
|
|
1124
|
+
"type": "object",
|
|
1125
|
+
"additionalProperties": true
|
|
1126
|
+
},
|
|
1127
|
+
"_meta": {
|
|
1128
|
+
"fastmcp": {
|
|
1129
|
+
"tags": []
|
|
1130
|
+
}
|
|
1131
|
+
}
|
|
1132
|
+
},
|
|
1133
|
+
{
|
|
1134
|
+
"name": "refactor_tool",
|
|
1135
|
+
"description": "Graph-powered refactoring operations.\n\nUnified entry point for rename previews, dead code detection, and\nrefactoring suggestions.\n\nModes:\n- rename: Preview renaming a symbol. Returns an edit list and a refactor_id\n to pass to apply_refactor_tool. Requires old_name and new_name.\n- dead_code: Find unreferenced functions/classes (no callers, tests, or\n importers, and not entry points).\n- suggest: Get community-driven refactoring suggestions (move misplaced\n functions, remove dead code).",
|
|
1136
|
+
"inputSchema": {
|
|
1137
|
+
"type": "object",
|
|
1138
|
+
"properties": {
|
|
1139
|
+
"mode": {
|
|
1140
|
+
"default": "rename",
|
|
1141
|
+
"type": "string",
|
|
1142
|
+
"description": "Operation mode: \"rename\", \"dead_code\", or \"suggest\"."
|
|
1143
|
+
},
|
|
1144
|
+
"old_name": {
|
|
1145
|
+
"anyOf": [
|
|
1146
|
+
{
|
|
1147
|
+
"type": "string"
|
|
1148
|
+
},
|
|
1149
|
+
{
|
|
1150
|
+
"type": "null"
|
|
1151
|
+
}
|
|
1152
|
+
],
|
|
1153
|
+
"default": null,
|
|
1154
|
+
"description": "(rename) Current symbol name to rename."
|
|
1155
|
+
},
|
|
1156
|
+
"new_name": {
|
|
1157
|
+
"anyOf": [
|
|
1158
|
+
{
|
|
1159
|
+
"type": "string"
|
|
1160
|
+
},
|
|
1161
|
+
{
|
|
1162
|
+
"type": "null"
|
|
1163
|
+
}
|
|
1164
|
+
],
|
|
1165
|
+
"default": null,
|
|
1166
|
+
"description": "(rename) Desired new name for the symbol."
|
|
1167
|
+
},
|
|
1168
|
+
"kind": {
|
|
1169
|
+
"anyOf": [
|
|
1170
|
+
{
|
|
1171
|
+
"type": "string"
|
|
1172
|
+
},
|
|
1173
|
+
{
|
|
1174
|
+
"type": "null"
|
|
1175
|
+
}
|
|
1176
|
+
],
|
|
1177
|
+
"default": null,
|
|
1178
|
+
"description": "(dead_code) Optional filter: Function or Class."
|
|
1179
|
+
},
|
|
1180
|
+
"file_pattern": {
|
|
1181
|
+
"anyOf": [
|
|
1182
|
+
{
|
|
1183
|
+
"type": "string"
|
|
1184
|
+
},
|
|
1185
|
+
{
|
|
1186
|
+
"type": "null"
|
|
1187
|
+
}
|
|
1188
|
+
],
|
|
1189
|
+
"default": null,
|
|
1190
|
+
"description": "(dead_code) Filter by file path substring."
|
|
1191
|
+
},
|
|
1192
|
+
"repo_root": {
|
|
1193
|
+
"anyOf": [
|
|
1194
|
+
{
|
|
1195
|
+
"type": "string"
|
|
1196
|
+
},
|
|
1197
|
+
{
|
|
1198
|
+
"type": "null"
|
|
1199
|
+
}
|
|
1200
|
+
],
|
|
1201
|
+
"default": null,
|
|
1202
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
1203
|
+
},
|
|
1204
|
+
"max_results": {
|
|
1205
|
+
"default": 50,
|
|
1206
|
+
"type": "integer",
|
|
1207
|
+
"description": "Maximum edits/symbols/suggestions in the response;\ntotal reports the full count. The stored rename preview keeps\nevery edit, so apply_refactor_tool still applies them all.\nDefault: 50."
|
|
1208
|
+
},
|
|
1209
|
+
"detail_level": {
|
|
1210
|
+
"default": "standard",
|
|
1211
|
+
"type": "string",
|
|
1212
|
+
"description": "\"standard\" for full records, \"minimal\" for\nidentifying fields only. Default: standard."
|
|
1213
|
+
}
|
|
1214
|
+
},
|
|
1215
|
+
"additionalProperties": false
|
|
1216
|
+
},
|
|
1217
|
+
"outputSchema": {
|
|
1218
|
+
"type": "object",
|
|
1219
|
+
"additionalProperties": true
|
|
1220
|
+
},
|
|
1221
|
+
"_meta": {
|
|
1222
|
+
"fastmcp": {
|
|
1223
|
+
"tags": []
|
|
1224
|
+
}
|
|
1225
|
+
}
|
|
1226
|
+
},
|
|
1227
|
+
{
|
|
1228
|
+
"name": "apply_refactor_tool",
|
|
1229
|
+
"description": "Apply a previously previewed refactoring to source files.\n\nTakes a refactor_id from a prior refactor_tool(mode=\"rename\") call and\napplies the exact string replacements to the target files. Previews\nexpire after 10 minutes.\n\nSecurity: All edit paths are validated to be within the repo root.\nOnly exact string replacements are performed (no regex, no eval).",
|
|
1230
|
+
"inputSchema": {
|
|
1231
|
+
"type": "object",
|
|
1232
|
+
"properties": {
|
|
1233
|
+
"refactor_id": {
|
|
1234
|
+
"type": "string",
|
|
1235
|
+
"description": "The refactor ID from refactor_tool's response."
|
|
1236
|
+
},
|
|
1237
|
+
"repo_root": {
|
|
1238
|
+
"anyOf": [
|
|
1239
|
+
{
|
|
1240
|
+
"type": "string"
|
|
1241
|
+
},
|
|
1242
|
+
{
|
|
1243
|
+
"type": "null"
|
|
1244
|
+
}
|
|
1245
|
+
],
|
|
1246
|
+
"default": null,
|
|
1247
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
1248
|
+
},
|
|
1249
|
+
"dry_run": {
|
|
1250
|
+
"default": false,
|
|
1251
|
+
"type": "boolean",
|
|
1252
|
+
"description": "If True, return a unified diff of what would change\nwithout touching any files. The refactor_id remains valid so\nthe same preview can be applied in a follow-up call without\ndry_run. Use this for a human-in-the-loop review before\ncommitting changes to disk. See: #176"
|
|
1253
|
+
},
|
|
1254
|
+
"max_diff_files": {
|
|
1255
|
+
"default": 25,
|
|
1256
|
+
"type": "integer",
|
|
1257
|
+
"description": "Maximum per-file diffs to include in a dry run.\nwould_modify still lists every file. Default: 25."
|
|
1258
|
+
}
|
|
1259
|
+
},
|
|
1260
|
+
"required": [
|
|
1261
|
+
"refactor_id"
|
|
1262
|
+
],
|
|
1263
|
+
"additionalProperties": false
|
|
1264
|
+
},
|
|
1265
|
+
"outputSchema": {
|
|
1266
|
+
"type": "object",
|
|
1267
|
+
"additionalProperties": true
|
|
1268
|
+
},
|
|
1269
|
+
"_meta": {
|
|
1270
|
+
"fastmcp": {
|
|
1271
|
+
"tags": []
|
|
1272
|
+
}
|
|
1273
|
+
}
|
|
1274
|
+
},
|
|
1275
|
+
{
|
|
1276
|
+
"name": "get_refactor_edit_plan_tool",
|
|
1277
|
+
"description": "Return a complete read-only UTF-8 edit plan for a host-controlled commit.\n\nEach file includes path, before_sha256, after_content and edit_count.\nPlans are not truncated. Hosts must recheck paths and byte hashes and\nobtain filesystem permission before applying; no source files are written.",
|
|
1278
|
+
"inputSchema": {
|
|
1279
|
+
"type": "object",
|
|
1280
|
+
"properties": {
|
|
1281
|
+
"refactor_id": {
|
|
1282
|
+
"type": "string"
|
|
1283
|
+
},
|
|
1284
|
+
"repo_root": {
|
|
1285
|
+
"anyOf": [
|
|
1286
|
+
{
|
|
1287
|
+
"type": "string"
|
|
1288
|
+
},
|
|
1289
|
+
{
|
|
1290
|
+
"type": "null"
|
|
1291
|
+
}
|
|
1292
|
+
],
|
|
1293
|
+
"default": null
|
|
1294
|
+
}
|
|
1295
|
+
},
|
|
1296
|
+
"required": [
|
|
1297
|
+
"refactor_id"
|
|
1298
|
+
],
|
|
1299
|
+
"additionalProperties": false
|
|
1300
|
+
},
|
|
1301
|
+
"outputSchema": {
|
|
1302
|
+
"type": "object",
|
|
1303
|
+
"additionalProperties": true
|
|
1304
|
+
},
|
|
1305
|
+
"_meta": {
|
|
1306
|
+
"fastmcp": {
|
|
1307
|
+
"tags": []
|
|
1308
|
+
}
|
|
1309
|
+
}
|
|
1310
|
+
},
|
|
1311
|
+
{
|
|
1312
|
+
"name": "generate_wiki_tool",
|
|
1313
|
+
"description": "Generate a markdown wiki from the code community structure.\n\nCreates a wiki page for each detected community and an index page.\nPages are written to .code-review-graph/wiki/ inside the repository.\nOnly regenerates pages whose content has changed unless force=True.\n\nOffloaded via ``_offload`` — on large graphs the page-generation loop\ntouches every community and issues many SQLite reads, which would\nblock the MCP event loop. See: #46, #136, #262.",
|
|
1314
|
+
"inputSchema": {
|
|
1315
|
+
"type": "object",
|
|
1316
|
+
"properties": {
|
|
1317
|
+
"repo_root": {
|
|
1318
|
+
"anyOf": [
|
|
1319
|
+
{
|
|
1320
|
+
"type": "string"
|
|
1321
|
+
},
|
|
1322
|
+
{
|
|
1323
|
+
"type": "null"
|
|
1324
|
+
}
|
|
1325
|
+
],
|
|
1326
|
+
"default": null,
|
|
1327
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
1328
|
+
},
|
|
1329
|
+
"force": {
|
|
1330
|
+
"default": false,
|
|
1331
|
+
"type": "boolean",
|
|
1332
|
+
"description": "If True, regenerate all pages even if content unchanged. Default: False."
|
|
1333
|
+
}
|
|
1334
|
+
},
|
|
1335
|
+
"additionalProperties": false
|
|
1336
|
+
},
|
|
1337
|
+
"outputSchema": {
|
|
1338
|
+
"type": "object",
|
|
1339
|
+
"additionalProperties": true
|
|
1340
|
+
},
|
|
1341
|
+
"_meta": {
|
|
1342
|
+
"fastmcp": {
|
|
1343
|
+
"tags": []
|
|
1344
|
+
}
|
|
1345
|
+
}
|
|
1346
|
+
},
|
|
1347
|
+
{
|
|
1348
|
+
"name": "get_wiki_page_tool",
|
|
1349
|
+
"description": "Retrieve a specific wiki page by community name.\n\nReturns the markdown content of the wiki page for the given community.\nThe wiki must have been generated first via generate_wiki_tool.",
|
|
1350
|
+
"inputSchema": {
|
|
1351
|
+
"type": "object",
|
|
1352
|
+
"properties": {
|
|
1353
|
+
"community_name": {
|
|
1354
|
+
"type": "string",
|
|
1355
|
+
"description": "Community name to look up."
|
|
1356
|
+
},
|
|
1357
|
+
"repo_root": {
|
|
1358
|
+
"anyOf": [
|
|
1359
|
+
{
|
|
1360
|
+
"type": "string"
|
|
1361
|
+
},
|
|
1362
|
+
{
|
|
1363
|
+
"type": "null"
|
|
1364
|
+
}
|
|
1365
|
+
],
|
|
1366
|
+
"default": null,
|
|
1367
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
1368
|
+
},
|
|
1369
|
+
"max_chars": {
|
|
1370
|
+
"default": 20000,
|
|
1371
|
+
"type": "integer",
|
|
1372
|
+
"description": "Maximum characters of page content to return;\ntotal_chars reports the real length. Default: 20000."
|
|
1373
|
+
}
|
|
1374
|
+
},
|
|
1375
|
+
"required": [
|
|
1376
|
+
"community_name"
|
|
1377
|
+
],
|
|
1378
|
+
"additionalProperties": false
|
|
1379
|
+
},
|
|
1380
|
+
"outputSchema": {
|
|
1381
|
+
"type": "object",
|
|
1382
|
+
"additionalProperties": true
|
|
1383
|
+
},
|
|
1384
|
+
"_meta": {
|
|
1385
|
+
"fastmcp": {
|
|
1386
|
+
"tags": []
|
|
1387
|
+
}
|
|
1388
|
+
}
|
|
1389
|
+
},
|
|
1390
|
+
{
|
|
1391
|
+
"name": "get_hub_nodes_tool",
|
|
1392
|
+
"description": "Find the most connected nodes in the codebase (architectural hotspots).\n\nHub nodes have the highest total degree (in + out edges). Changes to\nthem have disproportionate blast radius. Excludes File nodes.",
|
|
1393
|
+
"inputSchema": {
|
|
1394
|
+
"type": "object",
|
|
1395
|
+
"properties": {
|
|
1396
|
+
"top_n": {
|
|
1397
|
+
"default": 10,
|
|
1398
|
+
"type": "integer",
|
|
1399
|
+
"description": "Number of top hubs to return (capped at 100). Default: 10."
|
|
1400
|
+
},
|
|
1401
|
+
"repo_root": {
|
|
1402
|
+
"anyOf": [
|
|
1403
|
+
{
|
|
1404
|
+
"type": "string"
|
|
1405
|
+
},
|
|
1406
|
+
{
|
|
1407
|
+
"type": "null"
|
|
1408
|
+
}
|
|
1409
|
+
],
|
|
1410
|
+
"default": null,
|
|
1411
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
1412
|
+
},
|
|
1413
|
+
"detail_level": {
|
|
1414
|
+
"default": "standard",
|
|
1415
|
+
"type": "string",
|
|
1416
|
+
"description": "\"standard\" for full node data, \"minimal\" for name,\nkind, and total_degree only. Default: standard."
|
|
1417
|
+
}
|
|
1418
|
+
},
|
|
1419
|
+
"additionalProperties": false
|
|
1420
|
+
},
|
|
1421
|
+
"outputSchema": {
|
|
1422
|
+
"type": "object",
|
|
1423
|
+
"additionalProperties": true
|
|
1424
|
+
},
|
|
1425
|
+
"_meta": {
|
|
1426
|
+
"fastmcp": {
|
|
1427
|
+
"tags": []
|
|
1428
|
+
}
|
|
1429
|
+
}
|
|
1430
|
+
},
|
|
1431
|
+
{
|
|
1432
|
+
"name": "get_bridge_nodes_tool",
|
|
1433
|
+
"description": "Find architectural chokepoints via betweenness centrality.\n\nBridge nodes sit on shortest paths between many node pairs.\nIf they break, multiple code regions lose connectivity.\nUses sampling approximation for graphs > 5000 nodes.",
|
|
1434
|
+
"inputSchema": {
|
|
1435
|
+
"type": "object",
|
|
1436
|
+
"properties": {
|
|
1437
|
+
"top_n": {
|
|
1438
|
+
"default": 10,
|
|
1439
|
+
"type": "integer",
|
|
1440
|
+
"description": "Number of top bridges to return (capped at 100). Default: 10."
|
|
1441
|
+
},
|
|
1442
|
+
"repo_root": {
|
|
1443
|
+
"anyOf": [
|
|
1444
|
+
{
|
|
1445
|
+
"type": "string"
|
|
1446
|
+
},
|
|
1447
|
+
{
|
|
1448
|
+
"type": "null"
|
|
1449
|
+
}
|
|
1450
|
+
],
|
|
1451
|
+
"default": null,
|
|
1452
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
1453
|
+
},
|
|
1454
|
+
"detail_level": {
|
|
1455
|
+
"default": "standard",
|
|
1456
|
+
"type": "string",
|
|
1457
|
+
"description": "\"standard\" for full node data, \"minimal\" for name,\nkind, and betweenness only. Default: standard."
|
|
1458
|
+
}
|
|
1459
|
+
},
|
|
1460
|
+
"additionalProperties": false
|
|
1461
|
+
},
|
|
1462
|
+
"outputSchema": {
|
|
1463
|
+
"type": "object",
|
|
1464
|
+
"additionalProperties": true
|
|
1465
|
+
},
|
|
1466
|
+
"_meta": {
|
|
1467
|
+
"fastmcp": {
|
|
1468
|
+
"tags": []
|
|
1469
|
+
}
|
|
1470
|
+
}
|
|
1471
|
+
},
|
|
1472
|
+
{
|
|
1473
|
+
"name": "get_knowledge_gaps_tool",
|
|
1474
|
+
"description": "Identify structural weaknesses in the codebase graph.\n\nFinds isolated nodes (disconnected), thin communities (< 3 members),\nuntested hotspots (high-degree nodes without test coverage), and\nsingle-file communities.",
|
|
1475
|
+
"inputSchema": {
|
|
1476
|
+
"type": "object",
|
|
1477
|
+
"properties": {
|
|
1478
|
+
"repo_root": {
|
|
1479
|
+
"anyOf": [
|
|
1480
|
+
{
|
|
1481
|
+
"type": "string"
|
|
1482
|
+
},
|
|
1483
|
+
{
|
|
1484
|
+
"type": "null"
|
|
1485
|
+
}
|
|
1486
|
+
],
|
|
1487
|
+
"default": null,
|
|
1488
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
1489
|
+
},
|
|
1490
|
+
"max_per_category": {
|
|
1491
|
+
"default": 15,
|
|
1492
|
+
"type": "integer",
|
|
1493
|
+
"description": "Maximum entries per gap category; summary and\ntotal_gaps still report the untruncated counts. Default: 15."
|
|
1494
|
+
},
|
|
1495
|
+
"detail_level": {
|
|
1496
|
+
"default": "standard",
|
|
1497
|
+
"type": "string",
|
|
1498
|
+
"description": "\"standard\" for full gap records, \"minimal\" to drop\nfile paths. Default: standard."
|
|
1499
|
+
}
|
|
1500
|
+
},
|
|
1501
|
+
"additionalProperties": false
|
|
1502
|
+
},
|
|
1503
|
+
"outputSchema": {
|
|
1504
|
+
"type": "object",
|
|
1505
|
+
"additionalProperties": true
|
|
1506
|
+
},
|
|
1507
|
+
"_meta": {
|
|
1508
|
+
"fastmcp": {
|
|
1509
|
+
"tags": []
|
|
1510
|
+
}
|
|
1511
|
+
}
|
|
1512
|
+
},
|
|
1513
|
+
{
|
|
1514
|
+
"name": "get_surprising_connections_tool",
|
|
1515
|
+
"description": "Find unexpected architectural coupling via composite surprise scoring.\n\nScores edges by: cross-community (+0.3), cross-language (+0.2),\nperipheral-to-hub (+0.2), cross-test-boundary (+0.15), and\nunusual edge kinds (+0.15).",
|
|
1516
|
+
"inputSchema": {
|
|
1517
|
+
"type": "object",
|
|
1518
|
+
"properties": {
|
|
1519
|
+
"top_n": {
|
|
1520
|
+
"default": 15,
|
|
1521
|
+
"type": "integer",
|
|
1522
|
+
"description": "Number of top surprises to return (capped at 100). Default: 15."
|
|
1523
|
+
},
|
|
1524
|
+
"repo_root": {
|
|
1525
|
+
"anyOf": [
|
|
1526
|
+
{
|
|
1527
|
+
"type": "string"
|
|
1528
|
+
},
|
|
1529
|
+
{
|
|
1530
|
+
"type": "null"
|
|
1531
|
+
}
|
|
1532
|
+
],
|
|
1533
|
+
"default": null,
|
|
1534
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
1535
|
+
},
|
|
1536
|
+
"detail_level": {
|
|
1537
|
+
"default": "standard",
|
|
1538
|
+
"type": "string",
|
|
1539
|
+
"description": "\"standard\" for full edge records, \"minimal\" for\nsource, target, kind, and score only. Default: standard."
|
|
1540
|
+
}
|
|
1541
|
+
},
|
|
1542
|
+
"additionalProperties": false
|
|
1543
|
+
},
|
|
1544
|
+
"outputSchema": {
|
|
1545
|
+
"type": "object",
|
|
1546
|
+
"additionalProperties": true
|
|
1547
|
+
},
|
|
1548
|
+
"_meta": {
|
|
1549
|
+
"fastmcp": {
|
|
1550
|
+
"tags": []
|
|
1551
|
+
}
|
|
1552
|
+
}
|
|
1553
|
+
},
|
|
1554
|
+
{
|
|
1555
|
+
"name": "get_suggested_questions_tool",
|
|
1556
|
+
"description": "Auto-generate review questions from graph analysis.\n\nProduces prioritized questions about: bridge nodes needing tests,\nuntested hub nodes, surprising cross-community coupling, thin\ncommunities, and untested hotspots.",
|
|
1557
|
+
"inputSchema": {
|
|
1558
|
+
"type": "object",
|
|
1559
|
+
"properties": {
|
|
1560
|
+
"repo_root": {
|
|
1561
|
+
"anyOf": [
|
|
1562
|
+
{
|
|
1563
|
+
"type": "string"
|
|
1564
|
+
},
|
|
1565
|
+
{
|
|
1566
|
+
"type": "null"
|
|
1567
|
+
}
|
|
1568
|
+
],
|
|
1569
|
+
"default": null,
|
|
1570
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
1571
|
+
}
|
|
1572
|
+
},
|
|
1573
|
+
"additionalProperties": false
|
|
1574
|
+
},
|
|
1575
|
+
"outputSchema": {
|
|
1576
|
+
"type": "object",
|
|
1577
|
+
"additionalProperties": true
|
|
1578
|
+
},
|
|
1579
|
+
"_meta": {
|
|
1580
|
+
"fastmcp": {
|
|
1581
|
+
"tags": []
|
|
1582
|
+
}
|
|
1583
|
+
}
|
|
1584
|
+
},
|
|
1585
|
+
{
|
|
1586
|
+
"name": "traverse_graph_tool",
|
|
1587
|
+
"description": "BFS/DFS traversal from best-matching node with token budget.\n\nFree-form graph exploration: finds the node best matching your\nquery, then traverses outward via BFS or DFS up to the given\ndepth, collecting connected nodes within the token budget.",
|
|
1588
|
+
"inputSchema": {
|
|
1589
|
+
"type": "object",
|
|
1590
|
+
"properties": {
|
|
1591
|
+
"query": {
|
|
1592
|
+
"type": "string",
|
|
1593
|
+
"description": "Search string to find the starting node."
|
|
1594
|
+
},
|
|
1595
|
+
"mode": {
|
|
1596
|
+
"default": "bfs",
|
|
1597
|
+
"type": "string",
|
|
1598
|
+
"description": "Traversal mode: \"bfs\" (breadth-first) or \"dfs\"\n(depth-first). Default: bfs."
|
|
1599
|
+
},
|
|
1600
|
+
"depth": {
|
|
1601
|
+
"default": 3,
|
|
1602
|
+
"type": "integer",
|
|
1603
|
+
"description": "Max traversal depth (1-6). Default: 3."
|
|
1604
|
+
},
|
|
1605
|
+
"token_budget": {
|
|
1606
|
+
"default": 2000,
|
|
1607
|
+
"type": "integer",
|
|
1608
|
+
"description": "Approximate token limit for results.\nDefault: 2000."
|
|
1609
|
+
},
|
|
1610
|
+
"repo_root": {
|
|
1611
|
+
"anyOf": [
|
|
1612
|
+
{
|
|
1613
|
+
"type": "string"
|
|
1614
|
+
},
|
|
1615
|
+
{
|
|
1616
|
+
"type": "null"
|
|
1617
|
+
}
|
|
1618
|
+
],
|
|
1619
|
+
"default": null,
|
|
1620
|
+
"description": "Repository root path. Auto-detected if omitted."
|
|
1621
|
+
}
|
|
1622
|
+
},
|
|
1623
|
+
"required": [
|
|
1624
|
+
"query"
|
|
1625
|
+
],
|
|
1626
|
+
"additionalProperties": false
|
|
1627
|
+
},
|
|
1628
|
+
"outputSchema": {
|
|
1629
|
+
"type": "object",
|
|
1630
|
+
"additionalProperties": true
|
|
1631
|
+
},
|
|
1632
|
+
"_meta": {
|
|
1633
|
+
"fastmcp": {
|
|
1634
|
+
"tags": []
|
|
1635
|
+
}
|
|
1636
|
+
}
|
|
1637
|
+
},
|
|
1638
|
+
{
|
|
1639
|
+
"name": "list_repos_tool",
|
|
1640
|
+
"description": "List all registered repositories in the multi-repo registry.\n\nReturns the list of repos registered at ~/.code-review-graph/registry.json.\nUse the CLI 'register' command to add repos.\n\nStays synchronous: one small JSON read, no graph database and no Git.",
|
|
1641
|
+
"inputSchema": {
|
|
1642
|
+
"type": "object",
|
|
1643
|
+
"properties": {},
|
|
1644
|
+
"additionalProperties": false
|
|
1645
|
+
},
|
|
1646
|
+
"outputSchema": {
|
|
1647
|
+
"type": "object",
|
|
1648
|
+
"additionalProperties": true
|
|
1649
|
+
},
|
|
1650
|
+
"_meta": {
|
|
1651
|
+
"fastmcp": {
|
|
1652
|
+
"tags": []
|
|
1653
|
+
}
|
|
1654
|
+
}
|
|
1655
|
+
},
|
|
1656
|
+
{
|
|
1657
|
+
"name": "cross_repo_search_tool",
|
|
1658
|
+
"description": "Search for code entities across registered repositories.\n\nRuns hybrid search on each searched repo's graph database and interleaves\nresults by repository-local rank. Equal ranks follow registry order, and up\nto ``limit`` results per searched repo may be returned. Register repos first\nwith the CLI 'register' command.",
|
|
1659
|
+
"inputSchema": {
|
|
1660
|
+
"type": "object",
|
|
1661
|
+
"properties": {
|
|
1662
|
+
"query": {
|
|
1663
|
+
"type": "string",
|
|
1664
|
+
"description": "Search string to match against node names."
|
|
1665
|
+
},
|
|
1666
|
+
"kind": {
|
|
1667
|
+
"anyOf": [
|
|
1668
|
+
{
|
|
1669
|
+
"type": "string"
|
|
1670
|
+
},
|
|
1671
|
+
{
|
|
1672
|
+
"type": "null"
|
|
1673
|
+
}
|
|
1674
|
+
],
|
|
1675
|
+
"default": null,
|
|
1676
|
+
"description": "Optional filter: File, Class, Function, Type, or Test."
|
|
1677
|
+
},
|
|
1678
|
+
"limit": {
|
|
1679
|
+
"default": 20,
|
|
1680
|
+
"type": "integer",
|
|
1681
|
+
"description": "Maximum results per repo. Default: 20."
|
|
1682
|
+
},
|
|
1683
|
+
"max_results": {
|
|
1684
|
+
"default": 50,
|
|
1685
|
+
"type": "integer",
|
|
1686
|
+
"description": "Maximum merged results across searched repos; total\nreports the untruncated merged count. Default: 50."
|
|
1687
|
+
},
|
|
1688
|
+
"repos": {
|
|
1689
|
+
"anyOf": [
|
|
1690
|
+
{
|
|
1691
|
+
"items": {
|
|
1692
|
+
"type": "string"
|
|
1693
|
+
},
|
|
1694
|
+
"type": "array"
|
|
1695
|
+
},
|
|
1696
|
+
{
|
|
1697
|
+
"type": "null"
|
|
1698
|
+
}
|
|
1699
|
+
],
|
|
1700
|
+
"default": null,
|
|
1701
|
+
"description": "Optional repo aliases or folder names to search. Default: every\nregistered repo. Use it when the registry spans unrelated products\nand only some of them can answer the question. Matching is exact\nand case-sensitive, and paths are not accepted. Names matching no\nregistry entry come back in ``unknown``; a name matching several\nentries selects all of them and is listed in ``ambiguous``."
|
|
1702
|
+
}
|
|
1703
|
+
},
|
|
1704
|
+
"required": [
|
|
1705
|
+
"query"
|
|
1706
|
+
],
|
|
1707
|
+
"additionalProperties": false
|
|
1708
|
+
},
|
|
1709
|
+
"outputSchema": {
|
|
1710
|
+
"type": "object",
|
|
1711
|
+
"additionalProperties": true
|
|
1712
|
+
},
|
|
1713
|
+
"_meta": {
|
|
1714
|
+
"fastmcp": {
|
|
1715
|
+
"tags": []
|
|
1716
|
+
}
|
|
1717
|
+
}
|
|
1718
|
+
}
|
|
1719
|
+
],
|
|
1720
|
+
"prompts": [
|
|
1721
|
+
{
|
|
1722
|
+
"name": "review_changes",
|
|
1723
|
+
"description": "Pre-commit review workflow using detect_changes, affected_flows, and test gaps.\n\nProduces a structured code review with risk levels and actionable findings.",
|
|
1724
|
+
"arguments": [
|
|
1725
|
+
{
|
|
1726
|
+
"name": "base",
|
|
1727
|
+
"description": "Git ref to diff against. Default: HEAD~1.\n\nProvide as a JSON string matching the following schema: {\"type\":\"string\"}",
|
|
1728
|
+
"required": false
|
|
1729
|
+
}
|
|
1730
|
+
],
|
|
1731
|
+
"_meta": {
|
|
1732
|
+
"fastmcp": {
|
|
1733
|
+
"tags": []
|
|
1734
|
+
}
|
|
1735
|
+
}
|
|
1736
|
+
},
|
|
1737
|
+
{
|
|
1738
|
+
"name": "architecture_map",
|
|
1739
|
+
"description": "Architecture documentation using communities, flows, and Mermaid diagrams.\n\nGenerates a comprehensive architecture map with module summaries and coupling warnings.",
|
|
1740
|
+
"arguments": [],
|
|
1741
|
+
"_meta": {
|
|
1742
|
+
"fastmcp": {
|
|
1743
|
+
"tags": []
|
|
1744
|
+
}
|
|
1745
|
+
}
|
|
1746
|
+
},
|
|
1747
|
+
{
|
|
1748
|
+
"name": "debug_issue",
|
|
1749
|
+
"description": "Guided debugging using search, flow tracing, and recent changes.\n\nSystematic debugging workflow that traces execution paths and identifies root causes.",
|
|
1750
|
+
"arguments": [
|
|
1751
|
+
{
|
|
1752
|
+
"name": "description",
|
|
1753
|
+
"description": "Description of the issue to debug.\n\nProvide as a JSON string matching the following schema: {\"type\":\"string\"}",
|
|
1754
|
+
"required": false
|
|
1755
|
+
}
|
|
1756
|
+
],
|
|
1757
|
+
"_meta": {
|
|
1758
|
+
"fastmcp": {
|
|
1759
|
+
"tags": []
|
|
1760
|
+
}
|
|
1761
|
+
}
|
|
1762
|
+
},
|
|
1763
|
+
{
|
|
1764
|
+
"name": "onboard_developer",
|
|
1765
|
+
"description": "New developer orientation using stats, architecture, and critical flows.\n\nCreates an onboarding guide covering codebase structure, key modules, and patterns.",
|
|
1766
|
+
"arguments": [],
|
|
1767
|
+
"_meta": {
|
|
1768
|
+
"fastmcp": {
|
|
1769
|
+
"tags": []
|
|
1770
|
+
}
|
|
1771
|
+
}
|
|
1772
|
+
},
|
|
1773
|
+
{
|
|
1774
|
+
"name": "pre_merge_check",
|
|
1775
|
+
"description": "PR readiness check with risk scoring, test gaps, and dead code detection.\n\nProduces a merge readiness report with risk assessment and recommendations.",
|
|
1776
|
+
"arguments": [
|
|
1777
|
+
{
|
|
1778
|
+
"name": "base",
|
|
1779
|
+
"description": "Git ref to diff against. Default: HEAD~1.\n\nProvide as a JSON string matching the following schema: {\"type\":\"string\"}",
|
|
1780
|
+
"required": false
|
|
1781
|
+
}
|
|
1782
|
+
],
|
|
1783
|
+
"_meta": {
|
|
1784
|
+
"fastmcp": {
|
|
1785
|
+
"tags": []
|
|
1786
|
+
}
|
|
1787
|
+
}
|
|
1788
|
+
}
|
|
1789
|
+
]
|
|
1790
|
+
}
|