simple-dynamsoft-mcp 6.2.0 → 6.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.
@@ -6,7 +6,7 @@
6
6
  "dbr-mobile": {
7
7
  "name": "Dynamsoft Barcode Reader Mobile SDK",
8
8
  "description": "Barcode scanning for mobile platforms (Android/iOS) using Dynamsoft Barcode Reader.",
9
- "version": "11.2.5000",
9
+ "version": "11.4.1000",
10
10
  "default_platform": "android",
11
11
  "default_api_level": "high-level",
12
12
  "snippet_path": "dynamsoft-barcode-reader",
@@ -120,7 +120,7 @@
120
120
  "dbr-server": {
121
121
  "name": "Dynamsoft Barcode Reader Server/Desktop SDK",
122
122
  "description": "Barcode scanning for server/desktop platforms including Python, .NET, Java, C++, and Node.js.",
123
- "version": "11.2.5000",
123
+ "version": "11.4.1000",
124
124
  "default_platform": "python",
125
125
  "snippet_path": "dynamsoft-barcode-reader/server",
126
126
  "platforms": {
@@ -252,6 +252,206 @@
252
252
  }
253
253
  }
254
254
  },
255
+ "dcv-core": {
256
+ "name": "Dynamsoft Capture Vision Core",
257
+ "description": "Unified architecture documentation for Capture Vision capabilities across barcode, MRZ, document normalization, and parsing workflows.",
258
+ "version": "3.4.1000",
259
+ "default_platform": "core",
260
+ "snippet_path": "dynamsoft-capture-vision/core",
261
+ "platforms": {
262
+ "core": {
263
+ "docs": {
264
+ "introduction": "https://www.dynamsoft.com/capture-vision/docs/core/",
265
+ "architecture": "https://www.dynamsoft.com/capture-vision/docs/core/architecture/"
266
+ }
267
+ }
268
+ }
269
+ },
270
+ "dcv-server": {
271
+ "name": "Dynamsoft Capture Vision Server/Desktop SDK",
272
+ "description": "Capture Vision workflows for Python, .NET, Java, C++, and Node.js, including VIN, MRZ, document normalization, and driver license scenarios.",
273
+ "version": "3.4.1000",
274
+ "default_platform": "python",
275
+ "snippet_path": "dynamsoft-capture-vision/server",
276
+ "platforms": {
277
+ "python": {
278
+ "languages": [
279
+ "Python"
280
+ ],
281
+ "docs": {
282
+ "user-guide": "https://www.dynamsoft.com/capture-vision/docs/server/programming/python/user-guide/",
283
+ "api-reference": "https://www.dynamsoft.com/capture-vision/docs/server/programming/python/api-reference/"
284
+ },
285
+ "samples": {
286
+ "repo": "https://github.com/Dynamsoft/capture-vision-python-samples"
287
+ },
288
+ "installation": {
289
+ "pip": "pip install dynamsoft-capture-vision-bundle"
290
+ }
291
+ },
292
+ "dotnet": {
293
+ "languages": [
294
+ "C#"
295
+ ],
296
+ "docs": {
297
+ "user-guide": "https://www.dynamsoft.com/capture-vision/docs/server/programming/dotnet/user-guide/",
298
+ "api-reference": "https://www.dynamsoft.com/capture-vision/docs/server/programming/dotnet/api-reference/"
299
+ },
300
+ "samples": {
301
+ "repo": "https://github.com/Dynamsoft/capture-vision-dotnet-samples"
302
+ }
303
+ },
304
+ "java": {
305
+ "languages": [
306
+ "Java"
307
+ ],
308
+ "docs": {
309
+ "user-guide": "https://www.dynamsoft.com/capture-vision/docs/server/programming/java/user-guide/",
310
+ "api-reference": "https://www.dynamsoft.com/capture-vision/docs/server/programming/java/api-reference/"
311
+ },
312
+ "samples": {
313
+ "repo": "https://github.com/Dynamsoft/capture-vision-java-samples"
314
+ }
315
+ },
316
+ "cpp": {
317
+ "languages": [
318
+ "C++"
319
+ ],
320
+ "docs": {
321
+ "user-guide": "https://www.dynamsoft.com/capture-vision/docs/server/programming/cplusplus/user-guide/",
322
+ "api-reference": "https://www.dynamsoft.com/capture-vision/docs/server/programming/cplusplus/api-reference/"
323
+ },
324
+ "samples": {
325
+ "repo": "https://github.com/Dynamsoft/capture-vision-cpp-samples"
326
+ }
327
+ },
328
+ "nodejs": {
329
+ "languages": [
330
+ "JavaScript",
331
+ "TypeScript"
332
+ ],
333
+ "docs": {
334
+ "user-guide": "https://github.com/Dynamsoft/capture-vision-nodejs-samples#readme",
335
+ "api-reference": "https://www.dynamsoft.com/capture-vision/docs/server/programming/cplusplus/api-reference/"
336
+ },
337
+ "samples": {
338
+ "repo": "https://github.com/Dynamsoft/capture-vision-nodejs-samples"
339
+ },
340
+ "installation": {
341
+ "npm": "npm i dynamsoft-capture-vision-for-node",
342
+ "model": "npm i dynamsoft-capture-vision-for-node-model"
343
+ }
344
+ }
345
+ }
346
+ },
347
+ "dcv-web": {
348
+ "name": "Dynamsoft Capture Vision JavaScript SDK",
349
+ "description": "Capture Vision workflows for JavaScript web apps, including VIN and MRZ processing scenarios.",
350
+ "version": "3.2.5000",
351
+ "default_platform": "web",
352
+ "snippet_path": "dynamsoft-capture-vision/web",
353
+ "platforms": {
354
+ "web": {
355
+ "languages": [
356
+ "JavaScript",
357
+ "TypeScript"
358
+ ],
359
+ "docs": {
360
+ "user-guide": "https://www.dynamsoft.com/capture-vision/docs/web/programming/javascript/user-guide/",
361
+ "api-reference": "https://www.dynamsoft.com/capture-vision/docs/web/programming/javascript/api-reference/"
362
+ },
363
+ "samples": {
364
+ "repo": "https://github.com/Dynamsoft/capture-vision-javascript-samples"
365
+ },
366
+ "installation": {
367
+ "npm": "npm install dynamsoft-capture-vision-bundle"
368
+ }
369
+ }
370
+ }
371
+ },
372
+ "dcv-mobile": {
373
+ "name": "Dynamsoft Capture Vision Mobile SDK",
374
+ "description": "Capture Vision workflows for mobile platforms including Android, iOS, Flutter, React Native, and .NET MAUI.",
375
+ "version": "3.4.1000",
376
+ "default_platform": "android",
377
+ "snippet_path": "dynamsoft-capture-vision/mobile",
378
+ "platforms": {
379
+ "android": {
380
+ "languages": [
381
+ "Kotlin",
382
+ "Java"
383
+ ],
384
+ "docs": {
385
+ "user-guide": "https://www.dynamsoft.com/capture-vision/docs/mobile/programming/android/user-guide/",
386
+ "api-reference": "https://www.dynamsoft.com/capture-vision/docs/mobile/programming/android/api-reference/"
387
+ },
388
+ "samples": {
389
+ "repo": "https://github.com/Dynamsoft/capture-vision-mobile-samples/tree/main/Android"
390
+ }
391
+ },
392
+ "ios": {
393
+ "languages": [
394
+ "Swift",
395
+ "Objective-C"
396
+ ],
397
+ "docs": {
398
+ "user-guide": "https://www.dynamsoft.com/capture-vision/docs/mobile/programming/objectivec-swift/user-guide/",
399
+ "api-reference": "https://www.dynamsoft.com/capture-vision/docs/mobile/programming/objectivec-swift/api-reference/"
400
+ },
401
+ "samples": {
402
+ "repo": "https://github.com/Dynamsoft/capture-vision-mobile-samples/tree/main/ios"
403
+ }
404
+ },
405
+ "flutter": {
406
+ "languages": [
407
+ "Dart"
408
+ ],
409
+ "docs": {
410
+ "user-guide": "https://www.dynamsoft.com/capture-vision/docs/mobile/programming/flutter/user-guide/",
411
+ "api-reference": "https://www.dynamsoft.com/capture-vision/docs/mobile/programming/flutter/api-reference/"
412
+ },
413
+ "samples": {
414
+ "repo": "https://github.com/Dynamsoft/capture-vision-flutter-samples"
415
+ }
416
+ },
417
+ "react-native": {
418
+ "languages": [
419
+ "TypeScript",
420
+ "JavaScript"
421
+ ],
422
+ "docs": {
423
+ "user-guide": "https://www.dynamsoft.com/capture-vision/docs/mobile/programming/react-native/user-guide/",
424
+ "api-reference": "https://www.dynamsoft.com/capture-vision/docs/mobile/programming/react-native/api-reference/"
425
+ },
426
+ "samples": {
427
+ "repo": "https://github.com/Dynamsoft/capture-vision-react-native-samples"
428
+ }
429
+ },
430
+ "maui": {
431
+ "languages": [
432
+ "C#"
433
+ ],
434
+ "docs": {
435
+ "user-guide": "https://www.dynamsoft.com/capture-vision/docs/mobile/programming/maui/user-guide/",
436
+ "api-reference": "https://www.dynamsoft.com/capture-vision/docs/mobile/programming/maui/api-reference/"
437
+ },
438
+ "samples": {
439
+ "repo": "https://github.com/Dynamsoft/capture-vision-maui-samples"
440
+ }
441
+ },
442
+ "spm": {
443
+ "languages": [
444
+ "Swift"
445
+ ],
446
+ "docs": {
447
+ "user-guide": "https://www.dynamsoft.com/capture-vision/docs/mobile/programming/objectivec-swift/user-guide/"
448
+ },
449
+ "samples": {
450
+ "repo": "https://github.com/Dynamsoft/capture-vision-spm"
451
+ }
452
+ }
453
+ }
454
+ },
255
455
  "dwt": {
256
456
  "name": "Dynamic Web TWAIN",
257
457
  "description": "Document scanning SDK for web applications. Supports TWAIN, WIA, ICA, SANE scanners.",
@@ -292,7 +492,7 @@
292
492
  "ddv": {
293
493
  "name": "Dynamsoft Document Viewer",
294
494
  "description": "Browser-based JavaScript SDK for viewing, editing, and annotating documents (PDFs and images).",
295
- "version": "3.x",
495
+ "version": "3.2",
296
496
  "default_platform": "web",
297
497
  "snippet_path": "dynamsoft-document-viewer",
298
498
  "api_docs": "ddv-api-docs.json",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "simple-dynamsoft-mcp",
3
- "version": "6.2.0",
4
- "description": "MCP server for Dynamsoft SDKs - Barcode Reader (Mobile/Python/Web), Dynamic Web TWAIN, and Document Viewer. Provides documentation, code snippets, and API guidance.",
3
+ "version": "6.4.0",
4
+ "description": "MCP server for Dynamsoft SDKs - Capture Vision, Barcode Reader (Mobile/Python/Web), Dynamic Web TWAIN, and Document Viewer. Provides documentation, code snippets, and API guidance.",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
@@ -24,22 +24,30 @@
24
24
  "scripts": {
25
25
  "start": "node src/index.js",
26
26
  "test": "npm run test:fuse",
27
+ "test:unit": "node --test test/unit/gemini-retry.test.js",
27
28
  "test:fuse": "npm run test:stdio && npm run test:http && npm run test:package",
28
29
  "test:local": "node --test test/integration/stdio.test.js test/integration/http-gateway.test.js",
30
+ "test:gemini": "node scripts/run-gemini-tests.mjs",
29
31
  "test:stdio": "node --test test/integration/stdio.test.js",
30
32
  "test:http": "node --test test/integration/http-gateway.test.js",
31
33
  "test:package": "node --test test/integration/package-runtime.test.js",
32
34
  "data:bootstrap": "git submodule sync --recursive && git submodule update --init --recursive --jobs 1",
33
35
  "data:sync": "node scripts/sync-submodules.mjs",
34
36
  "data:status": "git submodule status --recursive",
37
+ "data:versions": "node scripts/update-sdk-versions.mjs",
38
+ "data:versions:strict": "node scripts/update-sdk-versions.mjs --strict",
39
+ "data:verify-versions": "node scripts/update-sdk-versions.mjs --check",
40
+ "data:verify-versions:strict": "node scripts/update-sdk-versions.mjs --check --strict",
35
41
  "data:lock": "node scripts/update-data-lock.mjs",
36
42
  "data:verify-lock": "node scripts/verify-data-lock.mjs",
43
+ "data:verify-docs": "node scripts/verify-doc-resources.mjs",
37
44
  "rag:prebuild": "node scripts/prebuild-rag-index.mjs"
38
45
  },
39
46
  "keywords": [
40
47
  "mcp",
41
48
  "model-context-protocol",
42
49
  "dynamsoft",
50
+ "capture-vision",
43
51
  "barcode-reader",
44
52
  "barcode-scanner",
45
53
  "document-scanner",
@@ -57,6 +65,7 @@
57
65
  "dotenv": "^16.4.5",
58
66
  "extract-zip": "^2.0.1",
59
67
  "fuse.js": "^7.0.0",
68
+ "tar": "^7.5.9",
60
69
  "zod": "~3.24.0"
61
70
  },
62
71
  "devDependencies": {
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createHash } from "node:crypto";
3
3
  import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
4
- import { join, resolve } from "node:path";
4
+ import { basename, join, resolve } from "node:path";
5
5
 
6
6
  function toPosixPath(path) {
7
7
  return path.replace(/\\/g, "/");
@@ -35,18 +35,39 @@ if (!existsSync(cacheDir)) {
35
35
  const cacheFiles = readdirSync(cacheDir, { withFileTypes: true })
36
36
  .filter((entry) => entry.isFile())
37
37
  .map((entry) => join(cacheDir, entry.name))
38
- .filter((path) => path.toLowerCase().endsWith(".json"))
38
+ .filter((path) => {
39
+ const name = basename(path).toLowerCase();
40
+ if (!name.endsWith(".json")) return false;
41
+ if (!name.startsWith("rag-")) return false;
42
+ if (name.endsWith(".checkpoint.json")) return false;
43
+ return true;
44
+ })
39
45
  .sort();
40
46
 
41
47
  if (cacheFiles.length === 0) {
42
48
  throw new Error(`No cache JSON files found in ${cacheDir}.`);
43
49
  }
44
50
 
51
+ let indexSignature = "";
52
+ let indexCacheKey = "";
53
+ const localCacheFile = cacheFiles.find((path) => /rag-local-.*\.json$/i.test(path));
54
+ if (localCacheFile) {
55
+ try {
56
+ const parsed = JSON.parse(readFileSync(localCacheFile, "utf8"));
57
+ indexSignature = String(parsed?.meta?.signature || "");
58
+ indexCacheKey = String(parsed?.cacheKey || "");
59
+ } catch {
60
+ // Keep manifest generation resilient; runtime still validates cache payloads directly.
61
+ }
62
+ }
63
+
45
64
  const manifest = {
46
65
  packageVersion: pkg.version,
47
66
  generatedAt: new Date().toISOString(),
48
67
  ragProvider: ragConfig.provider,
49
- ragModel: ragConfig.localModel,
68
+ ragModel: ragConfig.provider === "gemini" ? ragConfig.geminiModel : ragConfig.localModel,
69
+ indexSignature,
70
+ indexCacheKey,
50
71
  cacheDir: toPosixPath(cacheDir),
51
72
  files: cacheFiles.map((path) => {
52
73
  const stats = statSync(path);
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from "node:child_process";
3
+
4
+ const child = spawn(
5
+ process.execPath,
6
+ ["--test", "test/integration/stdio.test.js", "test/integration/http-gateway.test.js"],
7
+ {
8
+ stdio: "inherit",
9
+ env: {
10
+ ...process.env,
11
+ RUN_FUSE_PROVIDER_TESTS: "false",
12
+ RUN_LOCAL_PROVIDER_TESTS: "false",
13
+ RUN_GEMINI_PROVIDER_TESTS: "true"
14
+ }
15
+ }
16
+ );
17
+
18
+ child.on("exit", (code, signal) => {
19
+ if (signal) {
20
+ process.kill(process.pid, signal);
21
+ return;
22
+ }
23
+ process.exit(code ?? 1);
24
+ });
25
+