@frontmcp/skills 1.0.0-beta.13 → 1.0.0-beta.14

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 (258) hide show
  1. package/catalog/TEMPLATE.md +55 -0
  2. package/catalog/frontmcp-config/SKILL.md +2 -2
  3. package/catalog/frontmcp-config/examples/configure-auth/multi-app-auth.md +87 -0
  4. package/catalog/frontmcp-config/examples/configure-auth/public-mode-setup.md +63 -0
  5. package/catalog/frontmcp-config/examples/configure-auth/remote-oauth-with-vault.md +76 -0
  6. package/catalog/frontmcp-config/examples/configure-auth-modes/local-self-signed-tokens.md +77 -0
  7. package/catalog/frontmcp-config/examples/configure-auth-modes/remote-enterprise-oauth.md +73 -0
  8. package/catalog/frontmcp-config/examples/configure-auth-modes/transparent-jwt-validation.md +64 -0
  9. package/catalog/frontmcp-config/examples/configure-elicitation/basic-confirmation-gate.md +83 -0
  10. package/catalog/frontmcp-config/examples/configure-elicitation/distributed-elicitation-redis.md +87 -0
  11. package/catalog/frontmcp-config/examples/configure-http/cors-restricted-origins.md +52 -0
  12. package/catalog/frontmcp-config/examples/configure-http/entry-path-reverse-proxy.md +72 -0
  13. package/catalog/frontmcp-config/examples/configure-http/unix-socket-local.md +64 -0
  14. package/catalog/frontmcp-config/examples/configure-session/multi-server-key-prefix.md +68 -0
  15. package/catalog/frontmcp-config/examples/configure-session/redis-session-store.md +52 -0
  16. package/catalog/frontmcp-config/examples/configure-session/vercel-kv-session.md +52 -0
  17. package/catalog/frontmcp-config/examples/configure-throttle/distributed-redis-throttle.md +94 -0
  18. package/catalog/frontmcp-config/examples/configure-throttle/per-tool-rate-limit.md +92 -0
  19. package/catalog/frontmcp-config/examples/configure-throttle/server-level-rate-limit.md +83 -0
  20. package/catalog/frontmcp-config/examples/configure-throttle-guard-config/full-guard-config.md +99 -0
  21. package/catalog/frontmcp-config/examples/configure-throttle-guard-config/minimal-guard-config.md +55 -0
  22. package/catalog/frontmcp-config/examples/configure-transport/custom-protocol-flags.md +74 -0
  23. package/catalog/frontmcp-config/examples/configure-transport/distributed-sessions-redis.md +86 -0
  24. package/catalog/frontmcp-config/examples/configure-transport/stateless-serverless.md +69 -0
  25. package/catalog/frontmcp-config/examples/configure-transport-protocol-presets/legacy-preset-nodejs.md +65 -0
  26. package/catalog/frontmcp-config/examples/configure-transport-protocol-presets/stateless-api-serverless.md +69 -0
  27. package/catalog/frontmcp-config/references/configure-auth-modes.md +10 -0
  28. package/catalog/frontmcp-config/references/configure-auth.md +10 -0
  29. package/catalog/frontmcp-config/references/configure-elicitation.md +9 -0
  30. package/catalog/frontmcp-config/references/configure-http.md +10 -0
  31. package/catalog/frontmcp-config/references/configure-session.md +10 -0
  32. package/catalog/frontmcp-config/references/configure-throttle-guard-config.md +9 -0
  33. package/catalog/frontmcp-config/references/configure-throttle.md +10 -0
  34. package/catalog/frontmcp-config/references/configure-transport-protocol-presets.md +9 -0
  35. package/catalog/frontmcp-config/references/configure-transport.md +10 -0
  36. package/catalog/frontmcp-config/references/setup-redis.md +5 -0
  37. package/catalog/frontmcp-config/references/setup-sqlite.md +5 -0
  38. package/catalog/frontmcp-deployment/SKILL.md +2 -2
  39. package/catalog/frontmcp-deployment/examples/build-for-browser/browser-build-with-custom-entry.md +43 -0
  40. package/catalog/frontmcp-deployment/examples/build-for-browser/browser-crypto-and-storage.md +85 -0
  41. package/catalog/frontmcp-deployment/examples/build-for-browser/react-provider-setup.md +61 -0
  42. package/catalog/frontmcp-deployment/examples/build-for-cli/cli-binary-build.md +66 -0
  43. package/catalog/frontmcp-deployment/examples/build-for-cli/unix-socket-daemon.md +76 -0
  44. package/catalog/frontmcp-deployment/examples/build-for-sdk/connect-openai.md +78 -0
  45. package/catalog/frontmcp-deployment/examples/build-for-sdk/create-flat-config.md +85 -0
  46. package/catalog/frontmcp-deployment/examples/build-for-sdk/multi-platform-connect.md +104 -0
  47. package/catalog/frontmcp-deployment/examples/deploy-to-cloudflare/basic-worker-deploy.md +82 -0
  48. package/catalog/frontmcp-deployment/examples/deploy-to-cloudflare/worker-custom-domain.md +97 -0
  49. package/catalog/frontmcp-deployment/examples/deploy-to-cloudflare/worker-with-kv-storage.md +92 -0
  50. package/catalog/frontmcp-deployment/examples/deploy-to-lambda/cdk-deployment.md +92 -0
  51. package/catalog/frontmcp-deployment/examples/deploy-to-lambda/lambda-handler-with-cors.md +113 -0
  52. package/catalog/frontmcp-deployment/examples/deploy-to-lambda/sam-template-basic.md +100 -0
  53. package/catalog/frontmcp-deployment/examples/deploy-to-node/docker-compose-with-redis.md +101 -0
  54. package/catalog/frontmcp-deployment/examples/deploy-to-node/pm2-with-nginx.md +79 -0
  55. package/catalog/frontmcp-deployment/examples/deploy-to-node/resource-limits.md +92 -0
  56. package/catalog/frontmcp-deployment/examples/deploy-to-node-dockerfile/basic-multistage-dockerfile.md +63 -0
  57. package/catalog/frontmcp-deployment/examples/deploy-to-node-dockerfile/secure-nonroot-dockerfile.md +89 -0
  58. package/catalog/frontmcp-deployment/examples/deploy-to-vercel/vercel-mcp-endpoint-test.md +69 -0
  59. package/catalog/frontmcp-deployment/examples/deploy-to-vercel/vercel-with-kv.md +82 -0
  60. package/catalog/frontmcp-deployment/examples/deploy-to-vercel/vercel-with-skills-cache.md +90 -0
  61. package/catalog/frontmcp-deployment/examples/deploy-to-vercel-config/minimal-vercel-config.md +49 -0
  62. package/catalog/frontmcp-deployment/examples/deploy-to-vercel-config/vercel-config-with-security-headers.md +92 -0
  63. package/catalog/frontmcp-deployment/references/build-for-browser.md +10 -0
  64. package/catalog/frontmcp-deployment/references/build-for-cli.md +9 -0
  65. package/catalog/frontmcp-deployment/references/build-for-sdk.md +10 -0
  66. package/catalog/frontmcp-deployment/references/deploy-to-cloudflare.md +10 -0
  67. package/catalog/frontmcp-deployment/references/deploy-to-lambda.md +10 -0
  68. package/catalog/frontmcp-deployment/references/deploy-to-node-dockerfile.md +9 -0
  69. package/catalog/frontmcp-deployment/references/deploy-to-node.md +10 -0
  70. package/catalog/frontmcp-deployment/references/deploy-to-vercel-config.md +9 -0
  71. package/catalog/frontmcp-deployment/references/deploy-to-vercel.md +10 -0
  72. package/catalog/frontmcp-development/SKILL.md +2 -2
  73. package/catalog/frontmcp-development/examples/create-adapter/basic-api-adapter.md +92 -0
  74. package/catalog/frontmcp-development/examples/create-adapter/namespaced-adapter.md +124 -0
  75. package/catalog/frontmcp-development/examples/create-agent/basic-agent-with-tools.md +121 -0
  76. package/catalog/frontmcp-development/examples/create-agent/custom-multi-pass-agent.md +95 -0
  77. package/catalog/frontmcp-development/examples/create-agent/nested-agents-with-swarm.md +111 -0
  78. package/catalog/frontmcp-development/examples/create-agent-llm-config/anthropic-config.md +81 -0
  79. package/catalog/frontmcp-development/examples/create-agent-llm-config/openai-config.md +80 -0
  80. package/catalog/frontmcp-development/examples/create-job/basic-report-job.md +87 -0
  81. package/catalog/frontmcp-development/examples/create-job/job-with-permissions.md +117 -0
  82. package/catalog/frontmcp-development/examples/create-job/job-with-retry.md +88 -0
  83. package/catalog/frontmcp-development/examples/create-plugin/basic-plugin-with-provider.md +69 -0
  84. package/catalog/frontmcp-development/examples/create-plugin/configurable-dynamic-plugin.md +178 -0
  85. package/catalog/frontmcp-development/examples/create-plugin/plugin-with-context-extension.md +107 -0
  86. package/catalog/frontmcp-development/examples/create-plugin-hooks/basic-logging-plugin.md +69 -0
  87. package/catalog/frontmcp-development/examples/create-plugin-hooks/caching-with-around.md +80 -0
  88. package/catalog/frontmcp-development/examples/create-plugin-hooks/tool-level-hooks-and-stage-replacement.md +100 -0
  89. package/catalog/frontmcp-development/examples/create-prompt/basic-prompt.md +72 -0
  90. package/catalog/frontmcp-development/examples/create-prompt/dynamic-rag-prompt.md +92 -0
  91. package/catalog/frontmcp-development/examples/create-prompt/multi-turn-debug-session.md +86 -0
  92. package/catalog/frontmcp-development/examples/create-provider/basic-database-provider.md +113 -0
  93. package/catalog/frontmcp-development/examples/create-provider/config-and-api-providers.md +107 -0
  94. package/catalog/frontmcp-development/examples/create-resource/basic-static-resource.md +72 -0
  95. package/catalog/frontmcp-development/examples/create-resource/binary-and-multi-content.md +111 -0
  96. package/catalog/frontmcp-development/examples/create-resource/parameterized-template.md +84 -0
  97. package/catalog/frontmcp-development/examples/create-skill/basic-inline-skill.md +96 -0
  98. package/catalog/frontmcp-development/examples/create-skill/directory-based-skill.md +115 -0
  99. package/catalog/frontmcp-development/examples/create-skill/parameterized-skill.md +96 -0
  100. package/catalog/frontmcp-development/examples/create-skill-with-tools/basic-tool-orchestration.md +76 -0
  101. package/catalog/frontmcp-development/examples/create-skill-with-tools/directory-skill-with-tools.md +149 -0
  102. package/catalog/frontmcp-development/examples/create-skill-with-tools/incident-response-skill.md +92 -0
  103. package/catalog/frontmcp-development/examples/create-tool/basic-class-tool.md +62 -0
  104. package/catalog/frontmcp-development/examples/create-tool/tool-with-di-and-errors.md +84 -0
  105. package/catalog/frontmcp-development/examples/create-tool/tool-with-rate-limiting-and-progress.md +93 -0
  106. package/catalog/frontmcp-development/examples/create-tool-annotations/destructive-delete-tool.md +94 -0
  107. package/catalog/frontmcp-development/examples/create-tool-annotations/readonly-query-tool.md +60 -0
  108. package/catalog/frontmcp-development/examples/create-tool-output-schema-types/primitive-and-media-outputs.md +104 -0
  109. package/catalog/frontmcp-development/examples/create-tool-output-schema-types/zod-raw-shape-output.md +63 -0
  110. package/catalog/frontmcp-development/examples/create-tool-output-schema-types/zod-schema-advanced-output.md +103 -0
  111. package/catalog/frontmcp-development/examples/create-workflow/basic-deploy-pipeline.md +91 -0
  112. package/catalog/frontmcp-development/examples/create-workflow/parallel-validation-pipeline.md +90 -0
  113. package/catalog/frontmcp-development/examples/create-workflow/webhook-triggered-workflow.md +136 -0
  114. package/catalog/frontmcp-development/examples/decorators-guide/agent-skill-job-workflow.md +145 -0
  115. package/catalog/frontmcp-development/examples/decorators-guide/basic-server-with-app-and-tools.md +124 -0
  116. package/catalog/frontmcp-development/examples/decorators-guide/multi-app-with-plugins-and-providers.md +149 -0
  117. package/catalog/frontmcp-development/examples/official-adapters/authenticated-adapter-with-polling.md +84 -0
  118. package/catalog/frontmcp-development/examples/official-adapters/basic-openapi-adapter.md +54 -0
  119. package/catalog/frontmcp-development/examples/official-adapters/multi-api-hub-with-inline-spec.md +130 -0
  120. package/catalog/frontmcp-development/examples/official-plugins/cache-and-feature-flags.md +117 -0
  121. package/catalog/frontmcp-development/examples/official-plugins/production-multi-plugin-setup.md +147 -0
  122. package/catalog/frontmcp-development/examples/official-plugins/remember-plugin-session-memory.md +104 -0
  123. package/catalog/frontmcp-development/references/create-adapter.md +9 -0
  124. package/catalog/frontmcp-development/references/create-agent-llm-config.md +9 -0
  125. package/catalog/frontmcp-development/references/create-agent.md +10 -0
  126. package/catalog/frontmcp-development/references/create-job.md +10 -0
  127. package/catalog/frontmcp-development/references/create-plugin-hooks.md +10 -0
  128. package/catalog/frontmcp-development/references/create-plugin.md +10 -0
  129. package/catalog/frontmcp-development/references/create-prompt.md +10 -0
  130. package/catalog/frontmcp-development/references/create-provider.md +9 -0
  131. package/catalog/frontmcp-development/references/create-resource.md +52 -15
  132. package/catalog/frontmcp-development/references/create-skill-with-tools.md +10 -0
  133. package/catalog/frontmcp-development/references/create-skill.md +10 -0
  134. package/catalog/frontmcp-development/references/create-tool-annotations.md +9 -0
  135. package/catalog/frontmcp-development/references/create-tool-output-schema-types.md +10 -0
  136. package/catalog/frontmcp-development/references/create-tool.md +10 -0
  137. package/catalog/frontmcp-development/references/create-workflow.md +10 -0
  138. package/catalog/frontmcp-development/references/decorators-guide.md +10 -0
  139. package/catalog/frontmcp-development/references/official-adapters.md +10 -0
  140. package/catalog/frontmcp-development/references/official-plugins.md +10 -0
  141. package/catalog/frontmcp-extensibility/SKILL.md +1 -1
  142. package/catalog/frontmcp-extensibility/examples/vectoriadb/product-catalog-search.md +175 -0
  143. package/catalog/frontmcp-extensibility/examples/vectoriadb/semantic-search-with-persistence.md +138 -0
  144. package/catalog/frontmcp-extensibility/examples/vectoriadb/tfidf-keyword-search.md +103 -0
  145. package/catalog/frontmcp-extensibility/references/vectoriadb.md +10 -0
  146. package/catalog/frontmcp-guides/SKILL.md +2 -2
  147. package/catalog/frontmcp-guides/examples/example-knowledge-base/agent-and-plugin.md +160 -0
  148. package/catalog/frontmcp-guides/examples/example-knowledge-base/multi-app-composition.md +92 -0
  149. package/catalog/frontmcp-guides/examples/example-knowledge-base/vector-search-and-resources.md +135 -0
  150. package/catalog/frontmcp-guides/examples/example-task-manager/auth-and-crud-tools.md +135 -0
  151. package/catalog/frontmcp-guides/examples/example-task-manager/authenticated-e2e-tests.md +148 -0
  152. package/catalog/frontmcp-guides/examples/example-task-manager/redis-provider-with-di.md +129 -0
  153. package/catalog/frontmcp-guides/examples/example-weather-api/server-and-app-setup.md +75 -0
  154. package/catalog/frontmcp-guides/examples/example-weather-api/unit-and-e2e-tests.md +142 -0
  155. package/catalog/frontmcp-guides/examples/example-weather-api/weather-tool-with-schemas.md +74 -0
  156. package/catalog/frontmcp-guides/references/example-knowledge-base.md +10 -0
  157. package/catalog/frontmcp-guides/references/example-task-manager.md +10 -0
  158. package/catalog/frontmcp-guides/references/example-weather-api.md +10 -0
  159. package/catalog/frontmcp-production-readiness/SKILL.md +2 -2
  160. package/catalog/frontmcp-production-readiness/examples/common-checklist/caching-and-performance.md +102 -0
  161. package/catalog/frontmcp-production-readiness/examples/common-checklist/observability-setup.md +104 -0
  162. package/catalog/frontmcp-production-readiness/examples/common-checklist/security-hardening.md +95 -0
  163. package/catalog/frontmcp-production-readiness/examples/production-browser/browser-bundle-config.md +93 -0
  164. package/catalog/frontmcp-production-readiness/examples/production-browser/cross-platform-crypto.md +116 -0
  165. package/catalog/frontmcp-production-readiness/examples/production-browser/security-and-performance.md +128 -0
  166. package/catalog/frontmcp-production-readiness/examples/production-cli-binary/binary-build-config.md +109 -0
  167. package/catalog/frontmcp-production-readiness/examples/production-cli-binary/stdio-transport-error-handling.md +132 -0
  168. package/catalog/frontmcp-production-readiness/examples/production-cli-daemon/daemon-socket-config.md +82 -0
  169. package/catalog/frontmcp-production-readiness/examples/production-cli-daemon/graceful-shutdown-cleanup.md +107 -0
  170. package/catalog/frontmcp-production-readiness/examples/production-cli-daemon/security-and-permissions.md +119 -0
  171. package/catalog/frontmcp-production-readiness/examples/production-cloudflare/durable-objects-state.md +124 -0
  172. package/catalog/frontmcp-production-readiness/examples/production-cloudflare/workers-runtime-constraints.md +103 -0
  173. package/catalog/frontmcp-production-readiness/examples/production-cloudflare/wrangler-config.md +89 -0
  174. package/catalog/frontmcp-production-readiness/examples/production-lambda/cold-start-connection-reuse.md +122 -0
  175. package/catalog/frontmcp-production-readiness/examples/production-lambda/sam-template.md +107 -0
  176. package/catalog/frontmcp-production-readiness/examples/production-lambda/scaling-and-monitoring.md +138 -0
  177. package/catalog/frontmcp-production-readiness/examples/production-node-sdk/basic-sdk-lifecycle.md +85 -0
  178. package/catalog/frontmcp-production-readiness/examples/production-node-sdk/multi-instance-cleanup.md +110 -0
  179. package/catalog/frontmcp-production-readiness/examples/production-node-sdk/package-json-config.md +107 -0
  180. package/catalog/frontmcp-production-readiness/examples/production-node-server/docker-multi-stage.md +103 -0
  181. package/catalog/frontmcp-production-readiness/examples/production-node-server/graceful-shutdown.md +87 -0
  182. package/catalog/frontmcp-production-readiness/examples/production-node-server/redis-session-scaling.md +97 -0
  183. package/catalog/frontmcp-production-readiness/examples/production-vercel/cold-start-optimization.md +104 -0
  184. package/catalog/frontmcp-production-readiness/examples/production-vercel/stateless-serverless-design.md +91 -0
  185. package/catalog/frontmcp-production-readiness/examples/production-vercel/vercel-edge-config.md +78 -0
  186. package/catalog/frontmcp-production-readiness/references/common-checklist.md +10 -0
  187. package/catalog/frontmcp-production-readiness/references/production-browser.md +10 -0
  188. package/catalog/frontmcp-production-readiness/references/production-cli-binary.md +9 -0
  189. package/catalog/frontmcp-production-readiness/references/production-cli-daemon.md +10 -0
  190. package/catalog/frontmcp-production-readiness/references/production-cloudflare.md +10 -0
  191. package/catalog/frontmcp-production-readiness/references/production-lambda.md +10 -0
  192. package/catalog/frontmcp-production-readiness/references/production-node-sdk.md +10 -0
  193. package/catalog/frontmcp-production-readiness/references/production-node-server.md +10 -0
  194. package/catalog/frontmcp-production-readiness/references/production-vercel.md +10 -0
  195. package/catalog/frontmcp-setup/examples/frontmcp-skills-usage/bundle-presets-scaffolding.md +61 -0
  196. package/catalog/frontmcp-setup/examples/frontmcp-skills-usage/install-and-search-skills.md +83 -0
  197. package/catalog/frontmcp-setup/examples/multi-app-composition/local-apps-with-shared-tools.md +87 -0
  198. package/catalog/frontmcp-setup/examples/multi-app-composition/per-app-auth-and-isolation.md +88 -0
  199. package/catalog/frontmcp-setup/examples/multi-app-composition/remote-and-esm-apps.md +81 -0
  200. package/catalog/frontmcp-setup/examples/nx-workflow/build-test-affected.md +77 -0
  201. package/catalog/frontmcp-setup/examples/nx-workflow/multi-server-deployment.md +93 -0
  202. package/catalog/frontmcp-setup/examples/nx-workflow/scaffold-and-generate.md +62 -0
  203. package/catalog/frontmcp-setup/examples/project-structure-nx/nx-generator-scaffolding.md +73 -0
  204. package/catalog/frontmcp-setup/examples/project-structure-nx/nx-workspace-with-apps.md +85 -0
  205. package/catalog/frontmcp-setup/examples/project-structure-nx/shared-library-usage.md +89 -0
  206. package/catalog/frontmcp-setup/examples/project-structure-standalone/dev-workflow-commands.md +64 -0
  207. package/catalog/frontmcp-setup/examples/project-structure-standalone/feature-folder-organization.md +111 -0
  208. package/catalog/frontmcp-setup/examples/project-structure-standalone/minimal-standalone-layout.md +73 -0
  209. package/catalog/frontmcp-setup/examples/readme-guide/node-server-readme.md +89 -0
  210. package/catalog/frontmcp-setup/examples/readme-guide/vercel-deployment-readme.md +90 -0
  211. package/catalog/frontmcp-setup/examples/setup-project/basic-node-server.md +99 -0
  212. package/catalog/frontmcp-setup/examples/setup-project/cli-scaffold-with-flags.md +77 -0
  213. package/catalog/frontmcp-setup/examples/setup-project/vercel-serverless-server.md +89 -0
  214. package/catalog/frontmcp-setup/examples/setup-redis/docker-redis-local-dev.md +88 -0
  215. package/catalog/frontmcp-setup/examples/setup-redis/hybrid-vercel-kv-with-pubsub.md +78 -0
  216. package/catalog/frontmcp-setup/examples/setup-redis/vercel-kv-serverless.md +78 -0
  217. package/catalog/frontmcp-setup/examples/setup-sqlite/basic-sqlite-setup.md +75 -0
  218. package/catalog/frontmcp-setup/examples/setup-sqlite/encrypted-sqlite-storage.md +55 -0
  219. package/catalog/frontmcp-setup/examples/setup-sqlite/unix-socket-daemon.md +70 -0
  220. package/catalog/frontmcp-setup/references/frontmcp-skills-usage.md +9 -0
  221. package/catalog/frontmcp-setup/references/multi-app-composition.md +10 -0
  222. package/catalog/frontmcp-setup/references/nx-workflow.md +10 -0
  223. package/catalog/frontmcp-setup/references/project-structure-nx.md +10 -0
  224. package/catalog/frontmcp-setup/references/project-structure-standalone.md +10 -0
  225. package/catalog/frontmcp-setup/references/readme-guide.md +9 -0
  226. package/catalog/frontmcp-setup/references/setup-project.md +10 -0
  227. package/catalog/frontmcp-setup/references/setup-redis.md +10 -0
  228. package/catalog/frontmcp-setup/references/setup-sqlite.md +10 -0
  229. package/catalog/frontmcp-testing/examples/setup-testing/fixture-based-e2e-test.md +70 -0
  230. package/catalog/frontmcp-testing/examples/setup-testing/jest-config-with-coverage.md +59 -0
  231. package/catalog/frontmcp-testing/examples/setup-testing/unit-test-tool-resource-prompt.md +115 -0
  232. package/catalog/frontmcp-testing/examples/test-auth/oauth-flow-test.md +78 -0
  233. package/catalog/frontmcp-testing/examples/test-auth/role-based-access-test.md +88 -0
  234. package/catalog/frontmcp-testing/examples/test-auth/token-factory-test.md +71 -0
  235. package/catalog/frontmcp-testing/examples/test-browser-build/browser-bundle-validation.md +58 -0
  236. package/catalog/frontmcp-testing/examples/test-browser-build/playwright-browser-test.md +69 -0
  237. package/catalog/frontmcp-testing/examples/test-cli-binary/binary-startup-test.md +77 -0
  238. package/catalog/frontmcp-testing/examples/test-cli-binary/js-bundle-import-test.md +56 -0
  239. package/catalog/frontmcp-testing/examples/test-direct-client/basic-create-test.md +74 -0
  240. package/catalog/frontmcp-testing/examples/test-direct-client/openai-claude-format-test.md +79 -0
  241. package/catalog/frontmcp-testing/examples/test-e2e-handler/basic-e2e-test.md +67 -0
  242. package/catalog/frontmcp-testing/examples/test-e2e-handler/manual-client-with-transport.md +72 -0
  243. package/catalog/frontmcp-testing/examples/test-e2e-handler/tool-call-and-error-e2e.md +73 -0
  244. package/catalog/frontmcp-testing/examples/test-tool-unit/basic-tool-test.md +69 -0
  245. package/catalog/frontmcp-testing/examples/test-tool-unit/schema-validation-test.md +82 -0
  246. package/catalog/frontmcp-testing/examples/test-tool-unit/tool-error-handling-test.md +92 -0
  247. package/catalog/frontmcp-testing/references/setup-testing.md +10 -0
  248. package/catalog/frontmcp-testing/references/test-auth.md +10 -0
  249. package/catalog/frontmcp-testing/references/test-browser-build.md +9 -0
  250. package/catalog/frontmcp-testing/references/test-cli-binary.md +9 -0
  251. package/catalog/frontmcp-testing/references/test-direct-client.md +9 -0
  252. package/catalog/frontmcp-testing/references/test-e2e-handler.md +10 -0
  253. package/catalog/frontmcp-testing/references/test-tool-unit.md +10 -0
  254. package/catalog/skills-manifest.json +2383 -67
  255. package/package.json +1 -1
  256. package/src/manifest.d.ts +23 -0
  257. package/src/manifest.js +3 -1
  258. package/src/manifest.js.map +1 -1
