@uluops/registry-mcp 0.1.0 → 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/CHANGELOG.md +131 -4
- package/LICENSE +21 -0
- package/README.md +100 -93
- package/dist/client/sdk-error-mapper.d.ts +29 -0
- package/dist/client/sdk-error-mapper.d.ts.map +1 -1
- package/dist/client/sdk-error-mapper.js +122 -20
- package/dist/client/sdk-error-mapper.js.map +1 -1
- package/dist/config/index.d.ts +7 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +91 -14
- package/dist/config/index.js.map +1 -1
- package/dist/config/tool-registry.d.ts.map +1 -1
- package/dist/config/tool-registry.js +0 -8
- package/dist/config/tool-registry.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -6
- package/dist/index.js.map +1 -1
- package/dist/tools/batch-publish.js +8 -8
- package/dist/tools/batch-publish.js.map +1 -1
- package/dist/tools/index.d.ts +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -4
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/{check-forkable.d.ts → is-forkable.d.ts} +1 -1
- package/dist/tools/is-forkable.d.ts.map +1 -0
- package/dist/tools/{check-forkable.js → is-forkable.js} +1 -1
- package/dist/tools/is-forkable.js.map +1 -0
- package/dist/tools/render-definition.d.ts +3 -0
- package/dist/tools/render-definition.d.ts.map +1 -1
- package/dist/tools/render-definition.js +15 -1
- package/dist/tools/render-definition.js.map +1 -1
- package/dist/tools/update-and-publish.d.ts.map +1 -1
- package/dist/tools/update-and-publish.js +22 -10
- package/dist/tools/update-and-publish.js.map +1 -1
- package/dist/tools/update-definition.d.ts.map +1 -1
- package/dist/tools/update-definition.js +2 -7
- package/dist/tools/update-definition.js.map +1 -1
- package/dist/types/config.d.ts +6 -2
- package/dist/types/config.d.ts.map +1 -1
- package/dist/utils/error-guards.d.ts +21 -0
- package/dist/utils/error-guards.d.ts.map +1 -0
- package/dist/utils/error-guards.js +26 -0
- package/dist/utils/error-guards.js.map +1 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +28 -3
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/read-yaml-file.d.ts.map +1 -1
- package/dist/utils/read-yaml-file.js +16 -1
- package/dist/utils/read-yaml-file.js.map +1 -1
- package/dist/utils/tool-handler.d.ts.map +1 -1
- package/dist/utils/tool-handler.js +20 -8
- package/dist/utils/tool-handler.js.map +1 -1
- package/package.json +21 -20
- package/dist/tools/check-forkable.d.ts.map +0 -1
- package/dist/tools/check-forkable.js.map +0 -1
- package/dist/tools/sync-models.d.ts +0 -12
- package/dist/tools/sync-models.d.ts.map +0 -1
- package/dist/tools/sync-models.js +0 -32
- package/dist/tools/sync-models.js.map +0 -1
|
@@ -23,11 +23,41 @@ function getErrorMessage(error, fallback) {
|
|
|
23
23
|
}
|
|
24
24
|
/** Extract HTTP status code from SDK errors when available */
|
|
25
25
|
function getStatusCode(error) {
|
|
26
|
-
if (error && typeof error === 'object' && 'statusCode' in error) {
|
|
26
|
+
if (error !== null && typeof error === 'object' && 'statusCode' in error) {
|
|
27
27
|
return error.statusCode;
|
|
28
28
|
}
|
|
29
29
|
return undefined;
|
|
30
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Validate that a server-supplied URL is safe to embed in MCP responses.
|
|
33
|
+
*
|
|
34
|
+
* The 402 handler embeds `upgradeUrl` from the API response into MCP text
|
|
35
|
+
* that AI agents read as context. A compromised or attacker-controlled API
|
|
36
|
+
* could emit `javascript:`, `data:`, or untrusted-host URLs as prompt-
|
|
37
|
+
* injection bait. This guard restricts the embedded URL to:
|
|
38
|
+
* - https:// only (no javascript:/data:/file:/http:)
|
|
39
|
+
* - hosts ending in `.uluops.ai` or the apex `uluops.ai`
|
|
40
|
+
*
|
|
41
|
+
* Mirrors the SSRF defense in config/index.ts for symmetry — outgoing
|
|
42
|
+
* payload URLs face the same trust constraints as incoming registry URLs.
|
|
43
|
+
*/
|
|
44
|
+
function isSafeUpgradeUrl(url) {
|
|
45
|
+
let parsed;
|
|
46
|
+
try {
|
|
47
|
+
parsed = new URL(url);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
if (parsed.protocol !== 'https:')
|
|
53
|
+
return false;
|
|
54
|
+
const hostname = parsed.hostname.toLowerCase();
|
|
55
|
+
if (hostname === 'uluops.ai')
|
|
56
|
+
return true;
|
|
57
|
+
if (hostname.endsWith('.uluops.ai'))
|
|
58
|
+
return true;
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
31
61
|
/** Build a structured error response with optional metadata */
|
|
32
62
|
function buildErrorResponse(message, metadata) {
|
|
33
63
|
const payload = { error: message };
|
|
@@ -39,6 +69,65 @@ function buildErrorResponse(message, metadata) {
|
|
|
39
69
|
isError: true,
|
|
40
70
|
};
|
|
41
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Extract the same structured-error fields as `mapSdkErrorToMcp` produces,
|
|
74
|
+
* but without wrapping them in an `McpToolResponse`. Useful inside batch
|
|
75
|
+
* loops where each per-item failure should embed the rich error context
|
|
76
|
+
* (402 upgrade URL, 429 retry-after, 409 nextAvailable) into the parent
|
|
77
|
+
* response rather than producing one MCP error envelope per failure.
|
|
78
|
+
*/
|
|
79
|
+
export function extractErrorContext(error) {
|
|
80
|
+
const status = getStatusCode(error);
|
|
81
|
+
if (status === 402) {
|
|
82
|
+
const details = error.details ?? {};
|
|
83
|
+
const requiredTier = typeof details['requiredTier'] === 'string' ? details['requiredTier'] : undefined;
|
|
84
|
+
const currentTier = typeof details['currentTier'] === 'string' ? details['currentTier'] : undefined;
|
|
85
|
+
const def = (details['definition'] !== null && typeof details['definition'] === 'object')
|
|
86
|
+
? details['definition']
|
|
87
|
+
: undefined;
|
|
88
|
+
const rawUpgradeUrl = typeof details['upgradeUrl'] === 'string' ? details['upgradeUrl'] : undefined;
|
|
89
|
+
// Drop server-supplied URLs that don't pass the protocol/host guard.
|
|
90
|
+
// A compromised or attacker-controlled API could emit javascript:/data:
|
|
91
|
+
// or off-domain URLs as prompt-injection bait for the consuming agent.
|
|
92
|
+
const safeUpgradeUrl = rawUpgradeUrl !== undefined && isSafeUpgradeUrl(rawUpgradeUrl)
|
|
93
|
+
? rawUpgradeUrl
|
|
94
|
+
: undefined;
|
|
95
|
+
const sep = safeUpgradeUrl?.includes('?') === true ? '&' : '?';
|
|
96
|
+
const trackedUrl = safeUpgradeUrl !== undefined ? `${safeUpgradeUrl}${sep}source=mcp` : undefined;
|
|
97
|
+
return {
|
|
98
|
+
message: sanitizeErrorMessage(getErrorMessage(error, 'Subscription required')),
|
|
99
|
+
status,
|
|
100
|
+
...(requiredTier !== undefined ? { required_tier: requiredTier } : {}),
|
|
101
|
+
...(currentTier !== undefined ? { current_tier: currentTier } : {}),
|
|
102
|
+
...(def !== undefined ? { definition: def } : {}),
|
|
103
|
+
...(trackedUrl !== undefined ? { upgrade_url: trackedUrl } : {}),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
if (isRateLimitError(error)) {
|
|
107
|
+
const details = error.details ?? {};
|
|
108
|
+
const retryAfter = typeof details['retryAfter'] === 'number' ? details['retryAfter'] : undefined;
|
|
109
|
+
return {
|
|
110
|
+
message: sanitizeErrorMessage(getErrorMessage(error, 'Rate limit exceeded')),
|
|
111
|
+
status,
|
|
112
|
+
...(retryAfter !== undefined ? { retry_after: retryAfter } : {}),
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
if (isConflictError(error)) {
|
|
116
|
+
const details = 'details' in error
|
|
117
|
+
? error.details
|
|
118
|
+
: undefined;
|
|
119
|
+
const nextAvailable = details?.['nextAvailable'];
|
|
120
|
+
return {
|
|
121
|
+
message: sanitizeErrorMessage(getErrorMessage(error, 'Resource conflict')),
|
|
122
|
+
...(status !== undefined ? { status } : {}),
|
|
123
|
+
...(nextAvailable !== undefined ? { nextAvailable } : {}),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
message: sanitizeErrorMessage(getErrorMessage(error, 'Unknown error')),
|
|
128
|
+
...(status !== undefined ? { status } : {}),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
42
131
|
/**
|
|
43
132
|
* Map an SDK error to an MCP tool response.
|
|
44
133
|
*
|
|
@@ -51,16 +140,17 @@ function buildErrorResponse(message, metadata) {
|
|
|
51
140
|
export function mapSdkErrorToMcp(error) {
|
|
52
141
|
const statusCode = getStatusCode(error);
|
|
53
142
|
if (isNotFoundError(error)) {
|
|
54
|
-
return buildErrorResponse(sanitizeErrorMessage(getErrorMessage(error, 'Resource not found')), statusCode ? { status: statusCode } : undefined);
|
|
143
|
+
return buildErrorResponse(sanitizeErrorMessage(getErrorMessage(error, 'Resource not found')), statusCode !== undefined ? { status: statusCode } : undefined);
|
|
55
144
|
}
|
|
56
145
|
if (isRateLimitError(error)) {
|
|
57
146
|
const retryAfter = error.retryAfter;
|
|
58
|
-
|
|
147
|
+
const hasRetryAfter = typeof retryAfter === 'number' && retryAfter > 0;
|
|
148
|
+
return buildErrorResponse(hasRetryAfter
|
|
59
149
|
? `Rate limit exceeded. Retry after ${String(retryAfter)} seconds.`
|
|
60
|
-
: 'Rate limit exceeded, please retry later.', { status: 429, ...(
|
|
150
|
+
: 'Rate limit exceeded, please retry later.', { status: 429, ...(hasRetryAfter ? { retry_after_seconds: retryAfter } : {}) });
|
|
61
151
|
}
|
|
62
152
|
if (isValidationError(error)) {
|
|
63
|
-
return buildErrorResponse(sanitizeErrorMessage(getErrorMessage(error, 'Invalid request parameters')), statusCode ? { status: statusCode } : undefined);
|
|
153
|
+
return buildErrorResponse(sanitizeErrorMessage(getErrorMessage(error, 'Invalid request parameters')), statusCode !== undefined ? { status: statusCode } : undefined);
|
|
64
154
|
}
|
|
65
155
|
if (error instanceof UnauthorizedError) {
|
|
66
156
|
return buildErrorResponse('Authentication required. Verify ULUOPS_API_KEY is set to a valid ulr_* key.', { status: 401 });
|
|
@@ -74,19 +164,30 @@ export function mapSdkErrorToMcp(error) {
|
|
|
74
164
|
const requiredTier = details.requiredTier;
|
|
75
165
|
const currentTier = details.currentTier;
|
|
76
166
|
const def = details.definition;
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
167
|
+
const rawUpgradeUrl = details.upgradeUrl;
|
|
168
|
+
// Restrict the embedded URL to https://*.uluops.ai to prevent
|
|
169
|
+
// server-controlled prompt-injection bait reaching the agent's context.
|
|
170
|
+
const safeUpgradeUrl = rawUpgradeUrl !== undefined && isSafeUpgradeUrl(rawUpgradeUrl)
|
|
171
|
+
? rawUpgradeUrl
|
|
172
|
+
: undefined;
|
|
173
|
+
const sep = safeUpgradeUrl?.includes('?') === true ? '&' : '?';
|
|
174
|
+
const trackedUrl = safeUpgradeUrl !== undefined ? `${safeUpgradeUrl}${sep}source=mcp` : undefined;
|
|
175
|
+
const defLabel = def?.name !== undefined && def.name !== ''
|
|
176
|
+
? `${def.type ?? 'definition'}/${def.name}`
|
|
177
|
+
: 'this definition';
|
|
178
|
+
const tierLabel = requiredTier !== undefined && requiredTier !== ''
|
|
179
|
+
? ` Requires ${requiredTier} tier or higher.`
|
|
180
|
+
: '';
|
|
181
|
+
const currentLabel = currentTier !== undefined && currentTier !== ''
|
|
182
|
+
? ` Your current tier: ${currentTier}.`
|
|
183
|
+
: '';
|
|
83
184
|
return buildErrorResponse(`Subscription required to access ${defLabel}.${tierLabel}${currentLabel}` +
|
|
84
|
-
(trackedUrl ? ` Upgrade: ${trackedUrl}` : ''), {
|
|
185
|
+
(trackedUrl !== undefined ? ` Upgrade: ${trackedUrl}` : ''), {
|
|
85
186
|
status: 402,
|
|
86
|
-
...(requiredTier ? { required_tier: requiredTier } : {}),
|
|
87
|
-
...(currentTier ? { current_tier: currentTier } : {}),
|
|
88
|
-
...(def ? { definition: def } : {}),
|
|
89
|
-
...(trackedUrl ? { upgrade_url: trackedUrl } : {}),
|
|
187
|
+
...(requiredTier !== undefined && requiredTier !== '' ? { required_tier: requiredTier } : {}),
|
|
188
|
+
...(currentTier !== undefined && currentTier !== '' ? { current_tier: currentTier } : {}),
|
|
189
|
+
...(def !== undefined ? { definition: def } : {}),
|
|
190
|
+
...(trackedUrl !== undefined ? { upgrade_url: trackedUrl } : {}),
|
|
90
191
|
});
|
|
91
192
|
}
|
|
92
193
|
if (isConflictError(error)) {
|
|
@@ -94,16 +195,17 @@ export function mapSdkErrorToMcp(error) {
|
|
|
94
195
|
const details = 'details' in error
|
|
95
196
|
? error.details
|
|
96
197
|
: undefined;
|
|
198
|
+
const nextAvailable = details?.nextAvailable;
|
|
97
199
|
return buildErrorResponse(sanitizeErrorMessage(getErrorMessage(error, 'Resource conflict')), {
|
|
98
|
-
...(statusCode ? { status: statusCode } : {}),
|
|
99
|
-
...(
|
|
200
|
+
...(statusCode !== undefined ? { status: statusCode } : {}),
|
|
201
|
+
...(nextAvailable !== undefined && nextAvailable !== null ? { nextAvailable } : {}),
|
|
100
202
|
});
|
|
101
203
|
}
|
|
102
204
|
if (isUnprocessableError(error)) {
|
|
103
|
-
return buildErrorResponse(sanitizeErrorMessage(getErrorMessage(error, 'Unprocessable request')), statusCode ? { status: statusCode } : undefined);
|
|
205
|
+
return buildErrorResponse(sanitizeErrorMessage(getErrorMessage(error, 'Unprocessable request')), statusCode !== undefined ? { status: statusCode } : undefined);
|
|
104
206
|
}
|
|
105
207
|
if (isRegistryApiError(error)) {
|
|
106
|
-
return buildErrorResponse(sanitizeErrorMessage(getErrorMessage(error, 'Internal server error')), statusCode ? { status: statusCode } : undefined);
|
|
208
|
+
return buildErrorResponse(sanitizeErrorMessage(getErrorMessage(error, 'Internal server error')), statusCode !== undefined ? { status: statusCode } : undefined);
|
|
107
209
|
}
|
|
108
210
|
if (error instanceof Error) {
|
|
109
211
|
return buildErrorResponse(sanitizeErrorMessage(error.message));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-error-mapper.js","sourceRoot":"","sources":["../../src/client/sdk-error-mapper.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,oBAAoB,GACrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAIlD;;;;GAIG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,cAAc,CAAC;AAEnD,2DAA2D;AAC3D,SAAS,eAAe,CAAC,KAAc,EAAE,QAAgB;IACvD,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;QACtE,OAAO,MAAM,CAAE,KAA8B,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,8DAA8D;AAC9D,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,YAAY,IAAI,KAAK,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"sdk-error-mapper.js","sourceRoot":"","sources":["../../src/client/sdk-error-mapper.ts"],"names":[],"mappings":"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"}
|
package/dist/config/index.d.ts
CHANGED
|
@@ -12,6 +12,12 @@ export declare const VERSION: string;
|
|
|
12
12
|
export declare function loadConfig(): RegistryMcpConfig;
|
|
13
13
|
/**
|
|
14
14
|
* Validate that required configuration is present and well-formed.
|
|
15
|
+
*
|
|
16
|
+
* Returns a list of non-fatal warnings (e.g., custom registry URL accepted
|
|
17
|
+
* via escape hatch) that the caller should log so the user sees what
|
|
18
|
+
* happened during startup.
|
|
15
19
|
*/
|
|
16
|
-
export declare function validateConfig(config: RegistryMcpConfig):
|
|
20
|
+
export declare function validateConfig(config: RegistryMcpConfig): {
|
|
21
|
+
warnings: string[];
|
|
22
|
+
};
|
|
17
23
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAY,MAAM,mBAAmB,CAAC;AAKrE,kEAAkE;AAClE,eAAO,MAAM,OAAO,QAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAY,MAAM,mBAAmB,CAAC;AAKrE,kEAAkE;AAClE,eAAO,MAAM,OAAO,QAAa,CAAC;AAyBlC;;GAEG;AACH,wBAAgB,UAAU,IAAI,iBAAiB,CA6B9C;AAwCD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,iBAAiB,GAAG;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAqEhF"}
|
package/dist/config/index.js
CHANGED
|
@@ -8,7 +8,6 @@ const require = createRequire(import.meta.url);
|
|
|
8
8
|
const { version: pkgVersion } = require('../../package.json');
|
|
9
9
|
/** Package version read from package.json at module load time. */
|
|
10
10
|
export const VERSION = pkgVersion;
|
|
11
|
-
const DEFAULT_BASE_URL = 'https://api.uluops.ai/api/v1/registry';
|
|
12
11
|
const DEFAULT_TIMEOUT = 30000;
|
|
13
12
|
const DEFAULT_RETRIES = 3;
|
|
14
13
|
const DEFAULT_LOG_LEVEL = 'info';
|
|
@@ -34,9 +33,11 @@ function parseInteger(value, defaultValue) {
|
|
|
34
33
|
* Load configuration from environment variables.
|
|
35
34
|
*/
|
|
36
35
|
export function loadConfig() {
|
|
37
|
-
//
|
|
38
|
-
//
|
|
39
|
-
|
|
36
|
+
// ULUOPS_REGISTRY_URL is optional. When unset or empty, RegistryClient falls
|
|
37
|
+
// back to @uluops/registry-sdk's DEFAULT_BASE_URL (prod by default,
|
|
38
|
+
// localhost when NODE_ENV=development).
|
|
39
|
+
const rawUrl = process.env['ULUOPS_REGISTRY_URL'];
|
|
40
|
+
const apiUrl = rawUrl !== undefined && rawUrl !== '' ? rawUrl : undefined;
|
|
40
41
|
const apiKey = process.env['ULUOPS_API_KEY'];
|
|
41
42
|
const orgSlug = process.env['ULUOPS_ORG_SLUG'];
|
|
42
43
|
return {
|
|
@@ -60,24 +61,99 @@ export function loadConfig() {
|
|
|
60
61
|
},
|
|
61
62
|
};
|
|
62
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* Hosts allowlisted for the registry URL by default. Anything else must
|
|
66
|
+
* be explicitly opted into via ULUOPS_ALLOW_ANY_REGISTRY_HOST=1.
|
|
67
|
+
* Loopback names (localhost, 127.x.x.x, ::1) are also accepted to support
|
|
68
|
+
* local development against a self-hosted instance.
|
|
69
|
+
*
|
|
70
|
+
* Suffix check requires the leading dot — `endsWith('uluops.ai')` without
|
|
71
|
+
* the dot would accept attacker-controlled `eviluluops.ai`. The exact-
|
|
72
|
+
* match branch covers the bare apex.
|
|
73
|
+
*/
|
|
74
|
+
function isAllowedRegistryHost(hostname) {
|
|
75
|
+
if (hostname === 'localhost')
|
|
76
|
+
return true;
|
|
77
|
+
if (hostname === '127.0.0.1' || hostname.startsWith('127.'))
|
|
78
|
+
return true;
|
|
79
|
+
if (hostname === '::1' || hostname === '[::1]')
|
|
80
|
+
return true;
|
|
81
|
+
if (hostname === 'uluops.ai')
|
|
82
|
+
return true;
|
|
83
|
+
if (hostname.endsWith('.uluops.ai'))
|
|
84
|
+
return true;
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* RFC-1918, IMDS, and link-local addresses that should never receive the
|
|
89
|
+
* API key by accident. Even with ULUOPS_ALLOW_ANY_REGISTRY_HOST=1, these
|
|
90
|
+
* hosts require an explicit ULUOPS_ALLOW_PRIVATE_REGISTRY=1 second escape
|
|
91
|
+
* hatch — the typical AI-agent-driven misconfiguration we are defending
|
|
92
|
+
* against would not set both env vars.
|
|
93
|
+
*/
|
|
94
|
+
function isPrivateOrMetadataHost(hostname) {
|
|
95
|
+
// AWS / GCP / Azure instance metadata service
|
|
96
|
+
if (hostname === '169.254.169.254')
|
|
97
|
+
return true;
|
|
98
|
+
// RFC-1918 ranges (rough prefix match; sufficient for defense-in-depth)
|
|
99
|
+
if (hostname.startsWith('10.'))
|
|
100
|
+
return true;
|
|
101
|
+
if (hostname.startsWith('192.168.'))
|
|
102
|
+
return true;
|
|
103
|
+
if (/^172\.(1[6-9]|2\d|3[01])\./.test(hostname))
|
|
104
|
+
return true;
|
|
105
|
+
// Link-local
|
|
106
|
+
if (hostname.startsWith('169.254.'))
|
|
107
|
+
return true;
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
63
110
|
/**
|
|
64
111
|
* Validate that required configuration is present and well-formed.
|
|
112
|
+
*
|
|
113
|
+
* Returns a list of non-fatal warnings (e.g., custom registry URL accepted
|
|
114
|
+
* via escape hatch) that the caller should log so the user sees what
|
|
115
|
+
* happened during startup.
|
|
65
116
|
*/
|
|
66
117
|
export function validateConfig(config) {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
118
|
+
const warnings = [];
|
|
119
|
+
// baseUrl is optional. When undefined, RegistryClient falls back to the
|
|
120
|
+
// SDK's DEFAULT_BASE_URL — a trusted compile-time constant, so the SSRF
|
|
121
|
+
// defense below only runs when the operator explicitly set a URL.
|
|
122
|
+
if (config.api.baseUrl !== undefined) {
|
|
123
|
+
let parsed;
|
|
124
|
+
try {
|
|
125
|
+
parsed = new URL(config.api.baseUrl);
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
throw new Error(`Invalid Registry API URL: ${config.api.baseUrl}`);
|
|
129
|
+
}
|
|
72
130
|
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
|
|
73
131
|
throw new Error(`Registry API URL must use http or https scheme, got: ${parsed.protocol}`);
|
|
74
132
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
133
|
+
// SSRF defense (CWE-918). The URL receives ULUOPS_API_KEY as a Bearer
|
|
134
|
+
// header on every request. By default only *.uluops.ai (the canonical
|
|
135
|
+
// host) and loopback (localhost dev) are allowed without opt-in.
|
|
136
|
+
const allowAnyHost = process.env['ULUOPS_ALLOW_ANY_REGISTRY_HOST'] === '1';
|
|
137
|
+
const allowPrivate = process.env['ULUOPS_ALLOW_PRIVATE_REGISTRY'] === '1';
|
|
138
|
+
const hostname = parsed.hostname.toLowerCase();
|
|
139
|
+
if (isPrivateOrMetadataHost(hostname) && !allowPrivate) {
|
|
140
|
+
throw new Error(`Registry API URL host '${hostname}' is a private or instance-metadata address. ` +
|
|
141
|
+
`If you really intend this, set ULUOPS_ALLOW_PRIVATE_REGISTRY=1 to acknowledge the risk.`);
|
|
142
|
+
}
|
|
143
|
+
if (!isAllowedRegistryHost(hostname) && !allowAnyHost) {
|
|
144
|
+
throw new Error(`Registry API URL host '${hostname}' is not on the default allowlist. ` +
|
|
145
|
+
`By default only *.uluops.ai and loopback are accepted to prevent the ` +
|
|
146
|
+
`API key from being forwarded to untrusted hosts. If you are pointing ` +
|
|
147
|
+
`at a non-production endpoint, set ULUOPS_ALLOW_ANY_REGISTRY_HOST=1 to ` +
|
|
148
|
+
`acknowledge the risk.`);
|
|
149
|
+
}
|
|
150
|
+
if (allowAnyHost && !isAllowedRegistryHost(hostname)) {
|
|
151
|
+
warnings.push(`Registry API URL host '${hostname}' accepted via ULUOPS_ALLOW_ANY_REGISTRY_HOST=1. ` +
|
|
152
|
+
`Every API call will forward ULUOPS_API_KEY as a Bearer header to this host.`);
|
|
153
|
+
}
|
|
154
|
+
if (parsed.username !== '' || parsed.password !== '') {
|
|
155
|
+
throw new Error('Registry API URL must not include userinfo (user:pass@). Set ULUOPS_API_KEY instead.');
|
|
79
156
|
}
|
|
80
|
-
throw new Error(`Invalid Registry API URL: ${config.api.baseUrl}`);
|
|
81
157
|
}
|
|
82
158
|
if (config.api.apiKey === undefined || config.api.apiKey === '') {
|
|
83
159
|
throw new Error('API key is required. Set ULUOPS_API_KEY');
|
|
@@ -88,5 +164,6 @@ export function validateConfig(config) {
|
|
|
88
164
|
if (config.api.retries < 0) {
|
|
89
165
|
throw new Error('Retries must be a non-negative number');
|
|
90
166
|
}
|
|
167
|
+
return { warnings };
|
|
91
168
|
}
|
|
92
169
|
//# sourceMappingURL=index.js.map
|
package/dist/config/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAGvC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAC;AAErF,kEAAkE;AAClE,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAAC;AAElC,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-registry.d.ts","sourceRoot":"","sources":["../../src/config/tool-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAKlD,eAAO,MAAM,YAAY,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"tool-registry.d.ts","sourceRoot":"","sources":["../../src/config/tool-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAKlD,eAAO,MAAM,YAAY,EAAE,QAAQ,EAqXlC,CAAC"}
|
|
@@ -275,14 +275,6 @@ export const toolRegistry = [
|
|
|
275
275
|
quotaPerMinute: 240,
|
|
276
276
|
quotaPerHour: 5000,
|
|
277
277
|
},
|
|
278
|
-
{
|
|
279
|
-
name: 'sync_models',
|
|
280
|
-
sideEffects: 'write',
|
|
281
|
-
maxArgsSize: 10 * KB,
|
|
282
|
-
maxEgressBytes: 200 * KB,
|
|
283
|
-
quotaPerMinute: 10,
|
|
284
|
-
quotaPerHour: 50,
|
|
285
|
-
},
|
|
286
278
|
{
|
|
287
279
|
name: 'get_user',
|
|
288
280
|
sideEffects: 'read',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-registry.js","sourceRoot":"","sources":["../../src/config/tool-registry.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tool-registry.js","sourceRoot":"","sources":["../../src/config/tool-registry.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAaH,iBAAe,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA4JnC;AAED,OAAO,EAAE,IAAI,EAAE,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Thin protocol adapter that enables Claude Code to interact with
|
|
6
6
|
* the UluOps Registry API via MCP, using @uluops/registry-sdk.
|
|
7
7
|
*/
|
|
8
|
+
import { fileURLToPath } from 'node:url';
|
|
8
9
|
import { SecureMcpServer } from 'mcp-secure-server';
|
|
9
10
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
10
11
|
import { RegistryClient } from '@uluops/registry-sdk';
|
|
@@ -20,21 +21,26 @@ async function main() {
|
|
|
20
21
|
process.exit(0);
|
|
21
22
|
}
|
|
22
23
|
const config = loadConfig();
|
|
23
|
-
validateConfig(config);
|
|
24
|
+
const { warnings: configWarnings } = validateConfig(config);
|
|
24
25
|
const logger = createLogger({
|
|
25
26
|
level: config.security.logLevel,
|
|
26
27
|
enableFileLogging: config.security.enableLogging,
|
|
27
28
|
logDir: config.security.logDir,
|
|
28
29
|
});
|
|
30
|
+
for (const warning of configWarnings) {
|
|
31
|
+
logger.warn(warning);
|
|
32
|
+
}
|
|
29
33
|
logger.info('Starting UluOps Registry MCP client', {
|
|
30
34
|
version: config.server.version,
|
|
31
|
-
apiUrl: config.api.baseUrl,
|
|
35
|
+
apiUrl: config.api.baseUrl ?? '(SDK default)',
|
|
32
36
|
});
|
|
33
37
|
// Retry config applies to all requests including writes. This is safe because:
|
|
34
38
|
// - The SDK only retries on network errors and 5xx responses (not 4xx)
|
|
35
39
|
// - Registry API write operations are idempotent (create returns existing on conflict)
|
|
36
|
-
// Detect auth type: ulr_ prefix = API key, otherwise = session token
|
|
37
|
-
|
|
40
|
+
// Detect auth type: ulr_ prefix = API key, otherwise = session token.
|
|
41
|
+
// Explicit `=== true` to handle the nullable-boolean case from optional
|
|
42
|
+
// chaining (undefined apiKey → undefined isApiKey, falls to session-token).
|
|
43
|
+
const isApiKey = config.api.apiKey?.startsWith('ulr_') === true;
|
|
38
44
|
const registryClient = new RegistryClient({
|
|
39
45
|
baseUrl: config.api.baseUrl,
|
|
40
46
|
...(isApiKey ? { apiKey: config.api.apiKey } : { sessionToken: config.api.apiKey }),
|
|
@@ -133,7 +139,6 @@ async function main() {
|
|
|
133
139
|
'list_providers',
|
|
134
140
|
'list_aliases',
|
|
135
141
|
'get_translator_version',
|
|
136
|
-
'sync_models',
|
|
137
142
|
'get_user',
|
|
138
143
|
'batch_users',
|
|
139
144
|
'list_languages',
|
|
@@ -149,7 +154,15 @@ async function main() {
|
|
|
149
154
|
});
|
|
150
155
|
}
|
|
151
156
|
export { main };
|
|
152
|
-
|
|
157
|
+
// Auto-run main() only when this module is the program entry point.
|
|
158
|
+
// Tests import `{ main }` directly and call it themselves; they do not
|
|
159
|
+
// need (and previously relied on a fragile `NODE_ENV=test` guard to
|
|
160
|
+
// suppress) auto-execution. The ESM-standard entry-point check below is
|
|
161
|
+
// stable across NODE_ENV values, so a stray `NODE_ENV=test` in the user's
|
|
162
|
+
// shell no longer silently stops the server from starting.
|
|
163
|
+
const isEntryPoint = typeof process.argv[1] === 'string' &&
|
|
164
|
+
process.argv[1] === fileURLToPath(import.meta.url);
|
|
165
|
+
if (isEntryPoint) {
|
|
153
166
|
main().catch((error) => {
|
|
154
167
|
// console.error is intentional here — logger may not be initialized yet at startup
|
|
155
168
|
const message = error instanceof Error ? error.message : String(error);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,KAAK,UAAU,IAAI;IACjB,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtE,uFAAuF;QACvF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,cAAc,CAAC,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,KAAK,UAAU,IAAI;IACjB,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtE,uFAAuF;QACvF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAE5D,MAAM,MAAM,GAAG,YAAY,CAAC;QAC1B,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ;QAC/B,iBAAiB,EAAE,MAAM,CAAC,QAAQ,CAAC,aAAa;QAChD,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;KAC/B,CAAC,CAAC;IAEH,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,qCAAqC,EAAE;QACjD,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO;QAC9B,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,eAAe;KAC9C,CAAC,CAAC;IAEH,+EAA+E;IAC/E,uEAAuE;IACvE,uFAAuF;IACvF,sEAAsE;IACtE,wEAAwE;IACxE,4EAA4E;IAC5E,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IAChE,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC;QACxC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO;QAC3B,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QACnF,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO;QAC3B,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO;QAC3B,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO;KAC5B,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;QACzD,aAAa,EAAE,OAAO;QACtB,oBAAoB,EAAE,GAAG;QACzB,cAAc,EAAE,GAAG,GAAG,IAAI;QAC1B,aAAa,EAAE,GAAG;QAElB,cAAc,EAAE,EAAE;QAClB,aAAa,EAAE,IAAI;QACnB,6EAA6E;QAC7E,uDAAuD;QACvD,mBAAmB,EAAE;YACnB,OAAO,EAAE,KAAK;SACf;QAED,YAAY;QAEZ,aAAa,EAAE;YACb,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,IAAI;SACnB;QAED,cAAc,EAAE;YACd,cAAc,EAAE,CAAC,UAAU,CAAC;SAC7B;QAED,aAAa,EAAE,MAAM,CAAC,QAAQ,CAAC,aAAa;QAC5C,cAAc,EAAE,MAAM,CAAC,QAAQ,CAAC,cAAc;QAC9C,qBAAqB,EAAE,MAAM,CAAC,QAAQ,CAAC,qBAAqB;KAC7D,CAAC,CAAC;IAEH,gBAAgB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACzC,oBAAoB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAE7C,MAAM,QAAQ,GAAG,CAAC,MAAc,EAAQ,EAAE;QACxC,MAAM,CAAC,IAAI,CAAC,YAAY,MAAM,4BAA4B,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,QAAQ,CAAC,SAAS,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,EAAE;QACxC,MAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE;YACjC,KAAK,EAAE,KAAK,CAAC,OAAO;SACrB,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;QAC1C,MAAM,CAAC,KAAK,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,iFAAiF;IACjF,uFAAuF;IACvF,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,UAAU,IAAI,OAAO,SAAS,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QACnF,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IACD,MAAM,MAAM,CAAC,OAAO,CAAC,SAAiD,CAAC,CAAC;IAExE,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE;QAC5C,KAAK,EAAE;YACL,OAAO,EAAE,CAAC,kBAAkB,CAAC;YAC7B,OAAO,EAAE;gBACP,kBAAkB;gBAClB,gBAAgB;gBAChB,oBAAoB;gBACpB,aAAa;gBACb,eAAe;gBACf,qBAAqB;gBACrB,mBAAmB;aACpB;YACD,WAAW,EAAE;gBACX,mBAAmB;gBACnB,mBAAmB;gBACnB,oBAAoB;gBACpB,sBAAsB;gBACtB,mBAAmB;gBACnB,oBAAoB;gBACpB,eAAe;gBACf,eAAe;gBACf,eAAe;gBACf,kBAAkB;gBAClB,gBAAgB;gBAChB,qBAAqB;gBACrB,YAAY;aACb;YACD,QAAQ,EAAE;gBACR,iBAAiB;gBACjB,aAAa;gBACb,kBAAkB;gBAClB,kBAAkB;gBAClB,wBAAwB;gBACxB,oBAAoB;gBACpB,WAAW;gBACX,gBAAgB;gBAChB,cAAc;gBACd,wBAAwB;gBACxB,UAAU;gBACV,aAAa;gBACb,gBAAgB;gBAChB,cAAc;aACf;SACF;QACD,SAAS,EAAE;YACT,wBAAwB;YACxB,mBAAmB;YACnB,6BAA6B;YAC7B,sBAAsB;SACvB;KACF,CAAC,CAAC;AACL,CAAC;AAED,OAAO,EAAE,IAAI,EAAE,CAAC;AAEhB,oEAAoE;AACpE,uEAAuE;AACvE,oEAAoE;AACpE,wEAAwE;AACxE,0EAA0E;AAC1E,2DAA2D;AAC3D,MAAM,YAAY,GAChB,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAErD,IAAI,YAAY,EAAE,CAAC;IACjB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QAC9B,mFAAmF;QACnF,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,OAAO,CAAC,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { z } from 'zod';
|
|
8
8
|
import { DefinitionTypeSchema, createSuccessResponse } from '../types/index.js';
|
|
9
|
-
import { mapSdkErrorToMcp, mapZodErrorToMcp,
|
|
9
|
+
import { mapSdkErrorToMcp, mapZodErrorToMcp, extractErrorContext } from '../client/sdk-error-mapper.js';
|
|
10
10
|
import { trimDefinitionResponse } from '../utils/trim-definition.js';
|
|
11
11
|
const DefinitionRefSchema = z.object({
|
|
12
12
|
type: DefinitionTypeSchema,
|
|
@@ -32,18 +32,18 @@ export function registerBatchPublishTool(server, registryClient) {
|
|
|
32
32
|
published.push({ ...trimmed, warnings });
|
|
33
33
|
}
|
|
34
34
|
catch (error) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
35
|
+
// Route per-item failures through extractErrorContext so the
|
|
36
|
+
// batch response surfaces the same rich error metadata that
|
|
37
|
+
// single-call tools get via mapSdkErrorToMcp: 402 upgradeUrl
|
|
38
|
+
// and tier info, 429 retry_after, 409 nextAvailable.
|
|
39
|
+
const ctx = extractErrorContext(error);
|
|
40
|
+
const { message, ...rest } = ctx;
|
|
41
41
|
failed.push({
|
|
42
42
|
type: def.type,
|
|
43
43
|
name: def.name,
|
|
44
44
|
version: def.version,
|
|
45
45
|
error: message,
|
|
46
|
-
...
|
|
46
|
+
...rest,
|
|
47
47
|
});
|
|
48
48
|
}
|
|
49
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"batch-publish.js","sourceRoot":"","sources":["../../src/tools/batch-publish.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,oBAAoB,EAAkC,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAChH,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"batch-publish.js","sourceRoot":"","sources":["../../src/tools/batch-publish.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/index.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import type { RegistryClient } from '@uluops/registry-sdk';
|
|
5
5
|
import type { McpServerToolRegistration } from '../types/index.js';
|
|
6
6
|
/**
|
|
7
|
-
* Register all
|
|
7
|
+
* Register all 44 MCP tools with the server.
|
|
8
8
|
* @param server - MCP server instance to register tools on.
|
|
9
9
|
* @param registryClient - Registry SDK client for API calls.
|
|
10
10
|
*/
|