codedev-mcp 3.2.0

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.
Files changed (229) hide show
  1. package/CHANGELOG.md +90 -0
  2. package/LICENSE +21 -0
  3. package/README.md +760 -0
  4. package/dist/analyzers/api-contract.d.ts +46 -0
  5. package/dist/analyzers/api-contract.d.ts.map +1 -0
  6. package/dist/analyzers/api-contract.js +319 -0
  7. package/dist/analyzers/api-contract.js.map +1 -0
  8. package/dist/analyzers/architecture.d.ts +37 -0
  9. package/dist/analyzers/architecture.d.ts.map +1 -0
  10. package/dist/analyzers/architecture.js +149 -0
  11. package/dist/analyzers/architecture.js.map +1 -0
  12. package/dist/analyzers/branch-compare.d.ts +46 -0
  13. package/dist/analyzers/branch-compare.d.ts.map +1 -0
  14. package/dist/analyzers/branch-compare.js +128 -0
  15. package/dist/analyzers/branch-compare.js.map +1 -0
  16. package/dist/analyzers/cicd.d.ts +42 -0
  17. package/dist/analyzers/cicd.d.ts.map +1 -0
  18. package/dist/analyzers/cicd.js +237 -0
  19. package/dist/analyzers/cicd.js.map +1 -0
  20. package/dist/analyzers/codebase.d.ts +64 -0
  21. package/dist/analyzers/codebase.d.ts.map +1 -0
  22. package/dist/analyzers/codebase.js +354 -0
  23. package/dist/analyzers/codebase.js.map +1 -0
  24. package/dist/analyzers/complexity-heatmap.d.ts +50 -0
  25. package/dist/analyzers/complexity-heatmap.d.ts.map +1 -0
  26. package/dist/analyzers/complexity-heatmap.js +156 -0
  27. package/dist/analyzers/complexity-heatmap.js.map +1 -0
  28. package/dist/analyzers/context-pack.d.ts +43 -0
  29. package/dist/analyzers/context-pack.d.ts.map +1 -0
  30. package/dist/analyzers/context-pack.js +232 -0
  31. package/dist/analyzers/context-pack.js.map +1 -0
  32. package/dist/analyzers/coverage.d.ts +70 -0
  33. package/dist/analyzers/coverage.d.ts.map +1 -0
  34. package/dist/analyzers/coverage.js +313 -0
  35. package/dist/analyzers/coverage.js.map +1 -0
  36. package/dist/analyzers/db-schema.d.ts +55 -0
  37. package/dist/analyzers/db-schema.d.ts.map +1 -0
  38. package/dist/analyzers/db-schema.js +237 -0
  39. package/dist/analyzers/db-schema.js.map +1 -0
  40. package/dist/analyzers/dead-code.d.ts +34 -0
  41. package/dist/analyzers/dead-code.d.ts.map +1 -0
  42. package/dist/analyzers/dead-code.js +131 -0
  43. package/dist/analyzers/dead-code.js.map +1 -0
  44. package/dist/analyzers/dep-vuln.d.ts +36 -0
  45. package/dist/analyzers/dep-vuln.d.ts.map +1 -0
  46. package/dist/analyzers/dep-vuln.js +342 -0
  47. package/dist/analyzers/dep-vuln.js.map +1 -0
  48. package/dist/analyzers/docs.d.ts +47 -0
  49. package/dist/analyzers/docs.d.ts.map +1 -0
  50. package/dist/analyzers/docs.js +473 -0
  51. package/dist/analyzers/docs.js.map +1 -0
  52. package/dist/analyzers/git.d.ts +115 -0
  53. package/dist/analyzers/git.d.ts.map +1 -0
  54. package/dist/analyzers/git.js +214 -0
  55. package/dist/analyzers/git.js.map +1 -0
  56. package/dist/analyzers/iac.d.ts +39 -0
  57. package/dist/analyzers/iac.d.ts.map +1 -0
  58. package/dist/analyzers/iac.js +233 -0
  59. package/dist/analyzers/iac.js.map +1 -0
  60. package/dist/analyzers/impact.d.ts +51 -0
  61. package/dist/analyzers/impact.d.ts.map +1 -0
  62. package/dist/analyzers/impact.js +235 -0
  63. package/dist/analyzers/impact.js.map +1 -0
  64. package/dist/analyzers/monorepo.d.ts +36 -0
  65. package/dist/analyzers/monorepo.d.ts.map +1 -0
  66. package/dist/analyzers/monorepo.js +233 -0
  67. package/dist/analyzers/monorepo.js.map +1 -0
  68. package/dist/analyzers/notebook.d.ts +53 -0
  69. package/dist/analyzers/notebook.d.ts.map +1 -0
  70. package/dist/analyzers/notebook.js +149 -0
  71. package/dist/analyzers/notebook.js.map +1 -0
  72. package/dist/analyzers/perf-profile.d.ts +39 -0
  73. package/dist/analyzers/perf-profile.d.ts.map +1 -0
  74. package/dist/analyzers/perf-profile.js +222 -0
  75. package/dist/analyzers/perf-profile.js.map +1 -0
  76. package/dist/analyzers/scaffold.d.ts +46 -0
  77. package/dist/analyzers/scaffold.d.ts.map +1 -0
  78. package/dist/analyzers/scaffold.js +313 -0
  79. package/dist/analyzers/scaffold.js.map +1 -0
  80. package/dist/analyzers/security.d.ts +42 -0
  81. package/dist/analyzers/security.d.ts.map +1 -0
  82. package/dist/analyzers/security.js +281 -0
  83. package/dist/analyzers/security.js.map +1 -0
  84. package/dist/analyzers/symbols.d.ts +49 -0
  85. package/dist/analyzers/symbols.d.ts.map +1 -0
  86. package/dist/analyzers/symbols.js +212 -0
  87. package/dist/analyzers/symbols.js.map +1 -0
  88. package/dist/analyzers/tree-sitter.d.ts +71 -0
  89. package/dist/analyzers/tree-sitter.d.ts.map +1 -0
  90. package/dist/analyzers/tree-sitter.js +333 -0
  91. package/dist/analyzers/tree-sitter.js.map +1 -0
  92. package/dist/analyzers/type-flow.d.ts +39 -0
  93. package/dist/analyzers/type-flow.d.ts.map +1 -0
  94. package/dist/analyzers/type-flow.js +75 -0
  95. package/dist/analyzers/type-flow.js.map +1 -0
  96. package/dist/cache/memory-cache.d.ts +130 -0
  97. package/dist/cache/memory-cache.d.ts.map +1 -0
  98. package/dist/cache/memory-cache.js +273 -0
  99. package/dist/cache/memory-cache.js.map +1 -0
  100. package/dist/config.d.ts +32 -0
  101. package/dist/config.d.ts.map +1 -0
  102. package/dist/config.js +57 -0
  103. package/dist/config.js.map +1 -0
  104. package/dist/constants/instructions.d.ts +2 -0
  105. package/dist/constants/instructions.d.ts.map +1 -0
  106. package/dist/constants/instructions.js +82 -0
  107. package/dist/constants/instructions.js.map +1 -0
  108. package/dist/db/connection.d.ts +12 -0
  109. package/dist/db/connection.d.ts.map +1 -0
  110. package/dist/db/connection.js +34 -0
  111. package/dist/db/connection.js.map +1 -0
  112. package/dist/db/json-store.d.ts +111 -0
  113. package/dist/db/json-store.d.ts.map +1 -0
  114. package/dist/db/json-store.js +201 -0
  115. package/dist/db/json-store.js.map +1 -0
  116. package/dist/db/sqlite-store.d.ts +153 -0
  117. package/dist/db/sqlite-store.d.ts.map +1 -0
  118. package/dist/db/sqlite-store.js +388 -0
  119. package/dist/db/sqlite-store.js.map +1 -0
  120. package/dist/index.d.ts +17 -0
  121. package/dist/index.d.ts.map +1 -0
  122. package/dist/index.js +116 -0
  123. package/dist/index.js.map +1 -0
  124. package/dist/resources/health.d.ts +35 -0
  125. package/dist/resources/health.d.ts.map +1 -0
  126. package/dist/resources/health.js +81 -0
  127. package/dist/resources/health.js.map +1 -0
  128. package/dist/schemas/output-schemas.d.ts +517 -0
  129. package/dist/schemas/output-schemas.d.ts.map +1 -0
  130. package/dist/schemas/output-schemas.js +296 -0
  131. package/dist/schemas/output-schemas.js.map +1 -0
  132. package/dist/search/fast-search.d.ts +90 -0
  133. package/dist/search/fast-search.d.ts.map +1 -0
  134. package/dist/search/fast-search.js +387 -0
  135. package/dist/search/fast-search.js.map +1 -0
  136. package/dist/search/semantic.d.ts +26 -0
  137. package/dist/search/semantic.d.ts.map +1 -0
  138. package/dist/search/semantic.js +458 -0
  139. package/dist/search/semantic.js.map +1 -0
  140. package/dist/tools/analysis.d.ts +7 -0
  141. package/dist/tools/analysis.d.ts.map +1 -0
  142. package/dist/tools/analysis.js +491 -0
  143. package/dist/tools/analysis.js.map +1 -0
  144. package/dist/tools/architecture.d.ts +7 -0
  145. package/dist/tools/architecture.d.ts.map +1 -0
  146. package/dist/tools/architecture.js +176 -0
  147. package/dist/tools/architecture.js.map +1 -0
  148. package/dist/tools/devops.d.ts +7 -0
  149. package/dist/tools/devops.d.ts.map +1 -0
  150. package/dist/tools/devops.js +179 -0
  151. package/dist/tools/devops.js.map +1 -0
  152. package/dist/tools/docs.d.ts +7 -0
  153. package/dist/tools/docs.d.ts.map +1 -0
  154. package/dist/tools/docs.js +102 -0
  155. package/dist/tools/docs.js.map +1 -0
  156. package/dist/tools/git.d.ts +7 -0
  157. package/dist/tools/git.d.ts.map +1 -0
  158. package/dist/tools/git.js +475 -0
  159. package/dist/tools/git.js.map +1 -0
  160. package/dist/tools/nav.d.ts +7 -0
  161. package/dist/tools/nav.d.ts.map +1 -0
  162. package/dist/tools/nav.js +275 -0
  163. package/dist/tools/nav.js.map +1 -0
  164. package/dist/tools/notebook.d.ts +7 -0
  165. package/dist/tools/notebook.d.ts.map +1 -0
  166. package/dist/tools/notebook.js +102 -0
  167. package/dist/tools/notebook.js.map +1 -0
  168. package/dist/tools/performance.d.ts +7 -0
  169. package/dist/tools/performance.d.ts.map +1 -0
  170. package/dist/tools/performance.js +59 -0
  171. package/dist/tools/performance.js.map +1 -0
  172. package/dist/tools/quality.d.ts +7 -0
  173. package/dist/tools/quality.d.ts.map +1 -0
  174. package/dist/tools/quality.js +279 -0
  175. package/dist/tools/quality.js.map +1 -0
  176. package/dist/tools/scaffold.d.ts +7 -0
  177. package/dist/tools/scaffold.d.ts.map +1 -0
  178. package/dist/tools/scaffold.js +80 -0
  179. package/dist/tools/scaffold.js.map +1 -0
  180. package/dist/tools/search.d.ts +7 -0
  181. package/dist/tools/search.d.ts.map +1 -0
  182. package/dist/tools/search.js +308 -0
  183. package/dist/tools/search.js.map +1 -0
  184. package/dist/tools/security.d.ts +7 -0
  185. package/dist/tools/security.d.ts.map +1 -0
  186. package/dist/tools/security.js +138 -0
  187. package/dist/tools/security.js.map +1 -0
  188. package/dist/utils/analytics.d.ts +69 -0
  189. package/dist/utils/analytics.d.ts.map +1 -0
  190. package/dist/utils/analytics.js +144 -0
  191. package/dist/utils/analytics.js.map +1 -0
  192. package/dist/utils/concurrency.d.ts +43 -0
  193. package/dist/utils/concurrency.d.ts.map +1 -0
  194. package/dist/utils/concurrency.js +78 -0
  195. package/dist/utils/concurrency.js.map +1 -0
  196. package/dist/utils/fallback.d.ts +52 -0
  197. package/dist/utils/fallback.d.ts.map +1 -0
  198. package/dist/utils/fallback.js +137 -0
  199. package/dist/utils/fallback.js.map +1 -0
  200. package/dist/utils/git-hooks.d.ts +24 -0
  201. package/dist/utils/git-hooks.d.ts.map +1 -0
  202. package/dist/utils/git-hooks.js +108 -0
  203. package/dist/utils/git-hooks.js.map +1 -0
  204. package/dist/utils/languages.d.ts +72 -0
  205. package/dist/utils/languages.d.ts.map +1 -0
  206. package/dist/utils/languages.js +463 -0
  207. package/dist/utils/languages.js.map +1 -0
  208. package/dist/utils/logger.d.ts +13 -0
  209. package/dist/utils/logger.d.ts.map +1 -0
  210. package/dist/utils/logger.js +34 -0
  211. package/dist/utils/logger.js.map +1 -0
  212. package/dist/utils/plugins.d.ts +105 -0
  213. package/dist/utils/plugins.d.ts.map +1 -0
  214. package/dist/utils/plugins.js +325 -0
  215. package/dist/utils/plugins.js.map +1 -0
  216. package/dist/utils/security.d.ts +17 -0
  217. package/dist/utils/security.d.ts.map +1 -0
  218. package/dist/utils/security.js +48 -0
  219. package/dist/utils/security.js.map +1 -0
  220. package/dist/utils/streaming.d.ts +56 -0
  221. package/dist/utils/streaming.d.ts.map +1 -0
  222. package/dist/utils/streaming.js +95 -0
  223. package/dist/utils/streaming.js.map +1 -0
  224. package/dist/version.d.ts +3 -0
  225. package/dist/version.d.ts.map +1 -0
  226. package/dist/version.js +3 -0
  227. package/dist/version.js.map +1 -0
  228. package/mcp.json +100 -0
  229. package/package.json +89 -0
