mcp4openapi 0.1.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 (209) hide show
  1. package/LICENSE.md +7 -0
  2. package/README.md +489 -0
  3. package/dist/composite-executor.d.ts +65 -0
  4. package/dist/composite-executor.d.ts.map +1 -0
  5. package/dist/composite-executor.js +147 -0
  6. package/dist/composite-executor.js.map +1 -0
  7. package/dist/constants.d.ts +36 -0
  8. package/dist/constants.d.ts.map +1 -0
  9. package/dist/constants.js +36 -0
  10. package/dist/constants.js.map +1 -0
  11. package/dist/http-transport.d.ts +195 -0
  12. package/dist/http-transport.d.ts.map +1 -0
  13. package/dist/http-transport.js +760 -0
  14. package/dist/http-transport.js.map +1 -0
  15. package/dist/interceptors.d.ts +74 -0
  16. package/dist/interceptors.d.ts.map +1 -0
  17. package/dist/interceptors.js +220 -0
  18. package/dist/interceptors.js.map +1 -0
  19. package/dist/logger.d.ts +81 -0
  20. package/dist/logger.d.ts.map +1 -0
  21. package/dist/logger.js +264 -0
  22. package/dist/logger.js.map +1 -0
  23. package/dist/mcp-server.d.ts +110 -0
  24. package/dist/mcp-server.d.ts.map +1 -0
  25. package/dist/mcp-server.js +568 -0
  26. package/dist/mcp-server.js.map +1 -0
  27. package/dist/metrics.d.ts +86 -0
  28. package/dist/metrics.d.ts.map +1 -0
  29. package/dist/metrics.js +229 -0
  30. package/dist/metrics.js.map +1 -0
  31. package/dist/openapi-parser.d.ts +35 -0
  32. package/dist/openapi-parser.d.ts.map +1 -0
  33. package/dist/openapi-parser.js +160 -0
  34. package/dist/openapi-parser.js.map +1 -0
  35. package/dist/profile-loader.d.ts +25 -0
  36. package/dist/profile-loader.d.ts.map +1 -0
  37. package/dist/profile-loader.js +134 -0
  38. package/dist/profile-loader.js.map +1 -0
  39. package/dist/schema-validator.d.ts +32 -0
  40. package/dist/schema-validator.d.ts.map +1 -0
  41. package/dist/schema-validator.js +126 -0
  42. package/dist/schema-validator.js.map +1 -0
  43. package/dist/scripts/validate-profile.d.ts +9 -0
  44. package/dist/scripts/validate-profile.d.ts.map +1 -0
  45. package/dist/scripts/validate-profile.js +289 -0
  46. package/dist/scripts/validate-profile.js.map +1 -0
  47. package/dist/scripts/validate-schema.d.ts +9 -0
  48. package/dist/scripts/validate-schema.d.ts.map +1 -0
  49. package/dist/scripts/validate-schema.js +84 -0
  50. package/dist/scripts/validate-schema.js.map +1 -0
  51. package/dist/src/composite-executor.d.ts +75 -0
  52. package/dist/src/composite-executor.d.ts.map +1 -0
  53. package/dist/src/composite-executor.js +175 -0
  54. package/dist/src/composite-executor.js.map +1 -0
  55. package/dist/src/constants.d.ts +36 -0
  56. package/dist/src/constants.d.ts.map +1 -0
  57. package/dist/src/constants.js +36 -0
  58. package/dist/src/constants.js.map +1 -0
  59. package/dist/src/dag-executor.d.ts +49 -0
  60. package/dist/src/dag-executor.d.ts.map +1 -0
  61. package/dist/src/dag-executor.js +138 -0
  62. package/dist/src/dag-executor.js.map +1 -0
  63. package/dist/src/errors.d.ts +47 -0
  64. package/dist/src/errors.d.ts.map +1 -0
  65. package/dist/src/errors.js +99 -0
  66. package/dist/src/errors.js.map +1 -0
  67. package/dist/src/generated-schemas.d.ts +661 -0
  68. package/dist/src/generated-schemas.d.ts.map +1 -0
  69. package/dist/src/generated-schemas.js +66 -0
  70. package/dist/src/generated-schemas.js.map +1 -0
  71. package/dist/src/http-client-factory.d.ts +62 -0
  72. package/dist/src/http-client-factory.d.ts.map +1 -0
  73. package/dist/src/http-client-factory.js +121 -0
  74. package/dist/src/http-client-factory.js.map +1 -0
  75. package/dist/src/http-transport.d.ts +194 -0
  76. package/dist/src/http-transport.d.ts.map +1 -0
  77. package/dist/src/http-transport.js +851 -0
  78. package/dist/src/http-transport.js.map +1 -0
  79. package/dist/src/index.d.ts +8 -0
  80. package/dist/src/index.d.ts.map +1 -0
  81. package/dist/src/index.js +59 -0
  82. package/dist/src/index.js.map +1 -0
  83. package/dist/src/interceptors.d.ts +78 -0
  84. package/dist/src/interceptors.d.ts.map +1 -0
  85. package/dist/src/interceptors.js +252 -0
  86. package/dist/src/interceptors.js.map +1 -0
  87. package/dist/src/jsonrpc-validator.d.ts +27 -0
  88. package/dist/src/jsonrpc-validator.d.ts.map +1 -0
  89. package/dist/src/jsonrpc-validator.js +58 -0
  90. package/dist/src/jsonrpc-validator.js.map +1 -0
  91. package/dist/src/lib.d.ts +8 -0
  92. package/dist/src/lib.d.ts.map +1 -0
  93. package/dist/src/lib.js +7 -0
  94. package/dist/src/lib.js.map +1 -0
  95. package/dist/src/logger.d.ts +81 -0
  96. package/dist/src/logger.d.ts.map +1 -0
  97. package/dist/src/logger.js +264 -0
  98. package/dist/src/logger.js.map +1 -0
  99. package/dist/src/mcp-server.d.ts +117 -0
  100. package/dist/src/mcp-server.d.ts.map +1 -0
  101. package/dist/src/mcp-server.js +621 -0
  102. package/dist/src/mcp-server.js.map +1 -0
  103. package/dist/src/metrics.d.ts +86 -0
  104. package/dist/src/metrics.d.ts.map +1 -0
  105. package/dist/src/metrics.js +229 -0
  106. package/dist/src/metrics.js.map +1 -0
  107. package/dist/src/naming-warnings.d.ts +23 -0
  108. package/dist/src/naming-warnings.d.ts.map +1 -0
  109. package/dist/src/naming-warnings.js +83 -0
  110. package/dist/src/naming-warnings.js.map +1 -0
  111. package/dist/src/naming.d.ts +58 -0
  112. package/dist/src/naming.d.ts.map +1 -0
  113. package/dist/src/naming.js +510 -0
  114. package/dist/src/naming.js.map +1 -0
  115. package/dist/src/openapi-parser.d.ts +49 -0
  116. package/dist/src/openapi-parser.d.ts.map +1 -0
  117. package/dist/src/openapi-parser.js +216 -0
  118. package/dist/src/openapi-parser.js.map +1 -0
  119. package/dist/src/profile-loader.d.ts +77 -0
  120. package/dist/src/profile-loader.d.ts.map +1 -0
  121. package/dist/src/profile-loader.js +443 -0
  122. package/dist/src/profile-loader.js.map +1 -0
  123. package/dist/src/schema-validator.d.ts +30 -0
  124. package/dist/src/schema-validator.d.ts.map +1 -0
  125. package/dist/src/schema-validator.js +115 -0
  126. package/dist/src/schema-validator.js.map +1 -0
  127. package/dist/src/testing/fixtures.d.ts +268 -0
  128. package/dist/src/testing/fixtures.d.ts.map +1 -0
  129. package/dist/src/testing/fixtures.js +210 -0
  130. package/dist/src/testing/fixtures.js.map +1 -0
  131. package/dist/src/testing/mock-gitlab-server.d.ts +34 -0
  132. package/dist/src/testing/mock-gitlab-server.d.ts.map +1 -0
  133. package/dist/src/testing/mock-gitlab-server.js +351 -0
  134. package/dist/src/testing/mock-gitlab-server.js.map +1 -0
  135. package/dist/src/testing/mock-utils.d.ts +41 -0
  136. package/dist/src/testing/mock-utils.d.ts.map +1 -0
  137. package/dist/src/testing/mock-utils.js +59 -0
  138. package/dist/src/testing/mock-utils.js.map +1 -0
  139. package/dist/src/testing/test-http-utils.d.ts +52 -0
  140. package/dist/src/testing/test-http-utils.d.ts.map +1 -0
  141. package/dist/src/testing/test-http-utils.js +109 -0
  142. package/dist/src/testing/test-http-utils.js.map +1 -0
  143. package/dist/src/testing/test-types.d.ts +76 -0
  144. package/dist/src/testing/test-types.d.ts.map +1 -0
  145. package/dist/src/testing/test-types.js +7 -0
  146. package/dist/src/testing/test-types.js.map +1 -0
  147. package/dist/src/tool-generator.d.ts +43 -0
  148. package/dist/src/tool-generator.d.ts.map +1 -0
  149. package/dist/src/tool-generator.js +123 -0
  150. package/dist/src/tool-generator.js.map +1 -0
  151. package/dist/src/types/http-transport.d.ts +45 -0
  152. package/dist/src/types/http-transport.d.ts.map +1 -0
  153. package/dist/src/types/http-transport.js +8 -0
  154. package/dist/src/types/http-transport.js.map +1 -0
  155. package/dist/src/types/openapi.d.ts +50 -0
  156. package/dist/src/types/openapi.d.ts.map +1 -0
  157. package/dist/src/types/openapi.js +9 -0
  158. package/dist/src/types/openapi.js.map +1 -0
  159. package/dist/src/types/profile.d.ts +80 -0
  160. package/dist/src/types/profile.d.ts.map +1 -0
  161. package/dist/src/types/profile.js +9 -0
  162. package/dist/src/types/profile.js.map +1 -0
  163. package/dist/src/validation-utils.d.ts +15 -0
  164. package/dist/src/validation-utils.d.ts.map +1 -0
  165. package/dist/src/validation-utils.js +25 -0
  166. package/dist/src/validation-utils.js.map +1 -0
  167. package/dist/testing/fixtures.d.ts +186 -0
  168. package/dist/testing/fixtures.d.ts.map +1 -0
  169. package/dist/testing/fixtures.js +135 -0
  170. package/dist/testing/fixtures.js.map +1 -0
  171. package/dist/testing/http-integration.test.d.ts +7 -0
  172. package/dist/testing/http-integration.test.d.ts.map +1 -0
  173. package/dist/testing/http-integration.test.js +383 -0
  174. package/dist/testing/http-integration.test.js.map +1 -0
  175. package/dist/testing/http-multiuser.test.d.ts +10 -0
  176. package/dist/testing/http-multiuser.test.d.ts.map +1 -0
  177. package/dist/testing/http-multiuser.test.js +255 -0
  178. package/dist/testing/http-multiuser.test.js.map +1 -0
  179. package/dist/testing/integration.test.d.ts +8 -0
  180. package/dist/testing/integration.test.d.ts.map +1 -0
  181. package/dist/testing/integration.test.js +247 -0
  182. package/dist/testing/integration.test.js.map +1 -0
  183. package/dist/testing/mock-gitlab-server.d.ts +34 -0
  184. package/dist/testing/mock-gitlab-server.d.ts.map +1 -0
  185. package/dist/testing/mock-gitlab-server.js +224 -0
  186. package/dist/testing/mock-gitlab-server.js.map +1 -0
  187. package/dist/testing/test-types.d.ts +59 -0
  188. package/dist/testing/test-types.d.ts.map +1 -0
  189. package/dist/testing/test-types.js +7 -0
  190. package/dist/testing/test-types.js.map +1 -0
  191. package/dist/tool-generator.d.ts +43 -0
  192. package/dist/tool-generator.d.ts.map +1 -0
  193. package/dist/tool-generator.js +123 -0
  194. package/dist/tool-generator.js.map +1 -0
  195. package/dist/tsconfig.tsbuildinfo +1 -0
  196. package/dist/types/http-transport.d.ts +39 -0
  197. package/dist/types/http-transport.d.ts.map +1 -0
  198. package/dist/types/http-transport.js +8 -0
  199. package/dist/types/http-transport.js.map +1 -0
  200. package/dist/types/openapi.d.ts +50 -0
  201. package/dist/types/openapi.d.ts.map +1 -0
  202. package/dist/types/openapi.js +9 -0
  203. package/dist/types/openapi.js.map +1 -0
  204. package/dist/types/profile.d.ts +76 -0
  205. package/dist/types/profile.d.ts.map +1 -0
  206. package/dist/types/profile.js +9 -0
  207. package/dist/types/profile.js.map +1 -0
  208. package/package.json +84 -0
  209. package/profile-schema.json +369 -0
