@desplega.ai/agent-swarm 1.129.0 → 1.131.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 (226) hide show
  1. package/README.md +2 -2
  2. package/dist/{actions-kfv2dawe.js → actions-w53mbns9.js} +11 -11
  3. package/dist/{anthropic-messages-3xgme8my.js → anthropic-messages-rjmd2e7n.js} +5 -5
  4. package/dist/{app-q8vjk6e8.js → app-m9gwqsqv.js} +8 -8
  5. package/dist/{artifact-hg4t1nx7.js → artifact-jysj3wrg.js} +2 -2
  6. package/dist/{assistant-g037r345.js → assistant-bp65m6f3.js} +13 -13
  7. package/dist/{azure-openai-responses-xa4sh9f6.js → azure-openai-responses-c0yjmbfd.js} +8 -5
  8. package/dist/{boot-reembed-18pzsrxa.js → boot-reembed-62p0at2k.js} +6 -6
  9. package/dist/{boot-reembed-wpks2cj8.js → boot-reembed-xmfp6wdh.js} +7 -7
  10. package/dist/{boot-scrub-logs-n7szd57r.js → boot-scrub-logs-rr8q2dms.js} +5 -5
  11. package/dist/{claude-adapter-qz4r0ajt.js → claude-adapter-2y47mrkd.js} +9 -9
  12. package/dist/{cli-mhjnbgb6.js → cli-0rcyq6d9.js} +450 -186
  13. package/dist/{cli-ttkmehy0.js → cli-2q72qz2s.js} +274 -25
  14. package/dist/{cli-gztgc3hz.js → cli-2wadx7p2.js} +2 -2
  15. package/dist/cli-3fj60etf.js +153 -0
  16. package/dist/{cli-7ecgm5v0.js → cli-3kf51j15.js} +1 -1
  17. package/dist/{cli-vgexpfsr.js → cli-57khth04.js} +6 -3
  18. package/dist/{cli-2mbe7vk0.js → cli-5dsbcjjw.js} +1 -1
  19. package/dist/{cli-etr62zy6.js → cli-5kx36evn.js} +2 -2
  20. package/dist/{cli-v2tr6amf.js → cli-5n6e5yfn.js} +30 -8
  21. package/dist/{cli-hx02s9zq.js → cli-5v4rw6yd.js} +2 -2
  22. package/dist/{cli-v37yr6mf.js → cli-5ze9rv97.js} +4 -4
  23. package/dist/{cli-ch7t5v7n.js → cli-6map995v.js} +9 -4
  24. package/dist/{cli-h0457a67.js → cli-70xqj0z3.js} +3 -3
  25. package/dist/{cli-kk4f9r17.js → cli-72q8m8gk.js} +8 -6
  26. package/dist/{cli-7padk69a.js → cli-78xwvkhj.js} +2 -2
  27. package/dist/{cli-dxtxacy7.js → cli-9dr5qzc0.js} +45 -8
  28. package/dist/{cli-17zxdgsq.js → cli-a40rnf71.js} +6 -6
  29. package/dist/{cli-t53vnnxz.js → cli-a4jzdpa3.js} +2514 -1055
  30. package/dist/{cli-w10fkrf1.js → cli-akdvwc9v.js} +354 -115
  31. package/dist/{cli-1qkk5er0.js → cli-bmze986d.js} +1 -1
  32. package/dist/{cli-ga12dc1d.js → cli-bqw0mt1n.js} +3 -3
  33. package/dist/{cli-0sf92efp.js → cli-cdeg08wx.js} +1 -1
  34. package/dist/{cli-a8ynhkyj.js → cli-cvgjwnh1.js} +17 -15
  35. package/dist/{cli-9fxg3v5m.js → cli-d2tfkcga.js} +4 -4
  36. package/dist/{cli-nhcd7x43.js → cli-d3x3x1c9.js} +2 -2
  37. package/dist/{cli-6nh2qxvh.js → cli-darcwax3.js} +1 -1
  38. package/dist/{cli-yjbgmysx.js → cli-e7ckcg4v.js} +12 -12
  39. package/dist/{cli-4n2gcjpd.js → cli-efxfnq6q.js} +4 -3
  40. package/dist/{cli-z9xqqhfk.js → cli-er3a4bb0.js} +1 -1
  41. package/dist/{cli-xg2eezyv.js → cli-f1am9szv.js} +1 -1
  42. package/dist/{cli-xy4cwsm9.js → cli-fywms69x.js} +1 -1
  43. package/dist/{cli-33jj76y8.js → cli-g6b8x1h8.js} +1 -1
  44. package/dist/{cli-epsvdckx.js → cli-gm9cbhbq.js} +20 -10
  45. package/dist/{cli-rkndnn90.js → cli-k9qkf1hw.js} +6 -4
  46. package/dist/{cli-zejvt395.js → cli-kh3ba2zf.js} +1 -1
  47. package/dist/{cli-gb25p1h2.js → cli-nm5gtp1x.js} +2 -2
  48. package/dist/{cli-akxnpx17.js → cli-pm6xbh84.js} +1829 -1629
  49. package/dist/{cli-2k0ztbfp.js → cli-psh3c4va.js} +1 -1
  50. package/dist/{cli-39vgrsep.js → cli-qv61hp37.js} +2 -2
  51. package/dist/{cli-hv2fndhm.js → cli-r6kqqbj0.js} +6 -4
  52. package/dist/{cli-1y1cm570.js → cli-rzbpmxdr.js} +1 -1
  53. package/dist/{cli-mmrk00vp.js → cli-t1xze5qh.js} +1 -1
  54. package/dist/{cli-g252a9ky.js → cli-t55yw3a1.js} +2 -2
  55. package/dist/{cli-7bz8dzqa.js → cli-t76vw5db.js} +1184 -1522
  56. package/dist/{cli-4n4mdv21.js → cli-xpxde7rm.js} +7 -3
  57. package/dist/{cli-fpaa5k2q.js → cli-yw8vghx2.js} +54 -18
  58. package/dist/cli-zsspvvm2.js +490 -0
  59. package/dist/cli.js +27 -25
  60. package/dist/{codex-adapter-7v6t7ff6.js → codex-adapter-d24q75wk.js} +7 -7
  61. package/dist/{codex-hook-amndawyb.js → codex-hook-hq54t9ft.js} +2 -2
  62. package/dist/{codex-session-runner-e7j4khe2.js → codex-session-runner-g50vcsex.js} +7 -7
  63. package/dist/{commands-ex0k5tbf.js → commands-c3nrc5hg.js} +5 -5
  64. package/dist/{db-df7jatfc.js → db-nt7fg3tw.js} +5 -5
  65. package/dist/{google-generative-ai-y42hnw9p.js → google-generative-ai-hysrd8qx.js} +7 -5
  66. package/dist/{google-vertex-4sg66gb6.js → google-vertex-p5arrga0.js} +7 -5
  67. package/dist/{handlers-1j2cfqt2.js → handlers-fkr6swat.js} +13 -13
  68. package/dist/{hook-nx9a0mj3.js → hook-77wpvnjc.js} +7 -7
  69. package/dist/{hook-w6yaf6sy.js → hook-g019yehy.js} +8 -8
  70. package/dist/{http-4tz5h8wg.js → http-jewj0syk.js} +2993 -716
  71. package/dist/{index-0bpkzb09.js → index-070v4eyb.js} +3 -3
  72. package/dist/{index-0s67qv7h.js → index-6gm5he8h.js} +11 -11
  73. package/dist/{index-35gtv6gj.js → index-7n2xpbd4.js} +310 -40
  74. package/dist/{index-ker3gccb.js → index-9znhar3x.js} +4 -4
  75. package/dist/{index-5n2c8yay.js → index-hase6zbe.js} +2 -2
  76. package/dist/{index-kcf3tm9h.js → index-hfvggd0z.js} +12 -12
  77. package/dist/{index-7c0jqna0.js → index-hp1kdbjj.js} +13 -13
  78. package/dist/{keepalive-3j4a9168.js → keepalive-j0fjvqfd.js} +7 -7
  79. package/dist/{lead-6kpevymb.js → lead-1n8x30xe.js} +33 -33
  80. package/dist/{maintenance-m1k82ean.js → maintenance-gvev11sa.js} +7 -7
  81. package/dist/{mistral-conversations-bjkdfb6z.js → mistral-conversations-81fwav0j.js} +6 -6
  82. package/dist/{oauth-refresh-sweep-881k8e4q.js → oauth-refresh-sweep-s9ecsvh0.js} +6 -6
  83. package/dist/{onboard-c0ykffjn.js → onboard-pvm5b38w.js} +2 -2
  84. package/dist/{openai-codex-responses-xetseqvt.js → openai-codex-responses-5g27pd6f.js} +43 -23
  85. package/dist/{openai-completions-5r2g5axa.js → openai-completions-3vkmfz2a.js} +55 -11
  86. package/dist/{openai-responses-ce67hd23.js → openai-responses-dg4t7j7a.js} +8 -5
  87. package/dist/{openrouter-images-pzfp22jb.js → openrouter-images-g3gm8931.js} +1 -1
  88. package/dist/{otel-impl-sqagjerv.js → otel-impl-p6jvgd9c.js} +6 -4
  89. package/dist/{otel-3mp81ppd.js → otel-nqa12wf3.js} +2 -2
  90. package/dist/{pi-mono-adapter-k584k16g.js → pi-mono-adapter-t091s27g.js} +17117 -7517
  91. package/dist/{pricing-refresh-y82whbf9.js → pricing-refresh-k49rcyed.js} +7 -7
  92. package/dist/{rbac-roles-nvkqmzyd.js → rbac-roles-30pspvy7.js} +7 -7
  93. package/dist/{rbac-roles-4ht8gegc.js → rbac-roles-cr80g96t.js} +6 -6
  94. package/dist/{render-v2-wvqdgvvp.js → render-v2-xm457ng1.js} +8 -8
  95. package/dist/{seed-pricing-fy3rxhde.js → seed-pricing-yhpv35fr.js} +6 -6
  96. package/dist/{setup-ak5cnc6f.js → setup-nytnmwwr.js} +2 -2
  97. package/dist/{worker-d8769q8a.js → worker-msytr2cw.js} +33 -33
  98. package/openapi.json +34039 -11036
  99. package/package.json +8 -6
  100. package/src/apps/definition.ts +368 -26
  101. package/src/apps/row-store.ts +66 -10
  102. package/src/apps/schema-migrate.ts +95 -1
  103. package/src/apps/store.ts +13 -4
  104. package/src/apps/sync-run-as.ts +18 -0
  105. package/src/apps/sync.ts +934 -0
  106. package/src/apps/version.ts +16 -2
  107. package/src/assets/key.ts +8 -1
  108. package/src/be/asset-key-audit.ts +3 -1
  109. package/src/be/db-queries/mcp-oauth.ts +297 -24
  110. package/src/be/db.ts +42 -1
  111. package/src/be/migrations/129_asset_keys_apps_scripts.sql +161 -0
  112. package/src/be/scripts/db.ts +5 -2
  113. package/src/be/scripts/typecheck.ts +1 -0
  114. package/src/be/seed-scripts/catalog/app-sync-run.ts +32 -0
  115. package/src/be/seed-scripts/catalog/github-issues-pull.ts +102 -0
  116. package/src/be/seed-scripts/index.ts +18 -0
  117. package/src/be/seed-skills/index.ts +7 -0
  118. package/src/http/active-sessions.ts +26 -18
  119. package/src/http/agents.ts +94 -27
  120. package/src/http/api-keys.ts +91 -17
  121. package/src/http/approval-requests.ts +87 -10
  122. package/src/http/apps.ts +361 -53
  123. package/src/http/assets.ts +165 -31
  124. package/src/http/budgets.ts +7 -5
  125. package/src/http/codex-oauth-keep-warm.ts +21 -3
  126. package/src/http/config.ts +46 -16
  127. package/src/http/context.ts +33 -6
  128. package/src/http/ecosystem.ts +20 -6
  129. package/src/http/events.ts +24 -9
  130. package/src/http/favorites.ts +20 -6
  131. package/src/http/fs.ts +60 -17
  132. package/src/http/heartbeat.ts +18 -4
  133. package/src/http/inbox-state.ts +12 -6
  134. package/src/http/integrations.ts +25 -5
  135. package/src/http/kv.ts +36 -15
  136. package/src/http/mcp-bridge.ts +5 -1
  137. package/src/http/mcp-oauth.ts +332 -17
  138. package/src/http/mcp-servers.ts +56 -18
  139. package/src/http/memory.ts +282 -29
  140. package/src/http/metrics.ts +80 -17
  141. package/src/http/oauth-callback.ts +10 -4
  142. package/src/http/oauth-generic.ts +5 -1
  143. package/src/http/oauth-locks.ts +6 -3
  144. package/src/http/openapi.ts +57 -9
  145. package/src/http/page-proxy.ts +25 -5
  146. package/src/http/pages-public.ts +37 -20
  147. package/src/http/pages.ts +93 -28
  148. package/src/http/poll.ts +89 -5
  149. package/src/http/pricing.ts +9 -6
  150. package/src/http/prompt-templates.ts +85 -21
  151. package/src/http/route-def.ts +67 -4
  152. package/src/http/schedules.ts +63 -14
  153. package/src/http/script-connection-proxy.ts +30 -4
  154. package/src/http/script-connections.ts +393 -43
  155. package/src/http/script-runs.ts +73 -19
  156. package/src/http/scripts.ts +257 -39
  157. package/src/http/session-data.ts +87 -14
  158. package/src/http/sessions.ts +80 -5
  159. package/src/http/skills.ts +115 -35
  160. package/src/http/stats.ts +94 -13
  161. package/src/http/task-templates.ts +6 -4
  162. package/src/http/tasks.ts +230 -61
  163. package/src/http/trackers/jira.ts +90 -30
  164. package/src/http/trackers/linear.ts +46 -12
  165. package/src/http/users.ts +162 -25
  166. package/src/http/utils.ts +12 -2
  167. package/src/http/webhooks.ts +30 -16
  168. package/src/http/workflow-events.ts +18 -5
  169. package/src/http/workflows.ts +128 -39
  170. package/src/http/x.ts +37 -6
  171. package/src/oauth/ensure-mcp-token.ts +16 -1
  172. package/src/oauth/mcp-wrapper.ts +281 -26
  173. package/src/providers/pi-mono-adapter.ts +1 -1
  174. package/src/scripts-runtime/credential-broker/README.md +1 -1
  175. package/src/scripts-runtime/credential-broker/fetch-patch.ts +12 -2
  176. package/src/scripts-runtime/sdk-allowlist.ts +1 -0
  177. package/src/scripts-runtime/stdlib/fetch.ts +6 -0
  178. package/src/scripts-runtime/types/stdlib.d.ts +1 -0
  179. package/src/scripts-runtime/types/swarm-sdk.d.ts +1 -0
  180. package/src/server.ts +2 -0
  181. package/src/tests/apps-rbac.test.ts +110 -0
  182. package/src/tests/apps-spike2.test.ts +4 -1
  183. package/src/tests/apps-sync-engine.test.ts +2540 -0
  184. package/src/tests/apps-sync.test.ts +1627 -0
  185. package/src/tests/asset-key-api.test.ts +48 -2
  186. package/src/tests/asset-key-invariants.test.ts +92 -0
  187. package/src/tests/asset-key-migration.test.ts +174 -8
  188. package/src/tests/asset-key-normalization.test.ts +2 -0
  189. package/src/tests/credential-broker.test.ts +27 -2
  190. package/src/tests/mcp-oauth-dcr-reuse.test.ts +743 -0
  191. package/src/tests/mcp-oauth-ensure-token.test.ts +45 -0
  192. package/src/tests/mcp-oauth-manual-client.test.ts +135 -2
  193. package/src/tests/mcp-oauth-queries.test.ts +153 -0
  194. package/src/tests/mcp-oauth-wrapper.test.ts +432 -0
  195. package/src/tests/memory-http-recall-gating.test.ts +2 -0
  196. package/src/tests/openapi-response-contract.test.ts +138 -0
  197. package/src/tests/rbac-admission-e2e.test.ts +68 -0
  198. package/src/tests/script-connections.test.ts +3 -0
  199. package/src/tests/scripts-runtime-fetch.test.ts +121 -0
  200. package/src/tests/scripts-runtime-secret-egress.test.ts +4 -2
  201. package/src/tests/seed-scripts.test.ts +2 -2
  202. package/src/tests/swarm-tool-result-gate.test.ts +32 -0
  203. package/src/tests/task-working-dir.test.ts +8 -4
  204. package/src/tests/whoami-route.test.ts +127 -0
  205. package/src/tests/workflow-engine-v2.test.ts +80 -7
  206. package/src/tests/workflow-swarm-script.test.ts +104 -0
  207. package/src/tools/app-get.ts +10 -2
  208. package/src/tools/app-rollback.ts +1 -0
  209. package/src/tools/app-sync.ts +112 -0
  210. package/src/tools/script-common.ts +20 -0
  211. package/src/tools/tool-config.ts +2 -1
  212. package/src/tools/utils.ts +11 -0
  213. package/src/tools/workflows/create-workflow.ts +4 -1
  214. package/src/types.ts +1394 -1206
  215. package/src/utils/template.ts +8 -1
  216. package/src/utils/zod-openapi.ts +11 -0
  217. package/src/workflows/engine.ts +27 -4
  218. package/src/workflows/executors/swarm-script.ts +28 -0
  219. package/src/workflows/retry-poller.ts +19 -2
  220. package/templates/skills/apps/content.md +94 -5
  221. package/templates/skills/asset-namespaces/content.md +2 -2
  222. package/templates/skills/scheduled-task-resilience/SKILL.md +102 -0
  223. package/templates/skills/scheduled-task-resilience/config.json +14 -0
  224. package/templates/skills/scheduled-task-resilience/content.md +97 -0
  225. package/dist/cli-7wmybrt5.js +0 -115
  226. package/dist/cli-d91pvmq1.js +0 -14
