threenative-asset-mcp 0.4.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 (150) hide show
  1. package/README.md +441 -0
  2. package/dist/ambientcg/client.d.ts +61 -0
  3. package/dist/ambientcg/client.d.ts.map +1 -0
  4. package/dist/ambientcg/client.js +234 -0
  5. package/dist/ambientcg/client.js.map +1 -0
  6. package/dist/audio/catalog.d.ts +36 -0
  7. package/dist/audio/catalog.d.ts.map +1 -0
  8. package/dist/audio/catalog.js +169 -0
  9. package/dist/audio/catalog.js.map +1 -0
  10. package/dist/audio/client.d.ts +46 -0
  11. package/dist/audio/client.d.ts.map +1 -0
  12. package/dist/audio/client.js +196 -0
  13. package/dist/audio/client.js.map +1 -0
  14. package/dist/bundle/client.d.ts +89 -0
  15. package/dist/bundle/client.d.ts.map +1 -0
  16. package/dist/bundle/client.js +324 -0
  17. package/dist/bundle/client.js.map +1 -0
  18. package/dist/config.d.ts +20 -0
  19. package/dist/config.d.ts.map +1 -0
  20. package/dist/config.js +130 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/download/direct-asset-downloader.d.ts +41 -0
  23. package/dist/download/direct-asset-downloader.d.ts.map +1 -0
  24. package/dist/download/direct-asset-downloader.js +232 -0
  25. package/dist/download/direct-asset-downloader.js.map +1 -0
  26. package/dist/fab/api-download.d.ts +30 -0
  27. package/dist/fab/api-download.d.ts.map +1 -0
  28. package/dist/fab/api-download.js +200 -0
  29. package/dist/fab/api-download.js.map +1 -0
  30. package/dist/fab/browser-transport.d.ts +79 -0
  31. package/dist/fab/browser-transport.d.ts.map +1 -0
  32. package/dist/fab/browser-transport.js +492 -0
  33. package/dist/fab/browser-transport.js.map +1 -0
  34. package/dist/fab/cache.d.ts +22 -0
  35. package/dist/fab/cache.d.ts.map +1 -0
  36. package/dist/fab/cache.js +55 -0
  37. package/dist/fab/cache.js.map +1 -0
  38. package/dist/fab/client.d.ts +61 -0
  39. package/dist/fab/client.d.ts.map +1 -0
  40. package/dist/fab/client.js +868 -0
  41. package/dist/fab/client.js.map +1 -0
  42. package/dist/fab/direct-transport.d.ts +68 -0
  43. package/dist/fab/direct-transport.d.ts.map +1 -0
  44. package/dist/fab/direct-transport.js +184 -0
  45. package/dist/fab/direct-transport.js.map +1 -0
  46. package/dist/fab/download-store.d.ts +21 -0
  47. package/dist/fab/download-store.d.ts.map +1 -0
  48. package/dist/fab/download-store.js +93 -0
  49. package/dist/fab/download-store.js.map +1 -0
  50. package/dist/fab/errors.d.ts +20 -0
  51. package/dist/fab/errors.d.ts.map +1 -0
  52. package/dist/fab/errors.js +65 -0
  53. package/dist/fab/errors.js.map +1 -0
  54. package/dist/fab/impersonate-fetch.d.ts +48 -0
  55. package/dist/fab/impersonate-fetch.d.ts.map +1 -0
  56. package/dist/fab/impersonate-fetch.js +228 -0
  57. package/dist/fab/impersonate-fetch.js.map +1 -0
  58. package/dist/fab/normalize.d.ts +3 -0
  59. package/dist/fab/normalize.d.ts.map +1 -0
  60. package/dist/fab/normalize.js +285 -0
  61. package/dist/fab/normalize.js.map +1 -0
  62. package/dist/fab/schemas.d.ts +10 -0
  63. package/dist/fab/schemas.d.ts.map +1 -0
  64. package/dist/fab/schemas.js +105 -0
  65. package/dist/fab/schemas.js.map +1 -0
  66. package/dist/index.d.ts +3 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +58 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/itch/catalog.d.ts +13 -0
  71. package/dist/itch/catalog.d.ts.map +1 -0
  72. package/dist/itch/catalog.js +50 -0
  73. package/dist/itch/catalog.js.map +1 -0
  74. package/dist/itch/client.d.ts +46 -0
  75. package/dist/itch/client.d.ts.map +1 -0
  76. package/dist/itch/client.js +175 -0
  77. package/dist/itch/client.js.map +1 -0
  78. package/dist/polyhaven/client.d.ts +55 -0
  79. package/dist/polyhaven/client.d.ts.map +1 -0
  80. package/dist/polyhaven/client.js +210 -0
  81. package/dist/polyhaven/client.js.map +1 -0
  82. package/dist/server.d.ts +25 -0
  83. package/dist/server.d.ts.map +1 -0
  84. package/dist/server.js +448 -0
  85. package/dist/server.js.map +1 -0
  86. package/dist/sketchfab/client.d.ts +70 -0
  87. package/dist/sketchfab/client.d.ts.map +1 -0
  88. package/dist/sketchfab/client.js +255 -0
  89. package/dist/sketchfab/client.js.map +1 -0
  90. package/dist/smithsonian/client.d.ts +32 -0
  91. package/dist/smithsonian/client.d.ts.map +1 -0
  92. package/dist/smithsonian/client.js +142 -0
  93. package/dist/smithsonian/client.js.map +1 -0
  94. package/dist/tools/ambientcg.d.ts +296 -0
  95. package/dist/tools/ambientcg.d.ts.map +1 -0
  96. package/dist/tools/ambientcg.js +183 -0
  97. package/dist/tools/ambientcg.js.map +1 -0
  98. package/dist/tools/audio.d.ts +211 -0
  99. package/dist/tools/audio.d.ts.map +1 -0
  100. package/dist/tools/audio.js +156 -0
  101. package/dist/tools/audio.js.map +1 -0
  102. package/dist/tools/bundle.d.ts +237 -0
  103. package/dist/tools/bundle.d.ts.map +1 -0
  104. package/dist/tools/bundle.js +206 -0
  105. package/dist/tools/bundle.js.map +1 -0
  106. package/dist/tools/direct-download.d.ts +53 -0
  107. package/dist/tools/direct-download.d.ts.map +1 -0
  108. package/dist/tools/direct-download.js +68 -0
  109. package/dist/tools/direct-download.js.map +1 -0
  110. package/dist/tools/download-free-asset.d.ts +66 -0
  111. package/dist/tools/download-free-asset.d.ts.map +1 -0
  112. package/dist/tools/download-free-asset.js +60 -0
  113. package/dist/tools/download-free-asset.js.map +1 -0
  114. package/dist/tools/get-asset.d.ts +161 -0
  115. package/dist/tools/get-asset.d.ts.map +1 -0
  116. package/dist/tools/get-asset.js +131 -0
  117. package/dist/tools/get-asset.js.map +1 -0
  118. package/dist/tools/itch.d.ts +120 -0
  119. package/dist/tools/itch.d.ts.map +1 -0
  120. package/dist/tools/itch.js +120 -0
  121. package/dist/tools/itch.js.map +1 -0
  122. package/dist/tools/list-filters.d.ts +127 -0
  123. package/dist/tools/list-filters.d.ts.map +1 -0
  124. package/dist/tools/list-filters.js +68 -0
  125. package/dist/tools/list-filters.js.map +1 -0
  126. package/dist/tools/list-limited-time-free.d.ts +57 -0
  127. package/dist/tools/list-limited-time-free.d.ts.map +1 -0
  128. package/dist/tools/list-limited-time-free.js +47 -0
  129. package/dist/tools/list-limited-time-free.js.map +1 -0
  130. package/dist/tools/polyhaven.d.ts +266 -0
  131. package/dist/tools/polyhaven.d.ts.map +1 -0
  132. package/dist/tools/polyhaven.js +233 -0
  133. package/dist/tools/polyhaven.js.map +1 -0
  134. package/dist/tools/search-assets.d.ts +176 -0
  135. package/dist/tools/search-assets.d.ts.map +1 -0
  136. package/dist/tools/search-assets.js +172 -0
  137. package/dist/tools/search-assets.js.map +1 -0
  138. package/dist/tools/sketchfab.d.ts +325 -0
  139. package/dist/tools/sketchfab.d.ts.map +1 -0
  140. package/dist/tools/sketchfab.js +203 -0
  141. package/dist/tools/sketchfab.js.map +1 -0
  142. package/dist/tools/smithsonian.d.ts +189 -0
  143. package/dist/tools/smithsonian.d.ts.map +1 -0
  144. package/dist/tools/smithsonian.js +189 -0
  145. package/dist/tools/smithsonian.js.map +1 -0
  146. package/dist/tools/source-directory.d.ts +226 -0
  147. package/dist/tools/source-directory.d.ts.map +1 -0
  148. package/dist/tools/source-directory.js +583 -0
  149. package/dist/tools/source-directory.js.map +1 -0
  150. package/package.json +69 -0
