@1mcp/agent 0.35.0-beta.4 → 0.36.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 (262) hide show
  1. package/build/admin/assets/{admin-AboutRuntimeWorkspace-CM2ZafTJ.js → admin-AboutRuntimeWorkspace-DH2QC2nJ.js} +1 -1
  2. package/build/admin/assets/admin-BackendLogsWorkspace-BKavXT9B.js +1 -0
  3. package/build/admin/assets/admin-InstructionTemplatesWorkspace-CvG4EPdZ.js +1 -0
  4. package/build/admin/assets/admin-OAuthServicesWorkspace-BCGj2hP4.js +1 -0
  5. package/build/admin/assets/admin-PresetAuthoringWorkspace-BboJVBFl.js +1 -0
  6. package/build/admin/assets/admin-console-D6jyI73o.css +1 -0
  7. package/build/admin/assets/admin-console-xbgqUjbT.js +3 -0
  8. package/build/admin/assets/admin-icons-CYGTDZA5.js +1 -0
  9. package/build/admin/assets/admin-mantine-xwbfu5Gd.js +53 -0
  10. package/build/admin/index.html +4 -4
  11. package/build/auth/sdkOAuthClientProvider.d.ts +4 -0
  12. package/build/auth/sdkOAuthClientProvider.d.ts.map +1 -1
  13. package/build/auth/sdkOAuthClientProvider.js +29 -0
  14. package/build/auth/sdkOAuthClientProvider.js.map +1 -1
  15. package/build/commands/instructions/instructions.d.ts.map +1 -1
  16. package/build/commands/instructions/instructions.js +56 -1
  17. package/build/commands/instructions/instructions.js.map +1 -1
  18. package/build/commands/mcp/add.js +2 -2
  19. package/build/commands/mcp/add.js.map +1 -1
  20. package/build/commands/mcp/list.js +1 -1
  21. package/build/commands/mcp/list.js.map +1 -1
  22. package/build/commands/mcp/update.js +1 -1
  23. package/build/commands/mcp/update.js.map +1 -1
  24. package/build/commands/shared/serveTargetResolver.d.ts.map +1 -1
  25. package/build/commands/shared/serveTargetResolver.js +17 -22
  26. package/build/commands/shared/serveTargetResolver.js.map +1 -1
  27. package/build/config/configContext.d.ts +2 -0
  28. package/build/config/configContext.d.ts.map +1 -1
  29. package/build/config/configContext.js +5 -0
  30. package/build/config/configContext.js.map +1 -1
  31. package/build/config/configLoader.d.ts +8 -0
  32. package/build/config/configLoader.d.ts.map +1 -1
  33. package/build/config/configLoader.js +35 -11
  34. package/build/config/configLoader.js.map +1 -1
  35. package/build/config/configManager.d.ts +16 -1
  36. package/build/config/configManager.d.ts.map +1 -1
  37. package/build/config/configManager.js +77 -0
  38. package/build/config/configManager.js.map +1 -1
  39. package/build/config/configWatcher.d.ts +2 -0
  40. package/build/config/configWatcher.d.ts.map +1 -1
  41. package/build/config/configWatcher.js +9 -4
  42. package/build/config/configWatcher.js.map +1 -1
  43. package/build/config/configuredServerTargets.d.ts +3 -0
  44. package/build/config/configuredServerTargets.d.ts.map +1 -0
  45. package/build/config/configuredServerTargets.js +8 -0
  46. package/build/config/configuredServerTargets.js.map +1 -0
  47. package/build/config/envProcessor.d.ts +2 -1
  48. package/build/config/envProcessor.d.ts.map +1 -1
  49. package/build/config/envProcessor.js +16 -9
  50. package/build/config/envProcessor.js.map +1 -1
  51. package/build/config/mcpConfigManager.d.ts +3 -0
  52. package/build/config/mcpConfigManager.d.ts.map +1 -1
  53. package/build/config/mcpConfigManager.js +15 -0
  54. package/build/config/mcpConfigManager.js.map +1 -1
  55. package/build/config/runtimeScopeEnv.d.ts +15 -0
  56. package/build/config/runtimeScopeEnv.d.ts.map +1 -0
  57. package/build/config/runtimeScopeEnv.js +231 -0
  58. package/build/config/runtimeScopeEnv.js.map +1 -0
  59. package/build/config/runtimeTargetFingerprint.d.ts +3 -0
  60. package/build/config/runtimeTargetFingerprint.d.ts.map +1 -0
  61. package/build/config/runtimeTargetFingerprint.js +66 -0
  62. package/build/config/runtimeTargetFingerprint.js.map +1 -0
  63. package/build/config/types.d.ts +5 -0
  64. package/build/config/types.d.ts.map +1 -1
  65. package/build/config/types.js +1 -0
  66. package/build/config/types.js.map +1 -1
  67. package/build/constants/api.d.ts +1 -0
  68. package/build/constants/api.d.ts.map +1 -1
  69. package/build/constants/api.js +1 -0
  70. package/build/constants/api.js.map +1 -1
  71. package/build/constants/mcp.d.ts +1 -1
  72. package/build/constants/mcp.d.ts.map +1 -1
  73. package/build/constants/mcp.js +1 -1
  74. package/build/constants/mcp.js.map +1 -1
  75. package/build/core/capabilities/capabilityAggregator.d.ts.map +1 -1
  76. package/build/core/capabilities/capabilityAggregator.js +33 -14
  77. package/build/core/capabilities/capabilityAggregator.js.map +1 -1
  78. package/build/core/capabilities/capabilityCatalog.d.ts +1 -1
  79. package/build/core/capabilities/capabilityCatalog.d.ts.map +1 -1
  80. package/build/core/capabilities/capabilityCatalog.js +19 -7
  81. package/build/core/capabilities/capabilityCatalog.js.map +1 -1
  82. package/build/core/capabilities/capabilityPagination.d.ts.map +1 -1
  83. package/build/core/capabilities/capabilityPagination.js +7 -4
  84. package/build/core/capabilities/capabilityPagination.js.map +1 -1
  85. package/build/core/capabilities/configuredToolSnapshot.d.ts +34 -0
  86. package/build/core/capabilities/configuredToolSnapshot.d.ts.map +1 -0
  87. package/build/core/capabilities/configuredToolSnapshot.js +137 -0
  88. package/build/core/capabilities/configuredToolSnapshot.js.map +1 -0
  89. package/build/core/capabilities/lazyLoadingOrchestrator.d.ts.map +1 -1
  90. package/build/core/capabilities/lazyLoadingOrchestrator.js +8 -4
  91. package/build/core/capabilities/lazyLoadingOrchestrator.js.map +1 -1
  92. package/build/core/capabilities/metaToolProvider.js +3 -3
  93. package/build/core/capabilities/metaToolProvider.js.map +1 -1
  94. package/build/core/client/clientManager.d.ts.map +1 -1
  95. package/build/core/client/clientManager.js +31 -19
  96. package/build/core/client/clientManager.js.map +1 -1
  97. package/build/core/client/connectionHandler.d.ts.map +1 -1
  98. package/build/core/client/connectionHandler.js +9 -6
  99. package/build/core/client/connectionHandler.js.map +1 -1
  100. package/build/core/client/postAuthOAuthRecovery.d.ts +6 -0
  101. package/build/core/client/postAuthOAuthRecovery.d.ts.map +1 -0
  102. package/build/core/client/postAuthOAuthRecovery.js +74 -0
  103. package/build/core/client/postAuthOAuthRecovery.js.map +1 -0
  104. package/build/core/configChangeHandler.d.ts +5 -0
  105. package/build/core/configChangeHandler.d.ts.map +1 -1
  106. package/build/core/configChangeHandler.js +58 -14
  107. package/build/core/configChangeHandler.js.map +1 -1
  108. package/build/core/instructions/effectiveServerInstructions.d.ts +17 -0
  109. package/build/core/instructions/effectiveServerInstructions.d.ts.map +1 -0
  110. package/build/core/instructions/effectiveServerInstructions.js +12 -0
  111. package/build/core/instructions/effectiveServerInstructions.js.map +1 -0
  112. package/build/core/instructions/instructionAggregator.d.ts +51 -2
  113. package/build/core/instructions/instructionAggregator.d.ts.map +1 -1
  114. package/build/core/instructions/instructionAggregator.js +191 -30
  115. package/build/core/instructions/instructionAggregator.js.map +1 -1
  116. package/build/core/instructions/instructionsDistribution.d.ts +53 -0
  117. package/build/core/instructions/instructionsDistribution.d.ts.map +1 -1
  118. package/build/core/instructions/instructionsDistribution.js +25 -0
  119. package/build/core/instructions/instructionsDistribution.js.map +1 -1
  120. package/build/core/instructions/templateTypes.d.ts +25 -3
  121. package/build/core/instructions/templateTypes.d.ts.map +1 -1
  122. package/build/core/instructions/templateTypes.js +45 -0
  123. package/build/core/instructions/templateTypes.js.map +1 -1
  124. package/build/core/loading/mcpLoadingManager.d.ts.map +1 -1
  125. package/build/core/loading/mcpLoadingManager.js +5 -3
  126. package/build/core/loading/mcpLoadingManager.js.map +1 -1
  127. package/build/core/protocol/requestHandlerUtils.d.ts.map +1 -1
  128. package/build/core/protocol/requestHandlerUtils.js +3 -3
  129. package/build/core/protocol/requestHandlerUtils.js.map +1 -1
  130. package/build/core/protocol/toolRequestHandlers.d.ts.map +1 -1
  131. package/build/core/protocol/toolRequestHandlers.js +18 -5
  132. package/build/core/protocol/toolRequestHandlers.js.map +1 -1
  133. package/build/core/server/backendStdioSupervisor.d.ts.map +1 -1
  134. package/build/core/server/backendStdioSupervisor.js +2 -1
  135. package/build/core/server/backendStdioSupervisor.js.map +1 -1
  136. package/build/core/server/clientInstanceFactory.d.ts +2 -1
  137. package/build/core/server/clientInstanceFactory.d.ts.map +1 -1
  138. package/build/core/server/clientInstanceFactory.js +9 -2
  139. package/build/core/server/clientInstanceFactory.js.map +1 -1
  140. package/build/core/server/clientInstancePool.d.ts +1 -0
  141. package/build/core/server/clientInstancePool.d.ts.map +1 -1
  142. package/build/core/server/clientInstancePool.js +92 -55
  143. package/build/core/server/clientInstancePool.js.map +1 -1
  144. package/build/core/server/clientInstancePoolTypes.d.ts +2 -0
  145. package/build/core/server/clientInstancePoolTypes.d.ts.map +1 -1
  146. package/build/core/server/disabledTools.d.ts +2 -0
  147. package/build/core/server/disabledTools.d.ts.map +1 -1
  148. package/build/core/server/disabledTools.js +7 -4
  149. package/build/core/server/disabledTools.js.map +1 -1
  150. package/build/core/server/mcpServerLifecycleManager.d.ts +0 -4
  151. package/build/core/server/mcpServerLifecycleManager.d.ts.map +1 -1
  152. package/build/core/server/mcpServerLifecycleManager.js +18 -40
  153. package/build/core/server/mcpServerLifecycleManager.js.map +1 -1
  154. package/build/core/server/serverManager.d.ts +1 -0
  155. package/build/core/server/serverManager.d.ts.map +1 -1
  156. package/build/core/server/serverManager.js +32 -0
  157. package/build/core/server/serverManager.js.map +1 -1
  158. package/build/core/server/templateIdentity.d.ts +1 -0
  159. package/build/core/server/templateIdentity.d.ts.map +1 -1
  160. package/build/core/server/templateIdentity.js +11 -1
  161. package/build/core/server/templateIdentity.js.map +1 -1
  162. package/build/core/server/templateServerManager.d.ts +13 -1
  163. package/build/core/server/templateServerManager.d.ts.map +1 -1
  164. package/build/core/server/templateServerManager.js +68 -13
  165. package/build/core/server/templateServerManager.js.map +1 -1
  166. package/build/core/server/toolDescriptionOverrides.d.ts +9 -0
  167. package/build/core/server/toolDescriptionOverrides.d.ts.map +1 -0
  168. package/build/core/server/toolDescriptionOverrides.js +44 -0
  169. package/build/core/server/toolDescriptionOverrides.js.map +1 -0
  170. package/build/core/tools/handlers/serverManagementHandler.d.ts +22 -8
  171. package/build/core/tools/handlers/serverManagementHandler.d.ts.map +1 -1
  172. package/build/core/tools/internal/adapters/helpers/configTransformers.d.ts +3 -1
  173. package/build/core/tools/internal/adapters/helpers/configTransformers.d.ts.map +1 -1
  174. package/build/core/tools/internal/schemas/discovery.d.ts +1 -1
  175. package/build/core/tools/internal/schemas/index.d.ts +3 -3
  176. package/build/core/tools/internal/schemas/management.d.ts +2 -2
  177. package/build/core/types/transport.d.ts +39 -6
  178. package/build/core/types/transport.d.ts.map +1 -1
  179. package/build/core/types/transport.js +61 -2
  180. package/build/core/types/transport.js.map +1 -1
  181. package/build/domains/admin/adminConfiguredServerService.d.ts +65 -4
  182. package/build/domains/admin/adminConfiguredServerService.d.ts.map +1 -1
  183. package/build/domains/admin/adminConfiguredServerService.js +292 -49
  184. package/build/domains/admin/adminConfiguredServerService.js.map +1 -1
  185. package/build/domains/admin/adminDomain.d.ts +19 -0
  186. package/build/domains/admin/adminDomain.d.ts.map +1 -1
  187. package/build/domains/admin/adminDomain.js +17 -0
  188. package/build/domains/admin/adminDomain.js.map +1 -1
  189. package/build/domains/admin/adminInstructionPreviewRuntime.d.ts +7 -0
  190. package/build/domains/admin/adminInstructionPreviewRuntime.d.ts.map +1 -0
  191. package/build/domains/admin/adminInstructionPreviewRuntime.js +154 -0
  192. package/build/domains/admin/adminInstructionPreviewRuntime.js.map +1 -0
  193. package/build/domains/admin/adminInstructionTemplateService.d.ts +169 -0
  194. package/build/domains/admin/adminInstructionTemplateService.d.ts.map +1 -0
  195. package/build/domains/admin/adminInstructionTemplateService.js +181 -0
  196. package/build/domains/admin/adminInstructionTemplateService.js.map +1 -0
  197. package/build/domains/admin/configuredToolInventory.d.ts +64 -0
  198. package/build/domains/admin/configuredToolInventory.d.ts.map +1 -0
  199. package/build/domains/admin/configuredToolInventory.js +182 -0
  200. package/build/domains/admin/configuredToolInventory.js.map +1 -0
  201. package/build/domains/admin/runtimeConfiguredToolInspectionService.d.ts +21 -0
  202. package/build/domains/admin/runtimeConfiguredToolInspectionService.d.ts.map +1 -0
  203. package/build/domains/admin/runtimeConfiguredToolInspectionService.js +255 -0
  204. package/build/domains/admin/runtimeConfiguredToolInspectionService.js.map +1 -0
  205. package/build/domains/config-change/configChange.d.ts +1 -1
  206. package/build/domains/config-change/configChange.d.ts.map +1 -1
  207. package/build/domains/config-change/configChange.js +153 -13
  208. package/build/domains/config-change/configChange.js.map +1 -1
  209. package/build/domains/config-change/types.d.ts +30 -2
  210. package/build/domains/config-change/types.d.ts.map +1 -1
  211. package/build/domains/instruction-template/instructionTemplateManager.d.ts +58 -0
  212. package/build/domains/instruction-template/instructionTemplateManager.d.ts.map +1 -0
  213. package/build/domains/instruction-template/instructionTemplateManager.js +167 -0
  214. package/build/domains/instruction-template/instructionTemplateManager.js.map +1 -0
  215. package/build/domains/runtime-targets/runtimeIdentityVerification.d.ts +1 -0
  216. package/build/domains/runtime-targets/runtimeIdentityVerification.d.ts.map +1 -1
  217. package/build/domains/runtime-targets/runtimeIdentityVerification.js +6 -5
  218. package/build/domains/runtime-targets/runtimeIdentityVerification.js.map +1 -1
  219. package/build/transport/http/routes/adminRoutes.d.ts +2 -0
  220. package/build/transport/http/routes/adminRoutes.d.ts.map +1 -1
  221. package/build/transport/http/routes/adminRoutes.js +345 -9
  222. package/build/transport/http/routes/adminRoutes.js.map +1 -1
  223. package/build/transport/http/routes/apiRoutes.d.ts.map +1 -1
  224. package/build/transport/http/routes/apiRoutes.js +2 -0
  225. package/build/transport/http/routes/apiRoutes.js.map +1 -1
  226. package/build/transport/http/routes/inspectRequestContext.d.ts +2 -0
  227. package/build/transport/http/routes/inspectRequestContext.d.ts.map +1 -1
  228. package/build/transport/http/routes/inspectRequestContext.js +2 -2
  229. package/build/transport/http/routes/inspectRequestContext.js.map +1 -1
  230. package/build/transport/http/routes/inspectRoutes.d.ts +9 -0
  231. package/build/transport/http/routes/inspectRoutes.d.ts.map +1 -1
  232. package/build/transport/http/routes/inspectRoutes.js +15 -10
  233. package/build/transport/http/routes/inspectRoutes.js.map +1 -1
  234. package/build/transport/http/routes/instructionsRoutes.d.ts +4 -0
  235. package/build/transport/http/routes/instructionsRoutes.d.ts.map +1 -0
  236. package/build/transport/http/routes/instructionsRoutes.js +147 -0
  237. package/build/transport/http/routes/instructionsRoutes.js.map +1 -0
  238. package/build/transport/http/routes/toolRoutes.d.ts.map +1 -1
  239. package/build/transport/http/routes/toolRoutes.js +5 -4
  240. package/build/transport/http/routes/toolRoutes.js.map +1 -1
  241. package/build/transport/http/server.d.ts.map +1 -1
  242. package/build/transport/http/server.js +16 -0
  243. package/build/transport/http/server.js.map +1 -1
  244. package/build/transport/transportFactory.d.ts.map +1 -1
  245. package/build/transport/transportFactory.js +34 -12
  246. package/build/transport/transportFactory.js.map +1 -1
  247. package/build/utils/validation/discoveredServer.d.ts +15 -0
  248. package/build/utils/validation/discoveredServer.d.ts.map +1 -0
  249. package/build/utils/validation/discoveredServer.js +2 -0
  250. package/build/utils/validation/discoveredServer.js.map +1 -0
  251. package/build/utils/validation/urlDetection.d.ts +4 -5
  252. package/build/utils/validation/urlDetection.d.ts.map +1 -1
  253. package/build/utils/validation/urlDetection.js +94 -25
  254. package/build/utils/validation/urlDetection.js.map +1 -1
  255. package/package.json +7 -2
  256. package/build/admin/assets/admin-BackendLogsWorkspace-CvJs1npx.js +0 -1
  257. package/build/admin/assets/admin-OAuthServicesWorkspace-BswG57Gm.js +0 -1
  258. package/build/admin/assets/admin-PresetAuthoringWorkspace-BIIRs_EN.js +0 -1
  259. package/build/admin/assets/admin-console-Brz9bnhv.css +0 -1
  260. package/build/admin/assets/admin-console-MT8QZmIC.js +0 -3
  261. package/build/admin/assets/admin-icons-D-JtMXSq.js +0 -1
  262. package/build/admin/assets/admin-mantine-DSFdoMaN.js +0 -53
