search-code
Search code across repositories using specific queries and file patterns, returning relevant results for efficient code analysis and discovery.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| filePattern | No | Optional file pattern to limit search (e.g., '*.ts') | |
| maxResults | No | Maximum number of results to return | |
| query | Yes | Search query to find code in the repository |
Implementation Reference
- src/features/dev-tools/index.ts:45-103 (handler)Handler function for the 'search-code' tool. Executes grep command on the 'src/' directory to search for the query string, optionally filters by file pattern, limits results with maxResults, parses the output into structured matches (file, lineNum, content), and returns a formatted JSON response using createSuccessResponse or error response.async ({ query, filePattern, maxResults }) => { try { const searchPattern = filePattern ? `--include="${filePattern}"` : ""; const command = `grep -n ${searchPattern} -r "${query}" src --color=never | head -n ${maxResults}`; let results; try { results = execSync(command, { encoding: "utf-8" }); } catch (error) { // grep returns non-zero exit code when no results found results = ""; } const matches = results .split("\n") .filter((line) => line.trim().length > 0) .map((line) => { const [file, lineNum, ...contentParts] = line.split(":"); const content = contentParts.join(":").trim(); return { file, lineNum: parseInt(lineNum, 10), content }; }); const result = createSuccessResponse( { query, filePattern: filePattern || "all files", resultsCount: matches.length, matches, }, "search-code" ); return { content: [ { type: "text", text: JSON.stringify(result, null, 2), }, ], }; } catch (error) { return { content: [ { type: "text", text: JSON.stringify( createErrorResponse( error instanceof Error ? error.message : String(error), "search-code" ), null, 2 ), }, ], isError: true, }; } }
- Zod input schema for the 'search-code' tool defining parameters: query (required string), filePattern (optional string), maxResults (number with default 10).query: z.string().describe("Search query to find code in the repository"), filePattern: z .string() .optional() .describe("Optional file pattern to limit search (e.g., '*.ts')"), maxResults: z .number() .default(10) .describe("Maximum number of results to return"), },
- src/features/dev-tools/index.ts:32-104 (registration)Registration of the 'search-code' tool on the MCP server instance using server.tool(), including inline schema and handler function. Part of the registerDevTools function.server.tool( "search-code", { query: z.string().describe("Search query to find code in the repository"), filePattern: z .string() .optional() .describe("Optional file pattern to limit search (e.g., '*.ts')"), maxResults: z .number() .default(10) .describe("Maximum number of results to return"), }, async ({ query, filePattern, maxResults }) => { try { const searchPattern = filePattern ? `--include="${filePattern}"` : ""; const command = `grep -n ${searchPattern} -r "${query}" src --color=never | head -n ${maxResults}`; let results; try { results = execSync(command, { encoding: "utf-8" }); } catch (error) { // grep returns non-zero exit code when no results found results = ""; } const matches = results .split("\n") .filter((line) => line.trim().length > 0) .map((line) => { const [file, lineNum, ...contentParts] = line.split(":"); const content = contentParts.join(":").trim(); return { file, lineNum: parseInt(lineNum, 10), content }; }); const result = createSuccessResponse( { query, filePattern: filePattern || "all files", resultsCount: matches.length, matches, }, "search-code" ); return { content: [ { type: "text", text: JSON.stringify(result, null, 2), }, ], }; } catch (error) { return { content: [ { type: "text", text: JSON.stringify( createErrorResponse( error instanceof Error ? error.message : String(error), "search-code" ), null, 2 ), }, ], isError: true, }; } } );