@@ -13,47 +13,357 @@
13
13
  "references": [
14
14
  {
15
15
  "name": "configure-auth-modes",
16
- "description": "Detailed comparison of public, transparent, remote, and managed auth modes"
16
+ "description": "Detailed comparison of public, transparent, remote, and managed auth modes",
17
+ "examples": [
18
+ {
19
+ "name": "local-self-signed-tokens",
20
+ "description": "Configure a server that signs its own JWT tokens with consent and incremental auth enabled.",
21
+ "level": "intermediate",
22
+ "tags": ["config", "auth", "redis", "local", "auth-modes", "modes"],
23
+ "features": [
24
+ "Using `mode: 'local'` so the server signs its own JWTs",
25
+ "Setting `local.issuer` and `local.audience` to control token claims",
26
+ "Enabling `consent` for explicit user authorization flow",
27
+ "Enabling `incrementalAuth` to request additional scopes progressively",
28
+ "Using Redis for token storage in production"
29
+ ]
30
+ },
31
+ {
32
+ "name": "remote-enterprise-oauth",
33
+ "description": "Delegate authentication to an external OAuth orchestrator with Redis-backed token storage.",
34
+ "level": "advanced",
35
+ "tags": ["config", "oauth", "auth", "redis", "remote", "auth-modes"],
36
+ "features": [
37
+ "Using `mode: 'remote'` to delegate to an external OAuth 2.1 authorization server",
38
+ "Loading `clientId` and `clientSecret` from environment variables (never hardcoded)",
39
+ "Configuring Redis-backed token storage for production persistence",
40
+ "Full OAuth flow: clients are redirected to the provider and return with an authorization code"
41
+ ]
42
+ },
43
+ {
44
+ "name": "transparent-jwt-validation",
45
+ "description": "Validate externally-issued JWTs without managing token lifecycle on the server.",
46
+ "level": "basic",
47
+ "tags": ["config", "auth", "transparent", "auth-modes", "modes", "jwt"],
48
+ "features": [
49
+ "Using `mode: 'transparent'` to validate tokens from an external identity provider",
50
+ "Setting `expectedAudience` to restrict which tokens are accepted",
51
+ "The server fetches JWKS from `{provider}/.well-known/jwks.json` automatically"
52
+ ]
53
+ }
54
+ ]
17
55
  },
18
56
  {
19
57
  "name": "configure-auth",
20
- "description": "Set up authentication modes, credential vault, and OAuth flows for FrontMCP servers"
58
+ "description": "Set up authentication modes, credential vault, and OAuth flows for FrontMCP servers",
59
+ "examples": [
60
+ {
61
+ "name": "multi-app-auth",
62
+ "description": "Configure a single FrontMCP server with multiple apps, each using a different auth mode -- public for open endpoints and remote for admin endpoints.",
63
+ "level": "advanced",
64
+ "tags": ["config", "auth", "security", "multi-app", "remote", "multi"],
65
+ "features": [
66
+ "Hosting multiple `@App` instances on a single FrontMCP server with different auth modes",
67
+ "Using `public` mode for open-access endpoints alongside `remote` mode for admin-only endpoints",
68
+ "Isolating tools per app so each security posture governs only its own tools"
69
+ ]
70
+ },
71
+ {
72
+ "name": "public-mode-setup",
73
+ "description": "Set up a FrontMCP server with public (unauthenticated) access and anonymous scopes.",
74
+ "level": "basic",
75
+ "tags": ["config", "auth", "session", "public", "mode", "setup"],
76
+ "features": [
77
+ "Configuring `mode: 'public'` for unauthenticated access",
78
+ "Setting `sessionTtl` to control anonymous session lifetime",
79
+ "Granting `anonymousScopes` so tools can check scope-based permissions even without auth"
80
+ ]
81
+ },
82
+ {
83
+ "name": "remote-oauth-with-vault",
84
+ "description": "Configure a FrontMCP server with remote OAuth 2.1 authentication and use the credential vault to call downstream APIs on behalf of the authenticated user.",
85
+ "level": "intermediate",
86
+ "tags": ["config", "oauth", "auth", "remote", "vault"],
87
+ "features": [
88
+ "Configuring `mode: 'remote'` for full OAuth 2.1 authorization flow",
89
+ "Loading `clientId` from environment variables instead of hardcoding",
90
+ "Using `this.authProviders.headers('github')` to get pre-formatted auth headers for downstream API calls"
91
+ ]
92
+ }
93
+ ]
21
94
  },
22
95
  {
23
96
  "name": "configure-elicitation",
24
- "description": "Configure interactive user input during tool execution for confirmations, choices, and forms"
97
+ "description": "Configure interactive user input during tool execution for confirmations, choices, and forms",
98
+ "examples": [
99
+ {
100
+ "name": "basic-confirmation-gate",
101
+ "description": "Request user confirmation before executing a destructive action.",
102
+ "level": "basic",
103
+ "tags": ["config", "elicitation", "confirmation", "gate"],
104
+ "features": [
105
+ "Enabling elicitation with `elicitation: { enabled: true }` in the `@FrontMcp` decorator",
106
+ "Using `this.elicit()` to pause tool execution and request user confirmation",
107
+ "Handling the case where the client does not support elicitation (`!confirmation`)",
108
+ "Using a boolean `requestedSchema` for simple yes/no confirmations"
109
+ ]
110
+ },
111
+ {
112
+ "name": "distributed-elicitation-redis",
113
+ "description": "Configure elicitation with Redis storage for multi-instance production deployments.",
114
+ "level": "intermediate",
115
+ "tags": ["config", "redis", "elicitation", "distributed"],
116
+ "features": [
117
+ "Configuring Redis-backed elicitation state for multi-instance deployments",
118
+ "Using a `requestedSchema` with both required and optional fields",
119
+ "Elicitation state is shared across server instances so the response can arrive at any replica",
120
+ "Loading Redis connection details from environment variables"
121
+ ]
122
+ }
123
+ ]
25
124
  },
26
125
  {
27
126
  "name": "configure-http",
28
- "description": "Configure HTTP server port, CORS policy, unix sockets, and entry path prefix"
127
+ "description": "Configure HTTP server port, CORS policy, unix sockets, and entry path prefix",
128
+ "examples": [
129
+ {
130
+ "name": "cors-restricted-origins",
131
+ "description": "Configure CORS to allow only specific frontend origins with credentials.",
132
+ "level": "basic",
133
+ "tags": ["config", "browser", "http", "cors", "restricted", "origins"],
134
+ "features": [
135
+ "Restricting CORS to explicit origins instead of the permissive default",
136
+ "Enabling `credentials: true` with specific origins (required -- browsers reject `*` with credentials)",
137
+ "Setting `maxAge` to reduce preflight request overhead",
138
+ "Reading port from an environment variable with a fallback"
139
+ ]
140
+ },
141
+ {
142
+ "name": "entry-path-reverse-proxy",
143
+ "description": "Mount the MCP server under a URL prefix for reverse proxy or multi-service setups.",
144
+ "level": "intermediate",
145
+ "tags": ["config", "nx", "http", "entry", "path", "reverse"],
146
+ "features": [
147
+ "Using `entryPath` to mount the server under a URL prefix (no trailing slash)",
148
+ "All MCP endpoints are prefixed: `/api/mcp/sse`, `/api/mcp/`, etc.",
149
+ "Using a dynamic CORS origin function to allow wildcard subdomains",
150
+ "Suitable for running behind nginx, Caddy, or other reverse proxies"
151
+ ]
152
+ },
153
+ {
154
+ "name": "unix-socket-local",
155
+ "description": "Bind the server to a unix socket instead of a TCP port for local-only communication.",
156
+ "level": "intermediate",
157
+ "tags": ["config", "unix-socket", "cli", "local", "http", "unix"],
158
+ "features": [
159
+ "Using `socketPath` to bind to a unix socket instead of a TCP port",
160
+ "When `socketPath` is set, the `port` field is ignored",
161
+ "Disabling CORS with `cors: false` since unix sockets are local-only",
162
+ "Suitable for CLI tools, daemons, and process manager integrations"
163
+ ]
164
+ }
165
+ ]
29
166
  },
30
167
  {
31
168
  "name": "configure-session",
32
- "description": "Set up session storage with Redis or Vercel KV for persistent user state across requests"
169
+ "description": "Set up session storage with Redis or Vercel KV for persistent user state across requests",
170
+ "examples": [
171
+ {
172
+ "name": "multi-server-key-prefix",
173
+ "description": "Use unique key prefixes when multiple FrontMCP servers share one Redis instance.",
174
+ "level": "intermediate",
175
+ "tags": ["config", "redis", "session", "multi", "key", "prefix"],
176
+ "features": [
177
+ "Using unique `keyPrefix` values per server to avoid session key collisions",
178
+ "Both servers share the same Redis instance but have isolated session namespaces",
179
+ "Tuning `defaultTtlMs` per server based on workload pattern",
180
+ "`billing-mcp:session:` vs `analytics-mcp:session:` prevents cross-contamination"
181
+ ]
182
+ },
183
+ {
184
+ "name": "redis-session-store",
185
+ "description": "Configure Redis-backed session storage for production deployments.",
186
+ "level": "basic",
187
+ "tags": ["config", "redis", "session", "store"],
188
+ "features": [
189
+ "Configuring Redis as the session storage provider for production persistence",
190
+ "Using `keyPrefix` to namespace session keys and prevent collisions with other servers",
191
+ "Setting `defaultTtlMs` to control session lifetime (1 hour for interactive use)",
192
+ "Loading Redis connection details from environment variables"
193
+ ]
194
+ },
195
+ {
196
+ "name": "vercel-kv-session",
197
+ "description": "Configure Vercel KV for session storage in serverless Vercel deployments.",
198
+ "level": "intermediate",
199
+ "tags": ["config", "vercel-kv", "vercel", "session", "transport", "serverless"],
200
+ "features": [
201
+ "Using `provider: 'vercel-kv'` for Vercel platform deployments",
202
+ "Vercel automatically injects `KV_REST_API_URL` and `KV_REST_API_TOKEN` environment variables",
203
+ "Combining with `stateless-api` transport preset for serverless execution",
204
+ "No explicit host/port needed -- Vercel KV uses REST API under the hood"
205
+ ]
206
+ }
207
+ ]
33
208
  },
34
209
  {
35
210
  "name": "configure-throttle-guard-config",
36
- "description": "Complete GuardConfig interface reference for rate limiting, concurrency, and IP filtering"
211
+ "description": "Complete GuardConfig interface reference for rate limiting, concurrency, and IP filtering",
212
+ "examples": [
213
+ {
214
+ "name": "full-guard-config",
215
+ "description": "Complete GuardConfig using every available field for maximum protection.",
216
+ "level": "advanced",
217
+ "tags": ["config", "redis", "session", "throttle", "guard", "full"],
218
+ "features": [
219
+ "Every field in the `GuardConfig` interface used together",
220
+ "Priority order: IP filter -> global rate limit -> global concurrency -> per-tool limits",
221
+ "Redis `storage` for shared counters across instances",
222
+ "`keyPrefix` to namespace guard keys in shared Redis",
223
+ "Mixed `partitionBy` strategies: `'ip'` for global, `'session'` for per-tool",
224
+ "`queueTimeoutMs` to briefly queue excess requests instead of rejecting"
225
+ ]
226
+ },
227
+ {
228
+ "name": "minimal-guard-config",
229
+ "description": "Enable throttle with just a global rate limit and default timeout.",
230
+ "level": "basic",
231
+ "tags": ["config", "throttle", "guard", "minimal"],
232
+ "features": [
233
+ "The minimum fields needed to enable the guard: `enabled`, `global`, and `defaultTimeout`",
234
+ "`partitionBy: 'global'` shares one counter across all clients",
235
+ "`windowMs` defaults to 60000 (1 minute) if omitted",
236
+ "Other fields (`globalConcurrency`, `ipFilter`, `storage`) are optional"
237
+ ]
238
+ }
239
+ ]
37
240
  },
38
241
  {
39
242
  "name": "configure-throttle",
40
- "description": "Protect servers with rate limiting, concurrency control, execution timeouts, and IP filtering"
243
+ "description": "Protect servers with rate limiting, concurrency control, execution timeouts, and IP filtering",
244
+ "examples": [
245
+ {
246
+ "name": "distributed-redis-throttle",
247
+ "description": "Configure Redis-backed rate limiting for multi-instance deployments behind a load balancer.",
248
+ "level": "advanced",
249
+ "tags": ["config", "redis", "session", "throttle", "distributed"],
250
+ "features": [
251
+ "Configuring `storage: { type: 'redis' }` so rate limit counters are shared across instances",
252
+ "Using `keyPrefix` to namespace guard keys in a shared Redis instance",
253
+ "Combining `partitionBy: 'ip'` for global limits with `partitionBy: 'session'` per tool",
254
+ "In-memory counters are per-process and would allow N times the intended rate with N instances"
255
+ ]
256
+ },
257
+ {
258
+ "name": "per-tool-rate-limit",
259
+ "description": "Override server defaults with per-tool rate limits and concurrency caps.",
260
+ "level": "intermediate",
261
+ "tags": ["config", "session", "throttle", "per", "tool", "rate"],
262
+ "features": [
263
+ "Setting per-tool `rateLimit`, `concurrency`, and `timeout` on the `@Tool` decorator",
264
+ "Using `partitionBy: 'session'` for per-user fairness on expensive tools",
265
+ "Setting `queueTimeoutMs` to briefly queue excess requests instead of rejecting immediately",
266
+ "Tools without overrides (`QuickLookupTool`) inherit server defaults"
267
+ ]
268
+ },
269
+ {
270
+ "name": "server-level-rate-limit",
271
+ "description": "Configure global rate limits and IP filtering at the server level.",
272
+ "level": "basic",
273
+ "tags": ["config", "throttle", "level", "rate", "limit"],
274
+ "features": [
275
+ "Enabling throttle with `throttle: { enabled: true }`",
276
+ "Setting `global` rate limit shared across all clients",
277
+ "Configuring `globalConcurrency` to cap simultaneous executions",
278
+ "Setting `defaultTimeout` to prevent runaway tool executions",
279
+ "Using `ipFilter` with deny-by-default posture and an explicit allow list"
280
+ ]
281
+ }
282
+ ]
41
283
  },
42
284
  {
43
285
  "name": "configure-transport-protocol-presets",
44
- "description": "Reference for legacy, modern, stateless, and minimal transport protocol presets"
286
+ "description": "Reference for legacy, modern, stateless, and minimal transport protocol presets",
287
+ "examples": [
288
+ {
289
+ "name": "legacy-preset-nodejs",
290
+ "description": "Use the default legacy preset for maximum compatibility with all MCP clients.",
291
+ "level": "basic",
292
+ "tags": ["config", "anthropic", "session", "transport", "node", "protocol"],
293
+ "features": [
294
+ "The `'legacy'` preset is the default and can be omitted",
295
+ "Enables SSE, Streamable HTTP, and Legacy SSE for maximum client compatibility",
296
+ "`strictSession: true` requires `mcp-session-id` header for streamable HTTP",
297
+ "Best for single-instance Node.js deployments (Claude Desktop, etc.)"
298
+ ]
299
+ },
300
+ {
301
+ "name": "stateless-api-serverless",
302
+ "description": "Use the stateless-api preset for Vercel, Lambda, or Cloudflare Workers.",
303
+ "level": "intermediate",
304
+ "tags": ["config", "vercel", "lambda", "cloudflare", "session", "transport"],
305
+ "features": [
306
+ "The `'stateless-api'` preset disables SSE, streaming, and sessions entirely",
307
+ "Each request is standalone with no server-side state",
308
+ "Pair with `sessionMode: 'stateless'` for serverless execution",
309
+ "Required for Vercel, Lambda, Cloudflare Workers where persistent connections are not allowed"
310
+ ]
311
+ }
312
+ ]
45
313
  },
46
314
  {
47
315
  "name": "configure-transport",
48
- "description": "Configure client transport protocols including SSE, Streamable HTTP, and stateless API modes"
316
+ "description": "Configure client transport protocols including SSE, Streamable HTTP, and stateless API modes",
317
+ "examples": [
318
+ {
319
+ "name": "custom-protocol-flags",
320
+ "description": "Override individual protocol flags instead of using a preset for fine-grained control.",
321
+ "level": "advanced",
322
+ "tags": ["config", "redis", "session", "transport", "custom", "protocol"],
323
+ "features": [
324
+ "Passing an object to `protocol` instead of a preset string for fine-grained control",
325
+ "Enabling SSE, streamable HTTP, and JSON-only modes simultaneously",
326
+ "Setting `strictSession: true` to require `mcp-session-id` header on streamable HTTP",
327
+ "Using `distributedMode: 'auto'` to auto-detect based on whether Redis is configured",
328
+ "Disabling `legacy` SSE while keeping modern SSE support"
329
+ ]
330
+ },
331
+ {
332
+ "name": "distributed-sessions-redis",
333
+ "description": "Configure transport with Redis persistence for multi-instance load-balanced deployments.",
334
+ "level": "intermediate",
335
+ "tags": ["config", "redis", "session", "transport", "distributed", "sessions"],
336
+ "features": [
337
+ "Using `distributedMode: true` for load-balanced multi-instance deployments",
338
+ "Redis `persistence` so sessions survive restarts and are shared across instances",
339
+ "Setting `defaultTtlMs` to prevent sessions from accumulating indefinitely",
340
+ "Redis-backed `eventStore` for SSE resumability across instances",
341
+ "Using the `'modern'` preset (drops legacy SSE but keeps streamable HTTP)"
342
+ ]
343
+ },
344
+ {
345
+ "name": "stateless-serverless",
346
+ "description": "Configure stateless transport for Vercel, Lambda, or Cloudflare deployments.",
347
+ "level": "basic",
348
+ "tags": ["config", "vercel", "lambda", "cloudflare", "session", "transport"],
349
+ "features": [
350
+ "Using `sessionMode: 'stateless'` to disable session management",
351
+ "Using the `'stateless-api'` preset: no SSE, no streaming, pure request/response",
352
+ "Each request is standalone with no server-side state between invocations",
353
+ "Required for serverless targets (Vercel, Lambda, Cloudflare Workers)"
354
+ ]
355
+ }
356
+ ]
49
357
  },
50
358
  {
51
359
  "name": "setup-redis",
52
- "description": "Cross-reference to the full Redis configuration guide in frontmcp-setup"
360
+ "description": "Cross-reference to the full Redis configuration guide in frontmcp-setup",
361
+ "examples": []
53
362
  },
54
363
  {
55
364
  "name": "setup-sqlite",
56
- "description": "Cross-reference to the full SQLite configuration guide in frontmcp-setup"
365
+ "description": "Cross-reference to the full SQLite configuration guide in frontmcp-setup",
366
+ "examples": []
57
367
  }
58
368
  ]
