@sync.so/mcp-server 0.1.3 → 0.2.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 (261) hide show
  1. package/README.md +261 -86
  2. package/deploy/generation-status/app.html.gz +0 -0
  3. package/deploy/generation-status/release.json +6 -0
  4. package/dist/abort-signals.d.ts +6 -0
  5. package/dist/abort-signals.d.ts.map +1 -0
  6. package/dist/abort-signals.js +23 -0
  7. package/dist/account-features.d.ts +7 -0
  8. package/dist/account-features.d.ts.map +1 -0
  9. package/dist/account-features.js +48 -0
  10. package/dist/app-upload-relay.d.ts +13 -0
  11. package/dist/app-upload-relay.d.ts.map +1 -0
  12. package/dist/app-upload-relay.js +136 -0
  13. package/dist/asset-thumbnail.d.ts +3 -0
  14. package/dist/asset-thumbnail.d.ts.map +1 -0
  15. package/dist/asset-thumbnail.js +2 -0
  16. package/dist/auth/async-context.d.ts +5 -0
  17. package/dist/auth/async-context.d.ts.map +1 -0
  18. package/dist/auth/async-context.js +14 -0
  19. package/dist/auth/bearer-auth.d.ts +16 -0
  20. package/dist/auth/bearer-auth.d.ts.map +1 -0
  21. package/dist/auth/bearer-auth.js +55 -0
  22. package/dist/auth/client-credentials.d.ts +13 -0
  23. package/dist/auth/client-credentials.d.ts.map +1 -0
  24. package/dist/auth/client-credentials.js +67 -0
  25. package/dist/auth/device-auth.d.ts.map +1 -1
  26. package/dist/auth/device-auth.js +3 -2
  27. package/dist/auth/fixture-cleanup.d.ts +4 -0
  28. package/dist/auth/fixture-cleanup.d.ts.map +1 -0
  29. package/dist/auth/fixture-cleanup.js +9 -0
  30. package/dist/auth/index.d.ts +2 -0
  31. package/dist/auth/index.d.ts.map +1 -1
  32. package/dist/auth/index.js +2 -0
  33. package/dist/auth/oauth-diagnostics.d.ts +11 -0
  34. package/dist/auth/oauth-diagnostics.d.ts.map +1 -0
  35. package/dist/auth/oauth-diagnostics.js +78 -0
  36. package/dist/auth/oauth-provider.d.ts +16 -0
  37. package/dist/auth/oauth-provider.d.ts.map +1 -0
  38. package/dist/auth/oauth-provider.js +107 -0
  39. package/dist/auth/resource-metadata.d.ts +2 -0
  40. package/dist/auth/resource-metadata.d.ts.map +1 -0
  41. package/dist/auth/resource-metadata.js +3 -0
  42. package/dist/auth/token-verification.d.ts +11 -0
  43. package/dist/auth/token-verification.d.ts.map +1 -0
  44. package/dist/auth/token-verification.js +99 -0
  45. package/dist/auth/verification-cache.d.ts +8 -0
  46. package/dist/auth/verification-cache.d.ts.map +1 -0
  47. package/dist/auth/verification-cache.js +111 -0
  48. package/dist/chatgpt-analytics.d.ts +22 -0
  49. package/dist/chatgpt-analytics.d.ts.map +1 -0
  50. package/dist/chatgpt-analytics.js +172 -0
  51. package/dist/chatgpt-app.d.ts +15 -0
  52. package/dist/chatgpt-app.d.ts.map +1 -0
  53. package/dist/chatgpt-app.js +133 -0
  54. package/dist/chatgpt-release.d.ts +12 -0
  55. package/dist/chatgpt-release.d.ts.map +1 -0
  56. package/dist/chatgpt-release.js +30 -0
  57. package/dist/cli.js +30 -16
  58. package/dist/client-profile.d.ts +10 -0
  59. package/dist/client-profile.d.ts.map +1 -0
  60. package/dist/client-profile.js +45 -0
  61. package/dist/config.d.ts +17 -0
  62. package/dist/config.d.ts.map +1 -1
  63. package/dist/config.js +52 -0
  64. package/dist/generation-status-html.d.ts +2 -0
  65. package/dist/generation-status-html.d.ts.map +1 -0
  66. package/dist/generation-status-html.js +26 -0
  67. package/dist/generation-status.d.ts +6 -0
  68. package/dist/generation-status.d.ts.map +1 -0
  69. package/dist/generation-status.js +37 -0
  70. package/dist/http-client.d.ts +45 -1
  71. package/dist/http-client.d.ts.map +1 -1
  72. package/dist/http-client.js +171 -34
  73. package/dist/http-server.d.ts +53 -0
  74. package/dist/http-server.d.ts.map +1 -0
  75. package/dist/http-server.js +753 -0
  76. package/dist/http-session.d.ts +18 -0
  77. package/dist/http-session.d.ts.map +1 -0
  78. package/dist/http-session.js +189 -0
  79. package/dist/index.d.ts +4 -3
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +3 -2
  82. package/dist/oauth-response.d.ts +3 -0
  83. package/dist/oauth-response.d.ts.map +1 -0
  84. package/dist/oauth-response.js +30 -0
  85. package/dist/openapi/index.d.ts +2 -2
  86. package/dist/openapi/index.d.ts.map +1 -1
  87. package/dist/openapi/index.js +1 -1
  88. package/dist/openapi/parser.d.ts +2 -0
  89. package/dist/openapi/parser.d.ts.map +1 -1
  90. package/dist/openapi/parser.js +41 -1
  91. package/dist/openapi/types.d.ts +3 -0
  92. package/dist/openapi/types.d.ts.map +1 -1
  93. package/dist/organization-selection.d.ts +61 -0
  94. package/dist/organization-selection.d.ts.map +1 -0
  95. package/dist/organization-selection.js +142 -0
  96. package/dist/rate-limits.d.ts +13 -0
  97. package/dist/rate-limits.d.ts.map +1 -0
  98. package/dist/rate-limits.js +67 -0
  99. package/dist/revision.d.ts +6 -0
  100. package/dist/revision.d.ts.map +1 -0
  101. package/dist/revision.js +17 -0
  102. package/dist/runtime-diagnostics.d.ts +32 -0
  103. package/dist/runtime-diagnostics.d.ts.map +1 -0
  104. package/dist/runtime-diagnostics.js +58 -0
  105. package/dist/server.d.ts +23 -2
  106. package/dist/server.d.ts.map +1 -1
  107. package/dist/server.js +893 -32
  108. package/dist/session-registry.d.ts +54 -0
  109. package/dist/session-registry.d.ts.map +1 -0
  110. package/dist/session-registry.js +202 -0
  111. package/dist/session-telemetry.d.ts +13 -0
  112. package/dist/session-telemetry.d.ts.map +1 -0
  113. package/dist/session-telemetry.js +87 -0
  114. package/dist/spend-confirmation.d.ts +21 -0
  115. package/dist/spend-confirmation.d.ts.map +1 -0
  116. package/dist/spend-confirmation.js +105 -0
  117. package/dist/tool-analytics-context.d.ts +11 -0
  118. package/dist/tool-analytics-context.d.ts.map +1 -0
  119. package/dist/tool-analytics-context.js +8 -0
  120. package/dist/tool-names.d.ts +35 -0
  121. package/dist/tool-names.d.ts.map +1 -0
  122. package/dist/tool-names.js +133 -0
  123. package/dist/tools/account-context.d.ts +5 -0
  124. package/dist/tools/account-context.d.ts.map +1 -0
  125. package/dist/tools/account-context.js +131 -0
  126. package/dist/tools/account-management.d.ts +4 -0
  127. package/dist/tools/account-management.d.ts.map +1 -0
  128. package/dist/tools/account-management.js +111 -0
  129. package/dist/tools/app-tools.d.ts +31 -0
  130. package/dist/tools/app-tools.d.ts.map +1 -0
  131. package/dist/tools/app-tools.js +350 -0
  132. package/dist/tools/asset-analysis.d.ts +4 -0
  133. package/dist/tools/asset-analysis.d.ts.map +1 -0
  134. package/dist/tools/asset-analysis.js +172 -0
  135. package/dist/tools/asset-creators.d.ts +4 -0
  136. package/dist/tools/asset-creators.d.ts.map +1 -0
  137. package/dist/tools/asset-creators.js +38 -0
  138. package/dist/tools/audio-trim.d.ts +6 -0
  139. package/dist/tools/audio-trim.d.ts.map +1 -0
  140. package/dist/tools/audio-trim.js +79 -0
  141. package/dist/tools/batch-results.d.ts +16 -0
  142. package/dist/tools/batch-results.d.ts.map +1 -0
  143. package/dist/tools/batch-results.js +103 -0
  144. package/dist/tools/batches.d.ts +28 -0
  145. package/dist/tools/batches.d.ts.map +1 -0
  146. package/dist/tools/batches.js +293 -0
  147. package/dist/tools/dialogue.d.ts +6 -0
  148. package/dist/tools/dialogue.d.ts.map +1 -0
  149. package/dist/tools/dialogue.js +309 -0
  150. package/dist/tools/estimate-duration.d.ts +35 -0
  151. package/dist/tools/estimate-duration.d.ts.map +1 -0
  152. package/dist/tools/estimate-duration.js +66 -0
  153. package/dist/tools/feedback.d.ts +14 -0
  154. package/dist/tools/feedback.d.ts.map +1 -0
  155. package/dist/tools/feedback.js +72 -0
  156. package/dist/tools/generated-adapters.d.ts +25 -0
  157. package/dist/tools/generated-adapters.d.ts.map +1 -0
  158. package/dist/tools/generated-adapters.js +143 -0
  159. package/dist/tools/generation-context.d.ts +14 -0
  160. package/dist/tools/generation-context.d.ts.map +1 -0
  161. package/dist/tools/generation-context.js +39 -0
  162. package/dist/tools/generation-continuation.d.ts +4 -0
  163. package/dist/tools/generation-continuation.d.ts.map +1 -0
  164. package/dist/tools/generation-continuation.js +124 -0
  165. package/dist/tools/generation-costs.d.ts +6 -0
  166. package/dist/tools/generation-costs.d.ts.map +1 -0
  167. package/dist/tools/generation-costs.js +67 -0
  168. package/dist/tools/generation-output.d.ts +3 -0
  169. package/dist/tools/generation-output.d.ts.map +1 -0
  170. package/dist/tools/generation-output.js +39 -0
  171. package/dist/tools/generator.d.ts +35 -2
  172. package/dist/tools/generator.d.ts.map +1 -1
  173. package/dist/tools/generator.js +127 -9
  174. package/dist/tools/job-status.d.ts +35 -0
  175. package/dist/tools/job-status.d.ts.map +1 -0
  176. package/dist/tools/job-status.js +92 -0
  177. package/dist/tools/job-wait.d.ts +41 -0
  178. package/dist/tools/job-wait.d.ts.map +1 -0
  179. package/dist/tools/job-wait.js +84 -0
  180. package/dist/tools/jobs.d.ts +3 -0
  181. package/dist/tools/jobs.d.ts.map +1 -0
  182. package/dist/tools/jobs.js +210 -0
  183. package/dist/tools/media-upload.d.ts +27 -0
  184. package/dist/tools/media-upload.d.ts.map +1 -0
  185. package/dist/tools/media-upload.js +247 -0
  186. package/dist/tools/model-options.d.ts +36 -0
  187. package/dist/tools/model-options.d.ts.map +1 -0
  188. package/dist/tools/model-options.js +48 -0
  189. package/dist/tools/organization-choice.d.ts +9 -0
  190. package/dist/tools/organization-choice.d.ts.map +1 -0
  191. package/dist/tools/organization-choice.js +136 -0
  192. package/dist/tools/organizations.d.ts +56 -0
  193. package/dist/tools/organizations.d.ts.map +1 -0
  194. package/dist/tools/organizations.js +235 -0
  195. package/dist/tools/output-schemas.d.ts +54 -0
  196. package/dist/tools/output-schemas.d.ts.map +1 -0
  197. package/dist/tools/output-schemas.js +58 -0
  198. package/dist/tools/overrides.d.ts +3 -0
  199. package/dist/tools/overrides.d.ts.map +1 -1
  200. package/dist/tools/overrides.js +113 -15
  201. package/dist/tools/playback-metadata.d.ts +4 -0
  202. package/dist/tools/playback-metadata.d.ts.map +1 -0
  203. package/dist/tools/playback-metadata.js +51 -0
  204. package/dist/tools/project-destination.d.ts +13 -0
  205. package/dist/tools/project-destination.d.ts.map +1 -0
  206. package/dist/tools/project-destination.js +45 -0
  207. package/dist/tools/project-history.d.ts +6 -0
  208. package/dist/tools/project-history.d.ts.map +1 -0
  209. package/dist/tools/project-history.js +45 -0
  210. package/dist/tools/project-intent.d.ts +8 -0
  211. package/dist/tools/project-intent.d.ts.map +1 -0
  212. package/dist/tools/project-intent.js +87 -0
  213. package/dist/tools/running-submissions.d.ts +7 -0
  214. package/dist/tools/running-submissions.d.ts.map +1 -0
  215. package/dist/tools/running-submissions.js +91 -0
  216. package/dist/tools/speech.d.ts +6 -0
  217. package/dist/tools/speech.d.ts.map +1 -0
  218. package/dist/tools/speech.js +116 -0
  219. package/dist/tools/studio-draft.d.ts +7 -0
  220. package/dist/tools/studio-draft.d.ts.map +1 -0
  221. package/dist/tools/studio-draft.js +195 -0
  222. package/dist/tools/studio-view-contract.d.ts +184 -0
  223. package/dist/tools/studio-view-contract.d.ts.map +1 -0
  224. package/dist/tools/studio-view-contract.js +67 -0
  225. package/dist/tools/studio-view.d.ts +6 -0
  226. package/dist/tools/studio-view.d.ts.map +1 -0
  227. package/dist/tools/studio-view.js +126 -0
  228. package/dist/tools/timeline-lipsync.d.ts +316 -0
  229. package/dist/tools/timeline-lipsync.d.ts.map +1 -0
  230. package/dist/tools/timeline-lipsync.js +304 -0
  231. package/dist/tools/translation-preview.d.ts +8 -0
  232. package/dist/tools/translation-preview.d.ts.map +1 -0
  233. package/dist/tools/translation-preview.js +146 -0
  234. package/dist/tools/translation.d.ts +6 -0
  235. package/dist/tools/translation.d.ts.map +1 -0
  236. package/dist/tools/translation.js +131 -0
  237. package/dist/tools/upload-widget.d.ts +13 -0
  238. package/dist/tools/upload-widget.d.ts.map +1 -0
  239. package/dist/tools/upload-widget.js +788 -0
  240. package/dist/toolsets.d.ts +18 -0
  241. package/dist/toolsets.d.ts.map +1 -0
  242. package/dist/toolsets.js +157 -0
  243. package/dist/update-check.d.ts +38 -0
  244. package/dist/update-check.d.ts.map +1 -0
  245. package/dist/update-check.js +150 -0
  246. package/dist/upload-runtime.d.ts +45 -0
  247. package/dist/upload-runtime.d.ts.map +1 -0
  248. package/dist/upload-runtime.js +156 -0
  249. package/dist/upload-source.d.ts +4 -0
  250. package/dist/upload-source.d.ts.map +1 -0
  251. package/dist/upload-source.js +46 -0
  252. package/dist/version.d.ts +2 -0
  253. package/dist/version.d.ts.map +1 -0
  254. package/dist/version.js +3 -0
  255. package/package.json +79 -33
  256. package/dist/openapi/parser.test.d.ts +0 -2
  257. package/dist/openapi/parser.test.d.ts.map +0 -1
  258. package/dist/openapi/parser.test.js +0 -188
  259. package/dist/tools/generator.test.d.ts +0 -2
  260. package/dist/tools/generator.test.d.ts.map +0 -1
  261. package/dist/tools/generator.test.js +0 -178
