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.
- package/LICENSE.md +7 -0
- package/README.md +489 -0
- package/dist/composite-executor.d.ts +65 -0
- package/dist/composite-executor.d.ts.map +1 -0
- package/dist/composite-executor.js +147 -0
- package/dist/composite-executor.js.map +1 -0
- package/dist/constants.d.ts +36 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +36 -0
- package/dist/constants.js.map +1 -0
- package/dist/http-transport.d.ts +195 -0
- package/dist/http-transport.d.ts.map +1 -0
- package/dist/http-transport.js +760 -0
- package/dist/http-transport.js.map +1 -0
- package/dist/interceptors.d.ts +74 -0
- package/dist/interceptors.d.ts.map +1 -0
- package/dist/interceptors.js +220 -0
- package/dist/interceptors.js.map +1 -0
- package/dist/logger.d.ts +81 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +264 -0
- package/dist/logger.js.map +1 -0
- package/dist/mcp-server.d.ts +110 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +568 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/metrics.d.ts +86 -0
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +229 -0
- package/dist/metrics.js.map +1 -0
- package/dist/openapi-parser.d.ts +35 -0
- package/dist/openapi-parser.d.ts.map +1 -0
- package/dist/openapi-parser.js +160 -0
- package/dist/openapi-parser.js.map +1 -0
- package/dist/profile-loader.d.ts +25 -0
- package/dist/profile-loader.d.ts.map +1 -0
- package/dist/profile-loader.js +134 -0
- package/dist/profile-loader.js.map +1 -0
- package/dist/schema-validator.d.ts +32 -0
- package/dist/schema-validator.d.ts.map +1 -0
- package/dist/schema-validator.js +126 -0
- package/dist/schema-validator.js.map +1 -0
- package/dist/scripts/validate-profile.d.ts +9 -0
- package/dist/scripts/validate-profile.d.ts.map +1 -0
- package/dist/scripts/validate-profile.js +289 -0
- package/dist/scripts/validate-profile.js.map +1 -0
- package/dist/scripts/validate-schema.d.ts +9 -0
- package/dist/scripts/validate-schema.d.ts.map +1 -0
- package/dist/scripts/validate-schema.js +84 -0
- package/dist/scripts/validate-schema.js.map +1 -0
- package/dist/src/composite-executor.d.ts +75 -0
- package/dist/src/composite-executor.d.ts.map +1 -0
- package/dist/src/composite-executor.js +175 -0
- package/dist/src/composite-executor.js.map +1 -0
- package/dist/src/constants.d.ts +36 -0
- package/dist/src/constants.d.ts.map +1 -0
- package/dist/src/constants.js +36 -0
- package/dist/src/constants.js.map +1 -0
- package/dist/src/dag-executor.d.ts +49 -0
- package/dist/src/dag-executor.d.ts.map +1 -0
- package/dist/src/dag-executor.js +138 -0
- package/dist/src/dag-executor.js.map +1 -0
- package/dist/src/errors.d.ts +47 -0
- package/dist/src/errors.d.ts.map +1 -0
- package/dist/src/errors.js +99 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/generated-schemas.d.ts +661 -0
- package/dist/src/generated-schemas.d.ts.map +1 -0
- package/dist/src/generated-schemas.js +66 -0
- package/dist/src/generated-schemas.js.map +1 -0
- package/dist/src/http-client-factory.d.ts +62 -0
- package/dist/src/http-client-factory.d.ts.map +1 -0
- package/dist/src/http-client-factory.js +121 -0
- package/dist/src/http-client-factory.js.map +1 -0
- package/dist/src/http-transport.d.ts +194 -0
- package/dist/src/http-transport.d.ts.map +1 -0
- package/dist/src/http-transport.js +851 -0
- package/dist/src/http-transport.js.map +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +59 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/interceptors.d.ts +78 -0
- package/dist/src/interceptors.d.ts.map +1 -0
- package/dist/src/interceptors.js +252 -0
- package/dist/src/interceptors.js.map +1 -0
- package/dist/src/jsonrpc-validator.d.ts +27 -0
- package/dist/src/jsonrpc-validator.d.ts.map +1 -0
- package/dist/src/jsonrpc-validator.js +58 -0
- package/dist/src/jsonrpc-validator.js.map +1 -0
- package/dist/src/lib.d.ts +8 -0
- package/dist/src/lib.d.ts.map +1 -0
- package/dist/src/lib.js +7 -0
- package/dist/src/lib.js.map +1 -0
- package/dist/src/logger.d.ts +81 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +264 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/mcp-server.d.ts +117 -0
- package/dist/src/mcp-server.d.ts.map +1 -0
- package/dist/src/mcp-server.js +621 -0
- package/dist/src/mcp-server.js.map +1 -0
- package/dist/src/metrics.d.ts +86 -0
- package/dist/src/metrics.d.ts.map +1 -0
- package/dist/src/metrics.js +229 -0
- package/dist/src/metrics.js.map +1 -0
- package/dist/src/naming-warnings.d.ts +23 -0
- package/dist/src/naming-warnings.d.ts.map +1 -0
- package/dist/src/naming-warnings.js +83 -0
- package/dist/src/naming-warnings.js.map +1 -0
- package/dist/src/naming.d.ts +58 -0
- package/dist/src/naming.d.ts.map +1 -0
- package/dist/src/naming.js +510 -0
- package/dist/src/naming.js.map +1 -0
- package/dist/src/openapi-parser.d.ts +49 -0
- package/dist/src/openapi-parser.d.ts.map +1 -0
- package/dist/src/openapi-parser.js +216 -0
- package/dist/src/openapi-parser.js.map +1 -0
- package/dist/src/profile-loader.d.ts +77 -0
- package/dist/src/profile-loader.d.ts.map +1 -0
- package/dist/src/profile-loader.js +443 -0
- package/dist/src/profile-loader.js.map +1 -0
- package/dist/src/schema-validator.d.ts +30 -0
- package/dist/src/schema-validator.d.ts.map +1 -0
- package/dist/src/schema-validator.js +115 -0
- package/dist/src/schema-validator.js.map +1 -0
- package/dist/src/testing/fixtures.d.ts +268 -0
- package/dist/src/testing/fixtures.d.ts.map +1 -0
- package/dist/src/testing/fixtures.js +210 -0
- package/dist/src/testing/fixtures.js.map +1 -0
- package/dist/src/testing/mock-gitlab-server.d.ts +34 -0
- package/dist/src/testing/mock-gitlab-server.d.ts.map +1 -0
- package/dist/src/testing/mock-gitlab-server.js +351 -0
- package/dist/src/testing/mock-gitlab-server.js.map +1 -0
- package/dist/src/testing/mock-utils.d.ts +41 -0
- package/dist/src/testing/mock-utils.d.ts.map +1 -0
- package/dist/src/testing/mock-utils.js +59 -0
- package/dist/src/testing/mock-utils.js.map +1 -0
- package/dist/src/testing/test-http-utils.d.ts +52 -0
- package/dist/src/testing/test-http-utils.d.ts.map +1 -0
- package/dist/src/testing/test-http-utils.js +109 -0
- package/dist/src/testing/test-http-utils.js.map +1 -0
- package/dist/src/testing/test-types.d.ts +76 -0
- package/dist/src/testing/test-types.d.ts.map +1 -0
- package/dist/src/testing/test-types.js +7 -0
- package/dist/src/testing/test-types.js.map +1 -0
- package/dist/src/tool-generator.d.ts +43 -0
- package/dist/src/tool-generator.d.ts.map +1 -0
- package/dist/src/tool-generator.js +123 -0
- package/dist/src/tool-generator.js.map +1 -0
- package/dist/src/types/http-transport.d.ts +45 -0
- package/dist/src/types/http-transport.d.ts.map +1 -0
- package/dist/src/types/http-transport.js +8 -0
- package/dist/src/types/http-transport.js.map +1 -0
- package/dist/src/types/openapi.d.ts +50 -0
- package/dist/src/types/openapi.d.ts.map +1 -0
- package/dist/src/types/openapi.js +9 -0
- package/dist/src/types/openapi.js.map +1 -0
- package/dist/src/types/profile.d.ts +80 -0
- package/dist/src/types/profile.d.ts.map +1 -0
- package/dist/src/types/profile.js +9 -0
- package/dist/src/types/profile.js.map +1 -0
- package/dist/src/validation-utils.d.ts +15 -0
- package/dist/src/validation-utils.d.ts.map +1 -0
- package/dist/src/validation-utils.js +25 -0
- package/dist/src/validation-utils.js.map +1 -0
- package/dist/testing/fixtures.d.ts +186 -0
- package/dist/testing/fixtures.d.ts.map +1 -0
- package/dist/testing/fixtures.js +135 -0
- package/dist/testing/fixtures.js.map +1 -0
- package/dist/testing/http-integration.test.d.ts +7 -0
- package/dist/testing/http-integration.test.d.ts.map +1 -0
- package/dist/testing/http-integration.test.js +383 -0
- package/dist/testing/http-integration.test.js.map +1 -0
- package/dist/testing/http-multiuser.test.d.ts +10 -0
- package/dist/testing/http-multiuser.test.d.ts.map +1 -0
- package/dist/testing/http-multiuser.test.js +255 -0
- package/dist/testing/http-multiuser.test.js.map +1 -0
- package/dist/testing/integration.test.d.ts +8 -0
- package/dist/testing/integration.test.d.ts.map +1 -0
- package/dist/testing/integration.test.js +247 -0
- package/dist/testing/integration.test.js.map +1 -0
- package/dist/testing/mock-gitlab-server.d.ts +34 -0
- package/dist/testing/mock-gitlab-server.d.ts.map +1 -0
- package/dist/testing/mock-gitlab-server.js +224 -0
- package/dist/testing/mock-gitlab-server.js.map +1 -0
- package/dist/testing/test-types.d.ts +59 -0
- package/dist/testing/test-types.d.ts.map +1 -0
- package/dist/testing/test-types.js +7 -0
- package/dist/testing/test-types.js.map +1 -0
- package/dist/tool-generator.d.ts +43 -0
- package/dist/tool-generator.d.ts.map +1 -0
- package/dist/tool-generator.js +123 -0
- package/dist/tool-generator.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/types/http-transport.d.ts +39 -0
- package/dist/types/http-transport.d.ts.map +1 -0
- package/dist/types/http-transport.js +8 -0
- package/dist/types/http-transport.js.map +1 -0
- package/dist/types/openapi.d.ts +50 -0
- package/dist/types/openapi.d.ts.map +1 -0
- package/dist/types/openapi.js +9 -0
- package/dist/types/openapi.js.map +1 -0
- package/dist/types/profile.d.ts +76 -0
- package/dist/types/profile.d.ts.map +1 -0
- package/dist/types/profile.js +9 -0
- package/dist/types/profile.js.map +1 -0
- package/package.json +84 -0
- 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"}
|