59
369
  },
@@ -69,39 +379,318 @@
69
379
  "references": [
70
380
  {
71
381
  "name": "build-for-browser",
72
- "description": "Build a FrontMCP server or client for browser environments and frontend frameworks"
382
+ "description": "Build a FrontMCP server or client for browser environments and frontend frameworks",
383
+ "examples": [
384
+ {
385
+ "name": "browser-build-with-custom-entry",
386
+ "description": "Build a browser bundle using a dedicated client entry file that avoids Node.js-only imports.",
387
+ "level": "intermediate",
388
+ "tags": ["deployment", "browser", "node", "custom", "entry"],
389
+ "features": [
390
+ "Creating a separate browser entry point (`src/client.ts`) that avoids importing Node.js-only modules like `fs` or `node:crypto`",
391
+ "Using the `-e` and `-o` flags to customize the entry file and output directory"
392
+ ]
393
+ },
394
+ {
395
+ "name": "browser-crypto-and-storage",
396
+ "description": "Use `@frontmcp/utils` crypto functions (WebCrypto API) and in-memory storage in browser environments.",
397
+ "level": "advanced",
398
+ "tags": ["deployment", "browser", "database", "remote", "node", "crypto"],
399
+ "features": [
400
+ "Using `@frontmcp/utils` for PKCE and hashing in the browser (backed by WebCrypto, not `node:crypto`)",
401
+ "Avoiding filesystem and native database storage in browser builds by relying on a remote server for persistence"
402
+ ]
403
+ },
404
+ {
405
+ "name": "react-provider-setup",
406
+ "description": "Connect a React application to a remote FrontMCP server using `@frontmcp/react`.",
407
+ "level": "basic",
408
+ "tags": ["deployment", "react", "browser", "remote", "provider", "setup"],
409
+ "features": [
410
+ "Wrapping your React app with `FrontMcpProvider` and pointing it at a remote server URL",
411
+ "Using the `useTools` hook to list and invoke MCP tools from a React component"
412
+ ]
413
+ }
414
+ ]
73
415
  },
74
416
  {
75
417
  "name": "build-for-cli",
76
- "description": "Build a FrontMCP server as a standalone CLI binary using Node.js SEA or bundled JS"
418
+ "description": "Build a FrontMCP server as a standalone CLI binary using Node.js SEA or bundled JS",
419
+ "examples": [
420
+ {
421
+ "name": "cli-binary-build",
422
+ "description": "Build a FrontMCP server as a standalone binary using Node.js Single Executable Applications (SEA).",
423
+ "level": "basic",
424
+ "tags": ["deployment", "cli", "local", "node", "binary"],
425
+ "features": [
426
+ "Building a FrontMCP server as a self-contained binary with `--target cli`",
427
+ "Using `socketPath` for local communication instead of a TCP port",
428
+ "The `--js` flag to produce a bundled JS file without the native binary wrapper"
429
+ ]
430
+ },
431
+ {
432
+ "name": "unix-socket-daemon",
433
+ "description": "Run a FrontMCP server as a local daemon accessible via Unix socket for IDE extensions and local MCP clients.",
434
+ "level": "intermediate",
435
+ "tags": ["deployment", "unix-socket", "cli", "transport", "local", "unix"],
436
+ "features": [
437
+ "Configuring a FrontMCP server for Unix socket transport instead of TCP",
438
+ "Running the server as a background daemon with process management (`frontmcp start/stop/status`)",
439
+ "Installing the daemon as a system service for automatic startup on reboot"
440
+ ]
441
+ }
442
+ ]
77
443
  },
78
444
  {
79
445
  "name": "build-for-sdk",
80
- "description": "Build a FrontMCP server as an embeddable library with create() and connect() APIs"
446
+ "description": "Build a FrontMCP server as an embeddable library with create() and connect() APIs",
447
+ "examples": [
448
+ {
449
+ "name": "connect-openai",
450
+ "description": "Use `connectOpenAI()` to get tools formatted for OpenAI's function-calling API.",
451
+ "level": "intermediate",
452
+ "tags": ["deployment", "sdk", "openai", "session", "connect"],
453
+ "features": [
454
+ "Setting `serve: false` to prevent the HTTP server from starting in library mode",
455
+ "Using `connectOpenAI()` to get tools in OpenAI function-calling format automatically",
456
+ "Passing session information via `ConnectOptions` for user context"
457
+ ]
458
+ },
459
+ {
460
+ "name": "create-flat-config",
461
+ "description": "Spin up an in-memory FrontMCP server from a flat config object using `create()`.",
462
+ "level": "basic",
463
+ "tags": ["deployment", "sdk", "cache", "flat", "config"],
464
+ "features": [
465
+ "Using `create()` to spin up a server without decorators or classes",
466
+ "Calling tools directly via `server.callTool()` with zero network overhead",
467
+ "Using `cacheKey` to reuse the same server instance across multiple calls"
468
+ ]
469
+ },
470
+ {
471
+ "name": "multi-platform-connect",
472
+ "description": "Connect the same FrontMCP server to multiple LLM platforms using platform-specific `connect*()` functions.",
473
+ "level": "advanced",
474
+ "tags": ["deployment", "sdk", "multi", "platform", "connect"],
475
+ "features": [
476
+ "Connecting a single FrontMCP server to four different LLM platforms with automatic schema translation",
477
+ "Each `connect*()` function returns tools in the platform's native format",
478
+ "All clients share the same `DirectClient` API (`listTools`, `callTool`, `close`)"
479
+ ]
480
+ }
481
+ ]
81
482
  },
82
483
  {
83
484
  "name": "deploy-to-cloudflare",
84
- "description": "Deploy a FrontMCP server to Cloudflare Workers with KV, D1, and Durable Objects"
485
+ "description": "Deploy a FrontMCP server to Cloudflare Workers with KV, D1, and Durable Objects",
486
+ "examples": [
487
+ {
488
+ "name": "basic-worker-deploy",
489
+ "description": "Deploy a FrontMCP server to Cloudflare Workers with a minimal configuration.",
490
+ "level": "basic",
491
+ "tags": ["deployment", "cloudflare", "transport", "local", "worker"],
492
+ "features": [
493
+ "A minimal FrontMCP server configured for Cloudflare Workers with SSE transport",
494
+ "The `wrangler.toml` configuration with `main` pointing to the build output",
495
+ "Using `wrangler dev` for local testing before deploying with `wrangler deploy`"
496
+ ]
497
+ },
498
+ {
499
+ "name": "worker-custom-domain",
500
+ "description": "Scaffold a FrontMCP project targeting Cloudflare, configure a custom domain, and verify the deployment.",
501
+ "level": "advanced",
502
+ "tags": ["deployment", "json-rpc", "cloudflare", "worker", "custom", "domain"],
503
+ "features": [
504
+ "Using `frontmcp create --target cloudflare` to scaffold a project with `wrangler.toml` and deploy scripts",
505
+ "Adding a custom domain with `wrangler domains add` for production-ready URLs",
506
+ "End-to-end verification of both the health check and MCP JSON-RPC endpoint"
507
+ ]
508
+ },
509
+ {
510
+ "name": "worker-with-kv-storage",
511
+ "description": "Deploy a FrontMCP server to Cloudflare Workers with KV namespace for session and state storage.",
512
+ "level": "intermediate",
513
+ "tags": ["deployment", "cloudflare", "cli", "session", "worker", "kv"],
514
+ "features": [
515
+ "Binding a KV namespace in `wrangler.toml` with `[[kv_namespaces]]`",
516
+ "Using `wrangler secret put` for sensitive values instead of `[vars]` (which are visible in plaintext)",
517
+ "Creating the KV namespace via CLI and copying the ID into the configuration"
518
+ ]
519
+ }
520
+ ]
85
521
  },
86
522
  {
87
523
  "name": "deploy-to-lambda",
88
- "description": "Deploy a FrontMCP server to AWS Lambda with API Gateway using SAM or CDK"
524
+ "description": "Deploy a FrontMCP server to AWS Lambda with API Gateway using SAM or CDK",
525
+ "examples": [
526
+ {
527
+ "name": "cdk-deployment",
528
+ "description": "Deploy a FrontMCP server to AWS Lambda using CDK with provisioned concurrency and secrets management.",
529
+ "level": "advanced",
530
+ "tags": ["deployment", "lambda", "performance", "cdk"],
531
+ "features": [
532
+ "Using AWS CDK instead of SAM for infrastructure-as-code deployment",
533
+ "Provisioned concurrency via a Lambda alias to eliminate cold starts on critical endpoints",
534
+ "Referencing secrets from SSM Parameter Store with `{{resolve:ssm:...}}` instead of hardcoding"
535
+ ]
536
+ },
537
+ {
538
+ "name": "lambda-handler-with-cors",
539
+ "description": "Create a custom Lambda handler with an explicit API Gateway definition for CORS support.",
540
+ "level": "intermediate",
541
+ "tags": ["deployment", "lambda", "handler", "cors"],
542
+ "features": [
543
+ "Creating a custom Lambda handler with `createLambdaHandler()` from `@frontmcp/adapters/lambda`",
544
+ "Defining an explicit HTTP API resource with CORS configuration for cross-origin requests",
545
+ "Linking the function events to the explicit API via `ApiId: !Ref`"
546
+ ]
547
+ },
548
+ {
549
+ "name": "sam-template-basic",
550
+ "description": "Deploy a FrontMCP server to AWS Lambda with API Gateway using a SAM template.",
551
+ "level": "basic",
552
+ "tags": ["deployment", "lambda", "performance", "sam", "template"],
553
+ "features": [
554
+ "A minimal SAM template with ARM64 architecture for faster cold starts and lower cost",
555
+ "The `/{proxy+}` catch-all route that forwards all requests to FrontMCP's internal router",
556
+ "CloudWatch log group with 14-day retention"
557
+ ]
558
+ }
559
+ ]
89
560
  },
90
561
  {
91
562
  "name": "deploy-to-node-dockerfile",
92
- "description": "Multi-stage Dockerfile for building and running a FrontMCP server in production"
563
+ "description": "Multi-stage Dockerfile for building and running a FrontMCP server in production",
564
+ "examples": [
565
+ {
566
+ "name": "basic-multistage-dockerfile",
567
+ "description": "A minimal multi-stage Dockerfile for building and running a FrontMCP server in production.",
568
+ "level": "basic",
569
+ "tags": ["deployment", "dockerfile", "docker", "node", "multistage"],
570
+ "features": [
571
+ "Two-stage build: the first stage installs all dependencies and builds; the second copies only production artifacts",
572
+ "Using `yarn install --production` in the production stage to exclude dev dependencies",
573
+ "A health check that verifies the server is responding"
574
+ ]
575
+ },
576
+ {
577
+ "name": "secure-nonroot-dockerfile",
578
+ "description": "A production Dockerfile with a non-root user, proper ownership, and security hardening.",
579
+ "level": "advanced",
580
+ "tags": ["deployment", "dockerfile", "docker", "security", "node", "secure"],
581
+ "features": [
582
+ "Creating a dedicated non-root user (`frontmcp`) and switching to it with `USER`",
583
+ "Setting file ownership before switching users so the process can read its own files",
584
+ "Combining the Dockerfile with runtime resource limits (`--memory`, `--cpus`)"
585
+ ]
586
+ }
587
+ ]
93
588
  },
94
589
  {
95
590
  "name": "deploy-to-node",
96
- "description": "Deploy a FrontMCP server as a standalone Node.js app with Docker and process managers"
591
+ "description": "Deploy a FrontMCP server as a standalone Node.js app with Docker and process managers",
592
+ "examples": [
593
+ {
594
+ "name": "docker-compose-with-redis",
595
+ "description": "Deploy a FrontMCP server with Redis using Docker Compose for production.",
596
+ "level": "basic",
597
+ "tags": ["deployment", "docker-compose", "redis", "dockerfile", "docker", "session"],
598
+ "features": [
599
+ "Multi-stage Dockerfile that keeps the production image small and secure",
600
+ "Docker Compose configuration with Redis for session storage",
601
+ "Health checks on both the FrontMCP server and Redis, with `depends_on` ensuring Redis starts first"
602
+ ]
603
+ },
604
+ {
605
+ "name": "pm2-with-nginx",
606
+ "description": "Deploy a FrontMCP server on bare metal using PM2 for process management and NGINX for TLS termination.",
607
+ "level": "intermediate",
608
+ "tags": ["deployment", "nx", "node", "pm2", "nginx"],
609
+ "features": [
610
+ "Using PM2 with `-i max` for multi-core clustering and automatic restarts",
611
+ "Configuring NGINX as a reverse proxy for TLS termination in front of the FrontMCP server",
612
+ "Setting environment variables via `.env` for production configuration"
613
+ ]
614
+ },
615
+ {
616
+ "name": "resource-limits",
617
+ "description": "Configure resource limits, health checks, and environment variables for a production FrontMCP deployment.",
618
+ "level": "advanced",
619
+ "tags": ["deployment", "docker-compose", "docker", "node", "resource", "limits"],
620
+ "features": [
621
+ "Setting CPU and memory limits/reservations in Docker Compose to prevent OOM kills",
622
+ "Using `NODE_OPTIONS=--max-old-space-size` to align the V8 heap limit with the container memory",
623
+ "Configuring health checks with appropriate `start_period` to allow the server time to initialize"
624
+ ]
625
+ }
626
+ ]
97
627
  },
98
628
  {
99
629
  "name": "deploy-to-vercel-config",
100
- "description": "Reference vercel.json configuration for deploying a FrontMCP server to Vercel"
630
+ "description": "Reference vercel.json configuration for deploying a FrontMCP server to Vercel",
631
+ "examples": [
632
+ {
633
+ "name": "minimal-vercel-config",
634
+ "description": "The minimum `vercel.json` needed to deploy a FrontMCP server to Vercel.",
635
+ "level": "basic",
636
+ "tags": ["deployment", "vercel", "serverless", "config", "minimal"],
637
+ "features": [
638
+ "The catch-all rewrite (`/(.*) -> /api/frontmcp`) routes all requests to the single FrontMCP handler",
639
+ "Setting `buildCommand` and `outputDirectory` so Vercel uses the FrontMCP build pipeline",
640
+ "Configuring function memory (512 MB) and max duration (30s) for the serverless function"
641
+ ]
642
+ },
643
+ {
644
+ "name": "vercel-config-with-security-headers",
645
+ "description": "A complete `vercel.json` with per-route security headers for health, MCP, and all other endpoints.",
646
+ "level": "intermediate",
647
+ "tags": ["deployment", "vercel", "cache", "security", "config", "headers"],
648
+ "features": [
649
+ "Per-route header configuration: `/health` and `/mcp` get `Cache-Control: no-store` to prevent caching",
650
+ "Global security headers (`X-Frame-Options`, `X-Content-Type-Options`, `Referrer-Policy`) applied to all routes",
651
+ "Setting `framework: null` to tell Vercel this is not a framework project"
652
+ ]
653
+ }
654
+ ]
101
655
  },
102
656
  {
103
657
  "name": "deploy-to-vercel",
104
- "description": "Deploy a FrontMCP server to Vercel serverless functions with Vercel KV storage"
658
+ "description": "Deploy a FrontMCP server to Vercel serverless functions with Vercel KV storage",
659
+ "examples": [
660
+ {
661
+ "name": "vercel-mcp-endpoint-test",
662
+ "description": "Verify a Vercel-deployed FrontMCP server by testing health, tool listing, and tool invocation.",
663
+ "level": "advanced",
664
+ "tags": ["deployment", "json-rpc", "vercel", "mcp", "endpoint"],
665
+ "features": [
666
+ "Testing the health endpoint and MCP JSON-RPC API of a deployed Vercel function",
667
+ "Using preview deployments to validate changes before promoting to production",
668
+ "Setting `maxDuration` according to your Vercel plan (Hobby: 10s, Pro: 60s, Enterprise: 900s)"
669
+ ]
670
+ },
671
+ {
672
+ "name": "vercel-with-kv",
673
+ "description": "Deploy a FrontMCP server to Vercel serverless functions with Vercel KV for session persistence.",
674
+ "level": "basic",
675
+ "tags": ["deployment", "vercel-kv", "vercel", "session", "performance", "serverless"],
676
+ "features": [
677
+ "Configuring `{ provider: 'vercel-kv' }` for automatic Vercel KV session storage",
678
+ "The `vercel.json` catch-all rewrite that routes all requests to the single FrontMCP handler",
679
+ "Setting function memory to 1024 MB for faster cold starts"
680
+ ]
681
+ },
682
+ {
683
+ "name": "vercel-with-skills-cache",
684
+ "description": "Deploy a FrontMCP server to Vercel with skills enabled and KV-backed skill caching.",
685
+ "level": "intermediate",
686
+ "tags": ["deployment", "vercel-kv", "vercel", "cache", "security", "skills"],
687
+ "features": [
688
+ "Enabling skills cache backed by Vercel KV with a 60-second TTL",
689
+ "Setting environment variables via `vercel env add` instead of hardcoding in source",
690
+ "Adding security headers (`X-Content-Type-Options`, `X-Frame-Options`) in `vercel.json`"
691
+ ]
692
+ }
693
+ ]
105
694
  }
106
695
  ]
107
696
  },