@@ -23,9 +23,23 @@ import {
23
23
  type RbacPrincipal,
24
24
  type RbacResource,
25
25
  } from "../rbac";
26
+ import { AgentMcpServerSchema, McpServerSchema, McpServerWithInstallInfoSchema } from "../types";
26
27
  import { getRequestAuth } from "../utils/request-auth-context";
27
28
  import { route } from "./route-def";
28
- import { json, jsonError } from "./utils";
29
+ import { jsonError } from "./utils";
30
+
31
+ // ─── Response Schemas ────────────────────────────────────────────────────────
32
+
33
+ /**
34
+ * `getAgentMcpServers` response shape. When `?resolveSecrets=true`, each
35
+ * server is additionally decorated with resolved env/header values and any
36
+ * OAuth resolution error — see the `resolveSecrets` branch in the handler.
37
+ */
38
+ const McpServerWithOptionalSecretsSchema = McpServerWithInstallInfoSchema.extend({
39
+ resolvedEnv: z.record(z.string(), z.string()).optional(),
40
+ resolvedHeaders: z.record(z.string(), z.string()).optional(),
41
+ authError: z.string().nullable().optional(),
42
+ });
29
43
 
30
44
  // ─── Route Definitions ───────────────────────────────────────────────────────
31
45
 