@@ -0,0 +1,510 @@
1
+ /**
2
+ * Tool name shortening strategies
3
+ *
4
+ * Why: MCP tool names combined with server name must stay under limits.
5
+ * Different strategies offer trade-offs between readability and compactness.
6
+ */
7
+ export var NamingStrategy;
8
+ (function (NamingStrategy) {
9
+ NamingStrategy["None"] = "none";
10
+ NamingStrategy["Balanced"] = "balanced";
11
+ NamingStrategy["Iterative"] = "iterative";
12
+ NamingStrategy["Hash"] = "hash";
13
+ NamingStrategy["Auto"] = "auto";
14
+ })(NamingStrategy || (NamingStrategy = {}));
15
+ /**
16
+ * Shorten tool name using specified strategy
17
+ */
18
+ export function shortenToolName(op, strategy, maxLength, allOperations, options) {
19
+ const originalLength = op.operationId.length;
20
+ if (strategy === NamingStrategy.None) {
21
+ return {
22
+ name: op.operationId,
23
+ truncated: false,
24
+ strategy,
25
+ originalLength,
26
+ };
27
+ }
28
+ const opts = {
29
+ maxLength,
30
+ minParts: options?.minParts ?? 3,
31
+ minLength: options?.minLength ?? 20,
32
+ allOperations: allOperations || [op],
33
+ };
34
+ let result;
35
+ switch (strategy) {
36
+ case NamingStrategy.Balanced:
37
+ result = shortenWithBalanced(op, opts);
38
+ break;
39
+ case NamingStrategy.Iterative:
40
+ result = shortenWithIterative(op, opts);
41
+ break;
42
+ case NamingStrategy.Hash:
43
+ result = shortenWithHash(op, opts);
44
+ break;
45
+ case NamingStrategy.Auto:
46
+ // Try strategies in order: balanced → iterative → hash
47
+ result = shortenWithBalanced(op, opts);
48
+ if (result.name.length > maxLength) {
49
+ result = shortenWithIterative(op, opts);
50
+ }
51
+ if (result.name.length > maxLength) {
52
+ result = shortenWithHash(op, opts);
53
+ }
54
+ result.strategy = NamingStrategy.Auto;
55
+ break;
56
+ default:
57
+ result = {
58
+ name: op.operationId,
59
+ truncated: false,
60
+ strategy,
61
+ originalLength,
62
+ };
63
+ }
64
+ return result;
65
+ }
66
+ /**
67
+ * Split camelCase/snake_case into parts
68
+ */
69
+ function splitCamelCase(str) {
70
+ return str
71
+ .replace(/([a-z])([A-Z])/g, '$1_$2')
72
+ .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')
73
+ .split(/[_\-\/]/)
74
+ .filter(Boolean);
75
+ }
76
+ /**
77
+ * Sanitize name to valid identifier
78
+ */
79
+ function sanitizeName(name) {
80
+ return name
81
+ .toLowerCase()
82
+ .replace(/[^a-z0-9_]/g, '_')
83
+ .replace(/_+/g, '_')
84
+ .replace(/^_|_$/g, '');
85
+ }
86
+ /**
87
+ * Analyze part frequency across all operations
88
+ */
89
+ function analyzeFrequency(operations) {
90
+ const partCounts = new Map();
91
+ operations.forEach(op => {
92
+ const parts = splitCamelCase(op.operationId);
93
+ const uniqueParts = new Set(parts.map(p => p.toLowerCase()));
94
+ uniqueParts.forEach(part => {
95
+ partCounts.set(part, (partCounts.get(part) || 0) + 1);
96
+ });
97
+ });
98
+ return partCounts;
99
+ }
100
+ /**
101
+ * Check if candidate is unique across all operations
102
+ */
103
+ function isUniqueCandidate(candidate, candidateName, op, allOps) {
104
+ return !allOps.some(other => {
105
+ if (other.operationId === op.operationId)
106
+ return false;
107
+ const otherParts = splitCamelCase(other.operationId);
108
+ const otherCandidate = candidate
109
+ .filter(c => c.index < otherParts.length)
110
+ .map(c => otherParts[c.index])
111
+ .filter(Boolean);
112
+ const otherCandidateName = sanitizeName(otherCandidate.join('_'));
113
+ return candidateName === otherCandidateName;
114
+ });
115
+ }
116
+ /**
117
+ * Extract path parameters from path
118
+ */
119
+ function extractPathParams(path) {
120
+ return (path.match(/\{([^}]+)\}/g) || [])
121
+ .map(p => p.slice(1, -1).replace(/[^a-z0-9]/gi, '').toLowerCase());
122
+ }
123
+ /**
124
+ * Balanced strategy: Add parts by importance until unique, meaningful, and under limit
125
+ */
126
+ function shortenWithBalanced(op, opts) {
127
+ const parts = splitCamelCase(op.operationId);
128
+ const normalized = sanitizeName(parts.join('_'));
129
+ // If already under limit, don't shorten
130
+ if (normalized.length <= opts.maxLength) {
131
+ return {
132
+ name: normalized,
133
+ truncated: false,
134
+ strategy: NamingStrategy.Balanced,
135
+ originalLength: op.operationId.length,
136
+ partsUsed: parts.length,
137
+ };
138
+ }
139
+ const allOps = opts.allOperations || [op];
140
+ const total = allOps.length;
141
+ const partCounts = analyzeFrequency(allOps);
142
+ const verb = parts[0]?.toLowerCase();
143
+ const knownVerbs = ['get', 'post', 'put', 'delete', 'patch', 'head', 'options'];
144
+ const hasVerb = knownVerbs.includes(verb);
145
+ // Score each part by informativeness
146
+ const partScores = parts.map((part, index) => {
147
+ const lower = part.toLowerCase();
148
+ const count = partCounts.get(lower) || 0;
149
+ const frequency = count / total;
150
+ const rarityScore = 1 - frequency;
151
+ const verbBonus = (index === 0 && hasVerb) ? 2.0 : 0;
152
+ const commonPenalty = frequency > 0.5 ? -0.5 : 0;
153
+ return {
154
+ part,
155
+ index,
156
+ frequency,
157
+ score: rarityScore + verbBonus + commonPenalty,
158
+ };
159
+ });
160
+ const sortedParts = [...partScores].sort((a, b) => b.score - a.score);
161
+ let candidate = [];
162
+ let candidateName = '';
163
+ let bestValidCandidate = null;
164
+ // Add parts iteratively
165
+ for (const scored of sortedParts) {
166
+ candidate.push(scored);
167
+ candidate.sort((a, b) => a.index - b.index);
168
+ candidateName = sanitizeName(candidate.map(c => c.part).join('_'));
169
+ const isUnique = isUniqueCandidate(candidate, candidateName, op, allOps);
170
+ const underLimit = candidateName.length <= opts.maxLength;
171
+ const hasMinParts = candidate.length >= (opts.minParts || 3);
172
+ const hasMinLength = candidateName.length >= (opts.minLength || 20);
173
+ // Check if we've reached optimal
174
+ if (isUnique && underLimit && hasMinParts && hasMinLength) {
175
+ return {
176
+ name: candidateName,
177
+ truncated: true,
178
+ strategy: NamingStrategy.Balanced,
179
+ originalLength: op.operationId.length,
180
+ partsUsed: candidate.length,
181
+ };
182
+ }
183
+ // Track best valid (unique + under limit)
184
+ if (isUnique && underLimit) {
185
+ bestValidCandidate = {
186
+ name: candidateName,
187
+ parts: candidate.length,
188
+ };
189
+ }
190
+ // Stop if over limit or too many parts
191
+ if (candidateName.length > opts.maxLength || candidate.length >= Math.min(8, parts.length * 0.7)) {
192
+ break;
193
+ }
194
+ }
195
+ // Use best valid candidate if found
196
+ if (bestValidCandidate) {
197
+ return {
198
+ name: bestValidCandidate.name,
199
+ truncated: true,
200
+ strategy: NamingStrategy.Balanced,
201
+ originalLength: op.operationId.length,
202
+ partsUsed: bestValidCandidate.parts,
203
+ };
204
+ }
205
+ // Fallback: remove very common parts (≥95%)
206
+ const veryCommon = new Set();
207
+ partCounts.forEach((count, part) => {
208
+ if ((count / total) >= 0.95)
209
+ veryCommon.add(part);
210
+ });
211
+ const filtered = parts.filter((p, i) => {
212
+ if (i === 0 && hasVerb)
213
+ return true;
214
+ return !veryCommon.has(p.toLowerCase());
215
+ });
216
+ candidateName = sanitizeName(filtered.join('_'));
217
+ if (candidateName.length > opts.maxLength) {
218
+ candidateName = candidateName.substring(0, opts.maxLength);
219
+ }
220
+ return {
221
+ name: candidateName,
222
+ truncated: true,
223
+ strategy: NamingStrategy.Balanced,
224
+ originalLength: op.operationId.length,
225
+ partsUsed: filtered.length,
226
+ };
227
+ }
228
+ /**
229
+ * Iterative strategy: Remove parts progressively until under limit
230
+ */
231
+ function shortenWithIterative(op, opts) {
232
+ const originalParts = splitCamelCase(op.operationId);
233
+ let parts = [...originalParts];
234
+ const normalized = sanitizeName(parts.join('_'));
235
+ // If already under limit, don't shorten
236
+ if (normalized.length <= opts.maxLength) {
237
+ return {
238
+ name: normalized,
239
+ truncated: false,
240
+ strategy: NamingStrategy.Iterative,
241
+ originalLength: op.operationId.length,
242
+ partsUsed: parts.length,
243
+ };
244
+ }
245
+ const allOps = opts.allOperations || [op];
246
+ const total = allOps.length;
247
+ const partCounts = analyzeFrequency(allOps);
248
+ const verb = parts[0]?.toLowerCase();
249
+ const knownVerbs = ['get', 'post', 'put', 'delete', 'patch', 'head', 'options'];
250
+ const hasVerb = knownVerbs.includes(verb);
251
+ const pathParams = extractPathParams(op.path);
252
+ const currentLength = () => sanitizeName(parts.join('_')).length;
253
+ // Step 1: Remove very common noise (≥95%)
254
+ if (currentLength() > opts.maxLength) {
255
+ const veryCommon = new Set();
256
+ partCounts.forEach((count, part) => {
257
+ if ((count / total) >= 0.95)
258
+ veryCommon.add(part);
259
+ });
260
+ if (veryCommon.size > 0) {
261
+ parts = parts.filter((p, i) => {
262
+ if (i === 0 && hasVerb)
263
+ return true;
264
+ return !veryCommon.has(p.toLowerCase());
265
+ });
266
+ }
267
+ }
268
+ // Step 2: Remove common noise (≥80%)
269
+ if (currentLength() > opts.maxLength) {
270
+ const common = new Set();
271
+ partCounts.forEach((count, part) => {
272
+ if ((count / total) >= 0.80 && (count / total) < 0.95) {
273
+ common.add(part);
274
+ }
275
+ });
276
+ if (common.size > 0) {
277
+ parts = parts.filter((p, i) => {
278
+ if (i === 0 && hasVerb)
279
+ return true;
280
+ return !common.has(p.toLowerCase());
281
+ });
282
+ }
283
+ }
284
+ // Step 3: Remove path parameter suffixes
285
+ if (currentLength() > opts.maxLength) {
286
+ const paramSuffixes = ['id', 'iid'];
287
+ parts = parts.filter((p, i) => {
288
+ if (i === 0 && hasVerb)
289
+ return true;
290
+ const lower = p.toLowerCase();
291
+ if (paramSuffixes.includes(lower))
292
+ return false;
293
+ const normalized = lower.replace(/id$|iid$/i, '');
294
+ if (pathParams.includes(normalized) || pathParams.includes(lower)) {
295
+ return false;
296
+ }
297
+ return true;
298
+ });
299
+ }
300
+ // Step 4: Remove duplicates
301
+ if (currentLength() > opts.maxLength) {
302
+ const seen = new Set();
303
+ parts = parts.filter((p, i) => {
304
+ if (i === 0 && hasVerb)
305
+ return true;
306
+ const lower = p.toLowerCase();
307
+ if (seen.has(lower))
308
+ return false;
309
+ seen.add(lower);
310
+ return true;
311
+ });
312
+ }
313
+ // Step 5: Remove moderately common (≥50%)
314
+ if (currentLength() > opts.maxLength) {
315
+ const moderate = new Set();
316
+ partCounts.forEach((count, part) => {
317
+ if ((count / total) >= 0.50 && (count / total) < 0.80) {
318
+ moderate.add(part);
319
+ }
320
+ });
321
+ if (moderate.size > 0) {
322
+ parts = parts.filter((p, i) => {
323
+ if (i === 0 && hasVerb)
324
+ return true;
325
+ return !moderate.has(p.toLowerCase());
326
+ });
327
+ }
328
+ }
329
+ // Step 6: Keep only verb + last 2 parts
330
+ if (currentLength() > opts.maxLength) {
331
+ const keepCount = Math.min(3, parts.length);
332
+ if (parts.length > keepCount) {
333
+ const kept = hasVerb
334
+ ? [parts[0], ...parts.slice(-2)]
335
+ : parts.slice(-keepCount);
336
+ parts = kept;
337
+ }
338
+ }
339
+ let result = sanitizeName(parts.join('_'));
340
+ // Last resort: truncate
341
+ if (result.length > opts.maxLength) {
342
+ result = result.substring(0, opts.maxLength);
343
+ }
344
+ return {
345
+ name: result,
346
+ truncated: true,
347
+ strategy: NamingStrategy.Iterative,
348
+ originalLength: op.operationId.length,
349
+ partsUsed: parts.length,
350
+ };
351
+ }
352
+ /**
353
+ * Hash strategy: <verb>_<resource>_<hash4>
354
+ */
355
+ function shortenWithHash(op, opts) {
356
+ const verb = op.method.toLowerCase();
357
+ const resource = extractResourceFromPath(op.path);
358
+ const hash = stableHash(op.operationId, 4);
359
+ let result = `${verb}_${resource}_${hash}`;
360
+ // Ensure under limit
361
+ if (result.length > opts.maxLength) {
362
+ // Try shortening resource
363
+ const shortResource = resource.substring(0, Math.max(3, opts.maxLength - verb.length - hash.length - 2));
364
+ result = `${verb}_${shortResource}_${hash}`;
365
+ // Last resort: truncate
366
+ if (result.length > opts.maxLength) {
367
+ result = result.substring(0, opts.maxLength);
368
+ }
369
+ }
370
+ return {
371
+ name: sanitizeName(result),
372
+ truncated: true,
373
+ strategy: NamingStrategy.Hash,
374
+ originalLength: op.operationId.length,
375
+ };
376
+ }
377
+ /**
378
+ * Extract main resource from path
379
+ */
380
+ function extractResourceFromPath(path) {
381
+ const segments = path.split('/').filter(s => s && !s.startsWith('{'));
382
+ // Find last non-action meaningful segment
383
+ const actionWords = ['protect', 'unprotect', 'merge', 'approve', 'cancel', 'authorize'];
384
+ for (let i = segments.length - 1; i >= 0; i--) {
385
+ const segment = segments[i].toLowerCase();
386
+ if (!['api', 'v1', 'v2', 'v3', 'v4', 'repository'].includes(segment) &&
387
+ !actionWords.includes(segment)) {
388
+ return sanitizeName(segments[i]);
389
+ }
390
+ }
391
+ return sanitizeName(segments[segments.length - 1] || 'resource');
392
+ }
393
+ /**
394
+ * Generate stable short hash from string
395
+ */
396
+ export function stableHash(str, length = 4) {
397
+ let hash = 0;
398
+ for (let i = 0; i < str.length; i++) {
399
+ const char = str.charCodeAt(i);
400
+ hash = ((hash << 5) - hash) + char;
401
+ hash = hash & hash; // Convert to 32-bit integer
402
+ }
403
+ // Convert to base36 and take first N characters
404
+ return Math.abs(hash).toString(36).substring(0, length).padEnd(length, '0');
405
+ }
406
+ /**
407
+ * Calculate Levenshtein distance between two strings
408
+ */
409
+ export function levenshteinDistance(a, b) {
410
+ const matrix = Array(b.length + 1)
411
+ .fill(null)
412
+ .map(() => Array(a.length + 1).fill(null));
413
+ for (let i = 0; i <= a.length; i++)
414
+ matrix[0][i] = i;
415
+ for (let j = 0; j <= b.length; j++)
416
+ matrix[j][0] = j;
417
+ for (let j = 1; j <= b.length; j++) {
418
+ for (let i = 1; i <= a.length; i++) {
419
+ const indicator = a[i - 1] === b[j - 1] ? 0 : 1;
420
+ matrix[j][i] = Math.min(matrix[j][i - 1] + 1, matrix[j - 1][i] + 1, matrix[j - 1][i - 1] + indicator);
421
+ }
422
+ }
423
+ return matrix[b.length][a.length];
424
+ }
425
+ /**
426
+ * Normalize operation name for similarity comparison
427
+ */
428
+ function normalizeForSimilarity(op) {
429
+ return op.operationId
430
+ .toLowerCase()
431
+ .replace(/^(get|post|put|delete|patch)/, '')
432
+ .replace(/^apiv[0-9]/, '')
433
+ .replace(/[^a-z0-9]/g, '');
434
+ }
435
+ /**
436
+ * Pick most similar pairs of operations
437
+ */
438
+ export function pickMostSimilarPairs(operations, topN, threshold = 0.75) {
439
+ if (operations.length < 2) {
440
+ return [];
441
+ }
442
+ const pairs = [];
443
+ const normalized = operations.map(op => normalizeForSimilarity(op));
444
+ // Calculate similarity for all pairs
445
+ for (let i = 0; i < operations.length; i++) {
446
+ for (let j = i + 1; j < operations.length; j++) {
447
+ const distance = levenshteinDistance(normalized[i], normalized[j]);
448
+ const maxLen = Math.max(normalized[i].length, normalized[j].length);
449
+ // Similarity: 1.0 (100%) = identical, 0.0 (0%) = completely different
450
+ const similarity = 1 - (distance / maxLen);
451
+ // Keep pairs with similarity >= threshold (high similarity)
452
+ if (similarity >= threshold) {
453
+ pairs.push({
454
+ opA: operations[i],
455
+ opB: operations[j],
456
+ similarity,
457
+ });
458
+ }
459
+ }
460
+ }
461
+ // Sort by similarity (highest = most similar)
462
+ pairs.sort((a, b) => b.similarity - a.similarity);
463
+ // Pick top N pairs, trying to avoid duplicate operations
464
+ const selected = [];
465
+ const usedOps = new Set();
466
+ for (const pair of pairs) {
467
+ if (selected.length >= topN)
468
+ break;
469
+ const aId = pair.opA.operationId;
470
+ const bId = pair.opB.operationId;
471
+ const isNew = !usedOps.has(aId) && !usedOps.has(bId);
472
+ if (isNew || selected.length < topN) {
473
+ selected.push(pair);
474
+ usedOps.add(aId);
475
+ usedOps.add(bId);
476
+ }
477
+ }
478
+ // If we don't have enough, add pairs even with reused ops
479
+ if (selected.length < topN) {
480
+ for (const pair of pairs) {
481
+ if (selected.length >= topN)
482
+ break;
483
+ if (!selected.includes(pair)) {
484
+ selected.push(pair);
485
+ }
486
+ }
487
+ }
488
+ return selected.slice(0, topN);
489
+ }
490
+ /**
491
+ * Detect potential collisions when shortening multiple operations
492
+ */
493
+ export function detectCollisions(operations, strategy, maxLength, options) {
494
+ const nameMap = new Map();
495
+ for (const op of operations) {
496
+ const result = shortenToolName(op, strategy, maxLength, operations, options);
497
+ const existing = nameMap.get(result.name) || [];
498
+ existing.push(op);
499
+ nameMap.set(result.name, existing);
500
+ }
501
+ // Filter to only collisions
502
+ const collisions = new Map();
503
+ for (const [name, ops] of nameMap.entries()) {
504
+ if (ops.length > 1) {
505
+ collisions.set(name, ops);
506
+ }
507
+ }
508
+ return collisions;
509
+ }
510
+ //# sourceMappingURL=naming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/naming.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * OpenAPI specification parser and indexer
3
+ *
4
+ * Why indexing: Large OpenAPI specs (GitLab has ~200 operations) need fast lookup.
5
+ * Pre-indexing by operationId and path avoids linear search on every tool call.
6
+ */
7
+ import type { OperationInfo, PathInfo } from './types/openapi.js';
8
+ export declare class OpenAPIParser {
9
+ private spec?;
10
+ private index?;
11
+ load(specPath: string): Promise<void>;
12
+ /**
13
+ * Build search index from OpenAPI spec
14
+ *
15
+ * Why upfront: Trading startup time for runtime performance. Index creation
16
+ * happens once; lookups happen on every tool call.
17
+ */
18
+ private buildIndex;
19
+ private extractOperationInfo;
20
+ private extractParameters;
21
+ /**
22
+ * Resolve $ref to parameter definition
23
+ *
24
+ * Why: GitLab spec uses shared parameter definitions (e.g., ProjectIdOrPath).
25
+ * Need to resolve these refs to get actual parameter details.
26
+ */
27
+ private resolveParameter;
28
+ private extractRequestBody;
29
+ private extractSchema;
30
+ getOperation(operationId: string): OperationInfo | undefined;
31
+ getPath(path: string): PathInfo | undefined;
32
+ getBaseUrl(): string;
33
+ getAllOperations(): OperationInfo[];
34
+ /**
35
+ * Get first security scheme from OpenAPI spec
36
+ *
37
+ * Why: When no profile is provided, we need to infer auth configuration from OpenAPI spec.
38
+ * Returns the first security scheme defined in spec.security or components.securitySchemes.
39
+ *
40
+ * Returns undefined if no security is defined (public API).
41
+ */
42
+ getSecurityScheme(): {
43
+ type: string;
44
+ scheme?: string;
45
+ name?: string;
46
+ in?: string;
47
+ } | undefined;
48
+ }
49
+ //# sourceMappingURL=openapi-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openapi-parser.d.ts","sourceRoot":"","sources":["../../src/openapi-parser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAgB,aAAa,EAAiB,QAAQ,EAA+B,MAAM,oBAAoB,CAAC;AAE5H,qBAAa,aAAa;IACxB,OAAO,CAAC,IAAI,CAAC,CAAqB;IAClC,OAAO,CAAC,KAAK,CAAC,CAAe;IAEvB,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa3C;;;;;OAKG;IACH,OAAO,CAAC,UAAU;IAkClB,OAAO,CAAC,oBAAoB;IAiB5B,OAAO,CAAC,iBAAiB;IAqBzB;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAaxB,OAAO,CAAC,kBAAkB;IAoB1B,OAAO,CAAC,aAAa;IA0BrB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAI5D,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAI3C,UAAU,IAAI,MAAM;IAKpB,gBAAgB,IAAI,aAAa,EAAE;IAInC;;;;;;;OAOG;IACH,iBAAiB,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;CAoD/F"}