@@ -117,75 +706,739 @@
117
706
  "references": [
118
707
  {
119
708
  "name": "create-adapter",
120
- "description": "Build adapters that generate MCP tools and resources from external sources automatically"
709
+ "description": "Build adapters that generate MCP tools and resources from external sources automatically",
710
+ "examples": [
711
+ {
712
+ "name": "basic-api-adapter",
713
+ "description": "A minimal adapter that fetches operation definitions from an external API and generates MCP tools.",
714
+ "level": "basic",
715
+ "tags": ["development", "adapter", "api"],
716
+ "features": [
717
+ "Extending `DynamicAdapter<TOptions>` with a typed options interface",
718
+ "Declaring `__options_brand` for proper TypeScript inference on `init()`",
719
+ "Implementing `fetch()` to return `FrontMcpAdapterResponse` with tools, resources, and prompts",
720
+ "Registering the adapter via the static `init()` method in the `adapters` array"
721
+ ]
722
+ },
723
+ {
724
+ "name": "namespaced-adapter",
725
+ "description": "An adapter that namespaces generated tools to avoid collisions and includes proper error handling for startup failures.",
726
+ "level": "intermediate",
727
+ "tags": ["development", "adapter", "namespaced"],
728
+ "features": [
729
+ "Namespacing tools with `name: 'adapter-name:operation-name'` to prevent collisions",
730
+ "Throwing descriptive errors in `fetch()` so misconfigurations surface at startup",
731
+ "Registering multiple instances of the same adapter class with different configurations",
732
+ "Validating the external response shape before generating tool definitions"
733
+ ]
734
+ }
735
+ ]
121
736
  },
122
737
  {
123
738
  "name": "create-agent-llm-config",
124
- "description": "Reference for supported LLM provider configurations including Anthropic and OpenAI"
739
+ "description": "Reference for supported LLM provider configurations including Anthropic and OpenAI",
740
+ "examples": [
741
+ {
742
+ "name": "anthropic-config",
743
+ "description": "Configuring an agent with the Anthropic provider and common model options.",
744
+ "level": "basic",
745
+ "tags": ["development", "anthropic", "llm", "agent", "config"],
746
+ "features": [
747
+ "Setting `provider: 'anthropic'` with a supported model (`claude-sonnet-4-20250514` or `claude-opus-4-20250514`)",
748
+ "Using `{ env: 'ANTHROPIC_API_KEY' }` to read the API key from an environment variable",
749
+ "Setting `maxTokens` at the LLM config level and overriding per-call via `this.completion()` options",
750
+ "Passing `temperature` as a per-call option for controlling response creativity"
751
+ ]
752
+ },
753
+ {
754
+ "name": "openai-config",
755
+ "description": "Configuring an agent with the OpenAI provider and different model options.",
756
+ "level": "basic",
757
+ "tags": ["development", "openai", "llm", "agent", "config"],
758
+ "features": [
759
+ "Setting `provider: 'openai'` with `gpt-4o` for general purpose or `gpt-4o-mini` for cost-effective tasks",
760
+ "The API key pattern `{ env: 'OPENAI_API_KEY' }` works the same across all providers",
761
+ "Combining LLM config with inner tools -- the agent uses OpenAI to reason about tool invocations",
762
+ "Choosing the right model for the task: `gpt-4o` for complex workflows, `gpt-4o-mini` for fast classification"
763
+ ]
764
+ }
765
+ ]
125
766
  },
126
767
  {
127
768
  "name": "create-agent",
128
- "description": "Create autonomous AI agents that use LLM reasoning to plan and invoke inner tools"
769
+ "description": "Create autonomous AI agents that use LLM reasoning to plan and invoke inner tools",
770
+ "examples": [
771
+ {
772
+ "name": "basic-agent-with-tools",
773
+ "description": "An autonomous agent that uses inner tools to review GitHub pull requests.",
774
+ "level": "basic",
775
+ "tags": ["development", "anthropic", "agent", "tools"],
776
+ "features": [
777
+ "Creating an agent with `@Agent` decorator, `llm` config, and `inputSchema`",
778
+ "Defining inner tools in the `tools` array that the agent can invoke during its reasoning loop",
779
+ "Using `{ env: 'ANTHROPIC_API_KEY' }` for safe API key configuration",
780
+ "Inner tools are private to the agent and not exposed to external MCP clients",
781
+ "The default `execute()` runs the full agent loop without needing an override"
782
+ ]
783
+ },
784
+ {
785
+ "name": "custom-multi-pass-agent",
786
+ "description": "An agent that overrides `execute()` to perform multi-pass LLM reasoning with `this.completion()`.",
787
+ "level": "intermediate",
788
+ "tags": ["development", "security", "agent", "custom", "multi", "pass"],
789
+ "features": [
790
+ "Overriding `execute()` for custom multi-pass orchestration instead of the default agent loop",
791
+ "Using `this.completion()` to make individual LLM calls with full control over prompts",
792
+ "Using `this.mark(stage)` to track execution stages (security-pass, quality-pass, synthesis)",
793
+ "Defining `outputSchema` with Zod to validate and type-check the structured return value"
794
+ ]
795
+ },
796
+ {
797
+ "name": "nested-agents-with-swarm",
798
+ "description": "Composing specialized sub-agents and configuring swarm-based handoff between agents.",
799
+ "level": "advanced",
800
+ "tags": ["development", "agent", "nested", "agents", "swarm"],
801
+ "features": [
802
+ "Configuring `swarm` with `role: 'coordinator'` for the triage agent and `role: 'specialist'` for domain agents",
803
+ "Defining `handoff` rules with `agent` name and `condition` for declarative LLM-driven routing",
804
+ "Specialist agents can hand back to the triage agent when a request falls outside their scope",
805
+ "Each agent has its own `llm` config, `tools`, and `systemInstructions` for specialization"
806
+ ]
807
+ }
808
+ ]
129
809
  },
130
810
  {
131
811
  "name": "create-job",
132
- "description": "Create long-running background jobs with retry policies, progress tracking, and permissions"
812
+ "description": "Create long-running background jobs with retry policies, progress tracking, and permissions",
813
+ "examples": [
814
+ {
815
+ "name": "basic-report-job",
816
+ "description": "A minimal job that generates a report with progress tracking and structured output.",
817
+ "level": "basic",
818
+ "tags": ["development", "job", "report"],
819
+ "features": [
820
+ "Defining a job with `@Job` decorator including `inputSchema`, `outputSchema`, and `timeout`",
821
+ "Reporting progress at each stage using `this.progress(pct, total, message)`",
822
+ "Using `this.log()` for persistent, queryable log entries"
823
+ ]
824
+ },
825
+ {
826
+ "name": "job-with-permissions",
827
+ "description": "A data export job with declarative permission controls, plus a function-style job for simple tasks.",
828
+ "level": "advanced",
829
+ "tags": ["development", "redis", "job", "permissions"],
830
+ "features": [
831
+ "Declarative `permissions` with `actions`, `roles`, `scopes`, and a custom `predicate`",
832
+ "Using `tags` and `labels` for categorization and filtering",
833
+ "The `job()` function builder for simple jobs that need no class",
834
+ "Full server registration with `jobs.enabled: true` and a Redis store"
835
+ ]
836
+ },
837
+ {
838
+ "name": "job-with-retry",
839
+ "description": "A job that syncs data from an external API with automatic retry, exponential backoff, and batch progress tracking.",
840
+ "level": "intermediate",
841
+ "tags": ["development", "job", "retry"],
842
+ "features": [
843
+ "Configuring `retry` with `maxAttempts`, `backoffMs`, `backoffMultiplier`, and `maxBackoffMs`",
844
+ "Using `this.attempt` to log retry context (1-based attempt counter)",
845
+ "Using `this.fail()` to abort execution and trigger the retry flow",
846
+ "Combining batch processing with `this.progress()` for granular tracking"
847
+ ]
848
+ }
849
+ ]
133
850
  },
134
851
  {
135
852
  "name": "create-plugin-hooks",
136
- "description": "Intercept and extend FrontMCP flows using before, after, around, and stage hook decorators"
853
+ "description": "Intercept and extend FrontMCP flows using before, after, around, and stage hook decorators",
854
+ "examples": [
855
+ {
856
+ "name": "basic-logging-plugin",
857
+ "description": "Demonstrates a plugin that logs tool execution using `@Will` and `@Did` hook decorators from the pre-built `ToolHook` export.",
858
+ "level": "basic",
859
+ "tags": ["development", "plugin-hooks", "plugin", "hooks", "logging"],
860
+ "features": [
861
+ "Using `ToolHook` pre-built export instead of calling `FlowHooksOf('tools:call-tool')` directly",
862
+ "Destructuring `Will` and `Did` decorators from the hook object",
863
+ "Setting `priority: 100` on `@Will` to ensure the logging hook runs early",
864
+ "Registering a plugin in the `plugins` array of `@App`"
865
+ ]
866
+ },
867
+ {
868
+ "name": "caching-with-around",
869
+ "description": "Demonstrates wrapping tool execution with an `@Around` hook to implement result caching with TTL-based expiry.",
870
+ "level": "intermediate",
871
+ "tags": ["development", "cache", "plugin-hooks", "plugin", "hooks", "caching"],
872
+ "features": [
873
+ "Using `@Around` to wrap the `execute` stage with before-and-after logic",
874
+ "Calling `await next()` to invoke the original stage and capture its result",
875
+ "Short-circuiting execution by returning cached data without calling `next()`",
876
+ "Building a cache key from `ctx.toolName` and `ctx.input`"
877
+ ]
878
+ },
879
+ {
880
+ "name": "tool-level-hooks-and-stage-replacement",
881
+ "description": "Demonstrates two advanced patterns: adding `@Will`/`@Did` hooks directly on a `@Tool` class (scoped to that tool only), and using `@Stage` in a plugin to replace a flow stage entirely with a filtered mock.",
882
+ "level": "advanced",
883
+ "tags": ["development", "plugin-hooks", "plugin", "hooks", "tool", "level"],
884
+ "features": [
885
+ "Placing `@Will('execute')` and `@Did('execute')` directly on a `@Tool` class so hooks fire only for that tool",
886
+ "Using `this.fail()` in a `@Will` hook to abort execution when preconditions are not met",
887
+ "Using `this.mark()` to record lifecycle checkpoints during hook execution",
888
+ "Using `@Stage` with a `filter` predicate to replace the `execute` stage only for a specific tool name",
889
+ "The difference between tool-level hooks (scoped to one tool) and plugin-level hooks (fire for all tools)"
890
+ ]
891
+ }
892
+ ]
137
893
  },
138
894
  {
139
895
  "name": "create-plugin",
140
- "description": "Build plugins with providers, context extensions, lifecycle hooks, and contributed tools"
896
+ "description": "Build plugins with providers, context extensions, lifecycle hooks, and contributed tools",
897
+ "examples": [
898
+ {
899
+ "name": "basic-plugin-with-provider",
900
+ "description": "A minimal plugin that contributes an injectable service via the `providers` and `exports` arrays.",
901
+ "level": "basic",
902
+ "tags": ["development", "plugin", "provider"],
903
+ "features": [
904
+ "Creating a plugin with `@Plugin` decorator that bundles a `@Provider` class",
905
+ "Listing providers in both `providers` (for DI registration) and `exports` (for external access)",
906
+ "Registering a plugin in the `plugins` array of `@FrontMcp`"
907
+ ]
908
+ },
909
+ {
910
+ "name": "configurable-dynamic-plugin",
911
+ "description": "A plugin that accepts runtime configuration via `DynamicPlugin` and extends decorator metadata with custom fields.",
912
+ "level": "advanced",
913
+ "tags": ["development", "plugin", "configurable", "dynamic"],
914
+ "features": [
915
+ "Extending `DynamicPlugin<TOptions, TInput>` for runtime-configurable plugins",
916
+ "Implementing `static dynamicProviders()` to create providers from the input options",
917
+ "Using `TInput` with optional fields and applying defaults in the constructor",
918
+ "Extending decorator metadata via `declare global { interface ExtendFrontMcpToolMetadata }`",
919
+ "Augmenting both `ExecutionContextBase` and `PromptContext` for full context extension coverage",
920
+ "Registering the plugin with `MyPlugin.init({ ... })` in the `plugins` array"
921
+ ]
922
+ },
923
+ {
924
+ "name": "plugin-with-context-extension",
925
+ "description": "A plugin that adds a `this.auditLog` property to all execution contexts using context extensions and module augmentation.",
926
+ "level": "intermediate",
927
+ "tags": ["development", "sdk", "plugin", "context", "extension"],
928
+ "features": [
929
+ "Defining a typed DI token with `Token<T> = Symbol('...')` in a dedicated symbols file",
930
+ "Module augmentation via `declare module '@frontmcp/sdk'` to add `readonly auditLog` to `ExecutionContextBase`",
931
+ "Registering `contextExtensions` in `@Plugin` metadata with `property`, `token`, and `errorMessage`",
932
+ "Side-effect import of the context extension file in both the plugin and the barrel export",
933
+ "Accessing the extended property (`this.auditLog`) in tool execution contexts"
934
+ ]
935
+ }
936
+ ]
141
937
  },
142
938
  {
143
939
  "name": "create-prompt",
144
- "description": "Define reusable AI interaction patterns that produce structured message sequences"
940
+ "description": "Define reusable AI interaction patterns that produce structured message sequences",
941
+ "examples": [
942
+ {
943
+ "name": "basic-prompt",
944
+ "description": "A simple prompt that generates a structured code review message from user-provided arguments.",
945
+ "level": "basic",
946
+ "tags": ["development", "prompt", "create-prompt"],
947
+ "features": [
948
+ "Extending `PromptContext` and implementing `execute(args)` returning `GetPromptResult`",
949
+ "Declaring prompt `arguments` with `required: true` for mandatory parameters",
950
+ "Framework validates required arguments before `execute()` runs",
951
+ "Registering the prompt in the `prompts` array of `@App`"
952
+ ]
953
+ },
954
+ {
955
+ "name": "dynamic-rag-prompt",
956
+ "description": "A prompt that queries a knowledge base via DI to build context-aware messages at runtime.",
957
+ "level": "advanced",
958
+ "tags": ["development", "prompt", "dynamic", "rag"],
959
+ "features": [
960
+ "Performing async operations (knowledge base search) inside `execute()` to generate context-aware prompts",
961
+ "Resolving a DI provider via `this.get(KNOWLEDGE_BASE)` for service access",
962
+ "Using `this.mark(stage)` for execution stage tracking in complex prompt generation",
963
+ "Building dynamic message content from external data sources at runtime"
964
+ ]
965
+ },
966
+ {
967
+ "name": "multi-turn-debug-session",
968
+ "description": "A prompt that uses alternating user/assistant messages to guide a structured debugging conversation.",
969
+ "level": "intermediate",
970
+ "tags": ["development", "session", "prompt", "multi", "turn", "debug"],
971
+ "features": [
972
+ "Using `assistant` role messages to prime expected response patterns and guide LLM behavior",
973
+ "Alternating `user` and `assistant` roles to create a structured multi-turn conversation",
974
+ "Optional arguments that conditionally add content to the prompt",
975
+ "The assistant message establishes a systematic debugging approach the LLM will follow"
976
+ ]
977
+ }
978
+ ]
145
979
  },
146
980
  {
147
981
  "name": "create-provider",
148
- "description": "Create singleton DI providers for database pools, API clients, and shared services"
982
+ "description": "Create singleton DI providers for database pools, API clients, and shared services",
983
+ "examples": [
984
+ {
985
+ "name": "basic-database-provider",
986
+ "description": "A provider that manages a database connection pool with `onInit()` and `onDestroy()` lifecycle hooks.",
987
+ "level": "basic",
988
+ "tags": ["development", "database", "provider"],
989
+ "features": [
990
+ "Defining a typed token with `Token<T>` using a `Symbol` for DI identification",
991
+ "Using `@Provider` decorator with `onInit()` for async startup and `onDestroy()` for cleanup",
992
+ "Consuming the provider in a tool via `this.get(DB_TOKEN)` with full type safety",
993
+ "Registering the provider in the `providers` array so tools can resolve it"
994
+ ]
995
+ },
996
+ {
997
+ "name": "config-and-api-providers",
998
+ "description": "A configuration provider with readonly environment settings and an HTTP API client provider.",
999
+ "level": "intermediate",
1000
+ "tags": ["development", "provider", "config", "api", "providers"],
1001
+ "features": [
1002
+ "A configuration provider using `readonly` properties from environment variables (no lifecycle needed)",
1003
+ "An API client provider using `onInit()` for async setup of credentials",
1004
+ "Registering providers at `@FrontMcp` level for server-wide sharing across all apps",
1005
+ "Separating token definitions from provider implementations for clean dependency boundaries"
1006
+ ]
1007
+ }
1008
+ ]
149
1009
  },
150
1010
  {
151
1011
  "name": "create-resource",
152
- "description": "Expose data to AI clients via URI-based static resources and parameterized templates"
1012
+ "description": "Expose data to AI clients via URI-based static resources and parameterized templates",
1013
+ "examples": [
1014
+ {
1015
+ "name": "basic-static-resource",
1016
+ "description": "A static resource that exposes application configuration at a fixed URI.",
1017
+ "level": "basic",
1018
+ "tags": ["development", "resource", "static"],
1019
+ "features": [
1020
+ "Using `@Resource` with a fixed URI that follows RFC 3986 (has a valid scheme)",
1021
+ "Returning a `ReadResourceResult` with `contents` array containing `uri`, `mimeType`, and `text`",
1022
+ "Setting `mimeType` to indicate the content type of the resource",
1023
+ "Registering the resource in the `resources` array of `@App`"
1024
+ ]
1025
+ },
1026
+ {
1027
+ "name": "binary-and-multi-content",
1028
+ "description": "A resource serving binary blob data and a resource returning multiple content items.",
1029
+ "level": "advanced",
1030
+ "tags": ["development", "cli", "resource", "binary", "multi", "content"],
1031
+ "features": [
1032
+ "Returning binary data as base64-encoded `blob` (not `text`) for images and other binary assets",
1033
+ "Using `@frontmcp/utils` for file system operations (`readFileBuffer`) instead of `fs` directly",
1034
+ "Returning multiple content items from a single resource using fragment URIs (`#metrics`, `#charts`)",
1035
+ "Each content item has its own `uri`, `mimeType`, and `text` or `blob` field"
1036
+ ]
1037
+ },
1038
+ {
1039
+ "name": "parameterized-template",
1040
+ "description": "A resource template with typed URI parameters and argument autocompletion.",
1041
+ "level": "intermediate",
1042
+ "tags": ["development", "resource", "parameterized", "template"],
1043
+ "features": [
1044
+ "Using `@ResourceTemplate` with `uriTemplate` containing `{param}` placeholders",
1045
+ "Typing the `ResourceContext` generic parameter for compile-time parameter checking",
1046
+ "Implementing a convention-based completer (`userIdCompleter`) for argument autocompletion",
1047
+ "Accessing DI providers via `this.get()` in both `execute()` and completer methods"
1048
+ ]
1049
+ }
1050
+ ]
153
1051
  },
154
1052
  {
155
1053
  "name": "create-skill-with-tools",
156
- "description": "Create skills that combine structured instructions with MCP tool references for orchestration"
1054
+ "description": "Create skills that combine structured instructions with MCP tool references for orchestration",
1055
+ "examples": [
1056
+ {
1057
+ "name": "basic-tool-orchestration",
1058
+ "description": "A skill that guides an AI client through a deploy workflow using referenced MCP tools.",
1059
+ "level": "basic",
1060
+ "tags": ["development", "skill", "tools", "tool", "orchestration"],
1061
+ "features": [
1062
+ "Referencing tools by class (`BuildProjectTool`) and by string name (`'health_check'`)",
1063
+ "Mixing class references and string names in a single `tools` array",
1064
+ "Writing step-by-step instructions that guide the AI to use specific tools",
1065
+ "The `skill()` function builder for tool-referencing skills that need no class"
1066
+ ]
1067
+ },
1068
+ {
1069
+ "name": "directory-skill-with-tools",
1070
+ "description": "A directory-based skill loaded with `skillDir()`, plus a class-based skill using Agent Skills spec metadata fields.",
1071
+ "level": "advanced",
1072
+ "tags": ["development", "skill", "tools", "directory"],
1073
+ "features": [
1074
+ "Loading a directory-based skill with `skillDir()` including SKILL.md frontmatter with tool entries",
1075
+ "Mixing all three tool reference styles in one `tools` array: class, string, and object",
1076
+ "Agent Skills spec fields: `priority`, `license`, `compatibility`, `allowedTools`, `specMetadata`",
1077
+ "Bundled resource directories: `scripts`, `references`, `assets`",
1078
+ "File-based instructions with `{ file: './docs/codebase-audit.md' }`"
1079
+ ]
1080
+ },
1081
+ {
1082
+ "name": "incident-response-skill",
1083
+ "description": "A skill that uses object-style tool references with purpose descriptions and required flags, plus strict validation.",
1084
+ "level": "intermediate",
1085
+ "tags": ["development", "skill", "tools", "incident", "response"],
1086
+ "features": [
1087
+ "Object-style tool references with `name`, `purpose`, and `required` fields",
1088
+ "Using `toolValidation: 'strict'` to fail at startup if any referenced tool is missing",
1089
+ "Combining tool references with `parameters` and `examples` for full skill metadata",
1090
+ "Setting `visibility: 'mcp'` to restrict discovery to MCP protocol only",
1091
+ "Registering both skills and their referenced tools in the same `@App`"
1092
+ ]
1093
+ }
1094
+ ]
157
1095
  },
158
1096
  {
159
1097
  "name": "create-skill",
160
- "description": "Create instruction-only skills that package knowledge and workflow guides for AI clients"
1098
+ "description": "Create instruction-only skills that package knowledge and workflow guides for AI clients",
1099
+ "examples": [
1100
+ {
1101
+ "name": "basic-inline-skill",
1102
+ "description": "A minimal instruction-only skill with inline content and the function builder alternative.",
1103
+ "level": "basic",
1104
+ "tags": ["development", "skill", "inline"],
1105
+ "features": [
1106
+ "Creating a class-based instruction-only skill with `@Skill` and `SkillContext`",
1107
+ "Using inline string instructions for short, self-contained guides",
1108
+ "The `skill()` function builder as a lighter alternative when no `build()` override is needed",
1109
+ "Setting `visibility` to control where the skill is discoverable"
1110
+ ]
1111
+ },
1112
+ {
1113
+ "name": "directory-based-skill",
1114
+ "description": "A skill loaded from a directory structure with SKILL.md frontmatter, plus file-based and URL-based instruction sources.",
1115
+ "level": "advanced",
1116
+ "tags": ["development", "remote", "skill", "directory", "based"],
1117
+ "features": [
1118
+ "Loading a skill from a directory with `skillDir()` including SKILL.md frontmatter and bundled resources",
1119
+ "The SKILL.md YAML frontmatter format for metadata (name, description, tags, parameters, examples)",
1120
+ "File-based instructions with `{ file: './path.md' }` resolved relative to the skill file",
1121
+ "URL-based instructions with `{ url: '...' }` fetched at build time",
1122
+ "ESM loading with `Skill.esm()` and remote loading with `Skill.remote()`"
1123
+ ]
1124
+ },
1125
+ {
1126
+ "name": "parameterized-skill",
1127
+ "description": "A skill with customizable parameters, usage examples for AI guidance, and controlled visibility.",
1128
+ "level": "intermediate",
1129
+ "tags": ["development", "skill", "parameterized"],
1130
+ "features": [
1131
+ "Defining `parameters` to let callers customize skill behavior at invocation time",
1132
+ "Providing `examples` with `scenario` and `expectedOutcome` to guide AI application",
1133
+ "Using `tags` for skill categorization and filtering",
1134
+ "Controlling discovery with `visibility: 'mcp'` (MCP-only) vs `visibility: 'both'` (default)",
1135
+ "Using `hideFromDiscovery: true` to register a skill that is invocable by name but not listed"
1136
+ ]
1137
+ }
1138
+ ]
161
1139
  },
162
1140
  {
163
1141
  "name": "create-tool-annotations",
164
- "description": "Reference for MCP tool annotation hints like readOnly, destructive, and idempotent"
1142
+ "description": "Reference for MCP tool annotation hints like readOnly, destructive, and idempotent",
1143
+ "examples": [
1144
+ {
1145
+ "name": "destructive-delete-tool",
1146
+ "description": "Demonstrates annotating a tool that deletes data, enabling MCP clients to warn users before execution.",
1147
+ "level": "intermediate",
1148
+ "tags": ["development", "elicitation", "tool", "annotations", "destructive", "delete"],
1149
+ "features": [
1150
+ "Setting `destructiveHint: true` on the delete tool so MCP clients can trigger confirmation warnings",
1151
+ "Setting `idempotentHint: true` on the delete tool because deleting the same user twice produces the same outcome",
1152
+ "Setting `openWorldHint: true` on the email tool because it interacts with an external SMTP service",
1153
+ "Setting `idempotentHint: false` on the email tool because each call sends a new email",
1154
+ "How different annotation combinations express different behavioral contracts"
1155
+ ]
1156
+ },
1157
+ {
1158
+ "name": "readonly-query-tool",
1159
+ "description": "Demonstrates annotating a tool that only reads data, signaling to MCP clients that it has no side effects and is safe to retry.",
1160
+ "level": "basic",
1161
+ "tags": ["development", "database", "local", "tool", "annotations", "readonly"],
1162
+ "features": [
1163
+ "Setting `readOnlyHint: true` to indicate the tool performs no mutations",
1164
+ "Setting `destructiveHint: false` to tell clients no data will be deleted or overwritten",
1165
+ "Setting `idempotentHint: true` because repeated calls with the same input produce the same result",
1166
+ "Setting `openWorldHint: false` because the tool only accesses local database data",
1167
+ "Using `title` to provide a human-friendly display name for MCP client UIs"
1168
+ ]
1169
+ }
1170
+ ]
165
1171
  },
166
1172
  {
167
1173
  "name": "create-tool-output-schema-types",
168
- "description": "Reference for all supported outputSchema types including Zod shapes and JSON Schema"
1174
+ "description": "Reference for all supported outputSchema types including Zod shapes and JSON Schema",
1175
+ "examples": [
1176
+ {
1177
+ "name": "primitive-and-media-outputs",
1178
+ "description": "Demonstrates using primitive string literals and media types as `outputSchema` for tools that return plain text, images, or multi-content arrays.",
1179
+ "level": "intermediate",
1180
+ "tags": ["development", "output-schema", "tool", "output", "schema", "types"],
1181
+ "features": [
1182
+ "Using `'string'` literal to return plain text output",
1183
+ "Using `'image'` literal to return base64 image data",
1184
+ "Using `['string', 'image']` array to return multi-content (text plus image) in a single response",
1185
+ "Other available primitives: `'number'`, `'boolean'`, `'date'`",
1186
+ "Other available media types: `'audio'`, `'resource'`, `'resource_link'`"
1187
+ ]
1188
+ },
1189
+ {
1190
+ "name": "zod-raw-shape-output",
1191
+ "description": "Demonstrates the recommended approach of using a Zod raw shape as `outputSchema` for structured, validated JSON output.",
1192
+ "level": "basic",
1193
+ "tags": ["development", "codecall", "output-schema", "tool", "output", "schema"],
1194
+ "features": [
1195
+ "Using a Zod raw shape (plain object with Zod types) as `outputSchema` for structured output",
1196
+ "The output is validated at runtime against the schema before being returned to the client",
1197
+ "This is the recommended pattern for CodeCall compatibility and data leak prevention",
1198
+ "The `execute()` return type is automatically inferred from the output schema"
1199
+ ]
1200
+ },
1201
+ {
1202
+ "name": "zod-schema-advanced-output",
1203
+ "description": "Demonstrates using full Zod schema objects (not raw shapes) as `outputSchema`, including `z.object()`, `z.array()`, `z.union()`, and `z.discriminatedUnion()`.",
1204
+ "level": "advanced",
1205
+ "tags": ["development", "output-schema", "tool", "output", "schema", "types"],
1206
+ "features": [
1207
+ "Using `z.object()` for structured output with nested arrays and nullable fields",
1208
+ "Using `z.discriminatedUnion()` to return different output shapes based on a discriminant field",
1209
+ "Full Zod schemas provide the same validation as raw shapes but support more complex types",
1210
+ "Output is validated at runtime -- mismatched return values trigger validation errors"
1211
+ ]
1212
+ }
1213
+ ]
169
1214
  },
170
1215
  {
171
1216
  "name": "create-tool",
172
- "description": "Build MCP tools with Zod input/output validation and dependency injection"
1217
+ "description": "Build MCP tools with Zod input/output validation and dependency injection",
1218
+ "examples": [
1219
+ {
1220
+ "name": "basic-class-tool",
1221
+ "description": "A minimal tool using the class-based pattern with Zod input validation and output schema.",
1222
+ "level": "basic",
1223
+ "tags": ["development", "tool", "class"],
1224
+ "features": [
1225
+ "Extending `ToolContext` and implementing the `execute()` method",
1226
+ "Using a Zod raw shape for `inputSchema` (not wrapped in `z.object()`)",
1227
+ "Defining `outputSchema` to validate and restrict output fields",
1228
+ "Registering the tool in an `@App` via the `tools` array"
1229
+ ]
1230
+ },
1231
+ {
1232
+ "name": "tool-with-di-and-errors",
1233
+ "description": "A tool that resolves a database service via DI and uses `this.fail()` for business-logic errors.",
1234
+ "level": "intermediate",
1235
+ "tags": ["development", "database", "tool", "di", "errors"],
1236
+ "features": [
1237
+ "Defining a typed DI token with `Token<T>` and resolving it via `this.get()`",
1238
+ "Using `this.fail()` with `ResourceNotFoundError` for MCP-compliant error responses",
1239
+ "Letting infrastructure errors (database failures) propagate naturally to the framework",
1240
+ "Registering both the provider and tool in the same `@App`"
1241
+ ]
1242
+ },
1243
+ {
1244
+ "name": "tool-with-rate-limiting-and-progress",
1245
+ "description": "A batch processing tool that uses rate limiting, concurrency control, progress notifications, and annotations.",
1246
+ "level": "advanced",
1247
+ "tags": ["development", "throttle", "tool", "rate", "limiting", "progress"],
1248
+ "features": [
1249
+ "Configuring `rateLimit`, `concurrency`, and `timeout` for throttling protection",
1250
+ "Sending progress updates to the client with `this.respondProgress(value, total)`",
1251
+ "Using `this.mark(stage)` for execution stage tracking and debugging",
1252
+ "Sending log-level notifications with `this.notify(message, level)`",
1253
+ "Setting tool `annotations` to communicate behavioral hints to clients"
1254
+ ]
1255
+ }
1256
+ ]
173
1257
  },
174
1258
  {
175
1259
  "name": "create-workflow",
176
- "description": "Connect multiple jobs into managed DAG pipelines with dependencies, conditions, and triggers"
1260
+ "description": "Connect multiple jobs into managed DAG pipelines with dependencies, conditions, and triggers",
1261
+ "examples": [
1262
+ {
1263
+ "name": "basic-deploy-pipeline",
1264
+ "description": "A linear workflow that builds, tests, and deploys a service with step dependencies and dynamic input.",
1265
+ "level": "basic",
1266
+ "tags": ["development", "workflow", "pipeline"],
1267
+ "features": [
1268
+ "Defining a workflow with `@Workflow` decorator and sequential `steps`",
1269
+ "Using `dependsOn` to establish step execution order",
1270
+ "Passing dynamic input from a previous step using the callback form `(steps) => ({...})`",
1271
+ "Registering both jobs and workflows in `@App` with jobs enabled"
1272
+ ]
1273
+ },
1274
+ {
1275
+ "name": "parallel-validation-pipeline",
1276
+ "description": "A workflow that validates multiple datasets in parallel, then conditionally merges results or notifies on failure.",
1277
+ "level": "intermediate",
1278
+ "tags": ["development", "workflow", "parallel", "validation", "pipeline"],
1279
+ "features": [
1280
+ "Running steps in parallel by omitting `dependsOn` (no mutual dependencies)",
1281
+ "Using `maxConcurrency` to limit how many steps run at the same time",
1282
+ "Conditional steps with `condition` that check `.state` of previous steps",
1283
+ "Fan-out/fan-in pattern: parallel validation steps converge into a merge step",
1284
+ "Branching: separate success and failure notification paths"
1285
+ ]
1286
+ },
1287
+ {
1288
+ "name": "webhook-triggered-workflow",
1289
+ "description": "A CI/CD workflow triggered by a webhook, featuring `continueOnError`, per-step conditions, and the `workflow()` function builder.",
1290
+ "level": "advanced",
1291
+ "tags": ["development", "workflow", "webhook", "triggered"],
1292
+ "features": [
1293
+ "Webhook trigger with `trigger: 'webhook'` and `webhook: { path, secret, methods }`",
1294
+ "Using `continueOnError: true` to allow the workflow to proceed past non-critical step failures",
1295
+ "Conditional branching: separate success and failure notification steps based on prior step state",
1296
+ "Workflow-level `permissions` for access control",
1297
+ "The `workflow()` function builder as a lighter alternative to the class pattern"
1298
+ ]
1299
+ }
1300
+ ]
177
1301
  },
178
1302
  {
179
1303
  "name": "decorators-guide",
180
- "description": "Complete reference for the hierarchical decorator system from @FrontMcp to @Tool"
1304
+ "description": "Complete reference for the hierarchical decorator system from @FrontMcp to @Tool",
1305
+ "examples": [
1306
+ {
1307
+ "name": "agent-skill-job-workflow",
1308
+ "description": "Demonstrates the advanced decorator types: `@Agent` for autonomous AI agents, `@Skill` for knowledge packages, `@Job` for background tasks, and `@Workflow` for multi-step orchestration.",
1309
+ "level": "advanced",
1310
+ "tags": ["development", "decorators", "agent", "skill", "job", "workflow"],
1311
+ "features": [
1312
+ "`@Agent` with LLM config, input schema, and delegated tools for autonomous task execution",
1313
+ "`@Skill` with inline instructions and tool references for reusable knowledge packages",
1314
+ "`@Job` with retry policy, timeout, and typed input/output for background processing",
1315
+ "`@Workflow` with ordered steps, `dependsOn` for sequencing, and `condition` for conditional execution",
1316
+ "Enabling jobs and skills at the server level via `jobs: { enabled: true }` and `skillsConfig: { enabled: true }`",
1317
+ "All advanced decorators registered in a single `@App` module"
1318
+ ]
1319
+ },
1320
+ {
1321
+ "name": "basic-server-with-app-and-tools",
1322
+ "description": "Demonstrates the minimal decorator hierarchy to create a working FrontMCP server with one app containing a tool and a resource.",
1323
+ "level": "basic",
1324
+ "tags": ["development", "decorators", "app", "tools"],
1325
+ "features": [
1326
+ "The `@FrontMcp` -> `@App` -> `@Tool`/`@Resource`/`@Prompt` nesting hierarchy",
1327
+ "Tool classes extend `ToolContext` and implement `execute()`",
1328
+ "Resource classes extend `ResourceContext` and implement `read()`",
1329
+ "Prompt classes extend `PromptContext` and implement `execute()`",
1330
+ "Apps group related tools, resources, and prompts into logical modules"
1331
+ ]
1332
+ },
1333
+ {
1334
+ "name": "multi-app-with-plugins-and-providers",
1335
+ "description": "Demonstrates a server with multiple `@App` modules, a `@Provider` for dependency injection, and a `@Plugin` for cross-cutting concerns.",
1336
+ "level": "intermediate",
1337
+ "tags": ["development", "database", "multi-app", "decorators", "multi", "app"],
1338
+ "features": [
1339
+ "Organizing a server into multiple `@App` modules (`analytics` and `admin`)",
1340
+ "Using `@Provider` with `useFactory` to register a database client for dependency injection",
1341
+ "Accessing injected dependencies via `this.get(DatabaseToken)` in tools and resources",
1342
+ "Using `@ResourceTemplate` with URI parameters (`{dashboardId}`) for dynamic resources",
1343
+ "Registering a `@Plugin` at the server level so it applies across all apps",
1344
+ "Global plugins go in `@FrontMcp({ plugins })`, app-scoped providers go in `@App({ providers })`"
1345
+ ]
1346
+ }
1347
+ ]
181
1348
  },
182
1349
  {
183
1350
  "name": "official-adapters",
184
- "description": "Convert OpenAPI specs and external definitions into MCP tools automatically"
1351
+ "description": "Convert OpenAPI specs and external definitions into MCP tools automatically",
1352
+ "examples": [
1353
+ {
1354
+ "name": "authenticated-adapter-with-polling",
1355
+ "description": "Demonstrates configuring authentication (API key and bearer token) and automatic spec polling for OpenAPI adapters.",
1356
+ "level": "intermediate",
1357
+ "tags": ["development", "auth", "openapi", "security", "adapters", "authenticated"],
1358
+ "features": [
1359
+ "Three authentication methods: `staticAuth.apiKey`, `staticAuth.jwt`, and dynamic `securityResolver`",
1360
+ "Using `securityResolver` for per-request dynamic authentication based on the calling context",
1361
+ "Enabling `polling` to automatically refresh tool definitions when the upstream spec changes",
1362
+ "Loading secrets from environment variables instead of hardcoding them",
1363
+ "Each adapter has a unique `name` to avoid tool naming collisions"
1364
+ ]
1365
+ },
1366
+ {
1367
+ "name": "basic-openapi-adapter",
1368
+ "description": "Demonstrates converting an OpenAPI specification into MCP tools automatically using `OpenapiAdapter` with minimal configuration.",
1369
+ "level": "basic",
1370
+ "tags": ["development", "openapi", "adapters", "adapter"],
1371
+ "features": [
1372
+ "Using `OpenapiAdapter.init()` with just `name` and `url` to auto-generate MCP tools",
1373
+ "Each OpenAPI operation becomes a tool named `<adapter-name>:<operationId>`",
1374
+ "The adapter is registered in the `adapters` array of `@App`, not in `plugins`",
1375
+ "The `name` field serves as the namespace prefix to prevent tool name collisions"
1376
+ ]
1377
+ },
1378
+ {
1379
+ "name": "multi-api-hub-with-inline-spec",
1380
+ "description": "Demonstrates registering multiple OpenAPI adapters from different APIs in a single app, including one with an inline spec definition instead of a remote URL.",
1381
+ "level": "advanced",
1382
+ "tags": ["development", "openapi", "remote", "adapters", "multi", "api"],
1383
+ "features": [
1384
+ "Registering multiple adapters in a single `@App` with unique names for tool namespacing",
1385
+ "Using `additionalHeaders` for header-based authentication (GitHub token)",
1386
+ "Providing an inline `spec` object instead of a remote `url` for APIs without hosted specs",
1387
+ "Each adapter's tools are namespaced: `github:*`, `jira:*`, `internal:*`",
1388
+ "Only one of `url` or `spec` should be provided per adapter; `spec` takes precedence"
1389
+ ]
1390
+ }
1391
+ ]
185
1392
  },
186
1393
  {
187
1394
  "name": "official-plugins",
188
- "description": "Guide to the 6 official plugins for discovery, memory, auth, caching, flags, and monitoring"
1395
+ "description": "Guide to the 6 official plugins for discovery, memory, auth, caching, flags, and monitoring",
1396
+ "examples": [
1397
+ {
1398
+ "name": "cache-and-feature-flags",
1399
+ "description": "Demonstrates combining the Cache plugin for tool result caching with the Feature Flags plugin for gating tools behind flags.",
1400
+ "level": "intermediate",
1401
+ "tags": ["development", "feature-flags", "cache", "plugins", "feature", "flags"],
1402
+ "features": [
1403
+ "Combining `CachePlugin` and `FeatureFlagPlugin` in the same server",
1404
+ "Using `toolPatterns` glob patterns to cache groups of tools without per-tool configuration",
1405
+ "Per-tool `cache` metadata with custom `ttl` (seconds) and `slideWindow` for TTL refresh on hits",
1406
+ "Using `cache: true` for simple default-TTL caching",
1407
+ "Gating a tool with `featureFlag: 'beta-search'` -- the tool is hidden from `list_tools` when the flag is off",
1408
+ "Accessing `this.featureFlags.isEnabled()` inside a tool for runtime flag checks"
1409
+ ]
1410
+ },
1411
+ {
1412
+ "name": "production-multi-plugin-setup",
1413
+ "description": "Demonstrates a production-ready server configuration combining CodeCall, Remember, Approval, Cache, and Feature Flags plugins with Redis storage and external flag services.",
1414
+ "level": "advanced",
1415
+ "tags": ["development", "feature-flags", "redis", "keyword-search", "cache", "approval"],
1416
+ "features": [
1417
+ "Configuring all 5 stable official plugins together in a production server",
1418
+ "CodeCall in `codecall_only` mode with TF-IDF search and synonym expansion for semantic tool discovery",
1419
+ "Remember plugin with Redis storage, encryption enabled, and LLM-accessible memory tools",
1420
+ "Approval plugin in `webhook` mode with external PKCE-secured approval flow and audit logging",
1421
+ "Cache plugin with Redis storage and 24-hour default TTL",
1422
+ "Feature Flags with LaunchDarkly integration for external flag management",
1423
+ "Per-tool `approval` metadata with risk level and scope configuration",
1424
+ "Per-tool `featureFlag` with a `defaultValue` fallback if flag evaluation fails",
1425
+ "Using `this.approval.isApproved()` and `this.remember.set()` together in a single tool"
1426
+ ]
1427
+ },
1428
+ {
1429
+ "name": "remember-plugin-session-memory",
1430
+ "description": "Demonstrates installing the Remember plugin and using `this.remember` in tools to store and retrieve session memory.",
1431
+ "level": "basic",
1432
+ "tags": ["development", "session", "plugins", "remember", "plugin", "memory"],
1433
+ "features": [
1434
+ "Installing `RememberPlugin` with `type: 'memory'` for development",
1435
+ "Enabling `tools: { enabled: true }` to expose LLM-callable memory tools (`remember_this`, `recall`, etc.)",
1436
+ "Using `this.remember.set()` with default `session` scope and explicit `user` scope",
1437
+ "Using `this.remember.get()` with a `defaultValue` fallback",
1438
+ "Using `this.remember.knows()` to check key existence without retrieving the value"
1439
+ ]
1440
+ }
1441
+ ]
189
1442
  }
190
1443
  ]
