@structured-world/gitlab-mcp 4.1.1 → 4.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.
- package/README.md +44 -28
- package/dist/config.d.ts +0 -2
- package/dist/config.js +1 -3
- package/dist/config.js.map +1 -1
- package/dist/entities/core/registry.js +34 -16
- package/dist/entities/core/registry.js.map +1 -1
- package/dist/entities/core/schema-readonly.d.ts +3 -0
- package/dist/entities/core/schema-readonly.js +3 -0
- package/dist/entities/core/schema-readonly.js.map +1 -1
- package/dist/server.js +86 -13
- package/dist/server.js.map +1 -1
- package/dist/structured-world-gitlab-mcp-4.2.0.tgz +0 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -1
- package/dist/utils/smart-user-search.d.ts +33 -0
- package/dist/utils/smart-user-search.js +146 -0
- package/dist/utils/smart-user-search.js.map +1 -0
- package/package.json +2 -1
- package/dist/structured-world-gitlab-mcp-4.1.1.tgz +0 -0
package/dist/types.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ declare const TransportModeObj: {
|
|
|
2
2
|
readonly STDIO: "stdio";
|
|
3
3
|
readonly SSE: "sse";
|
|
4
4
|
readonly STREAMABLE_HTTP: "streamable-http";
|
|
5
|
+
readonly DUAL: "dual";
|
|
5
6
|
};
|
|
6
7
|
export { TransportModeObj as TransportMode };
|
|
7
8
|
export type TransportMode = (typeof TransportModeObj)[keyof typeof TransportModeObj];
|
package/dist/types.js
CHANGED
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AACA,MAAM,gBAAgB,GAAG;IACvB,KAAK,EAAE,OAAO;IACd,GAAG,EAAE,KAAK;IACV,eAAe,EAAE,iBAAiB;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AACA,MAAM,gBAAgB,GAAG;IACvB,KAAK,EAAE,OAAO;IACd,GAAG,EAAE,KAAK;IACV,eAAe,EAAE,iBAAiB;IAClC,IAAI,EAAE,MAAM;CACJ,CAAC;AAEkB,yCAAa"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type QueryType = 'email' | 'username' | 'name';
|
|
2
|
+
export interface QueryPattern {
|
|
3
|
+
type: QueryType;
|
|
4
|
+
hasTransliteration: boolean;
|
|
5
|
+
originalQuery: string;
|
|
6
|
+
transliteratedQuery?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface UserSearchParams {
|
|
9
|
+
username?: string;
|
|
10
|
+
public_email?: string;
|
|
11
|
+
search?: string;
|
|
12
|
+
active?: boolean;
|
|
13
|
+
humans?: boolean;
|
|
14
|
+
without_project_bots?: boolean;
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
}
|
|
17
|
+
export interface SmartSearchResult {
|
|
18
|
+
users: unknown[];
|
|
19
|
+
searchMetadata: {
|
|
20
|
+
query: string;
|
|
21
|
+
pattern: QueryPattern;
|
|
22
|
+
searchPhases: Array<{
|
|
23
|
+
phase: string;
|
|
24
|
+
params: UserSearchParams;
|
|
25
|
+
resultCount: number;
|
|
26
|
+
}>;
|
|
27
|
+
totalApiCalls: number;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export declare function transliterateText(text: string): string;
|
|
31
|
+
export declare function hasNonLatin(text: string): boolean;
|
|
32
|
+
export declare function analyzeQuery(query: string): QueryPattern;
|
|
33
|
+
export declare function smartUserSearch(query: string, additionalParams?: Partial<UserSearchParams>): Promise<SmartSearchResult>;
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.transliterateText = transliterateText;
|
|
4
|
+
exports.hasNonLatin = hasNonLatin;
|
|
5
|
+
exports.analyzeQuery = analyzeQuery;
|
|
6
|
+
exports.smartUserSearch = smartUserSearch;
|
|
7
|
+
const fetch_1 = require("./fetch");
|
|
8
|
+
const transliteration_1 = require("transliteration");
|
|
9
|
+
function transliterateText(text) {
|
|
10
|
+
return (0, transliteration_1.transliterate)(text);
|
|
11
|
+
}
|
|
12
|
+
function hasNonLatin(text) {
|
|
13
|
+
return /[^\u0000-\u007F\u0080-\u00FF]/.test(text);
|
|
14
|
+
}
|
|
15
|
+
function analyzeQuery(query) {
|
|
16
|
+
const trimmedQuery = query.trim();
|
|
17
|
+
if (/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(trimmedQuery)) {
|
|
18
|
+
return {
|
|
19
|
+
type: 'email',
|
|
20
|
+
hasTransliteration: false,
|
|
21
|
+
originalQuery: trimmedQuery,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
if (trimmedQuery.length >= 3 && trimmedQuery.length <= 30 && !/\s/.test(trimmedQuery)) {
|
|
25
|
+
const hasTransliterationNeeded = hasNonLatin(trimmedQuery);
|
|
26
|
+
return {
|
|
27
|
+
type: 'username',
|
|
28
|
+
hasTransliteration: hasTransliterationNeeded,
|
|
29
|
+
originalQuery: trimmedQuery,
|
|
30
|
+
transliteratedQuery: hasTransliterationNeeded ? transliterateText(trimmedQuery) : undefined,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const hasTransliterationNeeded = hasNonLatin(trimmedQuery);
|
|
34
|
+
return {
|
|
35
|
+
type: 'name',
|
|
36
|
+
hasTransliteration: hasTransliterationNeeded,
|
|
37
|
+
originalQuery: trimmedQuery,
|
|
38
|
+
transliteratedQuery: hasTransliterationNeeded ? transliterateText(trimmedQuery) : undefined,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
async function callUsersAPI(params) {
|
|
42
|
+
const queryParams = new URLSearchParams();
|
|
43
|
+
const defaultParams = {
|
|
44
|
+
active: true,
|
|
45
|
+
humans: true,
|
|
46
|
+
...params,
|
|
47
|
+
};
|
|
48
|
+
Object.entries(defaultParams).forEach(([key, value]) => {
|
|
49
|
+
if (value !== undefined) {
|
|
50
|
+
queryParams.set(key, String(value));
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
const apiUrl = `${process.env.GITLAB_API_URL}/api/v4/users?${queryParams}`;
|
|
54
|
+
const response = await (0, fetch_1.enhancedFetch)(apiUrl, {
|
|
55
|
+
headers: {
|
|
56
|
+
Authorization: `Bearer ${process.env.GITLAB_TOKEN}`,
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
if (!response.ok) {
|
|
60
|
+
throw new Error(`GitLab API error: ${response.status} ${response.statusText}`);
|
|
61
|
+
}
|
|
62
|
+
const users = (await response.json());
|
|
63
|
+
return Array.isArray(users) ? users : [];
|
|
64
|
+
}
|
|
65
|
+
async function smartUserSearch(query, additionalParams = {}) {
|
|
66
|
+
const pattern = analyzeQuery(query);
|
|
67
|
+
const searchPhases = [];
|
|
68
|
+
let users = [];
|
|
69
|
+
let totalApiCalls = 0;
|
|
70
|
+
let targetParams;
|
|
71
|
+
switch (pattern.type) {
|
|
72
|
+
case 'email':
|
|
73
|
+
targetParams = { public_email: pattern.originalQuery, ...additionalParams };
|
|
74
|
+
break;
|
|
75
|
+
case 'username':
|
|
76
|
+
targetParams = { username: pattern.originalQuery, ...additionalParams };
|
|
77
|
+
break;
|
|
78
|
+
case 'name':
|
|
79
|
+
targetParams = { search: pattern.originalQuery, ...additionalParams };
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
users = await callUsersAPI(targetParams);
|
|
84
|
+
totalApiCalls++;
|
|
85
|
+
searchPhases.push({
|
|
86
|
+
phase: `targeted-${pattern.type}`,
|
|
87
|
+
params: targetParams,
|
|
88
|
+
resultCount: users.length,
|
|
89
|
+
});
|
|
90
|
+
if (users.length > 0) {
|
|
91
|
+
return {
|
|
92
|
+
users,
|
|
93
|
+
searchMetadata: {
|
|
94
|
+
query,
|
|
95
|
+
pattern,
|
|
96
|
+
searchPhases,
|
|
97
|
+
totalApiCalls,
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
if (pattern.type !== 'name') {
|
|
102
|
+
const broadParams = { search: pattern.originalQuery, ...additionalParams };
|
|
103
|
+
users = await callUsersAPI(broadParams);
|
|
104
|
+
totalApiCalls++;
|
|
105
|
+
searchPhases.push({
|
|
106
|
+
phase: 'broad-search',
|
|
107
|
+
params: broadParams,
|
|
108
|
+
resultCount: users.length,
|
|
109
|
+
});
|
|
110
|
+
if (users.length > 0) {
|
|
111
|
+
return {
|
|
112
|
+
users,
|
|
113
|
+
searchMetadata: {
|
|
114
|
+
query,
|
|
115
|
+
pattern,
|
|
116
|
+
searchPhases,
|
|
117
|
+
totalApiCalls,
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (pattern.hasTransliteration && pattern.transliteratedQuery) {
|
|
123
|
+
const translitParams = { search: pattern.transliteratedQuery, ...additionalParams };
|
|
124
|
+
users = await callUsersAPI(translitParams);
|
|
125
|
+
totalApiCalls++;
|
|
126
|
+
searchPhases.push({
|
|
127
|
+
phase: 'transliteration',
|
|
128
|
+
params: translitParams,
|
|
129
|
+
resultCount: users.length,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
console.error('Smart user search error:', error);
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
users,
|
|
138
|
+
searchMetadata: {
|
|
139
|
+
query,
|
|
140
|
+
pattern,
|
|
141
|
+
searchPhases,
|
|
142
|
+
totalApiCalls,
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=smart-user-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smart-user-search.js","sourceRoot":"","sources":["../../src/utils/smart-user-search.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@structured-world/gitlab-mcp",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.2.0",
|
|
4
4
|
"description": "MCP server for using the GitLab API",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Dmitry Prudnikov <mail@polaz.com>",
|
|
@@ -62,6 +62,7 @@
|
|
|
62
62
|
"pino": "^9.9.5",
|
|
63
63
|
"pino-pretty": "^13.1.1",
|
|
64
64
|
"socks-proxy-agent": "^8.0.5",
|
|
65
|
+
"transliteration": "^2.3.5",
|
|
65
66
|
"zod": "^3.23.8",
|
|
66
67
|
"zod-to-json-schema": "^3.24.6"
|
|
67
68
|
},
|
|
Binary file
|