package/package.json CHANGED
@@ -1,29 +1,35 @@
1
1
  {
2
2
  "name": "@sync.so/mcp-server",
3
- "version": "0.1.3",
3
+ "version": "0.2.0",
4
4
  "description": "MCP server for the Sync API — give AI agents the ability to create lipsync videos, manage assets, and more",
5
5
  "keywords": [
6
+ "ai",
7
+ "lipsync",
6
8
  "mcp",
9
+ "model-context-protocol",
7
10
  "sync",
8
- "lipsync",
9
- "ai",
10
- "video",
11
- "model-context-protocol"
11
+ "video"
12
12
  ],
13
+ "homepage": "https://sync.so/docs",
14
+ "bugs": {
15
+ "url": "https://github.com/synchronicity-labs/mcp-server/issues"
16
+ },
13
17
  "license": "MIT",
14
18
  "repository": {
15
19
  "type": "git",
16
20
  "url": "https://github.com/synchronicity-labs/mcp-server.git"
17
21
  },
18
- "homepage": "https://sync.so/docs",
19
- "bugs": {
20
- "url": "https://github.com/synchronicity-labs/mcp-server/issues"
21
- },
22
- "type": "module",
23
22
  "bin": {
24
- "sync-mcp": "./dist/cli.js",
25
- "mcp-server": "./dist/cli.js"
23
+ "mcp-server": "./dist/cli.js",
24
+ "sync-mcp": "./dist/cli.js"
26
25
  },
26
+ "files": [
27
+ "dist",
28
+ "deploy/generation-status",
29
+ "README.md",
30
+ "LICENSE"
31
+ ],
32
+ "type": "module",
27
33
  "main": "./dist/index.js",
28
34
  "types": "./dist/index.d.ts",
29
35
  "exports": {
@@ -33,34 +39,74 @@
33
39
  "types": "./dist/index.d.ts"
34
40
  }
35
41
  },