191
1444
  },
@@ -201,7 +1454,50 @@
201
1454
  "references": [
202
1455
  {
203
1456
  "name": "vectoriadb",
204
- "description": "Use VectoriaDB for in-memory vector search with ML-based or TF-IDF engines in FrontMCP servers"
1457
+ "description": "Use VectoriaDB for in-memory vector search with ML-based or TF-IDF engines in FrontMCP servers",
1458
+ "examples": [
1459
+ {
1460
+ "name": "product-catalog-search",
1461
+ "description": "Shows advanced VectoriaDB usage with typed document metadata, batch operations, filtered search by multiple criteria, and batch indexing of a product catalog.",
1462
+ "level": "advanced",
1463
+ "tags": ["extensibility", "vectoriadb", "product", "catalog", "search"],
1464
+ "features": [
1465
+ "Typed document metadata with `ProductDoc extends DocumentMetadata`",
1466
+ "Batch operations with `db.addMany()` for efficient catalog indexing",
1467
+ "Multi-criteria filtered search combining category, price, and stock status",
1468
+ "`maxDocuments` option for DoS protection on large datasets",
1469
+ "`FileStorageAdapter` for persisting the entire product index to disk",
1470
+ "Semantic matching: \"something to block office noise\" finds \"noise-canceling headphones\""
1471
+ ]
1472
+ },
1473
+ {
1474
+ "name": "semantic-search-with-persistence",
1475
+ "description": "Shows how to use `VectoriaDB` for semantic search with transformer models, filtered search, and `FileStorageAdapter` for persistence across restarts.",
1476
+ "level": "intermediate",
1477
+ "tags": ["extensibility", "vectoriadb", "semantic-search", "semantic", "search", "persistence"],
1478
+ "features": [
1479
+ "Using `VectoriaDB` with transformer models for true semantic search",
1480
+ "Configuring HNSW index (`useHNSW: true`) for fast O(log n) search on large datasets",
1481
+ "Filtered search with a callback: `filter: (m) => m.category === category`",
1482
+ "`FileStorageAdapter` for persisting vectors to disk (restored without re-embedding)",
1483
+ "Async initialization with `await db.initialize()` (downloads model on first run)",
1484
+ "Update-or-add pattern with `db.has(id)` check"
1485
+ ]
1486
+ },
1487
+ {
1488
+ "name": "tfidf-keyword-search",
1489
+ "description": "Shows how to use `TFIDFVectoria` for zero-dependency keyword search in a FrontMCP provider, with field weights and index building.",
1490
+ "level": "basic",
1491
+ "tags": ["extensibility", "vectoriadb", "keyword-search", "tfidf", "keyword", "search"],
1492
+ "features": [
1493
+ "Using `TFIDFVectoria` for zero-dependency keyword search (no model downloads)",
1494
+ "Configuring field weights to control scoring influence",
1495
+ "Calling `buildIndex()` after adding documents (required for TFIDFVectoria)",
1496
+ "Wrapping the search engine in a FrontMCP provider with `ProviderScope.GLOBAL`",
1497
+ "Injecting the provider into tools via `this.get(FAQSearch)`"
1498
+ ]
1499
+ }
1500
+ ]
205
1501
  }
206
1502
  ]
207
1503
  },