@@ -44,7 +58,10 @@ const listMcpServersRoute = route({
44
58
  search: z.string().optional(),
45
59
  }),
46
60
  responses: {
47
- 200: { description: "MCP server list" },
61
+ 200: {
62
+ description: "MCP server list",
63
+ schema: z.object({ servers: z.array(McpServerSchema), total: z.number() }),
64
+ },
48
65
  },
49
66
  });
50
67
 
@@ -57,7 +74,7 @@ const getMcpServerRoute = route({
57
74
  auth: { apiKey: true },
58
75
  params: z.object({ id: z.string() }),
59
76
  responses: {
60
- 200: { description: "MCP server details" },
77
+ 200: { description: "MCP server details", schema: McpServerSchema },
61
78
  404: { description: "MCP server not found" },
62
79
  },
63
80
  });
@@ -83,7 +100,7 @@ const createMcpServerRoute = route({
83
100
  headerConfigKeys: z.string().optional(),
84
101
  }),
85
102
  responses: {
86
- 201: { description: "MCP server created" },
103
+ 201: { description: "MCP server created", schema: z.object({ server: McpServerSchema }) },
87
104
  400: { description: "Validation error" },
88
105
  },
89
106
  rbac: { permission: "mcp-server.create.swarm" },
@@ -99,7 +116,7 @@ const updateMcpServerRoute = route({
99
116
  params: z.object({ id: z.string() }),
100
117
  body: z.record(z.string(), z.unknown()),
101
118
  responses: {
102
- 200: { description: "MCP server updated" },
119
+ 200: { description: "MCP server updated", schema: z.object({ server: McpServerSchema }) },
103
120
  404: { description: "MCP server not found" },
104
121
  },
105
122
  rbac: { permission: "mcp-server.update.any" },
@@ -114,7 +131,13 @@ const deleteMcpServerRoute = route({
114
131
  auth: { apiKey: true },
115
132
  params: z.object({ id: z.string() }),
116
133
  responses: {
117
- 200: { description: "MCP server deleted" },
134
+ 200: {
135
+ description: "MCP server deleted",
136
+ schema: z.object({
137
+ success: z.boolean(),
138
+ deletedScriptConnectionCount: z.number(),
139
+ }),
140
+ },
118
141
  404: { description: "MCP server not found" },
119
142
  },
120
143
  rbac: { permission: "mcp-server.delete.any" },
@@ -132,7 +155,10 @@ const installMcpServerRoute = route({
132
155
  agentId: z.string(),
133
156
  }),
134
157
  responses: {
135
- 200: { description: "MCP server installed" },
158
+ 200: {
159
+ description: "MCP server installed",
160
+ schema: z.object({ agentMcpServer: AgentMcpServerSchema }),
161
+ },
136
162
  404: { description: "MCP server not found" },
137
163
  },
138
164
  rbac: { permission: "mcp-server.install.any" },
@@ -147,7 +173,10 @@ const uninstallMcpServerRoute = route({
147
173
  auth: { apiKey: true },
148
174
  params: z.object({ id: z.string(), agentId: z.string() }),
149
175
  responses: {
150
- 200: { description: "MCP server uninstalled" },
176
+ 200: {
177
+ description: "MCP server uninstalled",
178
+ schema: z.object({ success: z.boolean() }),
179
+ },
151
180
  },
152
181
  rbac: { permission: "mcp-server.uninstall.any" },
153
182
  });
@@ -164,7 +193,13 @@ const getAgentMcpServersRoute = route({
164
193
  resolveSecrets: z.string().optional(),
165
194
  }),
166
195
  responses: {
167
- 200: { description: "Agent MCP servers list" },
196
+ 200: {
197
+ description: "Agent MCP servers list",
198
+ schema: z.object({
199
+ servers: z.array(McpServerWithOptionalSecretsSchema),
200
+ total: z.number(),
201
+ }),
202
+ },
168
203
  },
169
204
  });
170
205
 
@@ -356,9 +391,12 @@ export async function handleMcpServers(
356
391
  }),
357
392
  );