36
- "files": [
37
- "dist",
38
- "README.md",
39
- "LICENSE"
40
- ],
41
- "engines": {
42
- "node": ">=18.0.0"
43
- },
44
42
  "scripts": {
45
- "build": "tsc -b && chmod +x dist/cli.js",
43
+ "build": "tsc -b tsconfig.build.json && chmod +x dist/cli.js",
44
+ "package:chatgpt": "node scripts/package-chatgpt.mjs",
45
+ "verify:chatgpt-package": "node scripts/verify-chatgpt-package.mjs",
46
+ "package:plugin": "node scripts/package-plugin.mjs",
47
+ "verify:plugin": "node scripts/verify-plugin-package.mjs",
48
+ "skills:update": "node scripts/update-plugin-skills.mjs",
46
49
  "clean": "rm -rf dist .cache",
47
- "dev": "tsc -b --watch",
48
- "lint": "biome check ./src",
49
- "lint:fix": "biome check --fix ./src",
50
- "format": "biome format --write ./src",
50
+ "dev": "tsc -b tsconfig.build.json --watch",
51
+ "lint": "oxlint src scripts && oxfmt --check",
52
+ "knip": "knip && knip --cycles",
53
+ "lint:fix": "oxlint --fix src scripts && oxfmt",
54
+ "format": "oxfmt",
51
55
  "test": "vitest run",
56
+ "test:memory": "node --expose-gc --max-old-space-size=512 scripts/verify-session-memory.mjs",
57
+ "test:memory:http": "node --expose-gc --max-old-space-size=512 scripts/verify-http-memory.mjs",
52
58
  "test:watch": "vitest",
53
59
  "typecheck": "tsc --noEmit --emitDeclarationOnly false",
54
- "prepublishOnly": "npm run build"
60
+ "prepublishOnly": "pnpm run clean && pnpm run build",
61
+ "test:browser": "vitest run --config vitest.browser.config.ts",
62
+ "monitor:mcp": "node scripts/check-mcp.mjs",
63
+ "prepare": "husky",
64
+ "test:scripts": "node --test scripts/*.test.mjs",
65
+ "capture:wire": "node scripts/capture-wire.mjs"
55
66
  },