@@ -217,15 +1513,138 @@
217
1513
  "references": [
218
1514
  {
219
1515
  "name": "example-knowledge-base",
220
- "description": "Multi-app knowledge base with vector storage, semantic search, AI research agent, and audit plugin"
1516
+ "description": "Multi-app knowledge base with vector storage, semantic search, AI research agent, and audit plugin",
1517
+ "examples": [
1518
+ {
1519
+ "name": "agent-and-plugin",
1520
+ "description": "Shows an autonomous research agent with inner tools and configurable depth, and a plugin that hooks into tool execution for audit logging.",
1521
+ "level": "advanced",
1522
+ "tags": ["guides", "knowledge-base", "knowledge", "base", "agent", "plugin"],
1523
+ "features": [
1524
+ "Agent with `@Agent` decorator, LLM config, inner tools, and system instructions",
1525
+ "Using `this.run(prompt, { maxIterations })` to execute the LLM tool-use loop",
1526
+ "Configurable behavior via input schema (`depth: 'shallow' | 'deep'`)",
1527
+ "Plugin hooks: `onToolExecuteBefore`, `onToolExecuteAfter`, `onToolExecuteError`",
1528
+ "Using `ctx.state.set/get()` for flow state instead of mutating `rawInput`",
1529
+ "Non-blocking audit logging (`.catch()` prevents audit failures from breaking tools)"
1530
+ ]
1531
+ },
1532
+ {
1533
+ "name": "multi-app-composition",
1534
+ "description": "Shows how to compose multiple apps (Ingestion, Search, Research) into a single server with shared providers, plugins, and agent registration.",
1535
+ "level": "basic",
1536
+ "tags": ["guides", "multi-app", "knowledge-base", "knowledge", "base", "multi"],
1537
+ "features": [
1538
+ "Composing three apps into one server: Ingestion (tools + providers), Search (tools + resources), Research (agents)",
1539
+ "Sharing providers across apps (VectorStoreProvider used by both Ingestion and Search)",
1540
+ "Registering plugins at the server level (AuditLogPlugin applies to all tools)",
1541
+ "Registering agents in a dedicated app for AI-powered features"
1542
+ ]
1543
+ },
1544
+ {
1545
+ "name": "vector-search-and-resources",
1546
+ "description": "Shows a semantic search tool with embedding generation and a resource template for retrieving documents by ID using URI parameters.",
1547
+ "level": "intermediate",
1548
+ "tags": ["guides", "openai", "semantic-search", "knowledge-base", "knowledge", "base"],
1549
+ "features": [
1550
+ "Semantic search tool that generates query embeddings via `this.fetch()` to OpenAI",
1551
+ "Using `this.mark()` for execution phase tracing",
1552
+ "Resource template with `uriTemplate: 'kb://documents/{documentId}'` for parameterized URIs",
1553
+ "Typed params via `ResourceContext<{ documentId: string }>` for type-safe URI parameters",
1554
+ "Returning `ReadResourceResult` with proper MCP protocol structure"
1555
+ ]
1556
+ }
1557
+ ]
221
1558
  },
222
1559
  {
223
1560
  "name": "example-task-manager",
224
- "description": "Authenticated task management server with CRUD tools, Redis storage, OAuth, and Vercel deployment"
1561
+ "description": "Authenticated task management server with CRUD tools, Redis storage, OAuth, and Vercel deployment",
1562
+ "examples": [
1563
+ {
1564
+ "name": "auth-and-crud-tools",
1565
+ "description": "Shows how to create CRUD tools with authentication, using `this.context.session` for user isolation and `this.get()` for dependency injection.",
1566
+ "level": "basic",
1567
+ "tags": ["guides", "auth", "session", "task-manager", "task", "manager"],
1568
+ "features": [
1569
+ "Using `this.context.session?.userId` for per-user data isolation",
1570
+ "Using `this.get(TASK_STORE)` for dependency injection of providers",
1571
+ "Enforcing authentication with `this.fail()` when no session exists",
1572
+ "Optional input fields with `.optional()` for filtering",
1573
+ "`outputSchema` with nested `z.array(z.object(...))` for structured responses"
1574
+ ]
1575
+ },
1576
+ {
1577
+ "name": "authenticated-e2e-tests",
1578
+ "description": "Shows how to write E2E tests with authentication using `TestTokenFactory`, and unit tests for tools that require session context.",
1579
+ "level": "advanced",
1580
+ "tags": ["guides", "auth", "session", "e2e", "unit-test", "task-manager"],
1581
+ "features": [
1582
+ "Using `TestTokenFactory` to create JWT tokens for authenticated E2E tests",
1583
+ "Chaining `.withToken(token).buildAndConnect()` for authenticated clients",
1584
+ "Unit testing with mocked DI tokens via `this.get()` mock",
1585
+ "Mocking session context (`context: { session: { userId } }`) for auth-dependent tools",
1586
+ "Testing the unauthenticated error path (no session)"
1587
+ ]
1588
+ },
1589
+ {
1590
+ "name": "redis-provider-with-di",
1591
+ "description": "Shows how to create a Redis-backed provider with a DI token, lifecycle hooks (`onInit`/`onDestroy`), and how tools inject it.",
1592
+ "level": "intermediate",
1593
+ "tags": ["guides", "redis", "node", "task-manager", "task", "manager"],
1594
+ "features": [
1595
+ "Defining an interface and DI token (`Symbol('TaskStore')`) for the provider",
1596
+ "Using `@Provider({ token: TASK_STORE })` to register the provider for DI",
1597
+ "Lifecycle hooks: `onInit()` for connection setup, `onDestroy()` for cleanup",
1598
+ "Lazy-loading `ioredis` via dynamic `import()` in `onInit()`",
1599
+ "Using `@frontmcp/utils` for `randomUUID()` instead of `node:crypto`",
1600
+ "Per-user data isolation using Redis hash keys (`tasks:${userId}`)"
1601
+ ]
1602
+ }
1603
+ ]
225
1604
  },
226
1605
  {
227
1606
  "name": "example-weather-api",
228
- "description": "Beginner MCP server with a weather lookup tool, static resource, Zod schemas, and E2E tests"
1607
+ "description": "Beginner MCP server with a weather lookup tool, static resource, Zod schemas, and E2E tests",
1608
+ "examples": [
1609
+ {
1610
+ "name": "server-and-app-setup",
1611
+ "description": "Shows the server entry point, app registration, and static resource for a beginner FrontMCP weather API server.",
1612
+ "level": "basic",
1613
+ "tags": ["guides", "weather", "api", "app", "setup"],
1614
+ "features": [
1615
+ "Server entry point with `@FrontMcp` decorator and `info` configuration",
1616
+ "App registration with `@App` grouping tools and resources together",
1617
+ "Static resource that returns JSON data via `read()`",
1618
+ "Clean separation between server, app, tools, and resources"
1619
+ ]
1620
+ },
1621
+ {
1622
+ "name": "unit-and-e2e-tests",
1623
+ "description": "Shows how to write unit tests for tools by mocking context methods, and E2E tests using `McpTestClient` and `TestServer`.",
1624
+ "level": "intermediate",
1625
+ "tags": ["guides", "e2e", "unit-test", "weather", "api", "unit"],
1626
+ "features": [
1627
+ "Unit testing tools by mocking `this.fetch()`, `this.fail()`, and other context methods",
1628
+ "Using `Object.assign(tool, ctx)` to inject mock context into the tool instance",
1629
+ "E2E testing with `TestServer.start()` and `McpTestClient.create()`",
1630
+ "Using `toContainTool()` custom matcher for asserting tool presence",
1631
+ "Proper cleanup with `client.disconnect()` and `server.stop()` in `afterAll`"
1632
+ ]
1633
+ },
1634
+ {
1635
+ "name": "weather-tool-with-schemas",
1636
+ "description": "Shows how to create a tool with Zod input and output schemas, use `this.fetch()` for HTTP calls, and handle errors with `this.fail()`.",
1637
+ "level": "basic",
1638
+ "tags": ["guides", "weather", "api", "tool", "schemas"],
1639
+ "features": [
1640
+ "Defining Zod `inputSchema` with validation (`.min(1)`, `.enum()`, `.default()`)",
1641
+ "Defining `outputSchema` to prevent data leaks and ensure type safety",
1642
+ "Using `this.fetch()` for HTTP calls within tools",
1643
+ "Using `this.fail()` for business-logic error handling",
1644
+ "Using `.describe()` on schema fields for LLM-friendly tool descriptions"
1645
+ ]
1646
+ }
1647
+ ]
229
1648
  }
230
1649
  ]
231
1650
  },
@@ -241,39 +1660,383 @@
241
1660
  "references": [
242
1661
  {
243
1662
  "name": "common-checklist",
244
- "description": "Security, performance, reliability, and observability checks for all deployment targets"
1663
+ "description": "Security, performance, reliability, and observability checks for all deployment targets",
1664
+ "examples": [
1665
+ {
1666
+ "name": "caching-and-performance",
1667
+ "description": "Shows how to configure caching with TTL, optimize responses, and manage memory with proper provider lifecycle cleanup.",
1668
+ "level": "advanced",
1669
+ "tags": ["production", "redis", "cache", "session", "performance", "checklist"],
1670
+ "features": [
1671
+ "Configuring per-tool cache TTL instead of a single global value",
1672
+ "Using Redis-backed cache for multi-instance consistency",
1673
+ "Setting session TTL to prevent unbounded storage growth",
1674
+ "Implementing `onDestroy()` in providers for proper connection cleanup",
1675
+ "Using connection pool limits and timeouts to prevent resource exhaustion"
1676
+ ]
1677
+ },
1678
+ {
1679
+ "name": "observability-setup",
1680
+ "description": "Shows how to configure structured logging, error handling with MCP error codes, and monitoring integration for production.",
1681
+ "level": "intermediate",
1682
+ "tags": ["production", "observability", "checklist", "setup"],
1683
+ "features": [
1684
+ "Using `this.mark()` to annotate execution phases for tracing",
1685
+ "Using `this.fail()` for business-logic errors without exposing internals",
1686
+ "Setting timeouts on all external calls via `AbortSignal.timeout()`",
1687
+ "Implementing health check providers that verify downstream dependencies"
1688
+ ]
1689
+ },
1690
+ {
1691
+ "name": "security-hardening",
1692
+ "description": "Shows how to configure authentication, CORS, input validation, and rate limiting for a production FrontMCP server.",
1693
+ "level": "basic",
1694
+ "tags": ["production", "redis", "session", "security", "throttle", "checklist"],
1695
+ "features": [
1696
+ "Restricting CORS origins to known domains instead of using `'*'`",
1697
+ "Configuring rate limiting via the `throttle` option",
1698
+ "Using Redis for session storage in multi-instance deployments",
1699
+ "Defining both `inputSchema` and `outputSchema` on tools to prevent data leaks"
1700
+ ]
1701
+ }
1702
+ ]
245
1703
  },
246
1704
  {
247
1705
  "name": "production-browser",
248
- "description": "Checklist for publishing FrontMCP as a browser-compatible SDK bundle"
1706
+ "description": "Checklist for publishing FrontMCP as a browser-compatible SDK bundle",
1707
+ "examples": [
1708
+ {
1709
+ "name": "browser-bundle-config",
1710
+ "description": "Shows how to configure package.json for browser-compatible SDK distribution with ESM/CJS/UMD entry points, TypeScript declarations, and CDN support.",
1711
+ "level": "basic",
1712
+ "tags": ["production", "browser", "sdk", "node", "bundle", "config"],
1713
+ "features": [
1714
+ "Correct `main`, `module`, `browser`, `types`, and `exports` fields for browser distribution",
1715
+ "Using the `browser` field to point bundlers to the browser-specific build",
1716
+ "Browser-safe imports with no Node.js-only APIs",
1717
+ "CDN-friendly distribution that works via `<script type=\"module\">`"
1718
+ ]
1719
+ },
1720
+ {
1721
+ "name": "cross-platform-crypto",
1722
+ "description": "Shows how to use `@frontmcp/utils` for cross-platform crypto operations that work in both browser and Node.js, and how to avoid Node.js-only APIs.",
1723
+ "level": "intermediate",
1724
+ "tags": ["production", "browser", "node", "cross", "platform", "crypto"],
1725
+ "features": [
1726
+ "Using `@frontmcp/utils` for crypto instead of `node:crypto` (wraps Web Crypto API)",
1727
+ "Using Fetch API for HTTP calls instead of Node.js `http`/`https`",
1728
+ "Using `crypto.randomUUID()` from the Web Crypto API in browser code",
1729
+ "WebSocket connection with automatic reconnection for streaming",
1730
+ "No Node.js-only APIs (`fs`, `path`, `child_process`, `net`)"
1731
+ ]
1732
+ },
1733
+ {
1734
+ "name": "security-and-performance",
1735
+ "description": "Shows how to ensure no secrets are bundled in browser code, configure CSP headers on the server, optimize bundle size, and avoid blocking the main thread.",
1736
+ "level": "advanced",
1737
+ "tags": ["production", "auth", "browser", "security", "performance"],
1738
+ "features": [
1739
+ "No secrets (API keys, tokens) in the browser bundle -- using server-side proxy",
1740
+ "CORS configured on the server to accept specific browser origins",
1741
+ "Code splitting with dynamic `import()` for large optional features",
1742
+ "Yielding to the event loop during large data processing to avoid blocking the main thread",
1743
+ "Auth tokens obtained from the auth flow, never hardcoded"
1744
+ ]
1745
+ }
1746
+ ]
249
1747
  },
250
1748
  {
251
1749
  "name": "production-cli-binary",
252
- "description": "Checklist for publishing FrontMCP as a one-shot CLI binary with stdin/stdout transport"
1750
+ "description": "Checklist for publishing FrontMCP as a one-shot CLI binary with stdin/stdout transport",
1751
+ "examples": [
1752
+ {
1753
+ "name": "binary-build-config",
1754
+ "description": "Shows how to configure a FrontMCP CLI binary with correct package.json `bin` field, shebang, stdio transport, and npm distribution settings.",
1755
+ "level": "basic",
1756
+ "tags": ["production", "cli", "transport", "node", "binary", "config"],
1757
+ "features": [
1758
+ "Correct `bin` field in package.json pointing to the built output",
1759
+ "Shebang line (`#!/usr/bin/env node`) for direct execution",
1760
+ "Handling `--version` and `--help` flags before server initialization",
1761
+ "Using stderr for logging (stdout is the MCP channel)",
1762
+ "`files` field excluding source, tests, and config from the published package"
1763
+ ]
1764
+ },
1765
+ {
1766
+ "name": "stdio-transport-error-handling",
1767
+ "description": "Shows how to handle stdin/stdout transport correctly, implement proper exit codes, and handle edge cases like EOF and broken pipes.",
1768
+ "level": "intermediate",
1769
+ "tags": ["production", "json-rpc", "cli", "transport", "binary", "stdio"],
1770
+ "features": [
1771
+ "Exit code conventions: 0 (success), 1 (user error), 2 (internal error)",
1772
+ "Using stderr for all logging since stdout is the MCP JSON-RPC channel",
1773
+ "Handling EOF on stdin and broken pipe on stdout gracefully",
1774
+ "Showing helpful error messages for unknown flags instead of stack traces",
1775
+ "Validating file paths to prevent writes to unexpected locations"
1776
+ ]
1777
+ }
1778
+ ]
253
1779
  },
254
1780
  {
255
1781
  "name": "production-cli-daemon",
256
- "description": "Checklist for deploying FrontMCP as a long-running local daemon with socket transport"
1782
+ "description": "Checklist for deploying FrontMCP as a long-running local daemon with socket transport",
1783
+ "examples": [
1784
+ {
1785
+ "name": "daemon-socket-config",
1786
+ "description": "Shows how to configure a FrontMCP server as a long-running local daemon with Unix socket transport, process management, and SQLite storage.",
1787
+ "level": "basic",
1788
+ "tags": ["production", "unix-socket", "sqlite", "cli", "transport", "performance"],
1789
+ "features": [
1790
+ "Configuring Unix socket transport for local-only communication",
1791
+ "Using SQLite with WAL mode for concurrent read/write performance",
1792
+ "Storing data in user-specific config directory (`~/.config/`)",
1793
+ "Process management with `frontmcp start/stop/restart/status/logs`",
1794
+ "System service registration for auto-start on boot"
1795
+ ]
1796
+ },
1797
+ {
1798
+ "name": "graceful-shutdown-cleanup",
1799
+ "description": "Shows how to implement graceful shutdown for a daemon process, including completing in-flight requests, closing database connections, removing the socket file, and cleaning up the PID file.",
1800
+ "level": "intermediate",
1801
+ "tags": ["production", "unix-socket", "cli", "database", "daemon", "graceful"],
1802
+ "features": [
1803
+ "SIGTERM handler that completes in-flight requests before exiting",
1804
+ "Removing the Unix socket file to prevent stale `.sock` files on restart",
1805
+ "Cleaning up the PID file on shutdown",
1806
+ "Using `@frontmcp/utils` (`unlink`, `fileExists`, `ensureDir`) for file operations",
1807
+ "Implementing `onDestroy()` to close database connections"
1808
+ ]
1809
+ },
1810
+ {
1811
+ "name": "security-and-permissions",
1812
+ "description": "Shows how to secure a local daemon with restrictive socket permissions, XDG-compliant config storage, and file-based secret management.",
1813
+ "level": "advanced",
1814
+ "tags": ["production", "cli", "transport", "security", "local", "node"],
1815
+ "features": [
1816
+ "XDG Base Directory compliance for config and data storage",
1817
+ "Restrictive file permissions: config at `700`, secrets at `600`",
1818
+ "Verifying secret file permissions before reading (fail if insecure)",
1819
+ "Socket-only transport with no TCP network exposure",
1820
+ "Using `@frontmcp/utils` for file operations instead of `node:fs`"
1821
+ ]
1822
+ }
1823
+ ]
257
1824
  },
258
1825
  {
259
1826
  "name": "production-cloudflare",
260
- "description": "Checklist for deploying FrontMCP to Cloudflare Workers with KV and Durable Objects"
1827
+ "description": "Checklist for deploying FrontMCP to Cloudflare Workers with KV and Durable Objects",
1828
+ "examples": [
1829
+ {
1830
+ "name": "durable-objects-state",
1831
+ "description": "Shows how to use Cloudflare Durable Objects for stateful coordination alongside the stateless Workers runtime, with KV for cache and R2 for blob storage.",
1832
+ "level": "advanced",
1833
+ "tags": ["production", "cloudflare", "cache", "throttle", "durable", "objects"],
1834
+ "features": [
1835
+ "Using Durable Objects for stateful coordination (rate limiting) in an ephemeral Workers runtime",
1836
+ "Using R2 for blob/file storage since Workers have no filesystem",
1837
+ "Combining KV (cache), R2 (files), and Durable Objects (state) in one deployment",
1838
+ "Wrangler configuration with all three binding types"
1839
+ ]
1840
+ },
1841
+ {
1842
+ "name": "workers-runtime-constraints",
1843
+ "description": "Shows how to write tools that are compatible with the Cloudflare Workers runtime: no Node.js APIs, no eval, only async I/O, and using Web APIs.",
1844
+ "level": "intermediate",
1845
+ "tags": ["production", "cloudflare", "node", "workers", "runtime", "constraints"],
1846
+ "features": [
1847
+ "Using `@frontmcp/utils` for crypto instead of `node:crypto` (Workers use V8 isolates, not Node)",
1848
+ "All I/O is async (no synchronous blocking operations allowed in Workers)",
1849
+ "No `eval()` or dynamic `Function()` (prohibited in Workers)",
1850
+ "No filesystem access (Workers have no filesystem)",
1851
+ "Using Fetch API via `this.fetch()` instead of Node.js `http`/`https`"
1852
+ ]
1853
+ },
1854
+ {
1855
+ "name": "wrangler-config",
1856
+ "description": "Shows how to configure `wrangler.toml` with correct routes, KV bindings for session storage, and secret management for a FrontMCP Cloudflare Worker.",
1857
+ "level": "basic",
1858
+ "tags": ["production", "cloudflare", "cache", "session", "wrangler", "config"],
1859
+ "features": [
1860
+ "Complete `wrangler.toml` with KV bindings for sessions and cache",
1861
+ "Separate staging/production environment configs",
1862
+ "Cloudflare Worker entry point via `createCloudflareHandler`",
1863
+ "Secrets managed via `wrangler secret put` (not in config files)"
1864
+ ]
1865
+ }
1866
+ ]
261
1867
  },
262
1868
  {
263
1869
  "name": "production-lambda",
264
- "description": "Checklist for deploying FrontMCP to AWS Lambda with SAM, API Gateway, and DynamoDB"
1870
+ "description": "Checklist for deploying FrontMCP to AWS Lambda with SAM, API Gateway, and DynamoDB",
1871
+ "examples": [
1872
+ {
1873
+ "name": "cold-start-connection-reuse",
1874
+ "description": "Shows how to minimize Lambda cold starts with lazy initialization, tree-shaking, and the connection reuse pattern for external services.",
1875
+ "level": "intermediate",
1876
+ "tags": ["production", "lambda", "performance", "cold", "start", "connection"],
1877
+ "features": [
1878
+ "Connection reuse pattern: caching connections in module scope across warm invocations",
1879
+ "Lazy-loading heavy dependencies (`pg`) via dynamic `import()` to reduce cold start",
1880
+ "Not closing connections in `onDestroy()` for Lambda (they survive freeze/thaw)",
1881
+ "Keeping module scope lightweight with no heavy initialization"
1882
+ ]
1883
+ },
1884
+ {
1885
+ "name": "sam-template",
1886
+ "description": "Shows a complete SAM/CloudFormation template for deploying a FrontMCP server to AWS Lambda with API Gateway routing, DynamoDB for session storage, and proper environment configuration.",
1887
+ "level": "basic",
1888
+ "tags": ["production", "lambda", "session", "sam", "template"],
1889
+ "features": [
1890
+ "Complete SAM template with API Gateway, Lambda function, and DynamoDB table",
1891
+ "DynamoDB for session storage with TTL-based automatic cleanup",
1892
+ "Lambda handler entry point via `createLambdaHandler`",
1893
+ "Pay-per-request billing for cost-effective scaling",
1894
+ "IAM policies scoped to the specific DynamoDB table"
1895
+ ]
1896
+ },
1897
+ {
1898
+ "name": "scaling-and-monitoring",
1899
+ "description": "Shows how to configure concurrency limits, dead letter queues, provisioned concurrency, and CloudWatch alarms for a production Lambda deployment.",
1900
+ "level": "advanced",
1901
+ "tags": ["production", "lambda", "performance", "scaling", "monitoring"],
1902
+ "features": [
1903
+ "Reserved concurrency to prevent downstream service overload",
1904
+ "Provisioned concurrency for latency-sensitive endpoints (reduces cold starts)",
1905
+ "Dead letter queue (DLQ) for capturing failed invocations",
1906
+ "CloudWatch alarms for error rate and throttling detection",
1907
+ "Loading secrets from AWS SSM Parameter Store instead of environment variables"
1908
+ ]
1909
+ }
1910
+ ]
265
1911
  },
266
1912
  {
267
1913
  "name": "production-node-sdk",
268
- "description": "Checklist for publishing FrontMCP as an embedded npm package used as a direct client SDK"
1914
+ "description": "Checklist for publishing FrontMCP as an embedded npm package used as a direct client SDK",
1915
+ "examples": [
1916
+ {
1917
+ "name": "basic-sdk-lifecycle",
1918
+ "description": "Shows the complete lifecycle of a FrontMCP SDK package used as an embedded client: initialization, tool invocation, and proper cleanup.",
1919
+ "level": "basic",
1920
+ "tags": ["production", "sdk", "node", "lifecycle"],
1921
+ "features": [
1922
+ "Exporting a `create()` function as the public API surface",
1923
+ "No port binding in SDK mode (embedded, not standalone server)",
1924
+ "The full lifecycle: `create()` -> `connect()` -> `callTool()` -> `close()` -> `dispose()`",
1925
+ "Proper cleanup to prevent memory and connection leaks"
1926
+ ]
1927
+ },
1928
+ {
1929
+ "name": "multi-instance-cleanup",
1930
+ "description": "Shows how multiple SDK instances can coexist without conflicts, and how to implement proper cleanup to prevent memory leaks from event listeners, timers, and provider resources.",
1931
+ "level": "advanced",
1932
+ "tags": ["production", "sdk", "node", "multi", "instance", "cleanup"],
1933
+ "features": [
1934
+ "Implementing `onDestroy()` in providers to clean up timers and listeners",
1935
+ "Ensuring multiple instances coexist without sharing global state",
1936
+ "Testing that dispose removes all event listeners (no leaks)",
1937
+ "Verifying one instance still works after another is disposed"
1938
+ ]
1939
+ },
1940
+ {
1941
+ "name": "package-json-config",
1942
+ "description": "Shows the correct package.json configuration for publishing a FrontMCP SDK package with CJS + ESM entry points, peer dependencies, and proper file inclusions.",
1943
+ "level": "intermediate",
1944
+ "tags": ["production", "sdk", "readme", "node", "package", "json"],
1945
+ "features": [
1946
+ "Correct `main`, `module`, `types`, and `exports` fields for CJS + ESM",
1947
+ "Using `files` to include only `dist/`, `README.md`, and `LICENSE` in the published package",
1948
+ "Declaring `zod` as a `peerDependency` for shared packages",
1949
+ "The `prepublishOnly` script ensuring build and tests pass before publishing",
1950
+ "Integration test verifying the full lifecycle with proper cleanup"
1951
+ ]
1952
+ }
1953
+ ]
269
1954
  },
270
1955
  {
271
1956
  "name": "production-node-server",
272
- "description": "Checklist for deploying FrontMCP as a long-running Node.js server with Docker"
1957
+ "description": "Checklist for deploying FrontMCP as a long-running Node.js server with Docker",
1958
+ "examples": [
1959
+ {
1960
+ "name": "docker-multi-stage",
1961
+ "description": "Shows a production-ready Dockerfile with multi-stage build, non-root user, and container health check for a FrontMCP Node.js server.",
1962
+ "level": "basic",
1963
+ "tags": ["production", "dockerfile", "docker", "security", "node", "multi"],
1964
+ "features": [
1965
+ "Multi-stage Docker build separating build dependencies from runtime",
1966
+ "Using `node:24-slim` as a minimal base image",
1967
+ "Running as non-root user (`USER node`) for security",
1968
+ "Container health check for orchestrator-aware restarts",
1969
+ "Resource limits (memory, CPU) in docker-compose"
1970
+ ]
1971
+ },
1972
+ {
1973
+ "name": "graceful-shutdown",
1974
+ "description": "Shows how to implement graceful shutdown with SIGTERM handling, in-flight request draining, and health check status transitions.",
1975
+ "level": "intermediate",
1976
+ "tags": ["production", "redis", "database", "node", "graceful", "shutdown"],
1977
+ "features": [
1978
+ "Handling SIGTERM for graceful shutdown in containerized environments",
1979
+ "Draining in-flight requests before exiting with a timeout safety net",
1980
+ "Disposing all resources (Redis, database) via `server.dispose()`",
1981
+ "Returning unhealthy during shutdown so load balancers redirect traffic"
1982
+ ]
1983
+ },
1984
+ {
1985
+ "name": "redis-session-scaling",
1986
+ "description": "Shows how to configure Redis-backed session storage, connection pooling, and stateless server design for horizontal scaling behind a load balancer.",
1987
+ "level": "advanced",
1988
+ "tags": ["production", "redis", "session", "node", "scaling"],
1989
+ "features": [
1990
+ "Configuring Redis for session storage so all instances share state",
1991
+ "Using key prefixes to namespace Redis keys and avoid collisions",
1992
+ "Setting session TTL to prevent unbounded storage growth",
1993
+ "Configuring Redis-backed job store for multi-instance job processing",
1994
+ "Validating required environment variables at startup (fail fast)"
1995
+ ]
1996
+ }
1997
+ ]
273
1998
  },
274
1999
  {
275
2000
  "name": "production-vercel",
276
- "description": "Checklist for deploying FrontMCP to Vercel serverless or edge functions with Vercel KV"
2001
+ "description": "Checklist for deploying FrontMCP to Vercel serverless or edge functions with Vercel KV",
2002
+ "examples": [
2003
+ {
2004
+ "name": "cold-start-optimization",
2005
+ "description": "Shows how to minimize cold start time by lazy-loading dependencies, avoiding heavy initialization at module scope, and caching expensive operations.",
2006
+ "level": "intermediate",
2007
+ "tags": ["production", "vercel", "openapi", "performance", "cold", "start"],
2008
+ "features": [
2009
+ "Lazy-loading heavy dependencies via dynamic `import()` in `onInit()` instead of module scope",
2010
+ "Caching expensive fetches (e.g., OpenAPI specs) across warm invocations",
2011
+ "Keeping the module scope lightweight with no side effects",
2012
+ "No `top-level await`, no global state, no network calls at import time"
2013
+ ]
2014
+ },
2015
+ {
2016
+ "name": "stateless-serverless-design",
2017
+ "description": "Shows a fully stateless server design that works on Vercel edge runtime with no Node.js-only APIs, using `@frontmcp/utils` for cross-platform crypto.",
2018
+ "level": "advanced",
2019
+ "tags": ["production", "vercel", "serverless", "node", "stateless", "design"],
2020
+ "features": [
2021
+ "Using `@frontmcp/utils` (`sha256Hex`, `randomUUID`) instead of `node:crypto` for edge compatibility",
2022
+ "Fully stateless design with no in-memory state between invocations",
2023
+ "Using `this.fetch()` instead of Node.js `http`/`https` modules",
2024
+ "No file system access (serverless is ephemeral)"
2025
+ ]
2026
+ },
2027
+ {
2028
+ "name": "vercel-edge-config",
2029
+ "description": "Shows how to configure a FrontMCP server for Vercel deployment with Vercel KV for session storage and correct route configuration.",
2030
+ "level": "basic",
2031
+ "tags": ["production", "vercel-kv", "vercel", "session", "serverless", "edge"],
2032
+ "features": [
2033
+ "Correct `vercel.json` with function routes, memory limits, and max duration",
2034
+ "Using Vercel KV (`provider: 'vercel-kv'`) for session storage instead of in-memory",
2035
+ "Setting CORS origins dynamically using `VERCEL_URL`",
2036
+ "Serverless function entry point via `createVercelHandler`"
2037
+ ]
2038
+ }
2039
+ ]
277
2040
  }
278
2041
  ]