@@ -0,0 +1,255 @@
1
+ const API_BASE = "https://api.sketchfab.com/v3";
2
+ export class SketchfabClientError extends Error {
3
+ code;
4
+ retryable;
5
+ constructor(code, message, retryable = false) {
6
+ super(message);
7
+ this.code = code;
8
+ this.retryable = retryable;
9
+ this.name = "SketchfabClientError";
10
+ }
11
+ }
12
+ function record(value) {
13
+ return typeof value === "object" && value !== null && !Array.isArray(value)
14
+ ? value
15
+ : undefined;
16
+ }
17
+ function text(value, max = 12_000) {
18
+ return typeof value === "string" && value.length > 0
19
+ ? value.slice(0, max)
20
+ : undefined;
21
+ }
22
+ function number(value) {
23
+ return typeof value === "number" && Number.isFinite(value)
24
+ ? value
25
+ : undefined;
26
+ }
27
+ function thumbnail(value) {
28
+ const images = record(value)?.images;
29
+ if (!Array.isArray(images))
30
+ return;
31
+ const normalized = images
32
+ .map((image) => record(image))
33
+ .filter((image) => !!image)
34
+ .map((image) => ({
35
+ url: text(image.url, 2_048),
36
+ width: number(image.width) ?? 0,
37
+ }))
38
+ .filter((image) => !!image.url)
39
+ .sort((a, b) => Math.abs(a.width - 512) - Math.abs(b.width - 512));
40
+ return normalized[0]?.url;
41
+ }
42
+ function normalizeArchives(value) {
43
+ const archives = record(value);
44
+ if (!archives)
45
+ return [];
46
+ return Object.entries(archives).flatMap(([format, raw]) => {
47
+ const item = record(raw);
48
+ if (!item)
49
+ return [];
50
+ const sizeBytes = number(item.size);
51
+ const textureCount = number(item.textureCount);
52
+ const textureMaxResolution = number(item.textureMaxResolution);
53
+ const faceCount = number(item.faceCount);
54
+ const vertexCount = number(item.vertexCount);
55
+ return [{
56
+ format,
57
+ ...(sizeBytes !== undefined ? { sizeBytes } : {}),
58
+ ...(textureCount !== undefined ? { textureCount } : {}),
59
+ ...(textureMaxResolution !== undefined ? { textureMaxResolution } : {}),
60
+ ...(faceCount !== undefined ? { faceCount } : {}),
61
+ ...(vertexCount !== undefined ? { vertexCount } : {}),
62
+ }];
63
+ });
64
+ }
65
+ function normalizeModel(value) {
66
+ const item = record(value);
67
+ const id = text(item?.uid, 100);
68
+ const name = text(item?.name, 500);
69
+ const viewerUrl = text(item?.viewerUrl, 2_048);
70
+ if (!id || !name || !viewerUrl) {
71
+ throw new SketchfabClientError("SKETCHFAB_UPSTREAM_CHANGED", "Sketchfab returned invalid model metadata.");
72
+ }
73
+ const user = record(item?.user);
74
+ const license = record(item?.license);
75
+ const username = text(user?.username, 200);
76
+ const description = text(item?.description);
77
+ const embedUrl = text(item?.embedUrl, 2_048);
78
+ const thumb = thumbnail(item?.thumbnails);
79
+ const licenseLabel = text(license?.label, 200);
80
+ const licenseSlug = text(license?.slug, 100);
81
+ const licenseUrl = text(license?.url, 2_048);
82
+ const requirements = text(license?.requirements, 2_000);
83
+ return {
84
+ id,
85
+ name,
86
+ viewerUrl,
87
+ tags: Array.isArray(item?.tags)
88
+ ? item.tags
89
+ .map((tag) => text(record(tag)?.name, 100))
90
+ .filter((tag) => !!tag)
91
+ .slice(0, 100)
92
+ : [],
93
+ categories: Array.isArray(item?.categories)
94
+ ? item.categories
95
+ .map((category) => text(record(category)?.name, 200) ??
96
+ text(record(category)?.slug, 200))
97
+ .filter((category) => !!category)
98
+ .slice(0, 50)
99
+ : [],
100
+ downloadable: item?.isDownloadable === true,
101
+ animated: (number(item?.animationCount) ?? 0) > 0,
102
+ archives: normalizeArchives(item?.archives),
103
+ ...(description ? { description } : {}),
104
+ ...(embedUrl ? { embedUrl } : {}),
105
+ ...(thumb ? { thumbnailUrl: thumb } : {}),
106
+ ...(username
107
+ ? {
108
+ author: {
109
+ username,
110
+ ...(text(user?.uid, 100) ? { id: text(user?.uid, 100) } : {}),
111
+ ...(text(user?.displayName, 200)
112
+ ? { displayName: text(user?.displayName, 200) }
113
+ : {}),
114
+ ...(text(user?.profileUrl, 2_048)
115
+ ? { profileUrl: text(user?.profileUrl, 2_048) }
116
+ : {}),
117
+ },
118
+ }
119
+ : {}),
120
+ ...(licenseLabel
121
+ ? {
122
+ license: {
123
+ label: licenseLabel,
124
+ ...(licenseSlug ? { slug: licenseSlug } : {}),
125
+ ...(licenseUrl ? { url: licenseUrl } : {}),
126
+ ...(requirements ? { requirements } : {}),
127
+ },
128
+ }
129
+ : {}),
130
+ ...(typeof item?.isAgeRestricted === "boolean"
131
+ ? { ageRestricted: item.isAgeRestricted }
132
+ : {}),
133
+ ...(number(item?.faceCount) !== undefined
134
+ ? { faceCount: number(item?.faceCount) }
135
+ : {}),
136
+ ...(number(item?.vertexCount) !== undefined
137
+ ? { vertexCount: number(item?.vertexCount) }
138
+ : {}),
139
+ ...(number(item?.viewCount) !== undefined
140
+ ? { viewCount: number(item?.viewCount) }
141
+ : {}),
142
+ ...(number(item?.likeCount) !== undefined
143
+ ? { likeCount: number(item?.likeCount) }
144
+ : {}),
145
+ ...(number(item?.downloadCount) !== undefined
146
+ ? { downloadCount: number(item?.downloadCount) }
147
+ : {}),
148
+ ...(text(item?.publishedAt, 100)
149
+ ? { publishedAt: text(item?.publishedAt, 100) }
150
+ : {}),
151
+ ...(text(item?.updatedAt, 100)
152
+ ? { updatedAt: text(item?.updatedAt, 100) }
153
+ : {}),
154
+ };
155
+ }
156
+ export class SketchfabClient {
157
+ fetchImpl;
158
+ token;
159
+ constructor(fetchImpl = fetch, options = {}) {
160
+ this.fetchImpl = fetchImpl;
161
+ const token = options.token === undefined
162
+ ? process.env.SKETCHFAB_API_TOKEN
163
+ : options.token;
164
+ if (token?.trim())
165
+ this.token = token.trim();
166
+ }
167
+ async request(path, authenticated = false) {
168
+ if (authenticated && !this.token) {
169
+ throw new SketchfabClientError("SKETCHFAB_AUTH_REQUIRED", "Set SKETCHFAB_API_TOKEN to retrieve Sketchfab download URLs.");
170
+ }
171
+ let response;
172
+ try {
173
+ response = await this.fetchImpl(`${API_BASE}${path}`, {
174
+ headers: {
175
+ accept: "application/json",
176
+ "user-agent": "threenative-asset-mcp/0.4.0",
177
+ ...(this.token ? { authorization: `Token ${this.token}` } : {}),
178
+ },
179
+ signal: AbortSignal.timeout(20_000),
180
+ });
181
+ }
182
+ catch {
183
+ throw new SketchfabClientError("SKETCHFAB_UPSTREAM_UNAVAILABLE", "Sketchfab could not be reached.", true);
184
+ }
185
+ if (response.status === 401) {
186
+ throw new SketchfabClientError("SKETCHFAB_AUTH_REQUIRED", "Sketchfab authentication is required or the configured token is invalid.");
187
+ }
188
+ if (response.status === 403) {
189
+ throw new SketchfabClientError("SKETCHFAB_ACCESS_DENIED", "Sketchfab denied access to this model.");
190
+ }
191
+ if (response.status === 404) {
192
+ throw new SketchfabClientError("SKETCHFAB_NOT_FOUND", "The Sketchfab model was not found.");
193
+ }
194
+ if (response.status === 429) {
195
+ throw new SketchfabClientError("SKETCHFAB_RATE_LIMITED", "Sketchfab rate-limited the request.", true);
196
+ }
197
+ if (!response.ok) {
198
+ throw new SketchfabClientError("SKETCHFAB_UPSTREAM_UNAVAILABLE", `Sketchfab returned HTTP ${response.status}.`, response.status >= 500);
199
+ }
200
+ try {
201
+ return (await response.json());
202
+ }
203
+ catch {
204
+ throw new SketchfabClientError("SKETCHFAB_UPSTREAM_CHANGED", "Sketchfab returned invalid JSON.");
205
+ }
206
+ }
207
+ async search(params) {
208
+ const payload = record(await this.request(`/search?${params}`));
209
+ if (!Array.isArray(payload?.results)) {
210
+ throw new SketchfabClientError("SKETCHFAB_UPSTREAM_CHANGED", "Sketchfab returned an invalid search response.");
211
+ }
212
+ const cursors = record(payload.cursors);
213
+ const nextCursor = text(cursors?.next, 500);
214
+ return {
215
+ models: payload.results.map(normalizeModel),
216
+ ...(nextCursor ? { nextCursor } : {}),
217
+ };
218
+ }
219
+ async getModel(id) {
220
+ return normalizeModel(await this.request(`/models/${encodeURIComponent(id)}`));
221
+ }
222
+ async getDownloads(id) {
223
+ const payload = record(await this.request(`/models/${encodeURIComponent(id)}/download`, true));
224
+ if (!payload) {
225
+ throw new SketchfabClientError("SKETCHFAB_UPSTREAM_CHANGED", "Sketchfab returned invalid download metadata.");
226
+ }
227
+ return Object.entries(payload).flatMap(([format, raw]) => {
228
+ const item = record(raw);
229
+ const url = text(item?.url, 2_048);
230
+ if (!url)
231
+ return [];
232
+ const expiresInSeconds = number(item?.expires);
233
+ const sizeBytes = number(item?.size);
234
+ return [{
235
+ format,
236
+ url,
237
+ ...(expiresInSeconds !== undefined ? { expiresInSeconds } : {}),
238
+ ...(sizeBytes !== undefined ? { sizeBytes } : {}),
239
+ }];
240
+ });
241
+ }
242
+ async listCategories() {
243
+ const payload = record(await this.request("/categories"));
244
+ if (!Array.isArray(payload?.results)) {
245
+ throw new SketchfabClientError("SKETCHFAB_UPSTREAM_CHANGED", "Sketchfab returned an invalid category list.");
246
+ }
247
+ return payload.results.flatMap((raw) => {
248
+ const item = record(raw);
249
+ const name = text(item?.name, 200);
250
+ const slug = text(item?.slug, 200);
251
+ return name && slug ? [{ name, slug }] : [];
252
+ });
253
+ }
254
+ }
255
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/sketchfab/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export declare const SMITHSONIAN_FILE_TYPES: readonly ["jpg", "glb", "ply", "zip"];
2
+ export declare const SMITHSONIAN_MODEL_TYPES: readonly ["glb", "ply", "obj", "gltf", "f3z", "blend", "stl"];
3
+ export declare const SMITHSONIAN_QUALITIES: readonly ["Low", "Medium", "High", "Thumb", "Low_resolution", "Medium_resolution", "Full_resolution", "Water_tight"];
4
+ export interface SmithsonianFile {
5
+ modelId: string;
6
+ title: string;
7
+ url: string;
8
+ fileType: string;
9
+ modelType?: string;
10
+ quality?: string;
11
+ usage?: string;
12
+ dracoCompressed?: boolean;
13
+ gltfOrientationCompliant?: boolean;
14
+ }
15
+ export interface SmithsonianSearchResult {
16
+ files: SmithsonianFile[];
17
+ totalFiles: number;
18
+ }
19
+ export declare class SmithsonianClientError extends Error {
20
+ readonly code: "SMITHSONIAN_INVALID_INPUT" | "SMITHSONIAN_NOT_FOUND" | "SMITHSONIAN_RATE_LIMITED" | "SMITHSONIAN_UPSTREAM_UNAVAILABLE" | "SMITHSONIAN_UPSTREAM_CHANGED";
21
+ readonly retryable: boolean;
22
+ constructor(code: "SMITHSONIAN_INVALID_INPUT" | "SMITHSONIAN_NOT_FOUND" | "SMITHSONIAN_RATE_LIMITED" | "SMITHSONIAN_UPSTREAM_UNAVAILABLE" | "SMITHSONIAN_UPSTREAM_CHANGED", message: string, retryable?: boolean);
23
+ }
24
+ type FetchLike = typeof fetch;
25
+ export declare class SmithsonianClient {
26
+ private readonly fetchImpl;
27
+ constructor(fetchImpl?: FetchLike);
28
+ search(params: URLSearchParams): Promise<SmithsonianSearchResult>;
29
+ listFiles(modelId: string): Promise<SmithsonianFile[]>;
30
+ }
31
+ export {};
32
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/smithsonian/client.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,sBAAsB,YAAI,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAU,CAAC;AAC5E,eAAO,MAAM,uBAAuB,YAClC,KAAK,EACL,KAAK,EACL,KAAK,EACL,MAAM,EACN,KAAK,EACL,OAAO,EACP,KAAK,CACG,CAAC;AACX,eAAO,MAAM,qBAAqB,YAChC,KAAK,EACL,QAAQ,EACR,MAAM,EACN,OAAO,EACP,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,aAAa,CACL,CAAC;AAEX,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAE7C,QAAQ,CAAC,IAAI,EACT,2BAA2B,GAC3B,uBAAuB,GACvB,0BAA0B,GAC1B,kCAAkC,GAClC,8BAA8B;IAElC,QAAQ,CAAC,SAAS;IARpB,YACW,IAAI,EACT,2BAA2B,GAC3B,uBAAuB,GACvB,0BAA0B,GAC1B,kCAAkC,GAClC,8BAA8B,EAClC,OAAO,EAAE,MAAM,EACN,SAAS,UAAQ,EAI3B;CACF;AAED,KAAK,SAAS,GAAG,OAAO,KAAK,CAAC;AAsD9B,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAAtC,YAA6B,SAAS,GAAE,SAAiB,EAAI;IAEvD,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAsDtE;IAEK,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAc3D;CACF"}
@@ -0,0 +1,142 @@
1
+ const API_BASE = "https://3d-api.si.edu/api/v1.0/content/file/search";
2
+ export const SMITHSONIAN_FILE_TYPES = ["jpg", "glb", "ply", "zip"];
3
+ export const SMITHSONIAN_MODEL_TYPES = [
4
+ "glb",
5
+ "ply",
6
+ "obj",
7
+ "gltf",
8
+ "f3z",
9
+ "blend",
10
+ "stl",
11
+ ];
12
+ export const SMITHSONIAN_QUALITIES = [
13
+ "Low",
14
+ "Medium",
15
+ "High",
16
+ "Thumb",
17
+ "Low_resolution",
18
+ "Medium_resolution",
19
+ "Full_resolution",
20
+ "Water_tight",
21
+ ];
22
+ export class SmithsonianClientError extends Error {
23
+ code;
24
+ retryable;
25
+ constructor(code, message, retryable = false) {
26
+ super(message);
27
+ this.code = code;
28
+ this.retryable = retryable;
29
+ this.name = "SmithsonianClientError";
30
+ }
31
+ }
32
+ function record(value) {
33
+ return typeof value === "object" && value !== null && !Array.isArray(value)
34
+ ? value
35
+ : undefined;
36
+ }
37
+ function text(value, max = 2_048) {
38
+ return typeof value === "string" && value.length > 0
39
+ ? value.slice(0, max)
40
+ : undefined;
41
+ }
42
+ function normalizeModelId(value) {
43
+ return value.replace(/^3d_package:/, "");
44
+ }
45
+ function normalizeFile(value) {
46
+ const row = record(value);
47
+ const content = record(row?.content);
48
+ const title = text(row?.title, 500);
49
+ const modelUrl = text(content?.model_url, 200);
50
+ const url = text(content?.uri);
51
+ const fileType = text(content?.file_type, 30);
52
+ if (!title || !modelUrl || !url || !fileType)
53
+ return;
54
+ try {
55
+ const parsed = new URL(url);
56
+ if (parsed.protocol !== "https:" || parsed.hostname !== "3d-api.si.edu") {
57
+ return;
58
+ }
59
+ }
60
+ catch {
61
+ return;
62
+ }
63
+ const modelType = text(content?.model_type, 30);
64
+ const quality = text(content?.quality, 50);
65
+ const usage = text(content?.usage, 100);
66
+ return {
67
+ modelId: normalizeModelId(modelUrl),
68
+ title,
69
+ url,
70
+ fileType,
71
+ ...(modelType ? { modelType } : {}),
72
+ ...(quality ? { quality } : {}),
73
+ ...(usage ? { usage } : {}),
74
+ ...(typeof content?.draco_compressed === "boolean"
75
+ ? { dracoCompressed: content.draco_compressed }
76
+ : {}),
77
+ ...(typeof content?.gltf_orientation_compliant === "boolean"
78
+ ? { gltfOrientationCompliant: content.gltf_orientation_compliant }
79
+ : {}),
80
+ };
81
+ }
82
+ export class SmithsonianClient {
83
+ fetchImpl;
84
+ constructor(fetchImpl = fetch) {
85
+ this.fetchImpl = fetchImpl;
86
+ }
87
+ async search(params) {
88
+ let response;
89
+ try {
90
+ response = await this.fetchImpl(`${API_BASE}?${params}`, {
91
+ headers: {
92
+ accept: "application/json",
93
+ "user-agent": "threenative-asset-mcp/0.4.0",
94
+ },
95
+ signal: AbortSignal.timeout(20_000),
96
+ });
97
+ }
98
+ catch {
99
+ throw new SmithsonianClientError("SMITHSONIAN_UPSTREAM_UNAVAILABLE", "The Smithsonian 3D API could not be reached.", true);
100
+ }
101
+ if (response.status === 404) {
102
+ return { files: [], totalFiles: 0 };
103
+ }
104
+ if (response.status === 429) {
105
+ throw new SmithsonianClientError("SMITHSONIAN_RATE_LIMITED", "The Smithsonian 3D API rate-limited the request.", true);
106
+ }
107
+ if (!response.ok) {
108
+ throw new SmithsonianClientError("SMITHSONIAN_UPSTREAM_UNAVAILABLE", `The Smithsonian 3D API returned HTTP ${response.status}.`, response.status >= 500);
109
+ }
110
+ let payload;
111
+ try {
112
+ payload = record(await response.json());
113
+ }
114
+ catch {
115
+ payload = undefined;
116
+ }
117
+ const rows = payload?.rows;
118
+ const rowCount = payload?.rowCount;
119
+ if (!Array.isArray(rows) || typeof rowCount !== "number") {
120
+ throw new SmithsonianClientError("SMITHSONIAN_UPSTREAM_CHANGED", "The Smithsonian 3D API returned an invalid response.");
121
+ }
122
+ return {
123
+ files: rows
124
+ .map(normalizeFile)
125
+ .filter((file) => file !== undefined),
126
+ totalFiles: rowCount,
127
+ };
128
+ }
129
+ async listFiles(modelId) {
130
+ const params = new URLSearchParams({
131
+ model_url: normalizeModelId(modelId),
132
+ start: "0",
133
+ rows: "1000",
134
+ });
135
+ const result = await this.search(params);
136
+ if (result.files.length === 0) {
137
+ throw new SmithsonianClientError("SMITHSONIAN_NOT_FOUND", "The Smithsonian 3D model was not found.");
138
+ }
139
+ return result.files;
140
+ }
141
+ }
142
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/smithsonian/client.ts"],"names":[],"mappings":"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"}