@@ -0,0 +1,308 @@
1
+ import { z } from 'zod';
2
+ import path from 'node:path';
3
+ import { searchCode, listFiles } from '../search/fast-search.js';
4
+ import { semanticSearch } from '../search/semantic.js';
5
+ import { detectLanguage } from '../utils/languages.js';
6
+ import { mapSymbols } from '../analyzers/codebase.js';
7
+ import { outputSchemas } from '../schemas/output-schemas.js';
8
+ import { CWD, ROOTS, IS_MULTI_ROOT, safePath } from '../config.js';
9
+ /**
10
+ * Registers search tools for text/regex search, symbol finding, reference lookup, and semantic search.
11
+ * @param server - The MCP server instance to register tools on.
12
+ */
13
+ export function registerSearchTools(server) {
14
+ // ═══════════════════════════════════════════════════════════════════════
15
+ // TOOL 1: search_code — Fast text/regex search across the codebase
16
+ // ═══════════════════════════════════════════════════════════════════════
17
+ server.registerTool('search_code', {
18
+ description: 'Fast text or regex search across the entire codebase. Uses ripgrep for speed. Returns file paths, line numbers, and matched content. Works with any programming language.',
19
+ inputSchema: {
20
+ pattern: z.string().describe('Search pattern (text or regex)'),
21
+ is_regex: z.boolean().optional().describe('Treat pattern as regex (default: false)'),
22
+ file_glob: z.string().optional().describe('Filter by file pattern, e.g. "*.py", "*.ts", "*.java"'),
23
+ case_sensitive: z.boolean().optional().describe('Case-sensitive search (default: false)'),
24
+ whole_word: z.boolean().optional().describe('Match whole words only (default: false)'),
25
+ max_results: z.number().optional().describe('Maximum results to return (default: 50)'),
26
+ context_lines: z.number().optional().describe('Lines of context before/after each match (default: 0)'),
27
+ directory: z.string().optional().describe('Subdirectory to search within'),
28
+ },
29
+ outputSchema: outputSchemas.search_code,
30
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
31
+ }, async (params) => {
32
+ try {
33
+ const searchCwd = params.directory ? safePath(params.directory) : CWD;
34
+ // In multi-root mode without a specific directory, search all roots
35
+ const cwdsToSearch = !params.directory && IS_MULTI_ROOT ? ROOTS : [searchCwd];
36
+ const allResults = [];
37
+ for (const cwd of cwdsToSearch) {
38
+ const results = await searchCode({
39
+ cwd,
40
+ pattern: params.pattern,
41
+ isRegex: params.is_regex,
42
+ fileGlob: params.file_glob,
43
+ caseSensitive: params.case_sensitive,
44
+ wholeWord: params.whole_word,
45
+ maxResults: params.max_results || 50,
46
+ contextLines: params.context_lines,
47
+ });
48
+ allResults.push(...results.map((r) => (IS_MULTI_ROOT ? { ...r, file: path.join(path.basename(cwd), r.file) } : r)));
49
+ }
50
+ if (allResults.length === 0) {
51
+ return {
52
+ content: [
53
+ {
54
+ type: 'text',
55
+ text: `No matches found for "${params.pattern}". Try broadening the search: use a shorter pattern, remove file_glob filter, or set case_sensitive=false.`,
56
+ },
57
+ ],
58
+ structuredContent: { matches: [], total: 0 },
59
+ };
60
+ }
61
+ const output = allResults
62
+ .slice(0, params.max_results || 50)
63
+ .map((r) => `${r.file}:${r.line}${r.column !== undefined ? ':' + r.column : ''} │ ${r.text}`)
64
+ .join('\n');
65
+ return {
66
+ content: [
67
+ {
68
+ type: 'text',
69
+ text: `Found ${allResults.length} matches${IS_MULTI_ROOT ? ` across ${cwdsToSearch.length} roots` : ''}:\n\n${output}`,
70
+ },
71
+ ],
72
+ structuredContent: {
73
+ matches: allResults
74
+ .slice(0, params.max_results || 50)
75
+ .map((r) => ({ file: r.file, line: r.line, column: r.column, text: r.text })),
76
+ total: allResults.length,
77
+ },
78
+ };
79
+ }
80
+ catch (error) {
81
+ return {
82
+ content: [
83
+ {
84
+ type: 'text',
85
+ text: `search_code failed: ${error.message}. Verify the directory exists and the pattern is valid. For regex, ensure proper escaping.`,
86
+ },
87
+ ],
88
+ isError: true,
89
+ };
90
+ }
91
+ });
92
+ // ═══════════════════════════════════════════════════════════════════════
93
+ // TOOL 2: search_symbols — Find functions, classes, types across codebase
94
+ // ═══════════════════════════════════════════════════════════════════════
95
+ server.registerTool('search_symbols', {
96
+ description: 'Find functions, classes, interfaces, types, and constants across the codebase. Supports 40+ languages. Returns symbol name, kind, file, and line number.',
97
+ inputSchema: {
98
+ name: z.string().optional().describe('Symbol name to search for (partial match)'),
99
+ kind: z
100
+ .enum(['function', 'class', 'interface', 'type', 'constant', 'export', 'all'])
101
+ .optional()
102
+ .describe('Type of symbol to find (default: all)'),
103
+ language: z.string().optional().describe('Filter by language, e.g. "python", "typescript", "java"'),
104
+ directory: z.string().optional().describe('Subdirectory to search within'),
105
+ max_files: z.number().optional().describe('Max files to scan (default: 200, increase for large codebases)'),
106
+ },
107
+ outputSchema: outputSchemas.search_symbols,
108
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
109
+ }, async (params) => {
110
+ try {
111
+ const symbolDir = params.directory ? safePath(params.directory) : undefined;
112
+ // Optimization: mapSymbols already filters by directory and language
113
+ const symbolMap = await mapSymbols(CWD, {
114
+ maxFiles: params.max_files || 200,
115
+ language: params.language,
116
+ directory: symbolDir ? path.relative(CWD, symbolDir) : undefined,
117
+ });
118
+ let allSymbols = symbolMap.flatMap(({ file, symbols }) => symbols.map((s) => ({ ...s, file })));
119
+ // Filter by name
120
+ if (params.name) {
121
+ const lower = params.name.toLowerCase();
122
+ allSymbols = allSymbols.filter((s) => s.name.toLowerCase().includes(lower));
123
+ }
124
+ // Filter by kind
125
+ if (params.kind && params.kind !== 'all') {
126
+ allSymbols = allSymbols.filter((s) => s.kind === params.kind);
127
+ }
128
+ if (allSymbols.length === 0) {
129
+ return {
130
+ content: [{ type: 'text', text: 'No symbols found matching criteria.' }],
131
+ structuredContent: { symbols: [], total: 0 },
132
+ };
133
+ }
134
+ // Group by kind for display
135
+ const grouped = {};
136
+ for (const s of allSymbols) {
137
+ if (!grouped[s.kind])
138
+ grouped[s.kind] = [];
139
+ grouped[s.kind].push(s);
140
+ }
141
+ const output = Object.entries(grouped)
142
+ .map(([kind, syms]) => {
143
+ const header = `### ${kind}s (${syms.length})`;
144
+ const list = syms
145
+ .slice(0, 100)
146
+ .map((s) => ` ${s.name.padEnd(35)} ${s.file}:${s.line} [${s.language}]`)
147
+ .join('\n');
148
+ return `${header}\n${list}`;
149
+ })
150
+ .join('\n\n');
151
+ return {
152
+ content: [
153
+ {
154
+ type: 'text',
155
+ text: `Found ${allSymbols.length} symbols:\n\n${output}`,
156
+ },
157
+ ],
158
+ structuredContent: {
159
+ symbols: allSymbols.slice(0, 200).map((s) => ({ name: s.name, type: s.kind, file: s.file, line: s.line })),
160
+ total: allSymbols.length,
161
+ },
162
+ };
163
+ }
164
+ catch (error) {
165
+ return {
166
+ content: [
167
+ {
168
+ type: 'text',
169
+ text: `search_symbols failed: ${error.message}. Try increasing max_files for large codebases, or narrow with language/directory filters.`,
170
+ },
171
+ ],
172
+ isError: true,
173
+ };
174
+ }
175
+ });
176
+ // ═══════════════════════════════════════════════════════════════════════
177
+ // TOOL 3: find_references — Find all references to a symbol
178
+ // ═══════════════════════════════════════════════════════════════════════
179
+ server.registerTool('find_references', {
180
+ description: 'Find all references to a symbol (function, class, variable) across the codebase. Shows every file and line where the symbol is used.',
181
+ inputSchema: {
182
+ symbol: z.string().describe('Symbol name to find references for'),
183
+ file_glob: z.string().optional().describe('Filter by file pattern, e.g. "*.py"'),
184
+ whole_word: z.boolean().optional().describe('Match whole word only (default: true)'),
185
+ context_lines: z.number().optional().describe('Lines of context around each reference (default: 1)'),
186
+ },
187
+ outputSchema: outputSchemas.find_references,
188
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
189
+ }, async (params) => {
190
+ try {
191
+ const results = await searchCode({
192
+ cwd: CWD,
193
+ pattern: params.symbol,
194
+ wholeWord: params.whole_word !== false,
195
+ fileGlob: params.file_glob,
196
+ contextLines: params.context_lines || 1,
197
+ maxResults: 100,
198
+ });
199
+ if (results.length === 0) {
200
+ return {
201
+ content: [{ type: 'text', text: `No references found for "${params.symbol}"` }],
202
+ structuredContent: { symbol: params.symbol, references: [], total: 0 },
203
+ };
204
+ }
205
+ // Group by file
206
+ const byFile = {};
207
+ for (const r of results) {
208
+ if (!byFile[r.file])
209
+ byFile[r.file] = [];
210
+ byFile[r.file].push(r);
211
+ }
212
+ const output = Object.entries(byFile)
213
+ .map(([file, refs]) => {
214
+ const lines = refs.map((r) => ` L${r.line}: ${r.text}`).join('\n');
215
+ return `📄 ${file} (${refs.length} references)\n${lines}`;
216
+ })
217
+ .join('\n\n');
218
+ return {
219
+ content: [
220
+ {
221
+ type: 'text',
222
+ text: `Found ${results.length} references to "${params.symbol}" in ${Object.keys(byFile).length} files:\n\n${output}`,
223
+ },
224
+ ],
225
+ structuredContent: {
226
+ symbol: params.symbol,
227
+ references: results.map((r) => ({ file: r.file, line: r.line, context: r.text })),
228
+ total: results.length,
229
+ },
230
+ };
231
+ }
232
+ catch (error) {
233
+ return {
234
+ content: [
235
+ {
236
+ type: 'text',
237
+ text: `find_references failed: ${error.message}. Verify the symbol name is correct. Try search_code with a broader pattern.`,
238
+ },
239
+ ],
240
+ isError: true,
241
+ };
242
+ }
243
+ });
244
+ // ═══════════════════════════════════════════════════════════════════════
245
+ // TOOL 4: semantic_search — Concept-based code search
246
+ // ═══════════════════════════════════════════════════════════════════════
247
+ server.registerTool('semantic_search', {
248
+ description: 'Search code by concept, not just text. Finds "authentication logic" or "error handling code" without needing exact strings. Uses TF-IDF with synonym expansion.',
249
+ inputSchema: {
250
+ query: z
251
+ .string()
252
+ .describe('Natural language query, e.g. "authentication flow" or "database connection handling"'),
253
+ file_glob: z.string().optional().describe('Filter by file pattern, e.g. "*.py"'),
254
+ max_results: z.number().optional().describe('Max results (default: 15)'),
255
+ },
256
+ outputSchema: outputSchemas.semantic_search,
257
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
258
+ }, async (params) => {
259
+ try {
260
+ let files = await listFiles(CWD, { type: 'file' });
261
+ // Filter by language (exclude unknown)
262
+ files = files.filter((f) => detectLanguage(f) !== 'unknown');
263
+ if (params.file_glob) {
264
+ const pattern = new RegExp(params.file_glob.replace(/\*/g, '.*').replace(/\?/g, '.'));
265
+ files = files.filter((f) => pattern.test(f));
266
+ }
267
+ const results = await semanticSearch(files, params.query, CWD, params.max_results || 15);
268
+ if (results.length === 0) {
269
+ return {
270
+ content: [
271
+ {
272
+ type: 'text',
273
+ text: `No semantic matches for "${params.query}". Try broader terms or use search_code for exact text search.`,
274
+ },
275
+ ],
276
+ structuredContent: { matches: [], total: 0 },
277
+ };
278
+ }
279
+ const output = results
280
+ .map((r, i) => `${i + 1}. ${r.file}:${r.startLine}-${r.endLine} (score: ${r.score.toFixed(2)}, terms: ${r.matchedTerms.join(', ')})\n${r.snippet
281
+ .split('\n')
282
+ .map((l) => ' ' + l)
283
+ .join('\n')}`)
284
+ .join('\n\n');
285
+ return {
286
+ content: [
287
+ { type: 'text', text: `Semantic search: "${params.query}" — ${results.length} results\n\n${output}` },
288
+ ],
289
+ structuredContent: {
290
+ matches: results.map((r) => ({ file: r.file, score: r.score, snippet: r.snippet })),
291
+ total: results.length,
292
+ },
293
+ };
294
+ }
295
+ catch (error) {
296
+ return {
297
+ content: [
298
+ {
299
+ type: 'text',
300
+ text: `semantic_search failed: ${error.message}. Try search_code for exact text matching.`,
301
+ },
302
+ ],
303
+ isError: true,
304
+ };
305
+ }
306
+ });
307
+ }
308
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ /**
3
+ * Registers security tools for vulnerability scanning and dependency vulnerability detection.
4
+ * @param server - The MCP server instance to register tools on.
5
+ */
6
+ export declare function registerSecurityTools(server: McpServer): void;
7
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/tools/security.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,QA4ItD"}
@@ -0,0 +1,138 @@
1
+ import { z } from 'zod';
2
+ import { outputSchemas } from '../schemas/output-schemas.js';
3
+ import { CWD } from '../config.js';
4
+ import { securityScan } from '../analyzers/security.js';
5
+ import { scanDependencyVulns } from '../analyzers/dep-vuln.js';
6
+ import { analytics } from '../utils/analytics.js';
7
+ /**
8
+ * Registers security tools for vulnerability scanning and dependency vulnerability detection.
9
+ * @param server - The MCP server instance to register tools on.
10
+ */
11
+ export function registerSecurityTools(server) {
12
+ // ═══════════════════════════════════════════════════════════════════════
13
+ // TOOL: security_scan — Security vulnerability detection
14
+ // ═══════════════════════════════════════════════════════════════════════
15
+ server.registerTool('security_scan', {
16
+ description: 'Scan codebase for security issues: hardcoded secrets, SQL injection, XSS, insecure crypto, eval usage, path traversal, and more. SAST-lite with no external dependencies.',
17
+ inputSchema: {
18
+ category: z
19
+ .string()
20
+ .optional()
21
+ .describe('Filter by category: injection, xss, secrets, crypto, config, auth, redirect, error-handling'),
22
+ severity: z.string().optional().describe('Filter by severity: critical, high, medium, low'),
23
+ file_glob: z.string().optional().describe('Filter by file pattern'),
24
+ },
25
+ outputSchema: outputSchemas.security_scan,
26
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
27
+ }, async (params) => {
28
+ try {
29
+ const report = await securityScan(CWD, {
30
+ category: params.category,
31
+ severity: params.severity,
32
+ fileGlob: params.file_glob,
33
+ });
34
+ let output = `## Security Scan Report\n\n`;
35
+ output += `Total findings: ${report.totalFindings}\n`;
36
+ output += `Severity breakdown: ${Object.entries(report.bySeverity)
37
+ .map(([k, v]) => `${k}: ${v}`)
38
+ .join(', ') || 'none'}\n`;
39
+ if (report.dependencyInfo) {
40
+ output += `\nDependencies: ${report.dependencyInfo.directDeps} direct, ${report.dependencyInfo.total} total`;
41
+ output += report.dependencyInfo.lockfileFound ? ' (lockfile ✅)' : ' (⚠️ no lockfile found)';
42
+ output += '\n';
43
+ }
44
+ if (report.findings.length > 0) {
45
+ output += '\n### Findings:\n\n';
46
+ output += report.findings
47
+ .slice(0, 50)
48
+ .map((f) => {
49
+ const icon = f.severity === 'critical' ? '🔴' : f.severity === 'high' ? '🟠' : f.severity === 'medium' ? '🟡' : '🔵';
50
+ let line = `${icon} [${f.severity.toUpperCase()}] ${f.message}\n`;
51
+ line += ` ${f.file}${f.line ? `:${f.line}` : ''}\n`;
52
+ if (f.snippet)
53
+ line += ` ${f.snippet}\n`;
54
+ line += ` 💡 ${f.recommendation}\n`;
55
+ return line;
56
+ })
57
+ .join('\n');
58
+ }
59
+ return {
60
+ content: [{ type: 'text', text: output }],
61
+ structuredContent: {
62
+ issues: report.findings.map((f) => ({
63
+ file: f.file,
64
+ line: f.line,
65
+ category: f.category,
66
+ severity: f.severity,
67
+ message: f.message,
68
+ recommendation: f.recommendation,
69
+ })),
70
+ total: report.totalFindings,
71
+ severity: report.bySeverity,
72
+ },
73
+ };
74
+ }
75
+ catch (error) {
76
+ return {
77
+ content: [
78
+ {
79
+ type: 'text',
80
+ text: `security_scan failed: ${error.message}. Verify the project directory is accessible.`,
81
+ },
82
+ ],
83
+ isError: true,
84
+ };
85
+ }
86
+ });
87
+ // ═══════════════════════════════════════════════════════════════════════
88
+ // TOOL: dep_vuln_scan — Dependency vulnerability scanning
89
+ // ═══════════════════════════════════════════════════════════════════════
90
+ server.registerTool('dep_vuln_scan', {
91
+ description: 'Scan dependencies for known vulnerabilities. Cross-references package lock files (npm, Cargo, pip, Go) against a database of known-vulnerable packages. Reports severity, CVEs, and recommended upgrades.',
92
+ outputSchema: outputSchemas.dep_vuln_scan,
93
+ annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
94
+ }, async () => {
95
+ try {
96
+ return await analytics.track('dep_vuln_scan', async () => {
97
+ const result = await scanDependencyVulns(CWD);
98
+ const lines = [`## Dependency Vulnerability Scan\n`];
99
+ lines.push(`Dependencies scanned: ${result.totalDeps}`);
100
+ lines.push(`Ecosystems: ${result.ecosystems.join(', ') || 'none detected'}`);
101
+ lines.push(`Lock files: ${result.lockFiles.join(', ') || 'none found'}`);
102
+ const s = result.summary;
103
+ lines.push(`Findings: ${s.critical} critical, ${s.high} high, ${s.medium} medium, ${s.low} low\n`);
104
+ if (result.vulnerabilities.length === 0) {
105
+ lines.push('✅ No known vulnerabilities detected in your dependencies!');
106
+ }
107
+ else {
108
+ for (const v of result.vulnerabilities) {
109
+ const icon = v.severity === 'critical' ? '🔴' : v.severity === 'high' ? '🟠' : v.severity === 'medium' ? '🟡' : '🔵';
110
+ lines.push(`${icon} [${v.severity.toUpperCase()}] ${v.name} @${v.version} — ${v.reason}`);
111
+ if (v.recommendation)
112
+ lines.push(` ↳ ${v.recommendation}`);
113
+ }
114
+ }
115
+ return {
116
+ content: [{ type: 'text', text: lines.join('\n') }],
117
+ structuredContent: {
118
+ vulnerabilities: (result.vulnerabilities || []).map((v) => ({
119
+ package: v.name,
120
+ severity: v.severity,
121
+ description: v.reason,
122
+ })),
123
+ totalDeps: result.totalDeps || 0,
124
+ outdatedCount: result.outdatedCount || 0,
125
+ summary: result.summary || {},
126
+ },
127
+ };
128
+ });
129
+ }
130
+ catch (error) {
131
+ return {
132
+ content: [{ type: 'text', text: `dep_vuln_scan failed: ${error.message}` }],
133
+ isError: true,
134
+ };
135
+ }
136
+ });
137
+ }
138
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/tools/security.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Tool Usage Analytics
3
+ * Tracks which tools are called most, response times, cache hit rates.
4
+ * Exposed via server://stats resource.
5
+ */
6
+ export interface ToolCall {
7
+ tool: string;
8
+ timestamp: number;
9
+ durationMs: number;
10
+ success: boolean;
11
+ cached: boolean;
12
+ }
13
+ export interface ToolStats {
14
+ tool: string;
15
+ callCount: number;
16
+ avgDurationMs: number;
17
+ maxDurationMs: number;
18
+ errorCount: number;
19
+ cacheHits: number;
20
+ lastCalled?: string;
21
+ }
22
+ export interface AnalyticsReport {
23
+ uptime: string;
24
+ totalCalls: number;
25
+ totalErrors: number;
26
+ avgResponseMs: number;
27
+ cacheHitRate: string;
28
+ toolStats: ToolStats[];
29
+ recentCalls: {
30
+ tool: string;
31
+ durationMs: number;
32
+ timestamp: string;
33
+ }[];
34
+ }
35
+ declare class Analytics {
36
+ private calls;
37
+ private startTime;
38
+ /** Keep last 5000 calls */
39
+ private maxHistory;
40
+ /**
41
+ * Record a tool call.
42
+ * @param tool - Tool name.
43
+ * @param durationMs - Duration in milliseconds.
44
+ * @param success - Whether the call succeeded.
45
+ * @param cached - Whether the result was from cache.
46
+ */
47
+ record(tool: string, durationMs: number, success: boolean, cached?: boolean): void;
48
+ /**
49
+ * Wrap an async tool handler with timing and recording.
50
+ * @param tool - Tool name.
51
+ * @param fn - The async function to wrap.
52
+ * @param cached - Whether the result is from cache.
53
+ * @returns The result of the wrapped function.
54
+ */
55
+ track<T>(tool: string, fn: () => Promise<T>, cached?: boolean): Promise<T>;
56
+ /**
57
+ * Get full analytics report.
58
+ * @returns The analytics report with uptime, totals, and per-tool stats.
59
+ */
60
+ getReport(): AnalyticsReport;
61
+ /**
62
+ * Get suggested actions based on analytics and codebase state.
63
+ * @returns A list of suggested actions.
64
+ */
65
+ getSuggestedActions(): string[];
66
+ }
67
+ export declare const analytics: Analytics;
68
+ export {};
69
+ //# sourceMappingURL=analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../src/utils/analytics.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,SAAS,EAAE,CAAC;IACvB,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACxE;AAED,cAAM,SAAS;IACb,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,SAAS,CAAc;IAC/B,2BAA2B;IAC3B,OAAO,CAAC,UAAU,CAAQ;IAE1B;;;;;;OAMG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAE,OAAe;IAqBlF;;;;;;OAMG;IACG,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,GAAE,OAAe,GAAG,OAAO,CAAC,CAAC,CAAC;IAYvF;;;OAGG;IACH,SAAS,IAAI,eAAe;IAoD5B;;;OAGG;IACH,mBAAmB,IAAI,MAAM,EAAE;CAqChC;AAGD,eAAO,MAAM,SAAS,WAAkB,CAAC"}