279
2042
  },
@@ -289,39 +2052,360 @@
289
2052
  "references": [
290
2053
  {
291
2054
  "name": "frontmcp-skills-usage",
292
- "description": "Search, install, and manage FrontMCP skill catalog for AI agents (Claude Code, Codex)"
2055
+ "description": "Search, install, and manage FrontMCP skill catalog for AI agents (Claude Code, Codex)",
2056
+ "examples": [
2057
+ {
2058
+ "name": "bundle-presets-scaffolding",
2059
+ "description": "Use `--skills` flag during project creation to install a skill bundle preset.",
2060
+ "level": "intermediate",
2061
+ "tags": ["setup", "skills", "usage", "bundle", "presets", "scaffolding"],
2062
+ "features": [
2063
+ "`--skills` flag accepts `recommended`, `minimal`, `full`, or `none` presets",
2064
+ "Static installs are snapshots; re-run `install` to update to the latest catalog version",
2065
+ "Hybrid approach: install core skills statically, search the rest on demand",
2066
+ "Fewer static installs reduce token usage in AI agent context"
2067
+ ]
2068
+ },
2069
+ {
2070
+ "name": "install-and-search-skills",
2071
+ "description": "Install skills statically for Claude Code and use dynamic CLI search for on-demand discovery.",
2072
+ "level": "basic",
2073
+ "tags": ["setup", "cli", "anthropic", "skills", "usage", "install"],
2074
+ "features": [
2075
+ "`frontmcp skills list` and `search` for discovering available skills",
2076
+ "`frontmcp skills read` for viewing skill content and references on demand",
2077
+ "`frontmcp skills install --provider claude` for static installation to `.claude/skills/`",
2078
+ "Installed skills are auto-loaded by Claude Code in its system prompt context"
2079
+ ]
2080
+ }
2081
+ ]
293
2082
  },
294
2083
  {
295
2084
  "name": "multi-app-composition",
296
- "description": "Compose multiple @App classes, ESM packages, and remote MCP servers into a single FrontMCP gateway"
2085
+ "description": "Compose multiple @App classes, ESM packages, and remote MCP servers into a single FrontMCP gateway",
2086
+ "examples": [
2087
+ {
2088
+ "name": "local-apps-with-shared-tools",
2089
+ "description": "Compose multiple local `@App` classes into a server with shared tools available to all apps.",
2090
+ "level": "basic",
2091
+ "tags": ["setup", "multi-app", "local", "multi", "app", "composition"],
2092
+ "features": [
2093
+ "Multiple `@App` classes with unique `id` fields for tool namespacing (`billing:charge`, `inventory:check_stock`)",
2094
+ "Server-level `tools` array for shared tools available to all apps without namespace prefix",
2095
+ "Each app is self-contained with its own tools array",
2096
+ "The `id` field on `@App` controls the namespace prefix for tool names"
2097
+ ]
2098
+ },
2099
+ {
2100
+ "name": "per-app-auth-and-isolation",
2101
+ "description": "Configure mixed authentication modes and scope isolation for different apps in a single server.",
2102
+ "level": "advanced",
2103
+ "tags": ["setup", "oauth", "auth", "multi-app", "remote", "multi"],
2104
+ "features": [
2105
+ "Per-app `auth` overrides the server-level auth (public vs remote OAuth per app)",
2106
+ "`standalone: true` fully isolates the Admin app (not visible in parent tool listing)",
2107
+ "`standalone: 'includeInParent'` gives Analytics its own scope but keeps tools visible",
2108
+ "Per-app `plugins` (BillingAuditPlugin) are scoped to that app only",
2109
+ "Server-level `plugins` (TracingPlugin, PiiRedactionPlugin) apply to all apps"
2110
+ ]
2111
+ },
2112
+ {
2113
+ "name": "remote-and-esm-apps",
2114
+ "description": "Compose local, ESM (npm package), and remote (external MCP server) apps into a single gateway.",
2115
+ "level": "intermediate",
2116
+ "tags": ["setup", "oauth", "auth", "transport", "multi-app", "remote"],
2117
+ "features": [
2118
+ "`app.esm()` loads an `@App` class from an npm package with namespace and auto-update",
2119
+ "`app.remote()` proxies tools from external MCP servers with configurable auth modes",
2120
+ "`remoteAuth` supports `'static'` (fixed credentials), `'forward'` (pass gateway user token), and `'oauth'`",
2121
+ "`namespace` prevents tool name collisions between apps (`crm:tool_name`, `slack:tool_name`)",
2122
+ "`transportOptions` configure timeout, retries, and SSE fallback for remote connections"
2123
+ ]
2124
+ }
2125
+ ]
297
2126
  },
298
2127
  {
299
2128
  "name": "nx-workflow",
300
- "description": "Scaffold, build, test, and deploy FrontMCP projects using the @frontmcp/nx plugin in a monorepo"
2129
+ "description": "Scaffold, build, test, and deploy FrontMCP projects using the @frontmcp/nx plugin in a monorepo",
2130
+ "examples": [
2131
+ {
2132
+ "name": "build-test-affected",
2133
+ "description": "Use Nx commands for efficient building, testing, and CI with affected-only execution.",
2134
+ "level": "intermediate",
2135
+ "tags": ["setup", "nx", "workflow", "affected"],
2136
+ "features": [
2137
+ "`nx build <server>` resolves the dependency graph and builds with caching",
2138
+ "`nx affected -t test` only runs tests for changed projects, saving CI time",
2139
+ "`nx run-many -t build,test,lint` parallelizes multiple targets across all projects",
2140
+ "`nx graph` visualizes project dependencies to detect circular imports"
2141
+ ]
2142
+ },
2143
+ {
2144
+ "name": "multi-server-deployment",
2145
+ "description": "Generate multiple servers in an Nx workspace, each composing different apps for different deployment targets.",
2146
+ "level": "advanced",
2147
+ "tags": ["setup", "vercel", "nx", "node", "workflow", "multi"],
2148
+ "features": [
2149
+ "Multiple servers composing different combinations of apps from the same workspace",
2150
+ "Each server has its own deployment target (`node` vs `vercel`) and storage configuration",
2151
+ "Apps are reusable across servers via Nx path aliases",
2152
+ "`nx build <server>` builds the server and all its app and lib dependencies"
2153
+ ]
2154
+ },
2155
+ {
2156
+ "name": "scaffold-and-generate",
2157
+ "description": "Initialize an Nx workspace and use generators to scaffold an app with tools, resources, and a server.",
2158
+ "level": "basic",
2159
+ "tags": ["setup", "nx", "workflow", "scaffold", "generate"],
2160
+ "features": [
2161
+ "`@frontmcp/nx:workspace` initializes the Nx monorepo structure with `apps/`, `libs/`, `servers/`",
2162
+ "All primitive generators require `--project=<app-name>` to target the correct app",
2163
+ "Each generator creates an implementation file, a `.spec.ts` test file, and updates barrel exports",
2164
+ "`@frontmcp/nx:server` with `--apps` and `--deploymentTarget` creates the deployment entry point"
2165
+ ]
2166
+ }
2167
+ ]
301
2168
  },
302
2169
  {
303
2170
  "name": "project-structure-nx",
304
- "description": "Canonical directory layout, generators, and dependency rules for FrontMCP Nx monorepos"
2171
+ "description": "Canonical directory layout, generators, and dependency rules for FrontMCP Nx monorepos",
2172
+ "examples": [
2173
+ {
2174
+ "name": "nx-generator-scaffolding",
2175
+ "description": "Use `@frontmcp/nx` generators to scaffold tools, resources, and providers within an app, with automatic barrel export updates.",
2176
+ "level": "basic",
2177
+ "tags": ["setup", "nx", "structure", "generator", "scaffolding"],
2178
+ "features": [
2179
+ "All primitive generators require `--project=<app-name>` to target the correct app",
2180
+ "Each generator creates the implementation file and a `.spec.ts` test file",
2181
+ "Barrel exports (`index.ts`) are updated automatically after each generator run",
2182
+ "Files follow the `<name>.<type>.ts` naming convention"
2183
+ ]
2184
+ },
2185
+ {
2186
+ "name": "nx-workspace-with-apps",
2187
+ "description": "Scaffold an Nx monorepo with two apps and a server that composes them into a single gateway.",
2188
+ "level": "basic",
2189
+ "tags": ["setup", "nx", "structure", "workspace", "apps"],
2190
+ "features": [
2191
+ "`apps/` directory holding self-contained `@App` classes with their tools and resources",
2192
+ "`servers/` directory holding `@FrontMcp` entry points that compose apps",
2193
+ "Nx path aliases (`@my-workspace/billing`) for clean imports across the monorepo",
2194
+ "Apps are independently testable and do not import from each other"
2195
+ ]
2196
+ },
2197
+ {
2198
+ "name": "shared-library-usage",
2199
+ "description": "Create a shared library in an Nx monorepo and use it from multiple apps to avoid cross-app imports.",
2200
+ "level": "intermediate",
2201
+ "tags": ["setup", "nx", "database", "structure", "shared", "library"],
2202
+ "features": [
2203
+ "Shared libraries live in `libs/` with barrel `index.ts` exports",
2204
+ "Both apps import `DatabaseProvider` from the shared library, not from each other",
2205
+ "Nx dependency graph: `servers/ --> apps/ --> libs/` (apps never import other apps)",
2206
+ "Path aliases configured in `tsconfig.base.json` keep imports clean (`@my-workspace/shared-utils`)"
2207
+ ]
2208
+ }
2209
+ ]
305
2210
  },
306
2211
  {
307
2212
  "name": "project-structure-standalone",
308
- "description": "File layout, naming conventions, and dev workflow for standalone FrontMCP projects"
2213
+ "description": "File layout, naming conventions, and dev workflow for standalone FrontMCP projects",
2214
+ "examples": [
2215
+ {
2216
+ "name": "dev-workflow-commands",
2217
+ "description": "Run the standard development workflow for a standalone FrontMCP project: dev server, build, and tests.",
2218
+ "level": "basic",
2219
+ "tags": ["setup", "e2e", "structure", "standalone", "dev", "workflow"],
2220
+ "features": [
2221
+ "`frontmcp dev` for hot-reloading development server",
2222
+ "`frontmcp build --target <target>` for production builds targeting different runtimes",
2223
+ "Test files use `.spec.ts` extension (not `.test.ts`) per FrontMCP convention",
2224
+ "E2E tests live in the `e2e/` directory with `*.e2e.spec.ts` naming"
2225
+ ]
2226
+ },
2227
+ {
2228
+ "name": "feature-folder-organization",
2229
+ "description": "Organize a growing standalone project into domain-specific feature folders instead of flat type-based directories.",
2230
+ "level": "intermediate",
2231
+ "tags": ["setup", "structure", "standalone", "feature", "folder", "organization"],
2232
+ "features": [
2233
+ "Feature folders (`src/billing/`) grouping related tools, resources, and providers by domain",
2234
+ "Each entity still follows the `<name>.<type>.ts` naming convention inside its feature folder",
2235
+ "One class per file across tools, resources, and providers",
2236
+ "Feature folders scale better than flat `src/tools/` directories for larger projects"
2237
+ ]
2238
+ },
2239
+ {
2240
+ "name": "minimal-standalone-layout",
2241
+ "description": "Set up the canonical file structure for a standalone FrontMCP project with one app, one tool, and the required entry point.",
2242
+ "level": "basic",
2243
+ "tags": ["setup", "structure", "standalone", "minimal", "layout"],
2244
+ "features": [
2245
+ "`<name>.<type>.ts` file naming convention (`fetch-weather.tool.ts`, `my-app.app.ts`)",
2246
+ "`main.ts` with a default-exported `@FrontMcp` server class",
2247
+ "One class per file pattern",
2248
+ "`@App` grouping tools and registered in the server `apps` array"
2249
+ ]
2250
+ }
2251
+ ]
309
2252
  },
310
2253
  {
311
2254
  "name": "readme-guide",
312
- "description": "Generate deployment-target-aware README.md files for FrontMCP MCP servers"
2255
+ "description": "Generate deployment-target-aware README.md files for FrontMCP MCP servers",
2256
+ "examples": [
2257
+ {
2258
+ "name": "node-server-readme",
2259
+ "description": "Generate a README for a FrontMCP server deployed as a Docker/Node.js service with tools and resources.",
2260
+ "level": "basic",
2261
+ "tags": ["setup", "docker", "readme", "node"],
2262
+ "features": [
2263
+ "Standard README sections: Features, Quick Start, Tools table, Resources table, Environment Variables",
2264
+ "Docker-specific deployment section with build and run commands",
2265
+ "Development commands using `frontmcp dev`, `frontmcp test`, `frontmcp inspect`",
2266
+ "Tool and resource tables generated from source code decorators"
2267
+ ]
2268
+ },
2269
+ {
2270
+ "name": "vercel-deployment-readme",
2271
+ "description": "Generate a README for a FrontMCP server deployed to Vercel with Vercel KV storage.",
2272
+ "level": "intermediate",
2273
+ "tags": ["setup", "vercel-kv", "vercel", "readme", "deployment"],
2274
+ "features": [
2275
+ "Vercel-specific deployment instructions with `frontmcp build --target vercel` and `vercel deploy`",
2276
+ "Vercel KV environment variables (`KV_REST_API_URL`, `KV_REST_API_TOKEN`) noted as auto-injected",
2277
+ "`vercel.json` configuration reference for route setup",
2278
+ "Consistent README structure adapted to the Vercel deployment target"
2279
+ ]
2280
+ }
2281
+ ]
313
2282
  },
314
2283
  {
315
2284
  "name": "setup-project",
316
- "description": "Scaffold a new FrontMCP project with CLI or manual setup, decorators, apps, and deployment config"
2285
+ "description": "Scaffold a new FrontMCP project with CLI or manual setup, decorators, apps, and deployment config",
2286
+ "examples": [
2287
+ {
2288
+ "name": "basic-node-server",
2289
+ "description": "Scaffold a minimal FrontMCP server with one app and one tool, running on Node.js with HTTP transport.",
2290
+ "level": "basic",
2291
+ "tags": ["setup", "transport", "node"],
2292
+ "features": [
2293
+ "Minimal `@FrontMcp` server with `info` and `apps` fields",
2294
+ "`@App` decorator grouping a single tool",
2295
+ "`@Tool` decorator with Zod input/output schemas extending `ToolContext`",
2296
+ "Required tsconfig flags: `experimentalDecorators` and `emitDecoratorMetadata`",
2297
+ "`reflect-metadata` imported as the first line of the entry point"
2298
+ ]
2299
+ },
2300
+ {
2301
+ "name": "cli-scaffold-with-flags",
2302
+ "description": "Use the `frontmcp create` CLI to scaffold a complete project non-interactively with explicit flags for deployment target, Redis, and package manager.",
2303
+ "level": "basic",
2304
+ "tags": ["setup", "redis", "cli", "nx", "scaffold", "flags"],
2305
+ "features": [
2306
+ "Non-interactive scaffolding with `--yes` to accept all defaults",
2307
+ "Explicit `--target`, `--redis`, `--pm`, `--skills`, and `--cicd` flags",
2308
+ "Nx monorepo scaffolding with `--nx`",
2309
+ "Verifying the server responds to MCP `initialize` requests after startup"
2310
+ ]
2311
+ },
2312
+ {
2313
+ "name": "vercel-serverless-server",
2314
+ "description": "Configure a FrontMCP server for Vercel deployment with Vercel KV storage and modern transport protocol.",
2315
+ "level": "intermediate",
2316
+ "tags": ["setup", "vercel-kv", "redis", "vercel", "session", "transport"],
2317
+ "features": [
2318
+ "`transport: { protocol: 'modern' }` for streamable HTTP with strict sessions on Vercel",
2319
+ "`redis: { provider: 'vercel-kv' }` for managed Redis-compatible storage without external provisioning",
2320
+ "Building with `frontmcp build --target vercel` for serverless output",
2321
+ "Vercel KV credentials are auto-injected via environment variables"
2322
+ ]
2323
+ }
2324
+ ]
317
2325
  },
318
2326
  {
319
2327
  "name": "setup-redis",
320
- "description": "Provision and configure Redis or Vercel KV for session storage and distributed state"
2328
+ "description": "Provision and configure Redis or Vercel KV for session storage and distributed state",
2329
+ "examples": [
2330
+ {
2331
+ "name": "docker-redis-local-dev",
2332
+ "description": "Provision Redis with Docker Compose and connect a FrontMCP server for local session storage.",
2333
+ "level": "basic",
2334
+ "tags": ["setup", "docker-compose", "redis", "docker", "session", "local"],
2335
+ "features": [
2336
+ "Docker Compose with Redis 7 Alpine, AOF persistence, and health checks",
2337
+ "`redis` config in `@FrontMcp` with `provider: 'redis'` and environment variable fallbacks",
2338
+ "`--appendonly yes` preserves data across container restarts",
2339
+ "`keyPrefix: 'mcp:'` namespaces all session keys"
2340
+ ]
2341
+ },
2342
+ {
2343
+ "name": "hybrid-vercel-kv-with-pubsub",
2344
+ "description": "Use Vercel KV for session storage and a separate Redis instance for pub/sub resource subscriptions.",
2345
+ "level": "advanced",
2346
+ "tags": ["setup", "vercel-kv", "redis", "vercel", "session", "hybrid"],
2347
+ "features": [
2348
+ "Vercel KV handles sessions (`redis` config) while a real Redis handles pub/sub (`pubsub` config)",
2349
+ "Vercel KV does not support pub/sub operations, so a separate Redis instance is required",
2350
+ "Resources with `subscribe: true` rely on the `pubsub` config for real-time notifications",
2351
+ "The `pubsub` field accepts `provider: 'redis'` only (no Vercel KV support)"
2352
+ ]
2353
+ },
2354
+ {
2355
+ "name": "vercel-kv-serverless",
2356
+ "description": "Configure a FrontMCP server with Vercel KV as the session store for serverless deployment.",
2357
+ "level": "intermediate",
2358
+ "tags": ["setup", "vercel-kv", "redis", "vercel", "session", "transport"],
2359
+ "features": [
2360
+ "`provider: 'vercel-kv'` for managed Redis-compatible storage on Vercel",
2361
+ "`transport: { protocol: 'modern' }` required for Streamable HTTP on serverless",
2362
+ "Vercel auto-injects `KV_REST_API_URL` and `KV_REST_API_TOKEN` in production",
2363
+ "Explicit `url` and `token` fields for local testing outside Vercel"
2364
+ ]
2365
+ }
2366
+ ]
321
2367
  },
322
2368
  {
323
2369
  "name": "setup-sqlite",
324
- "description": "Configure SQLite with WAL mode and optional encryption for local single-instance deployments"
2370
+ "description": "Configure SQLite with WAL mode and optional encryption for local single-instance deployments",
2371
+ "examples": [
2372
+ {
2373
+ "name": "basic-sqlite-setup",
2374
+ "description": "Configure a FrontMCP server with SQLite for local session storage with WAL mode enabled.",
2375
+ "level": "basic",
2376
+ "tags": ["setup", "sqlite", "session", "database", "local"],
2377
+ "features": [
2378
+ "`@frontmcp/storage-sqlite` and `better-sqlite3` as required dependencies",
2379
+ "`sqlite` config in `@FrontMcp` with `path` and `walMode`",
2380
+ "WAL mode creates three files (`.sqlite`, `.sqlite-wal`, `.sqlite-shm`)",
2381
+ "Tilde-prefixed paths for stable storage across working directories"
2382
+ ]
2383
+ },
2384
+ {
2385
+ "name": "encrypted-sqlite-storage",
2386
+ "description": "Enable AES-256-GCM at-rest encryption for sensitive session data stored in SQLite.",
2387
+ "level": "intermediate",
2388
+ "tags": ["setup", "sqlite", "session", "database", "encrypted", "storage"],
2389
+ "features": [
2390
+ "`encryption.secret` enables AES-256-GCM encryption with HKDF-SHA256 key derivation",
2391
+ "The secret must be at least 32 characters and sourced from environment variables",
2392
+ "The same secret must be used across server restarts to decrypt existing data",
2393
+ "Never hardcode the encryption secret in source code"
2394
+ ]
2395
+ },
2396
+ {
2397
+ "name": "unix-socket-daemon",
2398
+ "description": "Configure a FrontMCP daemon that listens on a unix socket and uses SQLite for persistent storage.",
2399
+ "level": "advanced",
2400
+ "tags": ["setup", "unix-socket", "sqlite", "session", "transport", "database"],
2401
+ "features": [
2402
+ "`http.unixSocket` for unix socket transport instead of TCP port",
2403
+ "`transport: { protocol: 'modern' }` for Streamable HTTP with strict sessions",
2404
+ "`ttlCleanupIntervalMs: 15000` for more aggressive cleanup on high-throughput daemons",
2405
+ "Absolute path for the database file in system-level storage (`/var/lib/`)"
2406
+ ]
2407
+ }
2408
+ ]
325
2409
  }
326
2410
  ]