56
67
  "dependencies": {
57
- "@modelcontextprotocol/sdk": "^1.27.1",
58
- "zod": "^4.1.13"
68
+ "@modelcontextprotocol/client": "2.4.0",
69
+ "@modelcontextprotocol/core": "2.4.0",
70
+ "@modelcontextprotocol/node": "2.1.2",
71
+ "@modelcontextprotocol/server": "2.4.0",
72
+ "@modelcontextprotocol/server-legacy": "2.4.0",
73
+ "cors": "^2.8.6",
74
+ "express": "^5.3.0",
75
+ "express-rate-limit": "^8.7.2",
76
+ "ipaddr.js": "^2.5.0",
77
+ "undici": "^8.12.2",
78
+ "zod": "^4.6.7"
59
79
  },
60
80
  "devDependencies": {
61
- "@biomejs/biome": "^2.3.7",
62
- "@types/node": "^22.5.0",
63
- "typescript": "^5.9.3",
64
- "vitest": "^4.0.12"
65
- }
81
+ "@playwright/test": "1.64.1",
82
+ "@types/cors": "^2.8.19",
83
+ "@types/express": "^5.0.6",
84
+ "@types/node": "^26.6.0",
85
+ "husky": "^9.1.7",
86
+ "knip": "6.44.0",
87
+ "lint-staged": "^17.6.0",
88
+ "oxfmt": "0.75.0",
89
+ "oxlint": "1.90.0",
90
+ "oxlint-tsgolint": "7.0.2005",
91
+ "typescript": "^7.0.2",
92
+ "vitest": "5.0.5"
93
+ },
94
+ "lint-staged": {
95
+ "package.json": "oxfmt --check --no-error-on-unmatched-pattern",
96
+ "*.{js,ts,mjs,cjs,mts,cts}": [
97
+ "oxlint --no-error-on-unmatched-pattern",
98
+ "oxfmt --check --no-error-on-unmatched-pattern"
99
+ ]
100
+ },
101
+ "devEngines": {
102
+ "runtime": {
103
+ "name": "node",
104
+ "version": ">=26.0.0",
105
+ "onFail": "error"
106
+ }
107
+ },
108
+ "engines": {
109
+ "node": ">=22.19.0"
110
+ },
111
+ "packageManager": "pnpm@12.14.0"
66
112
  }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=parser.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parser.test.d.ts","sourceRoot":"","sources":["../../src/openapi/parser.test.ts"],"names":[],"mappings":""}
