@manycore/aholo-sdk-mcp 1.0.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.
@@ -0,0 +1,319 @@
1
+ type Scene = 'model' | 'space';
2
+ type ResourceType = 'image' | 'video';
3
+ interface ResourceInput {
4
+ url: string;
5
+ type?: ResourceType;
6
+ }
7
+ export declare function validateSceneSource(sceneSource: 'user_explicit' | 'inspect', userConfirmedScene?: boolean): {
8
+ [x: string]: unknown;
9
+ content: ({
10
+ type: "text";
11
+ text: string;
12
+ annotations?: {
13
+ audience?: ("user" | "assistant")[] | undefined;
14
+ priority?: number | undefined;
15
+ lastModified?: string | undefined;
16
+ } | undefined;
17
+ _meta?: {
18
+ [x: string]: unknown;
19
+ } | undefined;
20
+ } | {
21
+ type: "image";
22
+ data: string;
23
+ mimeType: string;
24
+ annotations?: {
25
+ audience?: ("user" | "assistant")[] | undefined;
26
+ priority?: number | undefined;
27
+ lastModified?: string | undefined;
28
+ } | undefined;
29
+ _meta?: {
30
+ [x: string]: unknown;
31
+ } | undefined;
32
+ } | {
33
+ type: "audio";
34
+ data: string;
35
+ mimeType: string;
36
+ annotations?: {
37
+ audience?: ("user" | "assistant")[] | undefined;
38
+ priority?: number | undefined;
39
+ lastModified?: string | undefined;
40
+ } | undefined;
41
+ _meta?: {
42
+ [x: string]: unknown;
43
+ } | undefined;
44
+ } | {
45
+ uri: string;
46
+ name: string;
47
+ type: "resource_link";
48
+ description?: string | undefined;
49
+ mimeType?: string | undefined;
50
+ size?: number | undefined;
51
+ annotations?: {
52
+ audience?: ("user" | "assistant")[] | undefined;
53
+ priority?: number | undefined;
54
+ lastModified?: string | undefined;
55
+ } | undefined;
56
+ _meta?: {
57
+ [x: string]: unknown;
58
+ } | undefined;
59
+ icons?: {
60
+ src: string;
61
+ mimeType?: string | undefined;
62
+ sizes?: string[] | undefined;
63
+ theme?: "light" | "dark" | undefined;
64
+ }[] | undefined;
65
+ title?: string | undefined;
66
+ } | {
67
+ type: "resource";
68
+ resource: {
69
+ uri: string;
70
+ text: string;
71
+ mimeType?: string | undefined;
72
+ _meta?: {
73
+ [x: string]: unknown;
74
+ } | undefined;
75
+ } | {
76
+ uri: string;
77
+ blob: string;
78
+ mimeType?: string | undefined;
79
+ _meta?: {
80
+ [x: string]: unknown;
81
+ } | undefined;
82
+ };
83
+ annotations?: {
84
+ audience?: ("user" | "assistant")[] | undefined;
85
+ priority?: number | undefined;
86
+ lastModified?: string | undefined;
87
+ } | undefined;
88
+ _meta?: {
89
+ [x: string]: unknown;
90
+ } | undefined;
91
+ })[];
92
+ _meta?: {
93
+ [x: string]: unknown;
94
+ progressToken?: string | number | undefined;
95
+ "io.modelcontextprotocol/related-task"?: {
96
+ taskId: string;
97
+ } | undefined;
98
+ } | undefined;
99
+ structuredContent?: {
100
+ [x: string]: unknown;
101
+ } | undefined;
102
+ isError?: boolean | undefined;
103
+ } | null;
104
+ export declare function reconstructFromUrls(input: {
105
+ name?: string;
106
+ resources: ResourceInput[];
107
+ scene: Scene;
108
+ taskQuality?: 'low' | 'normal' | 'high';
109
+ useMask?: boolean;
110
+ wait?: boolean;
111
+ timeoutMs?: number;
112
+ region?: string;
113
+ toolName: string;
114
+ }): Promise<{
115
+ [x: string]: unknown;
116
+ content: ({
117
+ type: "text";
118
+ text: string;
119
+ annotations?: {
120
+ audience?: ("user" | "assistant")[] | undefined;
121
+ priority?: number | undefined;
122
+ lastModified?: string | undefined;
123
+ } | undefined;
124
+ _meta?: {
125
+ [x: string]: unknown;
126
+ } | undefined;
127
+ } | {
128
+ type: "image";
129
+ data: string;
130
+ mimeType: string;
131
+ annotations?: {
132
+ audience?: ("user" | "assistant")[] | undefined;
133
+ priority?: number | undefined;
134
+ lastModified?: string | undefined;
135
+ } | undefined;
136
+ _meta?: {
137
+ [x: string]: unknown;
138
+ } | undefined;
139
+ } | {
140
+ type: "audio";
141
+ data: string;
142
+ mimeType: string;
143
+ annotations?: {
144
+ audience?: ("user" | "assistant")[] | undefined;
145
+ priority?: number | undefined;
146
+ lastModified?: string | undefined;
147
+ } | undefined;
148
+ _meta?: {
149
+ [x: string]: unknown;
150
+ } | undefined;
151
+ } | {
152
+ uri: string;
153
+ name: string;
154
+ type: "resource_link";
155
+ description?: string | undefined;
156
+ mimeType?: string | undefined;
157
+ size?: number | undefined;
158
+ annotations?: {
159
+ audience?: ("user" | "assistant")[] | undefined;
160
+ priority?: number | undefined;
161
+ lastModified?: string | undefined;
162
+ } | undefined;
163
+ _meta?: {
164
+ [x: string]: unknown;
165
+ } | undefined;
166
+ icons?: {
167
+ src: string;
168
+ mimeType?: string | undefined;
169
+ sizes?: string[] | undefined;
170
+ theme?: "light" | "dark" | undefined;
171
+ }[] | undefined;
172
+ title?: string | undefined;
173
+ } | {
174
+ type: "resource";
175
+ resource: {
176
+ uri: string;
177
+ text: string;
178
+ mimeType?: string | undefined;
179
+ _meta?: {
180
+ [x: string]: unknown;
181
+ } | undefined;
182
+ } | {
183
+ uri: string;
184
+ blob: string;
185
+ mimeType?: string | undefined;
186
+ _meta?: {
187
+ [x: string]: unknown;
188
+ } | undefined;
189
+ };
190
+ annotations?: {
191
+ audience?: ("user" | "assistant")[] | undefined;
192
+ priority?: number | undefined;
193
+ lastModified?: string | undefined;
194
+ } | undefined;
195
+ _meta?: {
196
+ [x: string]: unknown;
197
+ } | undefined;
198
+ })[];
199
+ _meta?: {
200
+ [x: string]: unknown;
201
+ progressToken?: string | number | undefined;
202
+ "io.modelcontextprotocol/related-task"?: {
203
+ taskId: string;
204
+ } | undefined;
205
+ } | undefined;
206
+ structuredContent?: {
207
+ [x: string]: unknown;
208
+ } | undefined;
209
+ isError?: boolean | undefined;
210
+ }>;
211
+ export declare function reconstructFromFiles(input: {
212
+ localPaths: string[];
213
+ scene: Scene;
214
+ resourceType?: ResourceType;
215
+ name?: string;
216
+ taskQuality?: 'low' | 'normal' | 'high';
217
+ useMask?: boolean;
218
+ wait?: boolean;
219
+ timeoutMs?: number;
220
+ region?: string;
221
+ toolName: string;
222
+ }): Promise<{
223
+ [x: string]: unknown;
224
+ content: ({
225
+ type: "text";
226
+ text: string;
227
+ annotations?: {
228
+ audience?: ("user" | "assistant")[] | undefined;
229
+ priority?: number | undefined;
230
+ lastModified?: string | undefined;
231
+ } | undefined;
232
+ _meta?: {
233
+ [x: string]: unknown;
234
+ } | undefined;
235
+ } | {
236
+ type: "image";
237
+ data: string;
238
+ mimeType: string;
239
+ annotations?: {
240
+ audience?: ("user" | "assistant")[] | undefined;
241
+ priority?: number | undefined;
242
+ lastModified?: string | undefined;
243
+ } | undefined;
244
+ _meta?: {
245
+ [x: string]: unknown;
246
+ } | undefined;
247
+ } | {
248
+ type: "audio";
249
+ data: string;
250
+ mimeType: string;
251
+ annotations?: {
252
+ audience?: ("user" | "assistant")[] | undefined;
253
+ priority?: number | undefined;
254
+ lastModified?: string | undefined;
255
+ } | undefined;
256
+ _meta?: {
257
+ [x: string]: unknown;
258
+ } | undefined;
259
+ } | {
260
+ uri: string;
261
+ name: string;
262
+ type: "resource_link";
263
+ description?: string | undefined;
264
+ mimeType?: string | undefined;
265
+ size?: number | undefined;
266
+ annotations?: {
267
+ audience?: ("user" | "assistant")[] | undefined;
268
+ priority?: number | undefined;
269
+ lastModified?: string | undefined;
270
+ } | undefined;
271
+ _meta?: {
272
+ [x: string]: unknown;
273
+ } | undefined;
274
+ icons?: {
275
+ src: string;
276
+ mimeType?: string | undefined;
277
+ sizes?: string[] | undefined;
278
+ theme?: "light" | "dark" | undefined;
279
+ }[] | undefined;
280
+ title?: string | undefined;
281
+ } | {
282
+ type: "resource";
283
+ resource: {
284
+ uri: string;
285
+ text: string;
286
+ mimeType?: string | undefined;
287
+ _meta?: {
288
+ [x: string]: unknown;
289
+ } | undefined;
290
+ } | {
291
+ uri: string;
292
+ blob: string;
293
+ mimeType?: string | undefined;
294
+ _meta?: {
295
+ [x: string]: unknown;
296
+ } | undefined;
297
+ };
298
+ annotations?: {
299
+ audience?: ("user" | "assistant")[] | undefined;
300
+ priority?: number | undefined;
301
+ lastModified?: string | undefined;
302
+ } | undefined;
303
+ _meta?: {
304
+ [x: string]: unknown;
305
+ } | undefined;
306
+ })[];
307
+ _meta?: {
308
+ [x: string]: unknown;
309
+ progressToken?: string | number | undefined;
310
+ "io.modelcontextprotocol/related-task"?: {
311
+ taskId: string;
312
+ } | undefined;
313
+ } | undefined;
314
+ structuredContent?: {
315
+ [x: string]: unknown;
316
+ } | undefined;
317
+ isError?: boolean | undefined;
318
+ }>;
319
+ export {};
@@ -0,0 +1,92 @@
1
+ import { createAssetClient } from '@manycore/aholo-sdk-asset';
2
+ import { createWorldClient } from '@manycore/aholo-sdk-world';
3
+ import { buildClientConfig } from './config.js';
4
+ import { jsonResult } from './response.js';
5
+ import { sceneNotConfirmedError, toolError } from './errors.js';
6
+ function countImages(resources) {
7
+ return resources.filter((r) => r.type === 'image' || r.type !== 'video').length;
8
+ }
9
+ function validateResources(resources) {
10
+ const allVideo = resources.every((r) => r.type === 'video');
11
+ if (allVideo)
12
+ return null;
13
+ const imageCount = countImages(resources);
14
+ if (imageCount > 0 && imageCount < 20) {
15
+ return `图片类资源须至少 20 条,当前 ${imageCount} 条。纯视频请为每条设 type=video。`;
16
+ }
17
+ return null;
18
+ }
19
+ export function validateSceneSource(sceneSource, userConfirmedScene) {
20
+ if (sceneSource === 'user_explicit' && userConfirmedScene !== true) {
21
+ return sceneNotConfirmedError();
22
+ }
23
+ return null;
24
+ }
25
+ async function pollIfRequested(worldId, config, wait, timeoutMs) {
26
+ if (!wait)
27
+ return undefined;
28
+ const world = createWorldClient(config);
29
+ return world.waitFor(worldId, timeoutMs ? { timeoutMs } : undefined);
30
+ }
31
+ export async function reconstructFromUrls(input) {
32
+ const validation = validateResources(input.resources);
33
+ if (validation) {
34
+ return toolError(input.toolName, new Error(validation));
35
+ }
36
+ const taskQuality = input.taskQuality ?? 'normal';
37
+ try {
38
+ const config = buildClientConfig(input.region);
39
+ const world = createWorldClient(config);
40
+ const { worldId } = await world.reconstructions.create({
41
+ name: input.name,
42
+ resources: input.resources,
43
+ taskQuality,
44
+ scene: input.scene,
45
+ useMask: input.useMask,
46
+ });
47
+ const detail = await pollIfRequested(worldId, config, input.wait, input.timeoutMs);
48
+ return jsonResult({ worldId, scene: input.scene, taskQuality, ...(detail ? { detail } : {}) });
49
+ }
50
+ catch (error) {
51
+ return toolError(input.toolName, error);
52
+ }
53
+ }
54
+ export async function reconstructFromFiles(input) {
55
+ const taskQuality = input.taskQuality ?? 'normal';
56
+ try {
57
+ const config = buildClientConfig(input.region);
58
+ const asset = createAssetClient(config);
59
+ const uploads = await Promise.all(input.localPaths.map(async (localPath) => {
60
+ const result = await asset.uploadFile(localPath);
61
+ return { localPath, ...result };
62
+ }));
63
+ const resources = uploads.map(({ url }) => ({
64
+ url,
65
+ ...(input.resourceType ? { type: input.resourceType } : {}),
66
+ }));
67
+ const validation = validateResources(resources);
68
+ if (validation) {
69
+ return toolError(input.toolName, new Error(validation));
70
+ }
71
+ const world = createWorldClient(config);
72
+ const { worldId } = await world.reconstructions.create({
73
+ name: input.name,
74
+ resources,
75
+ taskQuality,
76
+ scene: input.scene,
77
+ useMask: input.useMask,
78
+ });
79
+ const detail = await pollIfRequested(worldId, config, input.wait, input.timeoutMs);
80
+ return jsonResult({
81
+ worldId,
82
+ scene: input.scene,
83
+ taskQuality,
84
+ uploads,
85
+ ...(detail ? { detail } : {}),
86
+ });
87
+ }
88
+ catch (error) {
89
+ return toolError(input.toolName, error);
90
+ }
91
+ }
92
+ //# sourceMappingURL=world-reconstruct.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world-reconstruct.js","sourceRoot":"","sources":["../src/world-reconstruct.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@manycore/aholo-sdk-mcp",
3
+ "version": "1.0.0",
4
+ "description": "Local stdio MCP server for Aholo OpenAPI (upload, world, lux3d). For Cursor and other local Agent studios.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "bin": {
8
+ "aholo-sdk-mcp": "./dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "README.md"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc -p tsconfig.json",
16
+ "prepack": "npm run build",
17
+ "smoke": "node scripts/smoke-list-tools.mjs",
18
+ "start": "node dist/index.js",
19
+ "dev": "npm run build && node dist/index.js"
20
+ },
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "https://github.com/manycoretech/aholo-spatial-sdk.git",
24
+ "directory": "typescript/mcp"
25
+ },
26
+ "homepage": "https://labs.aholo3d.cn/api-docs/sdk/typescript",
27
+ "bugs": {
28
+ "url": "https://github.com/manycoretech/aholo-spatial-sdk/issues"
29
+ },
30
+ "publishConfig": {
31
+ "registry": "https://registry.npmjs.org/",
32
+ "access": "public"
33
+ },
34
+ "engines": {
35
+ "node": ">=18"
36
+ },
37
+ "keywords": [
38
+ "aholo",
39
+ "mcp",
40
+ "model-context-protocol"
41
+ ],
42
+ "license": "MIT",
43
+ "dependencies": {
44
+ "@manycore/aholo-sdk-asset": "^1.2.0",
45
+ "@manycore/aholo-sdk-core": "^1.2.0",
46
+ "@manycore/aholo-sdk-lux3d": "^1.2.0",
47
+ "@manycore/aholo-sdk-world": "^1.2.0",
48
+ "@modelcontextprotocol/sdk": "^1.29.0",
49
+ "zod": "^4.4.3"
50
+ },
51
+ "devDependencies": {
52
+ "@types/node": "^26.0.0",
53
+ "typescript": "^6.0.3"
54
+ }
55
+ }