327
2411
  },
@@ -337,31 +2421,263 @@
337
2421
  "references": [
338
2422
  {
339
2423
  "name": "setup-testing",
340
- "description": "Configure Jest, write unit and E2E tests, and enforce 95%+ coverage for FrontMCP applications"
2424
+ "description": "Configure Jest, write unit and E2E tests, and enforce 95%+ coverage for FrontMCP applications",
2425
+ "examples": [
2426
+ {
2427
+ "name": "fixture-based-e2e-test",
2428
+ "description": "Write E2E tests using the fixture API from `@frontmcp/testing` that manages server lifecycle automatically and uses MCP-specific custom matchers.",
2429
+ "level": "advanced",
2430
+ "tags": ["testing", "jest", "e2e", "setup", "fixture", "based"],
2431
+ "features": [
2432
+ "Using `test.use()` to configure server path and port for automatic lifecycle management",
2433
+ "Importing `test` and `expect` from `@frontmcp/testing` (not from Jest) to access MCP-specific matchers",
2434
+ "Custom matchers: `toContainTool()`, `toBeSuccessful()`, `toHaveTextContent()` for MCP assertions",
2435
+ "Testing all three MCP primitives (tools, resources, prompts) in a single E2E suite"
2436
+ ]
2437
+ },
2438
+ {
2439
+ "name": "jest-config-with-coverage",
2440
+ "description": "Set up a Jest configuration file that enforces 95%+ coverage across all metrics for a FrontMCP library.",
2441
+ "level": "basic",
2442
+ "tags": ["testing", "jest", "setup", "config", "coverage"],
2443
+ "features": [
2444
+ "How to configure Jest with `ts-jest` for TypeScript test files",
2445
+ "Setting 95%+ coverage thresholds required by FrontMCP standards",
2446
+ "Proper `tsconfig.spec.json` that extends the base config and includes `.spec.ts` files"
2447
+ ]
2448
+ },
2449
+ {
2450
+ "name": "unit-test-tool-resource-prompt",
2451
+ "description": "Write unit tests for the three core MCP primitives, verifying that outputs match the expected MCP response shapes.",
2452
+ "level": "intermediate",
2453
+ "tags": ["testing", "jest", "unit-test", "setup", "unit", "tool"],
2454
+ "features": [
2455
+ "Testing tool `execute()` with a mock context object assigned via `Object.assign`",
2456
+ "Verifying resource `read()` output matches the MCP `ReadResourceResult` shape",
2457
+ "Verifying prompt `execute()` output matches the MCP `GetPromptResult` shape",
2458
+ "Using Jest matchers like `expect.stringContaining` and `expect.objectContaining` for flexible assertions"
2459
+ ]
2460
+ }
2461
+ ]
341
2462
  },
342
2463
  {
343
2464
  "name": "test-auth",
344
- "description": "Test authenticated MCP servers with TestTokenFactory, MockOAuthServer, and role-based access"
2465
+ "description": "Test authenticated MCP servers with TestTokenFactory, MockOAuthServer, and role-based access",
2466
+ "examples": [
2467
+ {
2468
+ "name": "oauth-flow-test",
2469
+ "description": "Use `MockOAuthServer` to simulate an OAuth identity provider and test the authorization code flow.",
2470
+ "level": "advanced",
2471
+ "tags": ["testing", "oauth", "auth", "flow"],
2472
+ "features": [
2473
+ "Setting up `MockOAuthServer` with a mock issuer URL and port",
2474
+ "Starting an OAuth flow with `startFlow()` specifying client ID, redirect URI, and scopes",
2475
+ "Verifying the authorization URL contains an authorization code",
2476
+ "Testing concurrent OAuth flows with different client configurations",
2477
+ "Proper cleanup with `mockOAuth.close()` in `afterAll`"
2478
+ ]
2479
+ },
2480
+ {
2481
+ "name": "role-based-access-test",
2482
+ "description": "Verify that tools enforce role-based access by testing admin and user tokens against protected endpoints.",
2483
+ "level": "intermediate",
2484
+ "tags": ["testing", "auth", "role", "based", "access"],
2485
+ "features": [
2486
+ "Creating tokens with different `roles` arrays to simulate admin and user access",
2487
+ "Testing that admin-only tools accept admin tokens and reject user tokens",
2488
+ "Verifying that user-level tools remain accessible to users with the correct role",
2489
+ "Each test creates and closes its own client for proper isolation"
2490
+ ]
2491
+ },
2492
+ {
2493
+ "name": "token-factory-test",
2494
+ "description": "Use `TestTokenFactory` to create tokens and verify authenticated and unauthenticated requests.",
2495
+ "level": "basic",
2496
+ "tags": ["testing", "auth", "token", "factory"],
2497
+ "features": [
2498
+ "Creating a `TestTokenFactory` with issuer and audience configuration",
2499
+ "Generating test tokens with specific subjects and scopes via `createToken()`",
2500
+ "Passing tokens to `server.connect({ authToken })` for authenticated client connections",
2501
+ "Verifying that unauthenticated requests are rejected with `isError`"
2502
+ ]
2503
+ }
2504
+ ]
345
2505
  },
346
2506
  {
347
2507
  "name": "test-browser-build",
348
- "description": "Validate browser build output for Node.js-free bundles and test with Playwright"
2508
+ "description": "Validate browser build output for Node.js-free bundles and test with Playwright",
2509
+ "examples": [
2510
+ {
2511
+ "name": "browser-bundle-validation",
2512
+ "description": "Verify that the browser build produces a valid bundle without Node.js-only module references.",
2513
+ "level": "basic",
2514
+ "tags": ["testing", "browser", "node", "bundle", "validation"],
2515
+ "features": [
2516
+ "Checking that the browser build output directory contains `.js` files",
2517
+ "Scanning the bundle for Node.js-only `require()` calls that would break in browsers",
2518
+ "Using dynamic `import()` to verify the bundle is loadable",
2519
+ "Targeting the `dist/browser/` directory where `frontmcp build --target browser` places output"
2520
+ ]
2521
+ },
2522
+ {
2523
+ "name": "playwright-browser-test",
2524
+ "description": "Use Playwright to test a browser-based MCP client that loads and calls tools from an MCP server.",
2525
+ "level": "advanced",
2526
+ "tags": ["testing", "browser", "playwright", "e2e"],
2527
+ "features": [
2528
+ "Using Playwright's `test` and `expect` from `@playwright/test` for browser E2E testing",
2529
+ "Waiting for DOM elements with `waitForSelector` before asserting tool list counts",
2530
+ "Filling form inputs and clicking buttons to simulate tool calls in the browser",
2531
+ "Asserting tool results via `textContent` on result elements",
2532
+ "Using the `.pw.spec.ts` file suffix required by FrontMCP naming conventions"
2533
+ ]
2534
+ }
2535
+ ]
349
2536
  },
350
2537
  {
351
2538
  "name": "test-cli-binary",
352
- "description": "Test CLI binary and SEA build for startup, health check, and JS bundle import"
2539
+ "description": "Test CLI binary and SEA build for startup, health check, and JS bundle import",
2540
+ "examples": [
2541
+ {
2542
+ "name": "binary-startup-test",
2543
+ "description": "Verify that a compiled CLI binary starts correctly and responds to health checks.",
2544
+ "level": "basic",
2545
+ "tags": ["testing", "cli", "binary", "startup"],
2546
+ "features": [
2547
+ "Using `execSync` to test that `--help` flag exits with code 0 and prints usage info",
2548
+ "Spawning the binary as a child process with `PORT=0` for dynamic port assignment",
2549
+ "Waiting for the \"listening\" log message before sending requests",
2550
+ "Testing the `/health` endpoint for server readiness",
2551
+ "Cleaning up the child process with `child.kill()`"
2552
+ ]
2553
+ },
2554
+ {
2555
+ "name": "js-bundle-import-test",
2556
+ "description": "Verify that the compiled JS bundle can be imported and exports the expected modules after a `frontmcp build` step.",
2557
+ "level": "intermediate",
2558
+ "tags": ["testing", "cli", "binary", "js", "bundle", "import"],
2559
+ "features": [
2560
+ "Using dynamic `import()` to test that the built JS bundle is importable",
2561
+ "Verifying the bundle has a default export (server class or factory)",
2562
+ "Testing CommonJS `require()` compatibility to ensure the bundle works in CJS environments",
2563
+ "Pointing to the `dist/` output directory where `frontmcp build` places artifacts"
2564
+ ]
2565
+ }
2566
+ ]
353
2567
  },
354
2568
  {
355
2569
  "name": "test-direct-client",
356
- "description": "In-memory testing with create() and connectOpenAI/connectClaude without HTTP overhead"
2570
+ "description": "In-memory testing with create() and connectOpenAI/connectClaude without HTTP overhead",
2571
+ "examples": [
2572
+ {
2573
+ "name": "basic-create-test",
2574
+ "description": "Test tools in-memory without any HTTP overhead using the `create()` function from `@frontmcp/sdk`.",
2575
+ "level": "basic",
2576
+ "tags": ["testing", "sdk", "transport", "direct-client", "direct", "client"],
2577
+ "features": [
2578
+ "Using `create()` to spin up an in-memory server with no HTTP transport",
2579
+ "Defining tools inline with the functional `tool()` API and Zod schemas",
2580
+ "Calling tools directly via `server.callTool()` and checking text content",
2581
+ "Proper cleanup with `server.dispose()` in each test"
2582
+ ]
2583
+ },
2584
+ {
2585
+ "name": "openai-claude-format-test",
2586
+ "description": "Verify that tools are returned in the correct format for OpenAI and Claude clients using `connectOpenAI` and `connectClaude`.",
2587
+ "level": "intermediate",
2588
+ "tags": ["testing", "openai", "anthropic", "direct-client", "direct", "client"],
2589
+ "features": [
2590
+ "Using `connectOpenAI()` with `serve: false` to get an in-memory client without starting an HTTP server",
2591
+ "Verifying OpenAI tool format: `{ type: 'function', function: { name, parameters } }`",
2592
+ "Using dynamic import for `connectClaude` to test Claude tool format: `{ name, description, input_schema }`",
2593
+ "Proper cleanup with `client.close()` after each test"
2594
+ ]
2595
+ }
2596
+ ]
357
2597
  },
358
2598
  {
359
2599
  "name": "test-e2e-handler",
360
- "description": "Full MCP protocol E2E tests over HTTP with McpTestClient and TestServer"
2600
+ "description": "Full MCP protocol E2E tests over HTTP with McpTestClient and TestServer",
2601
+ "examples": [
2602
+ {
2603
+ "name": "basic-e2e-test",
2604
+ "description": "Set up a basic E2E test that starts a server, connects a client, and verifies tools are listed.",
2605
+ "level": "basic",
2606
+ "tags": ["testing", "e2e", "handler"],
2607
+ "features": [
2608
+ "Using `TestServer.create()` to start a server from its module export",
2609
+ "Connecting a client via `server.connect()` for automatic base URL wiring",
2610
+ "Proper lifecycle management with `beforeAll` / `afterAll` for setup and teardown",
2611
+ "Using the `toContainTool` custom matcher from `@frontmcp/testing`"
2612
+ ]
2613
+ },
2614
+ {
2615
+ "name": "manual-client-with-transport",
2616
+ "description": "Use `McpTestClient.create()` with explicit transport settings for fine-grained control over E2E tests.",
2617
+ "level": "advanced",
2618
+ "tags": ["testing", "session", "transport", "e2e", "handler", "manual"],
2619
+ "features": [
2620
+ "Using `TestServer.start()` with an explicit command and port for process-based server startup",
2621
+ "Building a client with `McpTestClient.create().withTransport('modern').buildAndConnect()` for streamable HTTP + strict sessions",
2622
+ "Using `server.info.baseUrl` to wire the client to the correct address",
2623
+ "Separate `disconnect()` / `stop()` calls for client and server teardown",
2624
+ "The `toBeError()` and `toHaveTextContent()` custom matchers"
2625
+ ]
2626
+ },
2627
+ {
2628
+ "name": "tool-call-and-error-e2e",
2629
+ "description": "Test successful tool calls and verify that invalid inputs produce proper error responses over the full MCP protocol.",
2630
+ "level": "intermediate",
2631
+ "tags": ["testing", "e2e", "handler", "tool", "call", "error"],
2632
+ "features": [
2633
+ "Calling tools via `client.callTool()` and asserting success with `toBeSuccessful()`",
2634
+ "Verifying text content in tool results with `result.content[0].text`",
2635
+ "Checking `result.isError` for invalid input and nonexistent tool calls",
2636
+ "Testing edge cases like zero values and missing optional parameters"
2637
+ ]
2638
+ }
2639
+ ]
361
2640
  },
362
2641
  {
363
2642
  "name": "test-tool-unit",
364
- "description": "Unit test a ToolContext execute method with mock context, inputs, and Zod schema validation"
2643
+ "description": "Unit test a ToolContext execute method with mock context, inputs, and Zod schema validation",
2644
+ "examples": [
2645
+ {
2646
+ "name": "basic-tool-test",
2647
+ "description": "Test a simple tool's `execute()` method with mock context and verify the output.",
2648
+ "level": "basic",
2649
+ "tags": ["testing", "tool", "unit"],
2650
+ "features": [
2651
+ "Creating a mock `ToolContext` with all required methods (`get`, `tryGet`, `fail`, `mark`, `notify`, `respondProgress`)",
2652
+ "Assigning the mock context to the tool instance via `Object.assign`",
2653
+ "Testing multiple input scenarios including edge cases (negatives, zero)"
2654
+ ]
2655
+ },
2656
+ {
2657
+ "name": "schema-validation-test",
2658
+ "description": "Validate that a tool's Zod input schema rejects invalid data before `execute()` is called.",
2659
+ "level": "intermediate",
2660
+ "tags": ["testing", "tool", "unit", "schema", "validation"],
2661
+ "features": [
2662
+ "Testing the Zod input schema separately from the `execute()` method",
2663
+ "Using `safeParse()` to check validation results without throwing",
2664
+ "Covering rejection of wrong types, missing fields, and empty input",
2665
+ "Combining schema validation with execution to test the full flow"
2666
+ ]
2667
+ },
2668
+ {
2669
+ "name": "tool-error-handling-test",
2670
+ "description": "Test that a tool throws the correct MCP error classes with proper error codes and JSON-RPC error shapes.",
2671
+ "level": "advanced",
2672
+ "tags": ["testing", "json-rpc", "tool", "unit", "error", "handling"],
2673
+ "features": [
2674
+ "Verifying specific error classes with `toBeInstanceOf` instead of just checking that something threw",
2675
+ "Asserting MCP error codes from `MCP_ERROR_CODES` constants",
2676
+ "Validating the JSON-RPC error shape returned by `toJsonRpcError()`",
2677
+ "Testing both success and failure paths in the same suite"
2678
+ ]
2679
+ }
2680
+ ]
365
2681
  }
366
2682
  ]
367
2683
  }