@@ -1,188 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { parseSpec, resolveRef, resolveSchemaRefs } from './parser.js';
3
- const MINIMAL_SPEC = {
4
- openapi: '3.1.0',
5
- paths: {
6
- '/v2/generate': {
7
- post: {
8
- operationId: 'GenerateController_createGeneration',
9
- summary: 'Create a generation',
10
- tags: ['Generate'],
11
- parameters: [],
12
- requestBody: {
13
- content: {
14
- 'application/json': {
15
- schema: {
16
- type: 'object',
17
- properties: {
18
- model: { type: 'string' },
19
- input: { type: 'array', items: { type: 'object' } },
20
- },
21
- required: ['model', 'input'],
22
- },
23
- },
24
- },
25
- },
26
- },
27
- },
28
- '/v2/generate/{id}': {
29
- get: {
30
- operationId: 'GenerateController_getGeneration',
31
- summary: 'Get a generation by ID',
32
- tags: ['Generate'],
33
- parameters: [
34
- {
35
- name: 'id',
36
- in: 'path',
37
- required: true,
38
- schema: { type: 'string' },
39
- },
40
- ],
41
- },
42
- },
43
- '/v2/internal/something': {
44
- get: {
45
- operationId: 'InternalController_doSomething',
46
- summary: 'Internal endpoint',
47
- tags: ['internal'],
48
- parameters: [],
49
- },
50
- },
51
- },
52
- };
53
- describe('parseSpec', () => {
54
- it('parses operations from OpenAPI spec', () => {
55
- const operations = parseSpec(MINIMAL_SPEC);
56
- expect(operations).toHaveLength(2);
57
- });
58
- it('extracts operation details correctly', () => {
59
- const operations = parseSpec(MINIMAL_SPEC);
60
- const createOp = operations.find((op) => op.operationId === 'GenerateController_createGeneration');
61
- expect(createOp).toBeDefined();
62
- expect(createOp?.method).toBe('post');
63
- expect(createOp?.path).toBe('/v2/generate');
64
- expect(createOp?.summary).toBe('Create a generation');
65
- expect(createOp?.requestBody).toBeDefined();
66
- });
67
- it('parses path parameters', () => {
68
- const operations = parseSpec(MINIMAL_SPEC);
69
- const getOp = operations.find((op) => op.operationId === 'GenerateController_getGeneration');
70
- expect(getOp).toBeDefined();
71
- expect(getOp?.parameters).toHaveLength(1);
72
- expect(getOp?.parameters[0]?.name).toBe('id');
73
- expect(getOp?.parameters[0]?.in).toBe('path');
74
- expect(getOp?.parameters[0]?.required).toBe(true);
75
- });
76
- it('filters out internal-tagged endpoints', () => {
77
- const operations = parseSpec(MINIMAL_SPEC);
78
- const internalOp = operations.find((op) => op.operationId === 'InternalController_doSomething');
79
- expect(internalOp).toBeUndefined();
80
- });
81
- it('skips operations without operationId', () => {
82
- const spec = {
83
- openapi: '3.1.0',
84
- paths: {
85
- '/v2/test': {
86
- get: {
87
- summary: 'No operation ID',
88
- tags: ['Test'],
89
- },
90
- },
91
- },
92
- };
93
- const operations = parseSpec(spec);
94
- expect(operations).toHaveLength(0);
95
- });
96
- it('detects multipart endpoints', () => {
97
- const spec = {
98
- openapi: '3.1.0',
99
- paths: {
100
- '/v2/upload': {
101
- post: {
102
- operationId: 'UploadController_upload',
103
- summary: 'Upload a file',
104
- tags: ['Upload'],
105
- parameters: [],
106
- requestBody: {
107
- content: {
108
- 'multipart/form-data': {
109
- schema: { type: 'object' },
110
- },
111
- },
112
- },
113
- },
114
- },
115
- },
116
- };
117
- const operations = parseSpec(spec);
118
- expect(operations[0]?.isMultipart).toBe(true);
119
- });
120
- });
121
- describe('resolveRef', () => {
122
- it('resolves $ref to component schemas', () => {
123
- const spec = {
124
- openapi: '3.1.0',
125
- paths: {},
126
- components: {
127
- schemas: {
128
- MyModel: { type: 'object', properties: { name: { type: 'string' } } },
129
- },
130
- },
131
- };
132
- const resolved = resolveRef(spec, '#/components/schemas/MyModel');
133
- expect(resolved).toEqual({
134
- type: 'object',
135
- properties: { name: { type: 'string' } },
136
- });
137
- });
138
- });
139
- describe('resolveSchemaRefs', () => {
140
- const spec = {
141
- openapi: '3.1.0',
142
- paths: {},
143
- components: {
144
- schemas: {
145
- Status: { type: 'string', enum: ['pending', 'completed'] },
146
- },
147
- },
148
- };
149
- it('resolves $ref in schema', () => {
150
- const schema = { $ref: '#/components/schemas/Status' };
151
- const resolved = resolveSchemaRefs(schema, spec);
152
- expect(resolved).toEqual({
153
- type: 'string',
154
- enum: ['pending', 'completed'],
155
- });
156
- });
157
- it('passes through schemas without $ref', () => {
158
- const schema = { type: 'string' };
159
- const resolved = resolveSchemaRefs(schema, spec);
160
- expect(resolved).toEqual({ type: 'string' });
161
- });
162
- it('resolves nested $ref in properties', () => {
163
- const schema = {
164
- type: 'object',
165
- properties: {
166
- status: { $ref: '#/components/schemas/Status' },
167
- },
168
- };
169
- const resolved = resolveSchemaRefs(schema, spec);
170
- expect(resolved).toEqual({
171
- type: 'object',
172
- properties: {
173
- status: { type: 'string', enum: ['pending', 'completed'] },
174
- },
175
- });
176
- });
177
- it('resolves $ref in additionalProperties', () => {
178
- const schema = {
179
- type: 'object',
180
- additionalProperties: { $ref: '#/components/schemas/Status' },
181
- };
182
- const resolved = resolveSchemaRefs(schema, spec);
183
- expect(resolved).toEqual({
184
- type: 'object',
185
- additionalProperties: { type: 'string', enum: ['pending', 'completed'] },
186
- });
187
- });
188
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=generator.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generator.test.d.ts","sourceRoot":"","sources":["../../src/tools/generator.test.ts"],"names":[],"mappings":""}
@@ -1,178 +0,0 @@
1
- import { describe, expect, it, vi } from 'vitest';
2
- import { generateTools, operationIdToToolName } from './generator.js';
3
- describe('operationIdToToolName', () => {
4
- it('converts controller operation IDs to tool names', () => {
5
- expect(operationIdToToolName('GenerateController_createGeneration')).toBe('generate_create-generation');
6
- expect(operationIdToToolName('AssetsController_getAll')).toBe('assets_get-all');
7
- expect(operationIdToToolName('ModelsController_getPublic')).toBe('models_get-public');
8
- });
9
- it('kebab-cases multi-word controller names', () => {
10
- expect(operationIdToToolName('DeviceAuthController_start')).toBe('device-auth_start');
11
- expect(operationIdToToolName('AssetMetadataController_getAll')).toBe('asset-metadata_get-all');
12
- });
13
- it('handles single-part operation IDs', () => {
14
- expect(operationIdToToolName('createSomething')).toBe('create-something');
15
- });
16
- });
17
- describe('generateTools', () => {
18
- const mockHttpClient = {
19
- request: vi.fn().mockResolvedValue({ id: 'gen-123' }),
20
- };
21
- const operations = [
22
- {
23
- operationId: 'GenerateController_createGeneration',
24
- method: 'post',
25
- path: '/v2/generate',
26
- summary: 'Create a generation',
27
- tags: ['Generate'],
28
- parameters: [],
29
- requestBody: {
30
- schema: {
31
- type: 'object',
32
- properties: {
33
- model: { type: 'string' },
34
- },
35
- required: ['model'],
36
- },
37
- contentType: 'application/json',
38
- },
39
- isMultipart: false,
40
- },
41
- {
42
- operationId: 'GenerateController_getGeneration',
43
- method: 'get',
44
- path: '/v2/generate/{id}',
45
- summary: 'Get a generation by ID',
46
- tags: ['Generate'],
47
- parameters: [
48
- {
49
- name: 'id',
50
- in: 'path',
51
- required: true,
52
- schema: { type: 'string' },
53
- },
54
- ],
55
- isMultipart: false,
56
- },
57
- ];
58
- it('generates tools from operations', () => {
59
- const tools = generateTools(operations, mockHttpClient);
60
- expect(tools).toHaveLength(2);
61
- expect(tools[0]?.name).toBe('generate_create-generation');
62
- expect(tools[1]?.name).toBe('generate_get-generation');
63
- });
64
- it('uses overrides for known tools', () => {
65
- const tools = generateTools(operations, mockHttpClient);
66
- expect(tools[0]?.description).toContain('lipsync video');
67
- });
68
- it('handler calls httpClient with correct params', async () => {
69
- const tools = generateTools(operations, mockHttpClient);
70
- await tools[0]?.handler({ model: 'sync-1.9.0-beta' });
71
- expect(mockHttpClient.request).toHaveBeenCalledWith('post', '/v2/generate', {
72
- query: undefined,
73
- body: { model: 'sync-1.9.0-beta' },
74
- });
75
- });
76
- it('handler substitutes path parameters', async () => {
77
- const tools = generateTools(operations, mockHttpClient);
78
- await tools[1]?.handler({ id: 'gen-456' });
79
- expect(mockHttpClient.request).toHaveBeenCalledWith('get', '/v2/generate/gen-456', {
80
- query: undefined,
81
- body: undefined,
82
- });
83
- });
84
- it('handler builds query parameters', async () => {
85
- const opWithQuery = [
86
- {
87
- operationId: 'AssetsController_getAll',
88
- method: 'get',
89
- path: '/v2/assets',
90
- summary: 'List assets',
91
- tags: ['Assets'],
92
- parameters: [
93
- {
94
- name: 'limit',
95
- in: 'query',
96
- required: false,
97
- schema: { type: 'number' },
98
- },
99
- ],
100
- isMultipart: false,
101
- },
102
- ];
103
- const tools = generateTools(opWithQuery, mockHttpClient);
104
- await tools[0]?.handler({ limit: 10 });
105
- expect(mockHttpClient.request).toHaveBeenCalledWith('get', '/v2/assets', {
106
- query: { limit: '10' },
107
- body: undefined,
108
- });
109
- });
110
- it('handles allOf composed body schemas', async () => {
111
- const opWithAllOf = [
112
- {
113
- operationId: 'TestController_create',
114
- method: 'post',
115
- path: '/v2/test',
116
- summary: 'Test allOf',
117
- tags: ['Test'],
118
- parameters: [],
119
- requestBody: {
120
- schema: {
121
- allOf: [
122
- {
123
- type: 'object',
124
- properties: { name: { type: 'string' } },
125
- required: ['name'],
126
- },
127
- {
128
- type: 'object',
129
- properties: { age: { type: 'number' } },
130
- },
131
- ],
132
- },
133
- contentType: 'application/json',
134
- },
135
- isMultipart: false,
136
- },
137
- ];
138
- const tools = generateTools(opWithAllOf, mockHttpClient);
139
- await tools[0]?.handler({ name: 'test', age: 25 });
140
- expect(mockHttpClient.request).toHaveBeenCalledWith('post', '/v2/test', {
141
- query: undefined,
142
- body: { name: 'test', age: 25 },
143
- });
144
- });
145
- it('handles schema with both properties and allOf', async () => {
146
- const opWithBoth = [
147
- {
148
- operationId: 'TestController_mixed',
149
- method: 'post',
150
- path: '/v2/mixed',
151
- summary: 'Test mixed',
152
- tags: ['Test'],
153
- parameters: [],
154
- requestBody: {
155
- schema: {
156
- type: 'object',
157
- properties: { base: { type: 'string' } },
158
- required: ['base'],
159
- allOf: [
160
- {
161
- type: 'object',
162
- properties: { extra: { type: 'number' } },
163
- },
164
- ],
165
- },
166
- contentType: 'application/json',
167
- },
168
- isMultipart: false,
169
- },
170
- ];
171
- const tools = generateTools(opWithBoth, mockHttpClient);
172
- await tools[0]?.handler({ base: 'hello', extra: 42 });
173
- expect(mockHttpClient.request).toHaveBeenCalledWith('post', '/v2/mixed', {
174
- query: undefined,
175
- body: { base: 'hello', extra: 42 },
176
- });
177
- });
178
- });