efficient-gitlab-mcp-server 2.4.0 → 2.5.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 (2) hide show
  1. package/dist/index.js +32 -23
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -54123,6 +54123,27 @@ function registerIssueTools(server, logger2) {
54123
54123
  return tools;
54124
54124
  }
54125
54125
  // src/tools/merge-requests.ts
54126
+ var MAX_PATTERN_LENGTH = 200;
54127
+ var NESTED_QUANTIFIER_RE = /(\+|\*|\{)\s*(\+|\*|\{)/;
54128
+ function safeCompilePatterns(patterns) {
54129
+ return patterns.map((p) => {
54130
+ if (p.length > MAX_PATTERN_LENGTH || NESTED_QUANTIFIER_RE.test(p))
54131
+ return null;
54132
+ try {
54133
+ return new RegExp(p);
54134
+ } catch {
54135
+ return null;
54136
+ }
54137
+ }).filter((re) => re !== null);
54138
+ }
54139
+ function filterDiffsByPatterns(diffs, patterns) {
54140
+ if (!patterns?.length)
54141
+ return diffs;
54142
+ const regexes = safeCompilePatterns(patterns);
54143
+ if (regexes.length === 0)
54144
+ return diffs;
54145
+ return diffs.filter((d) => !regexes.some((re) => re.test(d.new_path) || (d.old_path ? re.test(d.old_path) : false)));
54146
+ }
54126
54147
  var GetMergeRequestSchema = exports_external.object({
54127
54148
  project_id: exports_external.string().describe("Project ID or URL-encoded path"),
54128
54149
  merge_request_iid: exports_external.number().optional().describe("Merge request IID"),
@@ -54177,7 +54198,8 @@ var GetMergeRequestDiffsSchema = exports_external.object({
54177
54198
  project_id: exports_external.string().describe("Project ID or URL-encoded path"),
54178
54199
  merge_request_iid: exports_external.number().describe("Merge request IID"),
54179
54200
  page: exports_external.number().optional().describe("Page number"),
54180
- per_page: exports_external.number().optional().describe("Results per page")
54201
+ per_page: exports_external.number().optional().describe("Results per page"),
54202
+ excluded_file_patterns: exports_external.array(exports_external.string()).optional().describe('Array of regex patterns to exclude files. Examples: ["^vendor/", "\\.pb\\.go$"]')
54181
54203
  });
54182
54204
  var ListMergeRequestDiscussionsSchema = exports_external.object({
54183
54205
  project_id: exports_external.string().describe("Project ID or URL-encoded path"),
@@ -54465,20 +54487,24 @@ function registerMergeRequestTools(server, logger2) {
54465
54487
  tools.set("merge_merge_request", toolRef5);
54466
54488
  const toolRef6 = server.registerTool("get_merge_request_diffs", {
54467
54489
  title: "Get Merge Request Diffs",
54468
- description: "Get the changes/diffs of a merge request",
54490
+ description: "Get the changes/diffs of a merge request. Supports excluded_file_patterns filtering using regex.",
54469
54491
  inputSchema: {
54470
54492
  project_id: exports_external.string().describe("Project ID or URL-encoded path"),
54471
54493
  merge_request_iid: exports_external.number().describe("Merge request IID"),
54472
54494
  page: exports_external.number().optional().describe("Page number"),
54473
- per_page: exports_external.number().optional().describe("Results per page")
54495
+ per_page: exports_external.number().optional().describe("Results per page"),
54496
+ excluded_file_patterns: exports_external.array(exports_external.string()).optional().describe('Array of regex patterns to exclude files. Examples: ["^vendor/", "\\.pb\\.go$"]')
54474
54497
  },
54475
54498
  annotations: { readOnlyHint: true }
54476
54499
  }, async (params) => {
54477
54500
  const args = GetMergeRequestDiffsSchema.parse(params);
54478
54501
  const projectId = encodeProjectId(args.project_id);
54479
54502
  const query = buildQueryString({ page: args.page, per_page: args.per_page });
54480
- const diffs = await defaultClient.get(`/projects/${projectId}/merge_requests/${args.merge_request_iid}/changes${query}`);
54481
- return { content: [{ type: "text", text: JSON.stringify(diffs, null, 2) }] };
54503
+ const mr = await defaultClient.get(`/projects/${projectId}/merge_requests/${args.merge_request_iid}/changes${query}`);
54504
+ const changes = filterDiffsByPatterns(mr.changes ?? [], args.excluded_file_patterns);
54505
+ return {
54506
+ content: [{ type: "text", text: JSON.stringify({ ...mr, changes }, null, 2) }]
54507
+ };
54482
54508
  });
54483
54509
  toolRef6.disable();
54484
54510
  tools.set("get_merge_request_diffs", toolRef6);
@@ -54708,24 +54734,7 @@ function registerMergeRequestTools(server, logger2) {
54708
54734
  renamed_file: c.renamed_file,
54709
54735
  deleted_file: c.deleted_file
54710
54736
  }));
54711
- if (args.excluded_file_patterns && args.excluded_file_patterns.length > 0) {
54712
- const patterns = [];
54713
- for (const p of args.excluded_file_patterns) {
54714
- try {
54715
- patterns.push(new RegExp(p));
54716
- } catch {
54717
- return {
54718
- content: [
54719
- {
54720
- type: "text",
54721
- text: JSON.stringify({ error: `Invalid regex pattern: ${p}` }, null, 2)
54722
- }
54723
- ]
54724
- };
54725
- }
54726
- }
54727
- files = files.filter((f) => !patterns.some((re) => re.test(f.new_path) || re.test(f.old_path)));
54728
- }
54737
+ files = filterDiffsByPatterns(files, args.excluded_file_patterns);
54729
54738
  return { content: [{ type: "text", text: JSON.stringify(files, null, 2) }] };
54730
54739
  });
54731
54740
  toolRef18.disable();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "efficient-gitlab-mcp-server",
3
- "version": "2.4.0",
3
+ "version": "2.5.0",
4
4
  "mcpName": "io.github.detailobsessed/efficient-gitlab",
5
5
  "description": "Production-ready GitLab MCP Server with progressive disclosure pattern",
6
6
  "license": "MIT",