@@ -6,6 +6,7 @@ import { MCP_PROJECT_METADATA } from '../../../constants.js';
6
6
  import { parseTemplateConnectionKey } from '../../../core/server/templateIdentity.js';
7
7
  import { AdminConfiguredServerApplyError, AdminConfiguredServerNotFoundError, } from '../../../domains/admin/adminConfiguredServerService.js';
8
8
  import { ADMIN_SESSION_COOKIE_NAME, AdminIdentityError, } from '../../../domains/admin/adminIdentityService.js';
9
+ import { AdminInstructionTemplateNotFoundError, } from '../../../domains/admin/adminInstructionTemplateService.js';
9
10
  import { AdminPresetConflictError, AdminPresetNotFoundError, } from '../../../domains/admin/adminPresetService.js';
10
11
  import { sensitiveOperationLimiter } from '../../../transport/http/middlewares/securityMiddleware.js';
11
12
  import { sanitizeErrorMessage } from '../../../utils/validation/sanitization.js';
@@ -40,6 +41,8 @@ const adminOAuthServiceParamsSchema = z.object({
40
41
  const backendLogSnapshotQuerySchema = z.object({
41
42
  sourceId: z.string().trim().min(1).max(256).optional(),
42
43
  });
44
+ const configuredServerModelSchema = z.string().trim().min(1).max(64);
45
+ const configuredToolInventoryRefreshSchema = z.object({ model: configuredServerModelSchema.optional() }).strict();
43
46
  const cliConfiguredServerMutationBodySchema = z.object({
44
47
  targetName: z.string().trim().min(1).max(256),
45
48
  dryRun: z.boolean().optional(),
@@ -53,6 +56,67 @@ const cliBackendRestartBodySchema = z
53
56
  .refine((value) => !(value.instance !== undefined && value.allInstances === true), {
54
57
  message: 'instance and allInstances are mutually exclusive',
55
58
  });
59
+ const instructionTemplateIdentitySchema = z.string().trim().min(1).max(128);
60
+ const instructionTemplateVariantsSchema = z.object({ initialization: z.string(), cli: z.string() }).strict();
61
+ const instructionPreviewSelectionSchema = z.discriminatedUnion('mode', [
62
+ z.object({ mode: z.literal('all') }).strict(),
63
+ z.object({ mode: z.literal('preset'), preset: z.string().trim().min(1).max(128) }).strict(),
64
+ z.object({ mode: z.literal('tags'), tags: z.array(z.string().trim().min(1).max(128)).max(256) }).strict(),
65
+ z.object({ mode: z.literal('tag-filter'), expression: z.string().trim().min(1).max(4096) }).strict(),
66
+ ]);
67
+ const requestContextSchema = z
68
+ .object({
69
+ project: z
70
+ .object({
71
+ path: z.string().optional(),
72
+ cwd: z.string().optional(),
73
+ name: z.string().optional(),
74
+ environment: z.string().optional(),
75
+ custom: z.record(z.string(), z.unknown()).optional(),
76
+ git: z
77
+ .object({
78
+ branch: z.string().optional(),
79
+ commit: z.string().optional(),
80
+ repository: z.string().optional(),
81
+ isRepo: z.boolean().optional(),
82
+ })
83
+ .strict()
84
+ .optional(),
85
+ })
86
+ .strict(),
87
+ user: z
88
+ .object({
89
+ name: z.string().optional(),
90
+ email: z.string().optional(),
91
+ home: z.string().optional(),
92
+ username: z.string().optional(),
93
+ uid: z.string().optional(),
94
+ gid: z.string().optional(),
95
+ shell: z.string().optional(),
96
+ })
97
+ .strict(),
98
+ environment: z
99
+ .object({
100
+ variables: z.record(z.string(), z.string()).optional(),
101
+ prefixes: z.array(z.string()).optional(),
102
+ })
103
+ .strict(),
104
+ timestamp: z.string().optional(),
105
+ sessionId: z.string().optional(),
106
+ version: z.string().optional(),
107
+ transport: z
108
+ .object({
109
+ type: z.string(),
110
+ url: z.string().optional(),
111
+ connectionId: z.string().optional(),
112
+ connectionTimestamp: z.string().optional(),
113
+ client: z.object({ name: z.string(), version: z.string(), title: z.string().optional() }).strict().optional(),
114
+ })
115
+ .strict()
116
+ .optional(),
117
+ })
118
+ .strict();
119
+ const configuredServerSourceSchema = z.enum(['mcpServers', 'mcpTemplates']);
56
120
  export function createAdminRoutes(options) {
57
121
  if (!options.adminEnabled) {
58
122
  options.adminService.revokeAllSessions();
@@ -421,8 +485,47 @@ export function createAdminRoutes(options) {
421
485
  ok: true,
422
486
  operationId: result.operationId,
423
487
  servers: result.result.servers,
488
+ configFingerprint: result.result.configFingerprint,
424
489
  });
425
490
  });
491
+ router.get('/api/instruction-templates', async (req, res) => {
492
+ const service = options.instructionTemplateService;
493
+ if (!service)
494
+ return void res.status(404).json({ error: 'admin_instruction_templates_unavailable' });
495
+ sendAdminOperationResult(res, await service.listTemplates({
496
+ context: buildAdminOperationContext(req, options, { type: 'instruction_template_collection' }),
497
+ }));
498
+ });
499
+ router.get('/api/instruction-templates/:identity', async (req, res) => {
500
+ await handleInstructionTemplateRequest(req, res, options, 'get');
501
+ });
502
+ router.post('/api/instruction-templates', async (req, res) => {
503
+ await handleInstructionTemplateRequest(req, res, options, 'create');
504
+ });
505
+ router.post('/api/instruction-templates/import-legacy', async (req, res) => {
506
+ await handleInstructionTemplateRequest(req, res, options, 'import');
507
+ });
508
+ router.post('/api/instruction-templates/:identity/clone', async (req, res) => {
509
+ await handleInstructionTemplateRequest(req, res, options, 'clone');
510
+ });
511
+ router.post('/api/instruction-templates/:identity/update', async (req, res) => {
512
+ await handleInstructionTemplateRequest(req, res, options, 'update');
513
+ });
514
+ router.post('/api/instruction-templates/:identity/validate', async (req, res) => {
515
+ await handleInstructionTemplateRequest(req, res, options, 'validate');
516
+ });
517
+ router.post('/api/instruction-templates/:identity/preview', async (req, res) => {
518
+ await handleInstructionTemplateRequest(req, res, options, 'preview');
519
+ });
520
+ router.post('/api/instruction-templates/:identity/activate', async (req, res) => {
521
+ await handleInstructionTemplateRequest(req, res, options, 'activate');
522
+ });
523
+ router.post('/api/instruction-templates/:identity/delete-preview', async (req, res) => {
524
+ await handleInstructionTemplateRequest(req, res, options, 'delete-preview');
525
+ });
526
+ router.delete('/api/instruction-templates/:identity', async (req, res) => {
527
+ await handleInstructionTemplateRequest(req, res, options, 'delete');
528
+ });
426
529
  router.get('/api/configured-servers/create-contract', async (req, res) => {
427
530
  await handleConfiguredServerCreateContract(req, res, options);
428
531
  });
@@ -432,9 +535,39 @@ export function createAdminRoutes(options) {
432
535
  router.post('/api/configured-servers', async (req, res) => {
433
536
  await handleConfiguredServerCreateApply(req, res, options);
434
537
  });
538
+ router.get('/api/configured-servers/:source/:name', async (req, res) => {
539
+ const source = configuredServerSourceSchema.safeParse(req.params.source);
540
+ if (!source.success)
541
+ return void res.status(400).json({ error: 'configured_server_source_invalid' });
542
+ await handleConfiguredServerDetail(req, res, options, source.data);
543
+ });
435
544
  router.get('/api/configured-servers/:name', async (req, res) => {
436
545
  await handleConfiguredServerDetail(req, res, options);
437
546
  });
547
+ router.post('/api/configured-servers/:source/:name/tool-inventory/refresh', async (req, res) => {
548
+ const source = configuredServerSourceSchema.safeParse(req.params.source);
549
+ if (!source.success)
550
+ return void res.status(400).json({ error: 'configured_server_source_invalid' });
551
+ await handleConfiguredToolInventoryRefresh(req, res, options, source.data);
552
+ });
553
+ router.post('/api/configured-servers/:source/:name/preview', async (req, res) => {
554
+ const source = configuredServerSourceSchema.safeParse(req.params.source);
555
+ if (!source.success)
556
+ return void res.status(400).json({ error: 'configured_server_source_invalid' });
557
+ await handleConfiguredServerPreview(req, res, options, source.data);
558
+ });
559
+ router.post('/api/configured-servers/:source/:name/apply', async (req, res) => {
560
+ const source = configuredServerSourceSchema.safeParse(req.params.source);
561
+ if (!source.success)
562
+ return void res.status(400).json({ error: 'configured_server_source_invalid' });
563
+ await handleConfiguredServerApply(req, res, options, source.data);
564
+ });
565
+ router.post('/api/configured-servers/mcpServers/:name/enable', async (req, res) => {
566
+ await handleConfiguredServerMutation(req, res, options, 'enableConfiguredServer', 'mcpServers');
567
+ });
568
+ router.post('/api/configured-servers/mcpServers/:name/disable', async (req, res) => {
569
+ await handleConfiguredServerMutation(req, res, options, 'disableConfiguredServer', 'mcpServers');
570
+ });
438
571
  router.post('/api/configured-servers/:name/preview', async (req, res) => {
439
572
  await handleConfiguredServerPreview(req, res, options);
440
573
  });
@@ -480,6 +613,113 @@ export function createAdminRoutes(options) {
480
613
  });
481
614
  return router;
482
615
  }
616
+ async function handleInstructionTemplateRequest(req, res, options, action) {
617
+ const service = options.instructionTemplateService;
618
+ if (!service)
619
+ return void res.status(404).json({ error: 'admin_instruction_templates_unavailable' });
620
+ const body = req.body && typeof req.body === 'object' ? req.body : {};
621
+ const identityValue = action === 'create' || action === 'import' ? body.identity : req.params.identity;
622
+ const identity = instructionTemplateIdentitySchema.safeParse(identityValue);
623
+ if (!identity.success)
624
+ return void res.status(400).json({ error: 'instruction_template_identity_invalid' });
625
+ const context = buildAdminOperationContext(req, options, { type: 'instruction_template', id: identity.data });
626
+ const expectedConfigFingerprint = typeof body.expectedConfigFingerprint === 'string' ? body.expectedConfigFingerprint : '';
627
+ try {
628
+ switch (action) {
629
+ case 'get':
630
+ return sendAdminOperationResult(res, await service.getTemplate({ context, identity: identity.data }));
631
+ case 'create':
632
+ case 'update': {
633
+ const variants = instructionTemplateVariantsSchema.safeParse(body.variants);
634
+ if (!variants.success || !expectedConfigFingerprint) {
635
+ return void res.status(400).json({ error: 'instruction_template_request_invalid' });
636
+ }
637
+ return sendInstructionTemplateResult(res, await (action === 'create' ? service.createTemplate : service.updateTemplate).call(service, {
638
+ context,
639
+ identity: identity.data,
640
+ variants: variants.data,
641
+ expectedConfigFingerprint,
642
+ }));
643
+ }
644
+ case 'clone': {
645
+ const destination = instructionTemplateIdentitySchema.safeParse(body.identity);
646
+ if (!destination.success || !expectedConfigFingerprint) {
647
+ return void res.status(400).json({ error: 'instruction_template_request_invalid' });
648
+ }
649
+ return sendInstructionTemplateResult(res, await service.cloneTemplate({
650
+ context,
651
+ sourceIdentity: identity.data,
652
+ identity: destination.data,
653
+ expectedConfigFingerprint,
654
+ }));
655
+ }
656
+ case 'validate':
657
+ return sendAdminOperationResult(res, await service.validateTemplate({ context, identity: identity.data, expectedConfigFingerprint }));
658
+ case 'preview': {
659
+ const preview = z
660
+ .object({
661
+ surface: z.enum(['initialize', 'cli']),
662
+ selection: instructionPreviewSelectionSchema,
663
+ requestContext: requestContextSchema.optional(),
664
+ })
665
+ .strict()
666
+ .safeParse(body);
667
+ if (!preview.success)
668
+ return void res.status(400).json({ error: 'instruction_template_preview_invalid' });
669
+ return sendAdminOperationResult(res, await service.previewTemplate({ context, identity: identity.data, ...preview.data }));
670
+ }
671
+ case 'activate':
672
+ case 'delete': {
673
+ const previewFingerprint = typeof body.previewFingerprint === 'string' ? body.previewFingerprint : '';
674
+ if (!expectedConfigFingerprint || !previewFingerprint) {
675
+ return void res.status(400).json({ error: 'instruction_template_request_invalid' });
676
+ }
677
+ return sendInstructionTemplateResult(res, await (action === 'activate' ? service.activateTemplate : service.deleteTemplate).call(service, {
678
+ context,
679
+ identity: identity.data,
680
+ expectedConfigFingerprint,
681
+ previewFingerprint,
682
+ }));
683
+ }
684
+ case 'import':
685
+ if (!expectedConfigFingerprint) {
686
+ return void res.status(400).json({ error: 'instruction_template_request_invalid' });
687
+ }
688
+ return sendInstructionTemplateResult(res, await service.importLegacyTemplate({ context, identity: identity.data, expectedConfigFingerprint }));
689
+ case 'delete-preview':
690
+ return sendAdminOperationResult(res, await service.previewDeleteTemplate({ context, identity: identity.data, expectedConfigFingerprint }));
691
+ }
692
+ }
693
+ catch (error) {
694
+ if (error instanceof AdminInstructionTemplateNotFoundError) {
695
+ res.status(404).json({ error: error.code });
696
+ return;
697
+ }
698
+ throw error;
699
+ }
700
+ }
701
+ function sendInstructionTemplateResult(res, result) {
702
+ if (!result.ok)
703
+ return sendAdminOperationResult(res, result);
704
+ const status = result.result?.status;
705
+ if (status === 'not_found')
706
+ return void res.status(404).json({ ok: false, error: 'instruction_template_not_found' });
707
+ if (status === 'invalid') {
708
+ return void res
709
+ .status(422)
710
+ .json({ ok: false, error: 'instruction_template_invalid', validation: result.result.validation });
711
+ }
712
+ if (status === 'legacy_unavailable') {
713
+ return void res.status(409).json({ ok: false, error: 'legacy_instruction_template_unavailable' });
714
+ }
715
+ if (status === 'conflict' ||
716
+ status === 'identity_conflict' ||
717
+ status === 'protected' ||
718
+ status === 'active_conflict') {
719
+ return void res.status(409).json({ ok: false, error: `instruction_template_${status}` });
720
+ }
721
+ sendAdminOperationResult(res, result);
722
+ }
483
723
  function streamBackendLogs(req, res, broker, adminService) {
484
724
  const sessionToken = getAdminSessionCookie(req);
485
725
  let closed = false;
@@ -786,16 +1026,22 @@ function backendRestartFailure(outcome) {
786
1026
  };
787
1027
  }
788
1028
  }
789
- async function handleConfiguredServerDetail(req, res, options) {
1029
+ async function handleConfiguredServerDetail(req, res, options, targetSource) {
790
1030
  if (!options.configuredServerService) {
791
1031
  res.status(404).json({ error: 'admin_configured_servers_unavailable' });
792
1032
  return;
793
1033
  }
794
1034
  const targetName = req.params.name;
795
1035
  try {
1036
+ const model = configuredServerModelSchema.safeParse(req.query.model);
796
1037
  const result = await options.configuredServerService.getConfiguredServerDetail({
797
- context: buildAdminOperationContext(req, options, { type: 'configured_server', id: targetName }),
1038
+ context: buildAdminOperationContext(req, options, {
1039
+ type: 'configured_server',
1040
+ id: `${targetSource ?? 'mcpServers'}:${targetName}`,
1041
+ }),
798
1042
  targetName,
1043
+ ...(targetSource ? { targetSource } : {}),
1044
+ ...(model.success ? { model: model.data } : {}),
799
1045
  });
800
1046
  if (!result.ok) {
801
1047
  sendAdminOperationResult(res, result);
@@ -806,6 +1052,7 @@ async function handleConfiguredServerDetail(req, res, options) {
806
1052
  operationId: result.operationId,
807
1053
  server: result.result.server,
808
1054
  editContract: result.result.editContract,
1055
+ ...(result.result.toolInventory ? { toolInventory: result.result.toolInventory } : {}),
809
1056
  });
810
1057
  }
811
1058
  catch (error) {
@@ -822,6 +1069,51 @@ async function handleConfiguredServerDetail(req, res, options) {
822
1069
  throw error;
823
1070
  }
824
1071
  }
1072
+ async function handleConfiguredToolInventoryRefresh(req, res, options, targetSource) {
1073
+ if (!options.configuredServerService?.refreshConfiguredToolInventory) {
1074
+ res.status(404).json({ error: 'admin_configured_servers_unavailable' });
1075
+ return;
1076
+ }
1077
+ const body = configuredToolInventoryRefreshSchema.safeParse(req.body ?? {});
1078
+ if (!body.success) {
1079
+ res.status(400).json({ error: 'configured_tool_inventory_refresh_invalid' });
1080
+ return;
1081
+ }
1082
+ const targetName = req.params.name;
1083
+ try {
1084
+ const result = await options.configuredServerService.refreshConfiguredToolInventory({
1085
+ context: buildAdminOperationContext(req, options, {
1086
+ type: 'configured_server',
1087
+ id: `${targetSource}:${targetName}`,
1088
+ }),
1089
+ targetName,
1090
+ targetSource,
1091
+ ...(body.data.model ? { model: body.data.model } : {}),
1092
+ });
1093
+ if (!result.ok) {
1094
+ sendAdminOperationResult(res, result);
1095
+ return;
1096
+ }
1097
+ res.status(200).json({
1098
+ ok: true,
1099
+ operationId: result.operationId,
1100
+ toolInventory: result.result,
1101
+ });
1102
+ }
1103
+ catch (error) {
1104
+ if (error instanceof AdminConfiguredServerNotFoundError) {
1105
+ res.status(404).json({
1106
+ ok: false,
1107
+ error: error.code,
1108
+ code: error.code,
1109
+ message: 'Configured server target was not found',
1110
+ target: { type: 'configured_server', id: `${targetSource}:${targetName}` },
1111
+ });
1112
+ return;
1113
+ }
1114
+ throw error;
1115
+ }
1116
+ }
825
1117
  async function handleConfiguredServerCreateContract(req, res, options) {
826
1118
  if (!options.configuredServerService) {
827
1119
  res.status(404).json({ error: 'admin_configured_servers_unavailable' });
@@ -906,7 +1198,7 @@ function configuredServerCreateDraftName(draft) {
906
1198
  const name = draft.name;
907
1199
  return typeof name === 'string' ? name : '';
908
1200
  }
909
- async function handleConfiguredServerPreview(req, res, options) {
1201
+ async function handleConfiguredServerPreview(req, res, options, targetSource) {
910
1202
  if (!options.configuredServerService) {
911
1203
  res.status(404).json({ error: 'admin_configured_servers_unavailable' });
912
1204
  return;
@@ -914,11 +1206,17 @@ async function handleConfiguredServerPreview(req, res, options) {
914
1206
  const targetName = req.params.name;
915
1207
  const edit = getBodyValue(req.body, 'edit');
916
1208
  try {
1209
+ const model = configuredServerModelSchema.safeParse(getBodyString(req.body, 'model'));
917
1210
  const result = await options.configuredServerService.previewConfiguredServerEdit({
918
- context: buildAdminOperationContext(req, options, { type: 'configured_server', id: targetName }),
1211
+ context: buildAdminOperationContext(req, options, {
1212
+ type: 'configured_server',
1213
+ id: `${targetSource ?? 'mcpServers'}:${targetName}`,
1214
+ }),
919
1215
  targetName,
1216
+ ...(targetSource ? { targetSource } : {}),
920
1217
  edit: edit === undefined ? {} : edit,
921
1218
  connectivityCheck: getBodyString(req.body, 'connectivityCheck') === 'manual' ? 'manual' : 'auto',
1219
+ ...(model.success ? { model: model.data } : {}),
922
1220
  });
923
1221
  if (!result.ok) {
924
1222
  sendAdminOperationResult(res, result);
@@ -944,7 +1242,7 @@ async function handleConfiguredServerPreview(req, res, options) {
944
1242
  throw error;
945
1243
  }
946
1244
  }
947
- async function handleConfiguredServerApply(req, res, options) {
1245
+ async function handleConfiguredServerApply(req, res, options, targetSource) {
948
1246
  if (!options.configuredServerService) {
949
1247
  res.status(404).json({ error: 'admin_configured_servers_unavailable' });
950
1248
  return;
@@ -962,11 +1260,17 @@ async function handleConfiguredServerApply(req, res, options) {
962
1260
  }
963
1261
  const targetName = req.params.name;
964
1262
  try {
1263
+ const model = configuredServerModelSchema.safeParse(getBodyString(req.body, 'model'));
965
1264
  const result = await options.configuredServerService.applyConfiguredServerEdit({
966
- context: buildAdminOperationContext(req, options, { type: 'configured_server', id: targetName }),
1265
+ context: buildAdminOperationContext(req, options, {
1266
+ type: 'configured_server',
1267
+ id: `${targetSource ?? 'mcpServers'}:${targetName}`,
1268
+ }),
967
1269
  targetName,
1270
+ ...(targetSource ? { targetSource } : {}),
968
1271
  edit: getBodyValue(req.body, 'edit') ?? {},
969
1272
  previewFingerprint: getBodyString(req.body, 'previewFingerprint'),
1273
+ ...(model.success ? { model: model.data } : {}),
970
1274
  });
971
1275
  if (!result.ok && result.status === 'mutation_failed' && isConfiguredServerApplyErrorCode(result.error)) {
972
1276
  sendConfiguredServerApplyError(res, result.error);
@@ -1020,7 +1324,7 @@ function configuredServerApplyErrorMessage(code) {
1020
1324
  return 'The configured server edit could not be applied.';
1021
1325
  }
1022
1326
  }
1023
- async function handleConfiguredServerMutation(req, res, options, operationName) {
1327
+ async function handleConfiguredServerMutation(req, res, options, operationName, targetSource) {
1024
1328
  if (!options.configuredServerService) {
1025
1329
  res.status(404).json({ error: 'admin_configured_servers_unavailable' });
1026
1330
  return;
@@ -1037,8 +1341,11 @@ async function handleConfiguredServerMutation(req, res, options, operationName)
1037
1341
  return;
1038
1342
  }
1039
1343
  const targetName = req.params.name;
1040
- const context = buildAdminOperationContext(req, options, { type: 'configured_server', id: targetName });
1041
- const input = { context, targetName };
1344
+ const context = buildAdminOperationContext(req, options, {
1345
+ type: 'configured_server',
1346
+ id: `${targetSource ?? 'mcpServers'}:${targetName}`,
1347
+ });
1348
+ const input = { context, targetName, ...(targetSource ? { targetSource } : {}) };
1042
1349
  const result = operationName === 'enableConfiguredServer'
1043
1350
  ? await options.configuredServerService.enableConfiguredServer(input)
1044
1351
  : await options.configuredServerService.disableConfiguredServer(input);
@@ -1531,6 +1838,11 @@ function configuredServerRequestFingerprint(operationName, targetName, body) {
1531
1838
  },
1532
1839
  }
1533
1840
  : {}),
1841
+ ...(operationName.includes('InstructionTemplate') || operationName === 'applyConfiguredServerInstructionOverride'
1842
+ ? {
1843
+ bodyDigest: keyedRequestFingerprint(previewFingerprint || getBodyString(body, 'expectedConfigFingerprint') || operationName, 'admin-instruction-operation', stableJsonStringify(body ?? {})),
1844
+ }
1845
+ : {}),
1534
1846
  });
1535
1847
  if (operationName === 'applyConfiguredServerCreate') {
1536
1848
  return `configured_server_create_${keyedRequestFingerprint(previewFingerprint, 'configured-server-create', normalized)}`;
@@ -1621,6 +1933,30 @@ function cliOperationErrorDetails(result) {
1621
1933
  return details;
1622
1934
  }
1623
1935
  function operationNameForRequest(req) {
1936
+ if (req.path.startsWith('/api/instruction-templates')) {
1937
+ if (req.path.endsWith('/clone'))
1938
+ return 'cloneInstructionTemplate';
1939
+ if (req.path.endsWith('/update'))
1940
+ return 'updateInstructionTemplate';
1941
+ if (req.path.endsWith('/validate'))
1942
+ return 'validateInstructionTemplate';
1943
+ if (req.path.endsWith('/preview'))
1944
+ return 'previewInstructionTemplate';
1945
+ if (req.path.endsWith('/activate'))
1946
+ return 'activateInstructionTemplate';
1947
+ if (req.path.endsWith('/delete-preview'))
1948
+ return 'previewDeleteInstructionTemplate';
1949
+ if (req.path.endsWith('/import-legacy'))
1950
+ return 'importLegacyInstructionTemplate';
1951
+ if (req.method === 'DELETE')
1952
+ return 'deleteInstructionTemplate';
1953
+ if (req.method === 'POST')
1954
+ return 'createInstructionTemplate';
1955
+ return req.path === '/api/instruction-templates' ? 'listInstructionTemplates' : 'getInstructionTemplate';
1956
+ }
1957
+ if (req.path.endsWith('/instruction-override')) {
1958
+ return 'applyConfiguredServerInstructionOverride';
1959
+ }
1624
1960
  if (req.path.startsWith('/api/oauth/')) {
1625
1961
  return req.path.endsWith('/restart') ? 'restartBackendOAuth' : 'authorizeBackendOAuth';
1626
1962
  }