@veracity/codeguardian-mcp 0.2.3 → 0.2.4

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/dist/index.js CHANGED
@@ -5,7 +5,7 @@ import { createAuthenticator } from "./auth.js";
5
5
  import { configureAllTools } from "./tools.js";
6
6
  import { configurePrompts } from "./prompts.js";
7
7
  import { configureResources } from "./resources.js";
8
- const packageVersion = "0.2.3";
8
+ const packageVersion = "0.2.4";
9
9
  try {
10
10
  const server = new McpServer({
11
11
  name: "CodeGuardian MCP Server",
@@ -0,0 +1,2 @@
1
+ export declare function configureSearchTools(server: any, tokenProvider: () => Promise<string>): void;
2
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"AAmEA,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,QA0FrF"}
@@ -0,0 +1,117 @@
1
+ import { z } from "zod";
2
+ import { VersionControlRecursionType } from "azure-devops-node-api/interfaces/GitInterfaces.js";
3
+ import { getAzureDevOpsConnection } from '../utils.js';
4
+ const apiVersion = "7.1";
5
+ /**
6
+ * Fetches full file content for each search result by calling the Git API.
7
+ * The Code Search API only returns metadata; this enriches results with the
8
+ * actual file content at the matched commit so callers can read the code.
9
+ */
10
+ async function fetchCombinedResults(topSearchResults, gitApi) {
11
+ const combinedResults = [];
12
+ for (const searchResult of topSearchResults) {
13
+ try {
14
+ const projectId = searchResult.project?.id;
15
+ const repositoryId = searchResult.repository?.id;
16
+ const filePath = searchResult.path;
17
+ const changeId = Array.isArray(searchResult.versions) && searchResult.versions.length > 0
18
+ ? searchResult.versions[0].changeId
19
+ : undefined;
20
+ if (!projectId || !repositoryId || !filePath || !changeId) {
21
+ combinedResults.push({
22
+ error: `Missing projectId, repositoryId, filePath, or changeId in the result: ${JSON.stringify(searchResult)}`,
23
+ });
24
+ continue;
25
+ }
26
+ const versionDescriptor = changeId ? { version: changeId, versionType: 2, versionOptions: 0 } : undefined;
27
+ const item = await gitApi.getItem(repositoryId, filePath, projectId, undefined, VersionControlRecursionType.None, true, // includeContentMetadata
28
+ false, // latestProcessedChange
29
+ false, // download
30
+ versionDescriptor, true, // includeContent
31
+ true, // resolveLfs
32
+ true // sanitize
33
+ );
34
+ combinedResults.push({
35
+ gitItem: item,
36
+ });
37
+ }
38
+ catch (err) {
39
+ combinedResults.push({
40
+ error: err instanceof Error ? err.message : String(err),
41
+ });
42
+ }
43
+ }
44
+ return combinedResults;
45
+ }
46
+ export function configureSearchTools(server, tokenProvider) {
47
+ server.tool("search_code", "Search Azure DevOps Repositories for a given search text. Returns matching files along with their content fetched from the repository at the matched commit.", {
48
+ organization: z.string().describe("Azure DevOps organization name (e.g., 'myorg')"),
49
+ searchText: z.string().describe("Keywords to search for in code repositories"),
50
+ project: z
51
+ .union([z.string().transform((value) => [value]), z.array(z.string())])
52
+ .describe("The project(s) to search within. Accepts a single project name or an array of project names. Required to scope the search for PR review."),
53
+ repository: z.array(z.string()).describe("The repository(ies) to search within. Required to scope the search for PR review."),
54
+ path: z.array(z.string()).optional().describe("Filter by paths"),
55
+ branch: z.array(z.string()).describe("The branch(es) to search within. Required to scope the search for PR review."),
56
+ includeFacets: z.boolean().default(false).describe("Include facets in the search results"),
57
+ skip: z.coerce.number().default(0).describe("Number of results to skip"),
58
+ top: z.coerce.number().default(5).describe("Maximum number of results to return"),
59
+ }, async (args) => {
60
+ try {
61
+ const { organization, searchText, project, repository, path, branch, includeFacets, skip, top } = args;
62
+ if (!organization || !searchText || !project || project.length === 0 || !repository || repository.length === 0 || !branch || branch.length === 0) {
63
+ throw new Error('Missing required parameters. Please provide organization, searchText, project, repository, and branch.');
64
+ }
65
+ const accessToken = await tokenProvider();
66
+ const connection = await getAzureDevOpsConnection(organization, tokenProvider);
67
+ const url = `https://almsearch.dev.azure.com/${organization}/_apis/search/codesearchresults?api-version=${apiVersion}`;
68
+ const requestBody = {
69
+ searchText,
70
+ includeFacets,
71
+ $skip: skip,
72
+ $top: top,
73
+ };
74
+ const filters = {};
75
+ if (project && project.length > 0)
76
+ filters.Project = project;
77
+ if (repository && repository.length > 0)
78
+ filters.Repository = repository;
79
+ if (path && path.length > 0)
80
+ filters.Path = path;
81
+ if (branch && branch.length > 0)
82
+ filters.Branch = branch;
83
+ if (Object.keys(filters).length > 0) {
84
+ requestBody.filters = filters;
85
+ }
86
+ const response = await fetch(url, {
87
+ method: "POST",
88
+ headers: {
89
+ "Content-Type": "application/json",
90
+ "Authorization": `Bearer ${accessToken}`,
91
+ },
92
+ body: JSON.stringify(requestBody),
93
+ });
94
+ if (!response.ok) {
95
+ throw new Error(`Azure DevOps Code Search API error: ${response.status} ${response.statusText}`);
96
+ }
97
+ const resultText = await response.text();
98
+ const resultJson = JSON.parse(resultText);
99
+ const gitApi = await connection.getGitApi();
100
+ const combinedResults = await fetchCombinedResults(resultJson.results ?? [], gitApi);
101
+ return {
102
+ content: [{ type: "text", text: resultText + JSON.stringify(combinedResults) }],
103
+ };
104
+ }
105
+ catch (error) {
106
+ const errorMessage = error instanceof Error ? error.message : String(error);
107
+ return {
108
+ content: [{
109
+ type: "text",
110
+ text: `Error searching code: ${errorMessage}`
111
+ }],
112
+ isError: true,
113
+ };
114
+ }
115
+ });
116
+ }
117
+ //# 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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAM/F"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAS/F"}
package/dist/tools.js CHANGED
@@ -1,9 +1,12 @@
1
1
  import { configureAdoTools } from "./tools/ado.js";
2
2
  import { configureAssaTools } from "./tools/assa.js";
3
+ import { configureSearchTools } from "./tools/search.js";
3
4
  export function configureAllTools(server, tokenProvider) {
4
5
  // Configure Azure DevOps tools
5
6
  configureAdoTools(server, tokenProvider);
6
7
  // Configure ASSA tools
7
8
  configureAssaTools(server, tokenProvider);
9
+ // Configure search tools
10
+ configureSearchTools(server, tokenProvider);
8
11
  }
9
12
  //# sourceMappingURL=tools.js.map
package/dist/tools.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,aAAoC;IACvF,+BAA+B;IAC/B,iBAAiB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAEzC,uBAAuB;IACvB,kBAAkB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,aAAoC;IACvF,+BAA+B;IAC/B,iBAAiB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAEzC,uBAAuB;IACvB,kBAAkB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAE1C,yBAAyB;IACzB,oBAAoB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AAC9C,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@veracity/codeguardian-mcp",
3
- "version": "0.2.3",
3
+ "version": "0.2.4",
4
4
  "description": "A Model Context Protocol (MCP) server for CodeGuardian",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",