358
393
 
359
- json(res, { servers: serversWithSecrets, total: serversWithSecrets.length });
394
+ getAgentMcpServersRoute.respond(res, 200, {
395
+ servers: serversWithSecrets,
396
+ total: serversWithSecrets.length,
397
+ });
360
398
  } else {
361
- json(res, { servers, total: servers.length });
399
+ getAgentMcpServersRoute.respond(res, 200, { servers, total: servers.length });
362
400
  }
363
401
  return true;
364
402
  }
@@ -376,7 +414,7 @@ export async function handleMcpServers(
376
414
 
377
415
  try {
378
416
  const agentMcpServer = installMcpServer(parsed.body.agentId, parsed.params.id);
379
- json(res, { agentMcpServer });
417
+ installMcpServerRoute.respond(res, 200, { agentMcpServer });
380
418
  } catch (err) {
381
419
  jsonError(res, err instanceof Error ? err.message : "Install failed", 400);
382
420
  }
@@ -389,7 +427,7 @@ export async function handleMcpServers(
389
427
  if (!parsed) return true;
390
428
 
391
429
  const removed = uninstallMcpServer(parsed.params.agentId, parsed.params.id);
392
- json(res, { success: removed });
430
+ uninstallMcpServerRoute.respond(res, 200, { success: removed });
393
431
  return true;
394
432
  }
395
433
 
@@ -406,7 +444,7 @@ export async function handleMcpServers(
406
444
  search: parsed.query.search,
407
445
  });
