@frontmcp/sdk 0.4.0 → 0.5.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 (558) hide show
  1. package/README.md +30 -18
  2. package/package.json +20 -5
  3. package/src/app/app.registry.d.ts +3 -2
  4. package/src/app/app.registry.js +3 -1
  5. package/src/app/app.registry.js.map +1 -1
  6. package/src/app/instances/app.local.instance.js +2 -2
  7. package/src/app/instances/app.local.instance.js.map +1 -1
  8. package/src/auth/auth.registry.d.ts +34 -2
  9. package/src/auth/auth.registry.js +162 -24
  10. package/src/auth/auth.registry.js.map +1 -1
  11. package/src/auth/auth.utils.js +8 -9
  12. package/src/auth/auth.utils.js.map +1 -1
  13. package/src/auth/authorization/authorization.class.d.ts +125 -0
  14. package/src/auth/authorization/authorization.class.js +224 -0
  15. package/src/auth/authorization/authorization.class.js.map +1 -0
  16. package/src/auth/authorization/authorization.types.d.ts +300 -0
  17. package/src/auth/authorization/authorization.types.js +79 -0
  18. package/src/auth/authorization/authorization.types.js.map +1 -0
  19. package/src/auth/authorization/index.d.ts +5 -0
  20. package/src/auth/authorization/index.js +19 -0
  21. package/src/auth/authorization/index.js.map +1 -0
  22. package/src/auth/authorization/orchestrated.authorization.d.ts +242 -0
  23. package/src/auth/authorization/orchestrated.authorization.js +306 -0
  24. package/src/auth/authorization/orchestrated.authorization.js.map +1 -0
  25. package/src/auth/authorization/public.authorization.d.ts +91 -0
  26. package/src/auth/authorization/public.authorization.js +132 -0
  27. package/src/auth/authorization/public.authorization.js.map +1 -0
  28. package/src/auth/authorization/transparent.authorization.d.ts +130 -0
  29. package/src/auth/authorization/transparent.authorization.js +147 -0
  30. package/src/auth/authorization/transparent.authorization.js.map +1 -0
  31. package/src/auth/consent/consent.types.d.ts +111 -0
  32. package/src/auth/consent/consent.types.js +119 -0
  33. package/src/auth/consent/consent.types.js.map +1 -0
  34. package/src/auth/consent/index.d.ts +1 -0
  35. package/src/auth/consent/index.js +13 -0
  36. package/src/auth/consent/index.js.map +1 -0
  37. package/src/auth/detection/auth-provider-detection.d.ts +84 -0
  38. package/src/auth/detection/auth-provider-detection.js +230 -0
  39. package/src/auth/detection/auth-provider-detection.js.map +1 -0
  40. package/src/auth/detection/index.d.ts +1 -0
  41. package/src/auth/detection/index.js +15 -0
  42. package/src/auth/detection/index.js.map +1 -0
  43. package/src/auth/flows/auth.verify.flow.d.ts +110 -0
  44. package/src/auth/flows/auth.verify.flow.js +379 -0
  45. package/src/auth/flows/auth.verify.flow.js.map +1 -0
  46. package/src/auth/flows/oauth.authorize.flow.d.ts +118 -164
  47. package/src/auth/flows/oauth.authorize.flow.js +701 -33
  48. package/src/auth/flows/oauth.authorize.flow.js.map +1 -1
  49. package/src/auth/flows/oauth.callback.flow.d.ts +117 -0
  50. package/src/auth/flows/oauth.callback.flow.js +357 -0
  51. package/src/auth/flows/oauth.callback.flow.js.map +1 -0
  52. package/src/auth/flows/oauth.register.flow.d.ts +32 -125
  53. package/src/auth/flows/oauth.token.flow.d.ts +52 -154
  54. package/src/auth/flows/oauth.token.flow.js +193 -55
  55. package/src/auth/flows/oauth.token.flow.js.map +1 -1
  56. package/src/auth/flows/session.verify.flow.d.ts +66 -321
  57. package/src/auth/flows/session.verify.flow.js +107 -18
  58. package/src/auth/flows/session.verify.flow.js.map +1 -1
  59. package/src/auth/flows/well-known.jwks.flow.d.ts +34 -205
  60. package/src/auth/flows/well-known.jwks.flow.js +15 -8
  61. package/src/auth/flows/well-known.jwks.flow.js.map +1 -1
  62. package/src/auth/flows/well-known.oauth-authorization-server.flow.d.ts +48 -223
  63. package/src/auth/flows/well-known.oauth-authorization-server.flow.js +2 -3
  64. package/src/auth/flows/well-known.oauth-authorization-server.flow.js.map +1 -1
  65. package/src/auth/flows/well-known.prm.flow.d.ts +19 -120
  66. package/src/auth/flows/well-known.prm.flow.js +3 -4
  67. package/src/auth/flows/well-known.prm.flow.js.map +1 -1
  68. package/src/auth/instances/instance.local-primary-auth.d.ts +91 -4
  69. package/src/auth/instances/instance.local-primary-auth.js +236 -6
  70. package/src/auth/instances/instance.local-primary-auth.js.map +1 -1
  71. package/src/auth/instances/instance.remote-primary-auth.d.ts +4 -3
  72. package/src/auth/instances/instance.remote-primary-auth.js +2 -2
  73. package/src/auth/instances/instance.remote-primary-auth.js.map +1 -1
  74. package/src/auth/session/authorization-vault.d.ts +611 -0
  75. package/src/auth/session/authorization-vault.js +817 -0
  76. package/src/auth/session/authorization-vault.js.map +1 -0
  77. package/src/auth/session/authorization.store.d.ts +301 -0
  78. package/src/auth/session/authorization.store.js +323 -0
  79. package/src/auth/session/authorization.store.js.map +1 -0
  80. package/src/auth/session/encrypted-authorization-vault.d.ts +181 -0
  81. package/src/auth/session/encrypted-authorization-vault.js +493 -0
  82. package/src/auth/session/encrypted-authorization-vault.js.map +1 -0
  83. package/src/auth/session/index.d.ts +4 -4
  84. package/src/auth/session/index.js +11 -7
  85. package/src/auth/session/index.js.map +1 -1
  86. package/src/auth/session/session.schema.d.ts +1 -1
  87. package/src/auth/session/session.service.d.ts +1 -1
  88. package/src/auth/session/transport-session.manager.d.ts +101 -0
  89. package/src/auth/session/transport-session.manager.js +300 -0
  90. package/src/auth/session/transport-session.manager.js.map +1 -0
  91. package/src/auth/session/transport-session.types.d.ts +457 -0
  92. package/src/auth/session/transport-session.types.js +110 -0
  93. package/src/auth/session/transport-session.types.js.map +1 -0
  94. package/src/auth/session/utils/session-id.utils.d.ts +14 -2
  95. package/src/auth/session/utils/session-id.utils.js +68 -19
  96. package/src/auth/session/utils/session-id.utils.js.map +1 -1
  97. package/src/auth/session/vault-encryption.d.ts +189 -0
  98. package/src/auth/session/vault-encryption.js +263 -0
  99. package/src/auth/session/vault-encryption.js.map +1 -0
  100. package/src/auth/ui/base-layout.d.ts +188 -0
  101. package/src/auth/ui/base-layout.js +292 -0
  102. package/src/auth/ui/base-layout.js.map +1 -0
  103. package/src/auth/ui/htmx-templates.d.ts +135 -0
  104. package/src/auth/ui/htmx-templates.js +433 -0
  105. package/src/auth/ui/htmx-templates.js.map +1 -0
  106. package/src/auth/ui/index.d.ts +11 -0
  107. package/src/auth/ui/index.js +35 -0
  108. package/src/auth/ui/index.js.map +1 -0
  109. package/src/auth/utils/audience.validator.d.ts +129 -0
  110. package/src/auth/utils/audience.validator.js +196 -0
  111. package/src/auth/utils/audience.validator.js.map +1 -0
  112. package/src/auth/utils/index.d.ts +2 -0
  113. package/src/auth/utils/index.js +7 -0
  114. package/src/auth/utils/index.js.map +1 -0
  115. package/src/auth/utils/www-authenticate.utils.d.ts +97 -0
  116. package/src/auth/utils/www-authenticate.utils.js +183 -0
  117. package/src/auth/utils/www-authenticate.utils.js.map +1 -0
  118. package/src/common/common.schema.d.ts +2 -16
  119. package/src/common/constants.d.ts +3 -0
  120. package/src/common/constants.js +6 -1
  121. package/src/common/constants.js.map +1 -1
  122. package/src/common/decorators/decorator-utils.d.ts +131 -0
  123. package/src/common/decorators/decorator-utils.js +195 -0
  124. package/src/common/decorators/decorator-utils.js.map +1 -0
  125. package/src/common/decorators/front-mcp.decorator.js +3 -2
  126. package/src/common/decorators/front-mcp.decorator.js.map +1 -1
  127. package/src/common/decorators/hook.decorator.d.ts +58 -2
  128. package/src/common/decorators/hook.decorator.js +127 -17
  129. package/src/common/decorators/hook.decorator.js.map +1 -1
  130. package/src/common/decorators/plugin.decorator.d.ts +1 -1
  131. package/src/common/decorators/plugin.decorator.js +11 -10
  132. package/src/common/decorators/plugin.decorator.js.map +1 -1
  133. package/src/common/decorators/resource.decorator.d.ts +32 -3
  134. package/src/common/decorators/resource.decorator.js +46 -4
  135. package/src/common/decorators/resource.decorator.js.map +1 -1
  136. package/src/common/decorators/tool.decorator.d.ts +54 -5
  137. package/src/common/decorators/tool.decorator.js.map +1 -1
  138. package/src/common/dynamic/dynamic.plugin.d.ts +22 -11
  139. package/src/common/dynamic/dynamic.plugin.js +7 -1
  140. package/src/common/dynamic/dynamic.plugin.js.map +1 -1
  141. package/src/common/entries/prompt.entry.d.ts +46 -2
  142. package/src/common/entries/prompt.entry.js +10 -0
  143. package/src/common/entries/prompt.entry.js.map +1 -1
  144. package/src/common/entries/resource.entry.d.ts +69 -6
  145. package/src/common/entries/resource.entry.js +27 -3
  146. package/src/common/entries/resource.entry.js.map +1 -1
  147. package/src/common/entries/scope.entry.d.ts +5 -1
  148. package/src/common/entries/scope.entry.js +3 -3
  149. package/src/common/entries/scope.entry.js.map +1 -1
  150. package/src/common/flow/flow.utils.d.ts +56 -0
  151. package/src/common/flow/flow.utils.js +96 -0
  152. package/src/common/flow/flow.utils.js.map +1 -0
  153. package/src/common/index.d.ts +2 -2
  154. package/src/common/index.js +2 -2
  155. package/src/common/index.js.map +1 -1
  156. package/src/common/interfaces/execution-context.interface.d.ts +59 -0
  157. package/src/common/interfaces/execution-context.interface.js +81 -0
  158. package/src/common/interfaces/execution-context.interface.js.map +1 -0
  159. package/src/common/interfaces/flow.interface.d.ts +1 -1
  160. package/src/common/interfaces/flow.interface.js.map +1 -1
  161. package/src/common/interfaces/index.d.ts +1 -0
  162. package/src/common/interfaces/index.js +1 -0
  163. package/src/common/interfaces/index.js.map +1 -1
  164. package/src/common/interfaces/internal/primary-auth-provider.interface.d.ts +17 -2
  165. package/src/common/interfaces/internal/primary-auth-provider.interface.js +52 -4
  166. package/src/common/interfaces/internal/primary-auth-provider.interface.js.map +1 -1
  167. package/src/common/interfaces/internal/registry.interface.d.ts +16 -2
  168. package/src/common/interfaces/internal/registry.interface.js.map +1 -1
  169. package/src/common/interfaces/plugin.interface.js.map +1 -1
  170. package/src/common/interfaces/prompt.interface.d.ts +53 -4
  171. package/src/common/interfaces/prompt.interface.js +78 -0
  172. package/src/common/interfaces/prompt.interface.js.map +1 -1
  173. package/src/common/interfaces/resource.interface.d.ts +47 -17
  174. package/src/common/interfaces/resource.interface.js +53 -0
  175. package/src/common/interfaces/resource.interface.js.map +1 -1
  176. package/src/common/interfaces/tool.interface.d.ts +39 -22
  177. package/src/common/interfaces/tool.interface.js +61 -34
  178. package/src/common/interfaces/tool.interface.js.map +1 -1
  179. package/src/common/metadata/adapter.metadata.d.ts +1 -9
  180. package/src/common/metadata/app.metadata.d.ts +425 -730
  181. package/src/common/metadata/auth-provider.metadata.d.ts +2 -12
  182. package/src/common/metadata/flow.metadata.d.ts +10 -25
  183. package/src/common/metadata/front-mcp.metadata.d.ts +602 -1023
  184. package/src/common/metadata/front-mcp.metadata.js +6 -4
  185. package/src/common/metadata/front-mcp.metadata.js.map +1 -1
  186. package/src/common/metadata/hook.metadata.d.ts +1 -1
  187. package/src/common/metadata/hook.metadata.js.map +1 -1
  188. package/src/common/metadata/index.d.ts +1 -0
  189. package/src/common/metadata/index.js +1 -0
  190. package/src/common/metadata/index.js.map +1 -1
  191. package/src/common/metadata/logger.metadata.d.ts +1 -9
  192. package/src/common/metadata/plugin.metadata.d.ts +8 -30
  193. package/src/common/metadata/prompt.metadata.d.ts +4 -161
  194. package/src/common/metadata/provider.metadata.d.ts +2 -12
  195. package/src/common/metadata/resource.metadata.d.ts +6 -98
  196. package/src/common/metadata/resource.metadata.js +15 -6
  197. package/src/common/metadata/resource.metadata.js.map +1 -1
  198. package/src/common/metadata/tool-ui.metadata.d.ts +10 -0
  199. package/src/common/metadata/tool-ui.metadata.js +12 -0
  200. package/src/common/metadata/tool-ui.metadata.js.map +1 -0
  201. package/src/common/metadata/tool.metadata.d.ts +78 -199
  202. package/src/common/metadata/tool.metadata.js +11 -14
  203. package/src/common/metadata/tool.metadata.js.map +1 -1
  204. package/src/common/providers/base-config.provider.d.ts +84 -0
  205. package/src/common/providers/base-config.provider.js +128 -0
  206. package/src/common/providers/base-config.provider.js.map +1 -0
  207. package/src/common/records/plugin.record.d.ts +5 -6
  208. package/src/common/records/plugin.record.js.map +1 -1
  209. package/src/common/records/prompt.record.js.map +1 -1
  210. package/src/common/records/resource.record.d.ts +17 -1
  211. package/src/common/records/resource.record.js +12 -6
  212. package/src/common/records/resource.record.js.map +1 -1
  213. package/src/common/records/tool.record.js.map +1 -1
  214. package/src/common/schemas/annotated-class.schema.d.ts +9 -9
  215. package/src/common/schemas/annotated-class.schema.js +92 -27
  216. package/src/common/schemas/annotated-class.schema.js.map +1 -1
  217. package/src/common/schemas/http-input.schema.d.ts +6 -30
  218. package/src/common/schemas/http-output.schema.d.ts +326 -1630
  219. package/src/common/schemas/http-output.schema.js +39 -1
  220. package/src/common/schemas/http-output.schema.js.map +1 -1
  221. package/src/common/tokens/front-mcp.tokens.js +4 -1
  222. package/src/common/tokens/front-mcp.tokens.js.map +1 -1
  223. package/src/common/tokens/resource.tokens.d.ts +2 -0
  224. package/src/common/tokens/resource.tokens.js +4 -1
  225. package/src/common/tokens/resource.tokens.js.map +1 -1
  226. package/src/common/tokens/tool.tokens.d.ts +2 -0
  227. package/src/common/tokens/tool.tokens.js +2 -0
  228. package/src/common/tokens/tool.tokens.js.map +1 -1
  229. package/src/common/types/auth/jwt.types.d.ts +5 -31
  230. package/src/common/types/auth/session.types.d.ts +97 -192
  231. package/src/common/types/auth/session.types.js +24 -11
  232. package/src/common/types/auth/session.types.js.map +1 -1
  233. package/src/common/types/options/auth.options.d.ts +1013 -490
  234. package/src/common/types/options/auth.options.js +554 -36
  235. package/src/common/types/options/auth.options.js.map +1 -1
  236. package/src/common/types/options/http.options.d.ts +1 -9
  237. package/src/common/types/options/logging.options.d.ts +7 -13
  238. package/src/common/types/options/logging.options.js +4 -0
  239. package/src/common/types/options/logging.options.js.map +1 -1
  240. package/src/common/types/options/server-info.options.d.ts +3 -31
  241. package/src/common/types/options/session.options.d.ts +90 -10
  242. package/src/common/types/options/session.options.js +26 -3
  243. package/src/common/types/options/session.options.js.map +1 -1
  244. package/src/common/utils/decide-request-intent.utils.d.ts +8 -46
  245. package/src/common/utils/decide-request-intent.utils.js +88 -23
  246. package/src/common/utils/decide-request-intent.utils.js.map +1 -1
  247. package/src/completion/flows/complete.flow.d.ts +74 -0
  248. package/src/completion/flows/complete.flow.js +199 -0
  249. package/src/completion/flows/complete.flow.js.map +1 -0
  250. package/src/errors/authorization-required.error.d.ts +189 -0
  251. package/src/errors/authorization-required.error.js +274 -0
  252. package/src/errors/authorization-required.error.js.map +1 -0
  253. package/src/errors/index.d.ts +2 -1
  254. package/src/errors/index.js +17 -1
  255. package/src/errors/index.js.map +1 -1
  256. package/src/errors/mcp.error.d.ts +101 -1
  257. package/src/errors/mcp.error.js +147 -2
  258. package/src/errors/mcp.error.js.map +1 -1
  259. package/src/flows/flow.instance.js +4 -3
  260. package/src/flows/flow.instance.js.map +1 -1
  261. package/src/flows/flow.registry.js.map +1 -1
  262. package/src/flows/flow.stages.js +14 -11
  263. package/src/flows/flow.stages.js.map +1 -1
  264. package/src/front-mcp/front-mcp.providers.d.ts +464 -102
  265. package/src/front-mcp/front-mcp.providers.js +3 -5
  266. package/src/front-mcp/front-mcp.providers.js.map +1 -1
  267. package/src/hooks/hook.instance.d.ts +1 -1
  268. package/src/hooks/hook.instance.js +5 -2
  269. package/src/hooks/hook.instance.js.map +1 -1
  270. package/src/hooks/hook.registry.js +7 -5
  271. package/src/hooks/hook.registry.js.map +1 -1
  272. package/src/index.d.ts +28 -9
  273. package/src/index.js +5 -1
  274. package/src/index.js.map +1 -1
  275. package/src/logger/instances/instance.logger.js +3 -2
  276. package/src/logger/instances/instance.logger.js.map +1 -1
  277. package/src/logger/logger.registry.js +7 -2
  278. package/src/logger/logger.registry.js.map +1 -1
  279. package/src/logging/flows/set-level.flow.d.ts +62 -0
  280. package/src/logging/flows/set-level.flow.js +108 -0
  281. package/src/logging/flows/set-level.flow.js.map +1 -0
  282. package/src/mcp-apps/csp.d.ts +111 -0
  283. package/src/mcp-apps/csp.js +267 -0
  284. package/src/mcp-apps/csp.js.map +1 -0
  285. package/src/mcp-apps/index.d.ts +23 -0
  286. package/src/mcp-apps/index.js +91 -0
  287. package/src/mcp-apps/index.js.map +1 -0
  288. package/src/mcp-apps/schemas.d.ts +403 -0
  289. package/src/mcp-apps/schemas.js +345 -0
  290. package/src/mcp-apps/schemas.js.map +1 -0
  291. package/src/mcp-apps/template.d.ts +94 -0
  292. package/src/mcp-apps/template.js +419 -0
  293. package/src/mcp-apps/template.js.map +1 -0
  294. package/src/mcp-apps/types.d.ts +323 -0
  295. package/src/mcp-apps/types.js +59 -0
  296. package/src/mcp-apps/types.js.map +1 -0
  297. package/src/notification/index.d.ts +1 -0
  298. package/src/notification/index.js +13 -0
  299. package/src/notification/index.js.map +1 -0
  300. package/src/notification/notification.service.d.ts +378 -0
  301. package/src/notification/notification.service.js +727 -0
  302. package/src/notification/notification.service.js.map +1 -0
  303. package/src/plugin/plugin.registry.js +12 -9
  304. package/src/plugin/plugin.registry.js.map +1 -1
  305. package/src/prompt/flows/get-prompt.flow.d.ts +153 -0
  306. package/src/prompt/flows/get-prompt.flow.js +214 -0
  307. package/src/prompt/flows/get-prompt.flow.js.map +1 -0
  308. package/src/prompt/flows/prompts-list.flow.d.ts +67 -0
  309. package/src/prompt/flows/prompts-list.flow.js +176 -0
  310. package/src/prompt/flows/prompts-list.flow.js.map +1 -0
  311. package/src/prompt/index.d.ts +7 -0
  312. package/src/prompt/index.js +17 -0
  313. package/src/prompt/index.js.map +1 -0
  314. package/src/prompt/prompt.events.d.ts +17 -0
  315. package/src/prompt/prompt.events.js +25 -0
  316. package/src/prompt/prompt.events.js.map +1 -0
  317. package/src/prompt/prompt.instance.d.ts +30 -0
  318. package/src/prompt/prompt.instance.js +120 -0
  319. package/src/prompt/prompt.instance.js.map +1 -0
  320. package/src/prompt/prompt.registry.d.ts +79 -12
  321. package/src/prompt/prompt.registry.js +360 -15
  322. package/src/prompt/prompt.registry.js.map +1 -1
  323. package/src/prompt/prompt.types.d.ts +26 -0
  324. package/src/prompt/prompt.types.js +11 -0
  325. package/src/prompt/prompt.types.js.map +1 -0
  326. package/src/prompt/prompt.utils.d.ts +26 -0
  327. package/src/prompt/prompt.utils.js +136 -0
  328. package/src/prompt/prompt.utils.js.map +1 -0
  329. package/src/provider/provider.registry.d.ts +12 -5
  330. package/src/provider/provider.registry.js +30 -138
  331. package/src/provider/provider.registry.js.map +1 -1
  332. package/src/regsitry/registry.base.d.ts +1 -1
  333. package/src/regsitry/registry.base.js.map +1 -1
  334. package/src/resource/flows/read-resource.flow.d.ts +91 -0
  335. package/src/resource/flows/read-resource.flow.js +270 -0
  336. package/src/resource/flows/read-resource.flow.js.map +1 -0
  337. package/src/resource/flows/resource-templates-list.flow.d.ts +64 -0
  338. package/src/resource/flows/resource-templates-list.flow.js +191 -0
  339. package/src/resource/flows/resource-templates-list.flow.js.map +1 -0
  340. package/src/resource/flows/resources-list.flow.d.ts +64 -0
  341. package/src/resource/flows/resources-list.flow.js +196 -0
  342. package/src/resource/flows/resources-list.flow.js.map +1 -0
  343. package/src/resource/flows/subscribe-resource.flow.d.ts +45 -0
  344. package/src/resource/flows/subscribe-resource.flow.js +123 -0
  345. package/src/resource/flows/subscribe-resource.flow.js.map +1 -0
  346. package/src/resource/flows/unsubscribe-resource.flow.d.ts +44 -0
  347. package/src/resource/flows/unsubscribe-resource.flow.js +107 -0
  348. package/src/resource/flows/unsubscribe-resource.flow.js.map +1 -0
  349. package/src/resource/index.d.ts +8 -0
  350. package/src/resource/index.js +20 -0
  351. package/src/resource/index.js.map +1 -0
  352. package/src/resource/resource.events.d.ts +24 -0
  353. package/src/resource/resource.events.js +17 -0
  354. package/src/resource/resource.events.js.map +1 -0
  355. package/src/resource/resource.instance.d.ts +35 -0
  356. package/src/resource/resource.instance.js +163 -0
  357. package/src/resource/resource.instance.js.map +1 -0
  358. package/src/resource/resource.registry.d.ts +106 -12
  359. package/src/resource/resource.registry.js +449 -13
  360. package/src/resource/resource.registry.js.map +1 -1
  361. package/src/resource/resource.types.d.ts +35 -0
  362. package/src/resource/resource.types.js +11 -0
  363. package/src/resource/resource.types.js.map +1 -0
  364. package/src/resource/resource.utils.d.ts +30 -0
  365. package/src/resource/resource.utils.js +151 -0
  366. package/src/resource/resource.utils.js.map +1 -0
  367. package/src/scope/flows/http.request.flow.d.ts +48 -330
  368. package/src/scope/flows/http.request.flow.js +306 -78
  369. package/src/scope/flows/http.request.flow.js.map +1 -1
  370. package/src/scope/scope.instance.d.ts +12 -0
  371. package/src/scope/scope.instance.js +145 -15
  372. package/src/scope/scope.instance.js.map +1 -1
  373. package/src/tool/flows/call-tool.flow.d.ts +64 -1110
  374. package/src/tool/flows/call-tool.flow.js +303 -15
  375. package/src/tool/flows/call-tool.flow.js.map +1 -1
  376. package/src/tool/flows/tools-list.flow.d.ts +32 -473
  377. package/src/tool/flows/tools-list.flow.js +111 -10
  378. package/src/tool/flows/tools-list.flow.js.map +1 -1
  379. package/src/tool/tool.events.d.ts +8 -1
  380. package/src/tool/tool.events.js.map +1 -1
  381. package/src/tool/tool.instance.d.ts +3 -1
  382. package/src/tool/tool.instance.js +17 -3
  383. package/src/tool/tool.instance.js.map +1 -1
  384. package/src/tool/tool.registry.d.ts +7 -1
  385. package/src/tool/tool.registry.js +26 -10
  386. package/src/tool/tool.registry.js.map +1 -1
  387. package/src/tool/tool.types.d.ts +4 -4
  388. package/src/tool/tool.types.js.map +1 -1
  389. package/src/tool/tool.utils.d.ts +3 -12
  390. package/src/tool/tool.utils.js +39 -193
  391. package/src/tool/tool.utils.js.map +1 -1
  392. package/src/tool/ui/index.d.ts +22 -0
  393. package/src/tool/ui/index.js +63 -0
  394. package/src/tool/ui/index.js.map +1 -0
  395. package/src/tool/ui/platform-adapters.d.ts +10 -0
  396. package/src/tool/ui/platform-adapters.js +18 -0
  397. package/src/tool/ui/platform-adapters.js.map +1 -0
  398. package/src/tool/ui/template-helpers.d.ts +46 -0
  399. package/src/tool/ui/template-helpers.js +112 -0
  400. package/src/tool/ui/template-helpers.js.map +1 -0
  401. package/src/tool/ui/ui-resource-template.d.ts +34 -0
  402. package/src/tool/ui/ui-resource-template.js +64 -0
  403. package/src/tool/ui/ui-resource-template.js.map +1 -0
  404. package/src/tool/ui/ui-resource.handler.d.ts +74 -0
  405. package/src/tool/ui/ui-resource.handler.js +129 -0
  406. package/src/tool/ui/ui-resource.handler.js.map +1 -0
  407. package/src/transport/adapters/transport.local.adapter.d.ts +2 -2
  408. package/src/transport/adapters/transport.local.adapter.js +28 -7
  409. package/src/transport/adapters/transport.local.adapter.js.map +1 -1
  410. package/src/transport/adapters/transport.sse.adapter.d.ts +2 -2
  411. package/src/transport/adapters/transport.sse.adapter.js +4 -3
  412. package/src/transport/adapters/transport.sse.adapter.js.map +1 -1
  413. package/src/transport/adapters/transport.streamable-http.adapter.d.ts +10 -3
  414. package/src/transport/adapters/transport.streamable-http.adapter.js +54 -8
  415. package/src/transport/adapters/transport.streamable-http.adapter.js.map +1 -1
  416. package/src/transport/flows/handle.sse.flow.d.ts +29 -63
  417. package/src/transport/flows/handle.sse.flow.js +78 -10
  418. package/src/transport/flows/handle.sse.flow.js.map +1 -1
  419. package/src/transport/flows/handle.stateless-http.flow.d.ts +29 -0
  420. package/src/transport/flows/handle.stateless-http.flow.js +102 -0
  421. package/src/transport/flows/handle.stateless-http.flow.js.map +1 -0
  422. package/src/transport/flows/handle.streamable-http.flow.d.ts +32 -64
  423. package/src/transport/flows/handle.streamable-http.flow.js +158 -26
  424. package/src/transport/flows/handle.streamable-http.flow.js.map +1 -1
  425. package/src/transport/legacy/legacy.sse.tranporter.d.ts +9 -0
  426. package/src/transport/legacy/legacy.sse.tranporter.js +17 -2
  427. package/src/transport/legacy/legacy.sse.tranporter.js.map +1 -1
  428. package/src/transport/mcp-handlers/call-tool-request.handler.js +27 -1
  429. package/src/transport/mcp-handlers/call-tool-request.handler.js.map +1 -1
  430. package/src/transport/mcp-handlers/complete-request.handler.d.ts +69 -0
  431. package/src/transport/mcp-handlers/complete-request.handler.js +11 -0
  432. package/src/transport/mcp-handlers/complete-request.handler.js.map +1 -0
  433. package/src/transport/mcp-handlers/get-prompt-request.handler.d.ts +87 -0
  434. package/src/transport/mcp-handlers/get-prompt-request.handler.js +11 -0
  435. package/src/transport/mcp-handlers/get-prompt-request.handler.js.map +1 -0
  436. package/src/transport/mcp-handlers/index.d.ts +517 -208
  437. package/src/transport/mcp-handlers/index.js +39 -2
  438. package/src/transport/mcp-handlers/index.js.map +1 -1
  439. package/src/transport/mcp-handlers/initialize-request.handler.d.ts +1 -1
  440. package/src/transport/mcp-handlers/initialize-request.handler.js +73 -7
  441. package/src/transport/mcp-handlers/initialize-request.handler.js.map +1 -1
  442. package/src/transport/mcp-handlers/list-prompts-request.handler.d.ts +54 -0
  443. package/src/transport/mcp-handlers/list-prompts-request.handler.js +11 -0
  444. package/src/transport/mcp-handlers/list-prompts-request.handler.js.map +1 -0
  445. package/src/transport/mcp-handlers/list-resource-templates-request.handler.d.ts +51 -0
  446. package/src/transport/mcp-handlers/list-resource-templates-request.handler.js +12 -0
  447. package/src/transport/mcp-handlers/list-resource-templates-request.handler.js.map +1 -0
  448. package/src/transport/mcp-handlers/list-resources-request.handler.d.ts +51 -0
  449. package/src/transport/mcp-handlers/list-resources-request.handler.js +12 -0
  450. package/src/transport/mcp-handlers/list-resources-request.handler.js.map +1 -0
  451. package/src/transport/mcp-handlers/list-tools-request.handler.d.ts +19 -146
  452. package/src/transport/mcp-handlers/logging-set-level-request.handler.d.ts +46 -0
  453. package/src/transport/mcp-handlers/logging-set-level-request.handler.js +34 -0
  454. package/src/transport/mcp-handlers/logging-set-level-request.handler.js.map +1 -0
  455. package/src/transport/mcp-handlers/mcp-handlers.types.d.ts +3 -7
  456. package/src/transport/mcp-handlers/mcp-handlers.types.js.map +1 -1
  457. package/src/transport/mcp-handlers/read-resource-request.handler.d.ts +46 -0
  458. package/src/transport/mcp-handlers/read-resource-request.handler.js +12 -0
  459. package/src/transport/mcp-handlers/read-resource-request.handler.js.map +1 -0
  460. package/src/transport/mcp-handlers/roots-list-changed-notification.handler.d.ts +11 -0
  461. package/src/transport/mcp-handlers/roots-list-changed-notification.handler.js +26 -0
  462. package/src/transport/mcp-handlers/roots-list-changed-notification.handler.js.map +1 -0
  463. package/src/transport/mcp-handlers/subscribe-request.handler.d.ts +37 -0
  464. package/src/transport/mcp-handlers/subscribe-request.handler.js +34 -0
  465. package/src/transport/mcp-handlers/subscribe-request.handler.js.map +1 -0
  466. package/src/transport/mcp-handlers/unsubscribe-request.handler.d.ts +37 -0
  467. package/src/transport/mcp-handlers/unsubscribe-request.handler.js +34 -0
  468. package/src/transport/mcp-handlers/unsubscribe-request.handler.js.map +1 -0
  469. package/src/transport/transport.local.js +7 -2
  470. package/src/transport/transport.local.js.map +1 -1
  471. package/src/transport/transport.registry.d.ts +30 -0
  472. package/src/transport/transport.registry.js +84 -1
  473. package/src/transport/transport.registry.js.map +1 -1
  474. package/src/transport/transport.types.d.ts +3 -3
  475. package/src/transport/transport.types.js.map +1 -1
  476. package/src/utils/content.utils.d.ts +48 -0
  477. package/src/utils/content.utils.js +194 -0
  478. package/src/utils/content.utils.js.map +1 -0
  479. package/src/utils/index.d.ts +8 -0
  480. package/src/utils/index.js +55 -0
  481. package/src/utils/index.js.map +1 -0
  482. package/src/utils/lineage.utils.d.ts +40 -0
  483. package/src/utils/lineage.utils.js +82 -0
  484. package/src/utils/lineage.utils.js.map +1 -0
  485. package/src/utils/naming.utils.d.ts +46 -0
  486. package/src/utils/naming.utils.js +136 -0
  487. package/src/utils/naming.utils.js.map +1 -0
  488. package/src/utils/types.utils.d.ts +2 -2
  489. package/src/utils/types.utils.js.map +1 -1
  490. package/src/utils/uri-template.utils.d.ts +57 -0
  491. package/src/utils/uri-template.utils.js +113 -0
  492. package/src/utils/uri-template.utils.js.map +1 -0
  493. package/src/utils/uri-validation.utils.d.ts +40 -0
  494. package/src/utils/uri-validation.utils.js +76 -0
  495. package/src/utils/uri-validation.utils.js.map +1 -0
  496. package/src/__test-utils__/fixtures/hook.fixtures.d.ts +0 -46
  497. package/src/__test-utils__/fixtures/hook.fixtures.js +0 -114
  498. package/src/__test-utils__/fixtures/hook.fixtures.js.map +0 -1
  499. package/src/__test-utils__/fixtures/index.d.ts +0 -7
  500. package/src/__test-utils__/fixtures/index.js +0 -11
  501. package/src/__test-utils__/fixtures/index.js.map +0 -1
  502. package/src/__test-utils__/fixtures/plugin.fixtures.d.ts +0 -46
  503. package/src/__test-utils__/fixtures/plugin.fixtures.js +0 -127
  504. package/src/__test-utils__/fixtures/plugin.fixtures.js.map +0 -1
  505. package/src/__test-utils__/fixtures/provider.fixtures.d.ts +0 -69
  506. package/src/__test-utils__/fixtures/provider.fixtures.js +0 -131
  507. package/src/__test-utils__/fixtures/provider.fixtures.js.map +0 -1
  508. package/src/__test-utils__/fixtures/scope.fixtures.d.ts +0 -14
  509. package/src/__test-utils__/fixtures/scope.fixtures.js +0 -59
  510. package/src/__test-utils__/fixtures/scope.fixtures.js.map +0 -1
  511. package/src/__test-utils__/fixtures/tool.fixtures.d.ts +0 -36
  512. package/src/__test-utils__/fixtures/tool.fixtures.js +0 -91
  513. package/src/__test-utils__/fixtures/tool.fixtures.js.map +0 -1
  514. package/src/__test-utils__/helpers/assertion.helpers.d.ts +0 -45
  515. package/src/__test-utils__/helpers/assertion.helpers.js +0 -153
  516. package/src/__test-utils__/helpers/assertion.helpers.js.map +0 -1
  517. package/src/__test-utils__/helpers/async.helpers.d.ts +0 -48
  518. package/src/__test-utils__/helpers/async.helpers.js +0 -112
  519. package/src/__test-utils__/helpers/async.helpers.js.map +0 -1
  520. package/src/__test-utils__/helpers/index.d.ts +0 -6
  521. package/src/__test-utils__/helpers/index.js +0 -10
  522. package/src/__test-utils__/helpers/index.js.map +0 -1
  523. package/src/__test-utils__/helpers/setup.helpers.d.ts +0 -54
  524. package/src/__test-utils__/helpers/setup.helpers.js +0 -106
  525. package/src/__test-utils__/helpers/setup.helpers.js.map +0 -1
  526. package/src/__test-utils__/index.d.ts +0 -9
  527. package/src/__test-utils__/index.js +0 -14
  528. package/src/__test-utils__/index.js.map +0 -1
  529. package/src/__test-utils__/mocks/flow-instance.mock.d.ts +0 -50
  530. package/src/__test-utils__/mocks/flow-instance.mock.js +0 -72
  531. package/src/__test-utils__/mocks/flow-instance.mock.js.map +0 -1
  532. package/src/__test-utils__/mocks/hook-registry.mock.d.ts +0 -25
  533. package/src/__test-utils__/mocks/hook-registry.mock.js +0 -65
  534. package/src/__test-utils__/mocks/hook-registry.mock.js.map +0 -1
  535. package/src/__test-utils__/mocks/index.d.ts +0 -8
  536. package/src/__test-utils__/mocks/index.js +0 -12
  537. package/src/__test-utils__/mocks/index.js.map +0 -1
  538. package/src/__test-utils__/mocks/plugin-registry.mock.d.ts +0 -43
  539. package/src/__test-utils__/mocks/plugin-registry.mock.js +0 -70
  540. package/src/__test-utils__/mocks/plugin-registry.mock.js.map +0 -1
  541. package/src/__test-utils__/mocks/provider-registry.mock.d.ts +0 -39
  542. package/src/__test-utils__/mocks/provider-registry.mock.js +0 -72
  543. package/src/__test-utils__/mocks/provider-registry.mock.js.map +0 -1
  544. package/src/__test-utils__/mocks/tool-registry.mock.d.ts +0 -43
  545. package/src/__test-utils__/mocks/tool-registry.mock.js +0 -79
  546. package/src/__test-utils__/mocks/tool-registry.mock.js.map +0 -1
  547. package/src/auth/path.utils.d.ts +0 -20
  548. package/src/auth/path.utils.js +0 -71
  549. package/src/auth/path.utils.js.map +0 -1
  550. package/src/common/decorators-old/async-with.decorator.d.ts +0 -10
  551. package/src/common/decorators-old/async-with.decorator.js +0 -24
  552. package/src/common/decorators-old/async-with.decorator.js.map +0 -1
  553. package/src/common/decorators-old/auth-hook.decorator.d.ts +0 -14
  554. package/src/common/decorators-old/auth-hook.decorator.js +0 -27
  555. package/src/common/decorators-old/auth-hook.decorator.js.map +0 -1
  556. package/src/common/decorators-old/session-hook.decorator.d.ts +0 -14
  557. package/src/common/decorators-old/session-hook.decorator.js +0 -27
  558. package/src/common/decorators-old/session-hook.decorator.js.map +0 -1
@@ -0,0 +1,419 @@
1
+ "use strict";
2
+ /**
3
+ * @file template.ts
4
+ * @description MCP Apps HTML template generator.
5
+ *
6
+ * Generates standard HTML5 documents with embedded MCP bridge for MCP Apps spec compliance.
7
+ *
8
+ * @module @frontmcp/sdk/mcp-apps/template
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.generateMcpAppsTemplate = generateMcpAppsTemplate;
12
+ exports.wrapInMcpAppsTemplate = wrapInMcpAppsTemplate;
13
+ exports.createSimpleMcpAppsTemplate = createSimpleMcpAppsTemplate;
14
+ exports.extractBodyContent = extractBodyContent;
15
+ const types_1 = require("./types");
16
+ const csp_1 = require("./csp");
17
+ // ============================================
18
+ // Template Generator
19
+ // ============================================
20
+ /**
21
+ * Generate MCP Apps compliant HTML5 document.
22
+ *
23
+ * @param options - Template options
24
+ * @returns Complete HTML5 document string
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * const html = generateMcpAppsTemplate({
29
+ * title: 'Weather Dashboard',
30
+ * bodyContent: '<div id="weather">Loading...</div>',
31
+ * toolInfo: { tool: { name: 'get_weather' } },
32
+ * input: { city: 'San Francisco' },
33
+ * output: { temperature: 72, condition: 'sunny' },
34
+ * csp: { connectDomains: ['https://api.weather.com'] },
35
+ * });
36
+ * ```
37
+ */
38
+ function generateMcpAppsTemplate(options) {
39
+ const { toolInfo, input, output, structuredContent, csp, title = 'MCP App', headContent = '', bodyContent, scripts = [], includeBridge = true, bridgeConfig, theme = 'light', debug = false, } = options;
40
+ // Build CSP meta tag
41
+ const cspMeta = (0, csp_1.buildCSPMetaTag)(csp);
42
+ // Build data attributes for initial state
43
+ const dataAttrs = buildDataAttributes({ toolInfo, input, output, structuredContent });
44
+ // Build bridge script
45
+ const bridgeScript = includeBridge ? generateBridgeScript({ ...bridgeConfig, debug }) : '';
46
+ // Build additional scripts
47
+ const additionalScripts = scripts.map((s) => `<script>${s}</script>`).join('\n');
48
+ return `<!DOCTYPE html>
49
+ <html lang="en" data-theme="${escapeAttr(theme)}">
50
+ <head>
51
+ <meta charset="UTF-8">
52
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
53
+ ${cspMeta}
54
+ <meta name="mcp-apps-version" content="${types_1.MCP_APPS_PROTOCOL_VERSION}">
55
+ <meta name="mcp-apps-mime-type" content="${types_1.MCP_APPS_MIME_TYPE}">
56
+ <title>${escapeHtml(title)}</title>
57
+ <style>
58
+ :root {
59
+ --mcp-bg: #ffffff;
60
+ --mcp-text: #1a1a1a;
61
+ --mcp-border: #e5e5e5;
62
+ --mcp-primary: #0969da;
63
+ --mcp-error: #cf222e;
64
+ --mcp-success: #1a7f37;
65
+ }
66
+ [data-theme="dark"] {
67
+ --mcp-bg: #0d1117;
68
+ --mcp-text: #c9d1d9;
69
+ --mcp-border: #30363d;
70
+ --mcp-primary: #58a6ff;
71
+ --mcp-error: #f85149;
72
+ --mcp-success: #3fb950;
73
+ }
74
+ * { box-sizing: border-box; }
75
+ body {
76
+ margin: 0;
77
+ padding: 16px;
78
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
79
+ background: var(--mcp-bg);
80
+ color: var(--mcp-text);
81
+ line-height: 1.5;
82
+ }
83
+ </style>
84
+ ${headContent}
85
+ </head>
86
+ <body ${dataAttrs}>
87
+ ${bodyContent}
88
+ ${bridgeScript}
89
+ ${additionalScripts}
90
+ </body>
91
+ </html>`;
92
+ }
93
+ // ============================================
94
+ // Bridge Script Generator
95
+ // ============================================
96
+ /**
97
+ * Generate the MCP Apps bridge runtime script.
98
+ */
99
+ function generateBridgeScript(config) {
100
+ const { protocolVersion = types_1.MCP_APPS_PROTOCOL_VERSION, trustedOrigin = '*', requestTimeout = 30000, debug = false, } = config || {};
101
+ return `<script>
102
+ (function() {
103
+ 'use strict';
104
+
105
+ // MCP Apps Bridge Runtime
106
+ const MCP_PROTOCOL_VERSION = '${protocolVersion}';
107
+ const REQUEST_TIMEOUT = ${requestTimeout};
108
+ const DEBUG = ${debug};
109
+
110
+ // State
111
+ let initialized = false;
112
+ let hostContext = {};
113
+ let pendingRequests = new Map();
114
+ let messageId = 0;
115
+ let trustedOrigin = '${trustedOrigin}';
116
+
117
+ // Logging
118
+ function log(...args) {
119
+ if (DEBUG) console.log('[MCP Bridge]', ...args);
120
+ }
121
+
122
+ // Generate unique message ID
123
+ function nextId() {
124
+ return ++messageId;
125
+ }
126
+
127
+ // Send JSON-RPC message to host
128
+ function sendMessage(message) {
129
+ log('Sending:', message);
130
+ parent.postMessage(message, trustedOrigin);
131
+ }
132
+
133
+ // Send JSON-RPC request and wait for response
134
+ function sendRequest(method, params) {
135
+ return new Promise((resolve, reject) => {
136
+ const id = nextId();
137
+ const request = {
138
+ jsonrpc: '2.0',
139
+ id: id,
140
+ method: method,
141
+ params: params
142
+ };
143
+
144
+ const timeout = setTimeout(() => {
145
+ pendingRequests.delete(id);
146
+ reject(new Error('Request timeout: ' + method));
147
+ }, REQUEST_TIMEOUT);
148
+
149
+ pendingRequests.set(id, { resolve, reject, timeout });
150
+ sendMessage(request);
151
+ });
152
+ }
153
+
154
+ // Send JSON-RPC notification (no response expected)
155
+ function sendNotification(method, params) {
156
+ sendMessage({
157
+ jsonrpc: '2.0',
158
+ method: method,
159
+ params: params
160
+ });
161
+ }
162
+
163
+ // Handle incoming messages from host
164
+ function handleMessage(event) {
165
+ // Validate origin on first message (trust-on-first-use)
166
+ if (trustedOrigin === '*' && event.origin) {
167
+ trustedOrigin = event.origin;
168
+ log('Trusted origin set to:', trustedOrigin);
169
+ }
170
+
171
+ const data = event.data;
172
+ if (!data || data.jsonrpc !== '2.0') return;
173
+
174
+ log('Received:', data);
175
+
176
+ // Handle response to our request
177
+ if (data.id !== undefined && pendingRequests.has(data.id)) {
178
+ const { resolve, reject, timeout } = pendingRequests.get(data.id);
179
+ clearTimeout(timeout);
180
+ pendingRequests.delete(data.id);
181
+
182
+ if (data.error) {
183
+ reject(new Error(data.error.message || 'Unknown error'));
184
+ } else {
185
+ resolve(data.result);
186
+ }
187
+ return;
188
+ }
189
+
190
+ // Handle notifications from host
191
+ if (data.method) {
192
+ handleNotification(data.method, data.params);
193
+ }
194
+ }
195
+
196
+ // Handle notifications from host
197
+ function handleNotification(method, params) {
198
+ switch (method) {
199
+ case '${types_1.MCP_APPS_METHODS.TOOL_INPUT}':
200
+ window.dispatchEvent(new CustomEvent('mcp:tool-input', { detail: params }));
201
+ break;
202
+ case '${types_1.MCP_APPS_METHODS.TOOL_INPUT_PARTIAL}':
203
+ window.dispatchEvent(new CustomEvent('mcp:tool-input-partial', { detail: params }));
204
+ break;
205
+ case '${types_1.MCP_APPS_METHODS.TOOL_RESULT}':
206
+ window.dispatchEvent(new CustomEvent('mcp:tool-result', { detail: params }));
207
+ break;
208
+ case '${types_1.MCP_APPS_METHODS.TOOL_CANCELLED}':
209
+ window.dispatchEvent(new CustomEvent('mcp:tool-cancelled', { detail: params }));
210
+ break;
211
+ case '${types_1.MCP_APPS_METHODS.SIZE_CHANGE}':
212
+ window.dispatchEvent(new CustomEvent('mcp:size-change', { detail: params }));
213
+ break;
214
+ case '${types_1.MCP_APPS_METHODS.HOST_CONTEXT_CHANGE}':
215
+ Object.assign(hostContext, params.changes);
216
+ window.dispatchEvent(new CustomEvent('mcp:context-change', { detail: params.changes }));
217
+ // Update theme if changed
218
+ if (params.changes.theme) {
219
+ document.documentElement.setAttribute('data-theme', params.changes.theme);
220
+ }
221
+ break;
222
+ case '${types_1.MCP_APPS_METHODS.RESOURCE_TEARDOWN}':
223
+ window.dispatchEvent(new CustomEvent('mcp:teardown', { detail: params }));
224
+ break;
225
+ }
226
+ }
227
+
228
+ // Initialize connection with host
229
+ async function initialize() {
230
+ if (initialized) return hostContext;
231
+
232
+ try {
233
+ const result = await sendRequest('${types_1.MCP_APPS_METHODS.INITIALIZE}', {
234
+ protocolVersion: MCP_PROTOCOL_VERSION,
235
+ capabilities: {
236
+ messages: ['${types_1.MCP_APPS_METHODS.TOOL_INPUT}', '${types_1.MCP_APPS_METHODS.TOOL_RESULT}']
237
+ }
238
+ });
239
+
240
+ hostContext = result.hostContext || {};
241
+ initialized = true;
242
+
243
+ // Apply initial theme
244
+ if (hostContext.theme) {
245
+ document.documentElement.setAttribute('data-theme', hostContext.theme);
246
+ }
247
+
248
+ // Send initialized notification
249
+ sendNotification('${types_1.MCP_APPS_METHODS.INITIALIZED}', {});
250
+
251
+ log('Initialized with context:', hostContext);
252
+ window.dispatchEvent(new CustomEvent('mcp:initialized', { detail: hostContext }));
253
+
254
+ return hostContext;
255
+ } catch (error) {
256
+ console.error('[MCP Bridge] Initialization failed:', error);
257
+ throw error;
258
+ }
259
+ }
260
+
261
+ // Public API
262
+ window.mcpBridge = {
263
+ // Initialize connection
264
+ initialize: initialize,
265
+
266
+ // Get current host context
267
+ getHostContext: function() {
268
+ return { ...hostContext };
269
+ },
270
+
271
+ // Get tool info
272
+ getToolInfo: function() {
273
+ return hostContext.toolInfo;
274
+ },
275
+
276
+ // Call a tool on the MCP server
277
+ callTool: function(name, args) {
278
+ return sendRequest('${types_1.MCP_APPS_METHODS.TOOLS_CALL}', { name, arguments: args });
279
+ },
280
+
281
+ // Read a resource
282
+ readResource: function(uri) {
283
+ return sendRequest('${types_1.MCP_APPS_METHODS.RESOURCES_READ}', { uri });
284
+ },
285
+
286
+ // Request host to open a link
287
+ openLink: function(url) {
288
+ return sendRequest('${types_1.MCP_APPS_METHODS.OPEN_LINK}', { url });
289
+ },
290
+
291
+ // Send message to host's chat
292
+ sendMessage: function(content) {
293
+ return sendRequest('${types_1.MCP_APPS_METHODS.MESSAGE}', { content });
294
+ },
295
+
296
+ // Log message to host
297
+ log: function(level, message, data) {
298
+ sendNotification('${types_1.MCP_APPS_METHODS.NOTIFICATIONS_MESSAGE}', {
299
+ level: level,
300
+ logger: 'mcp-app',
301
+ data: { message, ...data }
302
+ });
303
+ },
304
+
305
+ // Ping host
306
+ ping: function() {
307
+ return sendRequest('${types_1.MCP_APPS_METHODS.PING}', {});
308
+ },
309
+
310
+ // Check if initialized
311
+ isInitialized: function() {
312
+ return initialized;
313
+ },
314
+
315
+ // Protocol version
316
+ protocolVersion: MCP_PROTOCOL_VERSION
317
+ };
318
+
319
+ // Listen for messages
320
+ window.addEventListener('message', handleMessage);
321
+
322
+ // Auto-initialize when DOM is ready
323
+ if (document.readyState === 'loading') {
324
+ document.addEventListener('DOMContentLoaded', function() {
325
+ initialize().catch(function(err) {
326
+ log('Auto-init failed:', err);
327
+ });
328
+ });
329
+ } else {
330
+ initialize().catch(function(err) {
331
+ log('Auto-init failed:', err);
332
+ });
333
+ }
334
+
335
+ log('Bridge loaded');
336
+ })();
337
+ </script>`;
338
+ }
339
+ // ============================================
340
+ // Helper Functions
341
+ // ============================================
342
+ /**
343
+ * Build data attributes for initial state injection.
344
+ */
345
+ function buildDataAttributes(options) {
346
+ const attrs = [];
347
+ if (options.toolInfo) {
348
+ attrs.push(`data-mcp-tool="${escapeAttr(JSON.stringify(options.toolInfo))}"`);
349
+ }
350
+ if (options.input) {
351
+ attrs.push(`data-mcp-input="${escapeAttr(JSON.stringify(options.input))}"`);
352
+ }
353
+ if (options.output !== undefined) {
354
+ attrs.push(`data-mcp-output="${escapeAttr(JSON.stringify(options.output))}"`);
355
+ }
356
+ if (options.structuredContent !== undefined) {
357
+ attrs.push(`data-mcp-structured="${escapeAttr(JSON.stringify(options.structuredContent))}"`);
358
+ }
359
+ return attrs.join(' ');
360
+ }
361
+ /**
362
+ * Escape HTML content.
363
+ */
364
+ function escapeHtml(str) {
365
+ return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
366
+ }
367
+ /**
368
+ * Escape HTML attribute value.
369
+ */
370
+ function escapeAttr(str) {
371
+ return str
372
+ .replace(/&/g, '&amp;')
373
+ .replace(/"/g, '&quot;')
374
+ .replace(/'/g, '&#39;')
375
+ .replace(/</g, '&lt;')
376
+ .replace(/>/g, '&gt;');
377
+ }
378
+ // ============================================
379
+ // Utility Functions
380
+ // ============================================
381
+ /**
382
+ * Wrap existing HTML content in MCP Apps template.
383
+ *
384
+ * @param html - Existing HTML content
385
+ * @param options - Template options (without bodyContent)
386
+ * @returns Complete MCP Apps HTML document
387
+ */
388
+ function wrapInMcpAppsTemplate(html, options) {
389
+ return generateMcpAppsTemplate({
390
+ ...options,
391
+ bodyContent: html,
392
+ });
393
+ }
394
+ /**
395
+ * Create a minimal MCP Apps template for simple content.
396
+ *
397
+ * @param content - Simple text or HTML content
398
+ * @param title - Page title
399
+ * @returns Complete MCP Apps HTML document
400
+ */
401
+ function createSimpleMcpAppsTemplate(content, title) {
402
+ return generateMcpAppsTemplate({
403
+ title: title || 'MCP App',
404
+ bodyContent: `<div class="mcp-content">${content}</div>`,
405
+ includeBridge: true,
406
+ });
407
+ }
408
+ /**
409
+ * Extract body content from MCP Apps template.
410
+ * Useful for testing.
411
+ *
412
+ * @param html - Complete HTML document
413
+ * @returns Body content string or null
414
+ */
415
+ function extractBodyContent(html) {
416
+ const match = html.match(/<body[^>]*>([\s\S]*?)<script/);
417
+ return match ? match[1].trim() : null;
418
+ }
419
+ //# sourceMappingURL=template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.js","sourceRoot":"","sources":["../../../src/mcp-apps/template.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @file template.ts\n * @description MCP Apps HTML template generator.\n *\n * Generates standard HTML5 documents with embedded MCP bridge for MCP Apps spec compliance.\n *\n * @module @frontmcp/sdk/mcp-apps/template\n */\n\nimport type { McpAppsCSP, McpAppsHostContext, ToolInfo } from './types';\nimport { MCP_APPS_MIME_TYPE, MCP_APPS_PROTOCOL_VERSION, MCP_APPS_METHODS } from './types';\nimport { buildCSPMetaTag } from './csp';\n\n// ============================================\n// Template Options\n// ============================================\n\n/**\n * Options for generating MCP Apps HTML template.\n */\nexport interface McpAppsTemplateOptions {\n /** Tool information */\n toolInfo?: ToolInfo;\n /** Tool input arguments */\n input?: Record<string, unknown>;\n /** Tool output/result */\n output?: unknown;\n /** Structured content for UI rendering */\n structuredContent?: unknown;\n /** Content Security Policy */\n csp?: McpAppsCSP;\n /** Page title */\n title?: string;\n /** Additional head content (styles, meta tags) */\n headContent?: string;\n /** Main body content (HTML) */\n bodyContent: string;\n /** Additional scripts to include */\n scripts?: string[];\n /** Whether to include the MCP bridge runtime */\n includeBridge?: boolean;\n /** Custom bridge configuration */\n bridgeConfig?: McpAppsBridgeConfig;\n /** Initial theme */\n theme?: 'light' | 'dark';\n /** Debug mode - adds console logging */\n debug?: boolean;\n}\n\n/**\n * MCP Apps bridge configuration.\n */\nexport interface McpAppsBridgeConfig {\n /** Protocol version */\n protocolVersion?: string;\n /** Trusted origin for postMessage */\n trustedOrigin?: string;\n /** Request timeout in milliseconds */\n requestTimeout?: number;\n}\n\n// ============================================\n// Template Generator\n// ============================================\n\n/**\n * Generate MCP Apps compliant HTML5 document.\n *\n * @param options - Template options\n * @returns Complete HTML5 document string\n *\n * @example\n * ```typescript\n * const html = generateMcpAppsTemplate({\n * title: 'Weather Dashboard',\n * bodyContent: '<div id=\"weather\">Loading...</div>',\n * toolInfo: { tool: { name: 'get_weather' } },\n * input: { city: 'San Francisco' },\n * output: { temperature: 72, condition: 'sunny' },\n * csp: { connectDomains: ['https://api.weather.com'] },\n * });\n * ```\n */\nexport function generateMcpAppsTemplate(options: McpAppsTemplateOptions): string {\n const {\n toolInfo,\n input,\n output,\n structuredContent,\n csp,\n title = 'MCP App',\n headContent = '',\n bodyContent,\n scripts = [],\n includeBridge = true,\n bridgeConfig,\n theme = 'light',\n debug = false,\n } = options;\n\n // Build CSP meta tag\n const cspMeta = buildCSPMetaTag(csp);\n\n // Build data attributes for initial state\n const dataAttrs = buildDataAttributes({ toolInfo, input, output, structuredContent });\n\n // Build bridge script\n const bridgeScript = includeBridge ? generateBridgeScript({ ...bridgeConfig, debug }) : '';\n\n // Build additional scripts\n const additionalScripts = scripts.map((s) => `<script>${s}</script>`).join('\\n');\n\n return `<!DOCTYPE html>\n<html lang=\"en\" data-theme=\"${escapeAttr(theme)}\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n ${cspMeta}\n <meta name=\"mcp-apps-version\" content=\"${MCP_APPS_PROTOCOL_VERSION}\">\n <meta name=\"mcp-apps-mime-type\" content=\"${MCP_APPS_MIME_TYPE}\">\n <title>${escapeHtml(title)}</title>\n <style>\n :root {\n --mcp-bg: #ffffff;\n --mcp-text: #1a1a1a;\n --mcp-border: #e5e5e5;\n --mcp-primary: #0969da;\n --mcp-error: #cf222e;\n --mcp-success: #1a7f37;\n }\n [data-theme=\"dark\"] {\n --mcp-bg: #0d1117;\n --mcp-text: #c9d1d9;\n --mcp-border: #30363d;\n --mcp-primary: #58a6ff;\n --mcp-error: #f85149;\n --mcp-success: #3fb950;\n }\n * { box-sizing: border-box; }\n body {\n margin: 0;\n padding: 16px;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: var(--mcp-bg);\n color: var(--mcp-text);\n line-height: 1.5;\n }\n </style>\n ${headContent}\n</head>\n<body ${dataAttrs}>\n ${bodyContent}\n ${bridgeScript}\n ${additionalScripts}\n</body>\n</html>`;\n}\n\n// ============================================\n// Bridge Script Generator\n// ============================================\n\n/**\n * Generate the MCP Apps bridge runtime script.\n */\nfunction generateBridgeScript(config?: McpAppsBridgeConfig & { debug?: boolean }): string {\n const {\n protocolVersion = MCP_APPS_PROTOCOL_VERSION,\n trustedOrigin = '*',\n requestTimeout = 30000,\n debug = false,\n } = config || {};\n\n return `<script>\n(function() {\n 'use strict';\n\n // MCP Apps Bridge Runtime\n const MCP_PROTOCOL_VERSION = '${protocolVersion}';\n const REQUEST_TIMEOUT = ${requestTimeout};\n const DEBUG = ${debug};\n\n // State\n let initialized = false;\n let hostContext = {};\n let pendingRequests = new Map();\n let messageId = 0;\n let trustedOrigin = '${trustedOrigin}';\n\n // Logging\n function log(...args) {\n if (DEBUG) console.log('[MCP Bridge]', ...args);\n }\n\n // Generate unique message ID\n function nextId() {\n return ++messageId;\n }\n\n // Send JSON-RPC message to host\n function sendMessage(message) {\n log('Sending:', message);\n parent.postMessage(message, trustedOrigin);\n }\n\n // Send JSON-RPC request and wait for response\n function sendRequest(method, params) {\n return new Promise((resolve, reject) => {\n const id = nextId();\n const request = {\n jsonrpc: '2.0',\n id: id,\n method: method,\n params: params\n };\n\n const timeout = setTimeout(() => {\n pendingRequests.delete(id);\n reject(new Error('Request timeout: ' + method));\n }, REQUEST_TIMEOUT);\n\n pendingRequests.set(id, { resolve, reject, timeout });\n sendMessage(request);\n });\n }\n\n // Send JSON-RPC notification (no response expected)\n function sendNotification(method, params) {\n sendMessage({\n jsonrpc: '2.0',\n method: method,\n params: params\n });\n }\n\n // Handle incoming messages from host\n function handleMessage(event) {\n // Validate origin on first message (trust-on-first-use)\n if (trustedOrigin === '*' && event.origin) {\n trustedOrigin = event.origin;\n log('Trusted origin set to:', trustedOrigin);\n }\n\n const data = event.data;\n if (!data || data.jsonrpc !== '2.0') return;\n\n log('Received:', data);\n\n // Handle response to our request\n if (data.id !== undefined && pendingRequests.has(data.id)) {\n const { resolve, reject, timeout } = pendingRequests.get(data.id);\n clearTimeout(timeout);\n pendingRequests.delete(data.id);\n\n if (data.error) {\n reject(new Error(data.error.message || 'Unknown error'));\n } else {\n resolve(data.result);\n }\n return;\n }\n\n // Handle notifications from host\n if (data.method) {\n handleNotification(data.method, data.params);\n }\n }\n\n // Handle notifications from host\n function handleNotification(method, params) {\n switch (method) {\n case '${MCP_APPS_METHODS.TOOL_INPUT}':\n window.dispatchEvent(new CustomEvent('mcp:tool-input', { detail: params }));\n break;\n case '${MCP_APPS_METHODS.TOOL_INPUT_PARTIAL}':\n window.dispatchEvent(new CustomEvent('mcp:tool-input-partial', { detail: params }));\n break;\n case '${MCP_APPS_METHODS.TOOL_RESULT}':\n window.dispatchEvent(new CustomEvent('mcp:tool-result', { detail: params }));\n break;\n case '${MCP_APPS_METHODS.TOOL_CANCELLED}':\n window.dispatchEvent(new CustomEvent('mcp:tool-cancelled', { detail: params }));\n break;\n case '${MCP_APPS_METHODS.SIZE_CHANGE}':\n window.dispatchEvent(new CustomEvent('mcp:size-change', { detail: params }));\n break;\n case '${MCP_APPS_METHODS.HOST_CONTEXT_CHANGE}':\n Object.assign(hostContext, params.changes);\n window.dispatchEvent(new CustomEvent('mcp:context-change', { detail: params.changes }));\n // Update theme if changed\n if (params.changes.theme) {\n document.documentElement.setAttribute('data-theme', params.changes.theme);\n }\n break;\n case '${MCP_APPS_METHODS.RESOURCE_TEARDOWN}':\n window.dispatchEvent(new CustomEvent('mcp:teardown', { detail: params }));\n break;\n }\n }\n\n // Initialize connection with host\n async function initialize() {\n if (initialized) return hostContext;\n\n try {\n const result = await sendRequest('${MCP_APPS_METHODS.INITIALIZE}', {\n protocolVersion: MCP_PROTOCOL_VERSION,\n capabilities: {\n messages: ['${MCP_APPS_METHODS.TOOL_INPUT}', '${MCP_APPS_METHODS.TOOL_RESULT}']\n }\n });\n\n hostContext = result.hostContext || {};\n initialized = true;\n\n // Apply initial theme\n if (hostContext.theme) {\n document.documentElement.setAttribute('data-theme', hostContext.theme);\n }\n\n // Send initialized notification\n sendNotification('${MCP_APPS_METHODS.INITIALIZED}', {});\n\n log('Initialized with context:', hostContext);\n window.dispatchEvent(new CustomEvent('mcp:initialized', { detail: hostContext }));\n\n return hostContext;\n } catch (error) {\n console.error('[MCP Bridge] Initialization failed:', error);\n throw error;\n }\n }\n\n // Public API\n window.mcpBridge = {\n // Initialize connection\n initialize: initialize,\n\n // Get current host context\n getHostContext: function() {\n return { ...hostContext };\n },\n\n // Get tool info\n getToolInfo: function() {\n return hostContext.toolInfo;\n },\n\n // Call a tool on the MCP server\n callTool: function(name, args) {\n return sendRequest('${MCP_APPS_METHODS.TOOLS_CALL}', { name, arguments: args });\n },\n\n // Read a resource\n readResource: function(uri) {\n return sendRequest('${MCP_APPS_METHODS.RESOURCES_READ}', { uri });\n },\n\n // Request host to open a link\n openLink: function(url) {\n return sendRequest('${MCP_APPS_METHODS.OPEN_LINK}', { url });\n },\n\n // Send message to host's chat\n sendMessage: function(content) {\n return sendRequest('${MCP_APPS_METHODS.MESSAGE}', { content });\n },\n\n // Log message to host\n log: function(level, message, data) {\n sendNotification('${MCP_APPS_METHODS.NOTIFICATIONS_MESSAGE}', {\n level: level,\n logger: 'mcp-app',\n data: { message, ...data }\n });\n },\n\n // Ping host\n ping: function() {\n return sendRequest('${MCP_APPS_METHODS.PING}', {});\n },\n\n // Check if initialized\n isInitialized: function() {\n return initialized;\n },\n\n // Protocol version\n protocolVersion: MCP_PROTOCOL_VERSION\n };\n\n // Listen for messages\n window.addEventListener('message', handleMessage);\n\n // Auto-initialize when DOM is ready\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', function() {\n initialize().catch(function(err) {\n log('Auto-init failed:', err);\n });\n });\n } else {\n initialize().catch(function(err) {\n log('Auto-init failed:', err);\n });\n }\n\n log('Bridge loaded');\n})();\n</script>`;\n}\n\n// ============================================\n// Helper Functions\n// ============================================\n\n/**\n * Build data attributes for initial state injection.\n */\nfunction buildDataAttributes(options: {\n toolInfo?: ToolInfo;\n input?: Record<string, unknown>;\n output?: unknown;\n structuredContent?: unknown;\n}): string {\n const attrs: string[] = [];\n\n if (options.toolInfo) {\n attrs.push(`data-mcp-tool=\"${escapeAttr(JSON.stringify(options.toolInfo))}\"`);\n }\n\n if (options.input) {\n attrs.push(`data-mcp-input=\"${escapeAttr(JSON.stringify(options.input))}\"`);\n }\n\n if (options.output !== undefined) {\n attrs.push(`data-mcp-output=\"${escapeAttr(JSON.stringify(options.output))}\"`);\n }\n\n if (options.structuredContent !== undefined) {\n attrs.push(`data-mcp-structured=\"${escapeAttr(JSON.stringify(options.structuredContent))}\"`);\n }\n\n return attrs.join(' ');\n}\n\n/**\n * Escape HTML content.\n */\nfunction escapeHtml(str: string): string {\n return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n}\n\n/**\n * Escape HTML attribute value.\n */\nfunction escapeAttr(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n}\n\n// ============================================\n// Utility Functions\n// ============================================\n\n/**\n * Wrap existing HTML content in MCP Apps template.\n *\n * @param html - Existing HTML content\n * @param options - Template options (without bodyContent)\n * @returns Complete MCP Apps HTML document\n */\nexport function wrapInMcpAppsTemplate(html: string, options: Omit<McpAppsTemplateOptions, 'bodyContent'>): string {\n return generateMcpAppsTemplate({\n ...options,\n bodyContent: html,\n });\n}\n\n/**\n * Create a minimal MCP Apps template for simple content.\n *\n * @param content - Simple text or HTML content\n * @param title - Page title\n * @returns Complete MCP Apps HTML document\n */\nexport function createSimpleMcpAppsTemplate(content: string, title?: string): string {\n return generateMcpAppsTemplate({\n title: title || 'MCP App',\n bodyContent: `<div class=\"mcp-content\">${content}</div>`,\n includeBridge: true,\n });\n}\n\n/**\n * Extract body content from MCP Apps template.\n * Useful for testing.\n *\n * @param html - Complete HTML document\n * @returns Body content string or null\n */\nexport function extractBodyContent(html: string): string | null {\n const match = html.match(/<body[^>]*>([\\s\\S]*?)<script/);\n return match ? match[1].trim() : null;\n}\n"]}