408
446
 
409
- json(res, { servers, total: servers.length });
447
+ listMcpServersRoute.respond(res, 200, { servers, total: servers.length });
410
448
  return true;
411
449
  }
412
450
 
@@ -420,7 +458,7 @@ export async function handleMcpServers(
420
458
  jsonError(res, "MCP server not found", 404);
421
459
  return true;
422
460
  }
423
- json(res, server);
461
+ getMcpServerRoute.respond(res, 200, server);
424
462
  return true;
425
463
  }
426
464
 
@@ -460,7 +498,7 @@ export async function handleMcpServers(
460
498
  envConfigKeys: parsed.body.envConfigKeys,
461
499
  headerConfigKeys: parsed.body.headerConfigKeys,
462
500
  });
463
- json(res, { server }, 201);
501
+ createMcpServerRoute.respond(res, 201, { server });
464
502
  } catch (err) {
465
503
  jsonError(res, err instanceof Error ? err.message : "Create failed", 400);
466
504
  }
@@ -519,7 +557,7 @@ export async function handleMcpServers(
519
557
  jsonError(res, "MCP server not found", 404);
520
558
  return true;
521
559
  }
522
- json(res, { server });
560
+ updateMcpServerRoute.respond(res, 200, { server });
523
561
  return true;
524
562
  }
525
563
 
@@ -533,7 +571,7 @@ export async function handleMcpServers(
533
571
  jsonError(res, "MCP server not found", 404);
534
572
  return true;
535
573
  }
536
- json(res, {
574
+ deleteMcpServerRoute.respond(res, 200, {
537
575
  success: true,
538
576
  deletedScriptConnectionCount: result.deletedScriptConnectionCount,
539
577
  });