@frontmcp/skills 1.0.0-beta.9 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/catalog/TEMPLATE.md +69 -0
- package/catalog/frontmcp-config/SKILL.md +38 -22
- package/catalog/frontmcp-config/examples/configure-auth/multi-app-auth.md +87 -0
- package/catalog/frontmcp-config/examples/configure-auth/public-mode-setup.md +63 -0
- package/catalog/frontmcp-config/examples/configure-auth/remote-oauth-with-vault.md +76 -0
- package/catalog/frontmcp-config/examples/configure-auth-modes/local-self-signed-tokens.md +77 -0
- package/catalog/frontmcp-config/examples/configure-auth-modes/remote-enterprise-oauth.md +73 -0
- package/catalog/frontmcp-config/examples/configure-auth-modes/transparent-jwt-validation.md +64 -0
- package/catalog/frontmcp-config/examples/configure-elicitation/basic-confirmation-gate.md +83 -0
- package/catalog/frontmcp-config/examples/configure-elicitation/distributed-elicitation-redis.md +87 -0
- package/catalog/frontmcp-config/examples/configure-http/cors-restricted-origins.md +52 -0
- package/catalog/frontmcp-config/examples/configure-http/entry-path-reverse-proxy.md +72 -0
- package/catalog/frontmcp-config/examples/configure-http/unix-socket-local.md +64 -0
- package/catalog/frontmcp-config/examples/configure-session/multi-server-key-prefix.md +68 -0
- package/catalog/frontmcp-config/examples/configure-session/redis-session-store.md +52 -0
- package/catalog/frontmcp-config/examples/configure-session/vercel-kv-session.md +52 -0
- package/catalog/frontmcp-config/examples/configure-throttle/distributed-redis-throttle.md +94 -0
- package/catalog/frontmcp-config/examples/configure-throttle/per-tool-rate-limit.md +92 -0
- package/catalog/frontmcp-config/examples/configure-throttle/server-level-rate-limit.md +83 -0
- package/catalog/frontmcp-config/examples/configure-throttle-guard-config/full-guard-config.md +99 -0
- package/catalog/frontmcp-config/examples/configure-throttle-guard-config/minimal-guard-config.md +55 -0
- package/catalog/frontmcp-config/examples/configure-transport/custom-protocol-flags.md +74 -0
- package/catalog/frontmcp-config/examples/configure-transport/distributed-sessions-redis.md +86 -0
- package/catalog/frontmcp-config/examples/configure-transport/stateless-serverless.md +69 -0
- package/catalog/frontmcp-config/examples/configure-transport-protocol-presets/legacy-preset-nodejs.md +65 -0
- package/catalog/frontmcp-config/examples/configure-transport-protocol-presets/stateless-api-serverless.md +69 -0
- package/catalog/frontmcp-config/references/configure-auth-modes.md +15 -0
- package/catalog/frontmcp-config/references/configure-auth.md +15 -0
- package/catalog/frontmcp-config/references/configure-elicitation.md +14 -0
- package/catalog/frontmcp-config/references/configure-http.md +15 -0
- package/catalog/frontmcp-config/references/configure-session.md +15 -0
- package/catalog/frontmcp-config/references/configure-throttle-guard-config.md +14 -0
- package/catalog/frontmcp-config/references/configure-throttle.md +15 -0
- package/catalog/frontmcp-config/references/configure-transport-protocol-presets.md +14 -0
- package/catalog/frontmcp-config/references/configure-transport.md +15 -0
- package/catalog/frontmcp-config/references/setup-redis.md +10 -0
- package/catalog/frontmcp-config/references/setup-sqlite.md +10 -0
- package/catalog/frontmcp-deployment/SKILL.md +40 -12
- package/catalog/frontmcp-deployment/examples/build-for-browser/browser-build-with-custom-entry.md +43 -0
- package/catalog/frontmcp-deployment/examples/build-for-browser/browser-crypto-and-storage.md +85 -0
- package/catalog/frontmcp-deployment/examples/build-for-browser/react-provider-setup.md +61 -0
- package/catalog/frontmcp-deployment/examples/build-for-cli/cli-binary-build.md +66 -0
- package/catalog/frontmcp-deployment/examples/build-for-cli/unix-socket-daemon.md +76 -0
- package/catalog/frontmcp-deployment/examples/build-for-sdk/connect-openai.md +78 -0
- package/catalog/frontmcp-deployment/examples/build-for-sdk/create-flat-config.md +85 -0
- package/catalog/frontmcp-deployment/examples/build-for-sdk/multi-platform-connect.md +104 -0
- package/catalog/frontmcp-deployment/examples/deploy-to-cloudflare/basic-worker-deploy.md +82 -0
- package/catalog/frontmcp-deployment/examples/deploy-to-cloudflare/worker-custom-domain.md +97 -0
- package/catalog/frontmcp-deployment/examples/deploy-to-cloudflare/worker-with-kv-storage.md +92 -0
- package/catalog/frontmcp-deployment/examples/deploy-to-lambda/cdk-deployment.md +92 -0
- package/catalog/frontmcp-deployment/examples/deploy-to-lambda/lambda-handler-with-cors.md +113 -0
- package/catalog/frontmcp-deployment/examples/deploy-to-lambda/sam-template-basic.md +100 -0
- package/catalog/frontmcp-deployment/examples/deploy-to-node/docker-compose-with-redis.md +101 -0
- package/catalog/frontmcp-deployment/examples/deploy-to-node/pm2-with-nginx.md +79 -0
- package/catalog/frontmcp-deployment/examples/deploy-to-node/resource-limits.md +92 -0
- package/catalog/frontmcp-deployment/examples/deploy-to-node-dockerfile/basic-multistage-dockerfile.md +63 -0
- package/catalog/frontmcp-deployment/examples/deploy-to-node-dockerfile/secure-nonroot-dockerfile.md +89 -0
- package/catalog/frontmcp-deployment/examples/deploy-to-vercel/vercel-mcp-endpoint-test.md +69 -0
- package/catalog/frontmcp-deployment/examples/deploy-to-vercel/vercel-with-kv.md +82 -0
- package/catalog/frontmcp-deployment/examples/deploy-to-vercel/vercel-with-skills-cache.md +90 -0
- package/catalog/frontmcp-deployment/examples/deploy-to-vercel-config/minimal-vercel-config.md +49 -0
- package/catalog/frontmcp-deployment/examples/deploy-to-vercel-config/vercel-config-with-security-headers.md +92 -0
- package/catalog/frontmcp-deployment/references/build-for-browser.md +15 -0
- package/catalog/frontmcp-deployment/references/build-for-cli.md +65 -3
- package/catalog/frontmcp-deployment/references/build-for-sdk.md +15 -0
- package/catalog/frontmcp-deployment/references/deploy-to-cloudflare.md +15 -0
- package/catalog/frontmcp-deployment/references/deploy-to-lambda.md +18 -3
- package/catalog/frontmcp-deployment/references/deploy-to-node-dockerfile.md +16 -2
- package/catalog/frontmcp-deployment/references/deploy-to-node.md +19 -4
- package/catalog/frontmcp-deployment/references/deploy-to-vercel-config.md +14 -0
- package/catalog/frontmcp-deployment/references/deploy-to-vercel.md +15 -0
- package/catalog/frontmcp-development/SKILL.md +25 -17
- package/catalog/frontmcp-development/examples/create-adapter/basic-api-adapter.md +92 -0
- package/catalog/frontmcp-development/examples/create-adapter/namespaced-adapter.md +124 -0
- package/catalog/frontmcp-development/examples/create-agent/basic-agent-with-tools.md +121 -0
- package/catalog/frontmcp-development/examples/create-agent/custom-multi-pass-agent.md +95 -0
- package/catalog/frontmcp-development/examples/create-agent/nested-agents-with-swarm.md +111 -0
- package/catalog/frontmcp-development/examples/create-agent-llm-config/anthropic-config.md +81 -0
- package/catalog/frontmcp-development/examples/create-agent-llm-config/openai-config.md +80 -0
- package/catalog/frontmcp-development/examples/create-job/basic-report-job.md +87 -0
- package/catalog/frontmcp-development/examples/create-job/job-with-permissions.md +117 -0
- package/catalog/frontmcp-development/examples/create-job/job-with-retry.md +88 -0
- package/catalog/frontmcp-development/examples/create-plugin/basic-plugin-with-provider.md +69 -0
- package/catalog/frontmcp-development/examples/create-plugin/configurable-dynamic-plugin.md +178 -0
- package/catalog/frontmcp-development/examples/create-plugin/plugin-with-context-extension.md +107 -0
- package/catalog/frontmcp-development/examples/create-plugin-hooks/basic-logging-plugin.md +69 -0
- package/catalog/frontmcp-development/examples/create-plugin-hooks/caching-with-around.md +80 -0
- package/catalog/frontmcp-development/examples/create-plugin-hooks/tool-level-hooks-and-stage-replacement.md +100 -0
- package/catalog/frontmcp-development/examples/create-prompt/basic-prompt.md +72 -0
- package/catalog/frontmcp-development/examples/create-prompt/dynamic-rag-prompt.md +92 -0
- package/catalog/frontmcp-development/examples/create-prompt/multi-turn-debug-session.md +86 -0
- package/catalog/frontmcp-development/examples/create-provider/basic-database-provider.md +113 -0
- package/catalog/frontmcp-development/examples/create-provider/config-and-api-providers.md +107 -0
- package/catalog/frontmcp-development/examples/create-resource/basic-static-resource.md +72 -0
- package/catalog/frontmcp-development/examples/create-resource/binary-and-multi-content.md +111 -0
- package/catalog/frontmcp-development/examples/create-resource/parameterized-template.md +84 -0
- package/catalog/frontmcp-development/examples/create-skill/basic-inline-skill.md +96 -0
- package/catalog/frontmcp-development/examples/create-skill/directory-based-skill.md +115 -0
- package/catalog/frontmcp-development/examples/create-skill/parameterized-skill.md +96 -0
- package/catalog/frontmcp-development/examples/create-skill-with-tools/basic-tool-orchestration.md +76 -0
- package/catalog/frontmcp-development/examples/create-skill-with-tools/directory-skill-with-tools.md +149 -0
- package/catalog/frontmcp-development/examples/create-skill-with-tools/incident-response-skill.md +92 -0
- package/catalog/frontmcp-development/examples/create-tool/basic-class-tool.md +62 -0
- package/catalog/frontmcp-development/examples/create-tool/tool-with-di-and-errors.md +84 -0
- package/catalog/frontmcp-development/examples/create-tool/tool-with-rate-limiting-and-progress.md +93 -0
- package/catalog/frontmcp-development/examples/create-tool-annotations/destructive-delete-tool.md +94 -0
- package/catalog/frontmcp-development/examples/create-tool-annotations/readonly-query-tool.md +60 -0
- package/catalog/frontmcp-development/examples/create-tool-output-schema-types/primitive-and-media-outputs.md +104 -0
- package/catalog/frontmcp-development/examples/create-tool-output-schema-types/zod-raw-shape-output.md +63 -0
- package/catalog/frontmcp-development/examples/create-tool-output-schema-types/zod-schema-advanced-output.md +103 -0
- package/catalog/frontmcp-development/examples/create-workflow/basic-deploy-pipeline.md +91 -0
- package/catalog/frontmcp-development/examples/create-workflow/parallel-validation-pipeline.md +90 -0
- package/catalog/frontmcp-development/examples/create-workflow/webhook-triggered-workflow.md +136 -0
- package/catalog/frontmcp-development/examples/decorators-guide/agent-skill-job-workflow.md +145 -0
- package/catalog/frontmcp-development/examples/decorators-guide/basic-server-with-app-and-tools.md +124 -0
- package/catalog/frontmcp-development/examples/decorators-guide/multi-app-with-plugins-and-providers.md +149 -0
- package/catalog/frontmcp-development/examples/official-adapters/authenticated-adapter-with-polling.md +84 -0
- package/catalog/frontmcp-development/examples/official-adapters/basic-openapi-adapter.md +54 -0
- package/catalog/frontmcp-development/examples/official-adapters/multi-api-hub-with-inline-spec.md +130 -0
- package/catalog/frontmcp-development/examples/official-plugins/cache-and-feature-flags.md +117 -0
- package/catalog/frontmcp-development/examples/official-plugins/production-multi-plugin-setup.md +147 -0
- package/catalog/frontmcp-development/examples/official-plugins/remember-plugin-session-memory.md +104 -0
- package/catalog/frontmcp-development/references/create-adapter.md +14 -0
- package/catalog/frontmcp-development/references/create-agent-llm-config.md +14 -0
- package/catalog/frontmcp-development/references/create-agent.md +15 -0
- package/catalog/frontmcp-development/references/create-job.md +15 -0
- package/catalog/frontmcp-development/references/create-plugin-hooks.md +51 -0
- package/catalog/frontmcp-development/references/create-plugin.md +186 -11
- package/catalog/frontmcp-development/references/create-prompt.md +17 -0
- package/catalog/frontmcp-development/references/create-provider.md +14 -0
- package/catalog/frontmcp-development/references/create-resource.md +127 -0
- package/catalog/frontmcp-development/references/create-skill-with-tools.md +126 -7
- package/catalog/frontmcp-development/references/create-skill.md +57 -12
- package/catalog/frontmcp-development/references/create-tool-annotations.md +14 -0
- package/catalog/frontmcp-development/references/create-tool-output-schema-types.md +15 -0
- package/catalog/frontmcp-development/references/create-tool.md +205 -1
- package/catalog/frontmcp-development/references/create-workflow.md +15 -0
- package/catalog/frontmcp-development/references/decorators-guide.md +155 -78
- package/catalog/frontmcp-development/references/official-adapters.md +31 -16
- package/catalog/frontmcp-development/references/official-plugins.md +62 -28
- package/catalog/frontmcp-extensibility/SKILL.md +103 -0
- package/catalog/frontmcp-extensibility/examples/vectoriadb/product-catalog-search.md +175 -0
- package/catalog/frontmcp-extensibility/examples/vectoriadb/semantic-search-with-persistence.md +138 -0
- package/catalog/frontmcp-extensibility/examples/vectoriadb/tfidf-keyword-search.md +103 -0
- package/catalog/frontmcp-extensibility/references/vectoriadb.md +299 -0
- package/catalog/frontmcp-guides/SKILL.md +7 -4
- package/catalog/frontmcp-guides/examples/example-knowledge-base/agent-and-plugin.md +160 -0
- package/catalog/frontmcp-guides/examples/example-knowledge-base/multi-app-composition.md +92 -0
- package/catalog/frontmcp-guides/examples/example-knowledge-base/vector-search-and-resources.md +135 -0
- package/catalog/frontmcp-guides/examples/example-task-manager/auth-and-crud-tools.md +135 -0
- package/catalog/frontmcp-guides/examples/example-task-manager/authenticated-e2e-tests.md +148 -0
- package/catalog/frontmcp-guides/examples/example-task-manager/redis-provider-with-di.md +129 -0
- package/catalog/frontmcp-guides/examples/example-weather-api/server-and-app-setup.md +75 -0
- package/catalog/frontmcp-guides/examples/example-weather-api/unit-and-e2e-tests.md +142 -0
- package/catalog/frontmcp-guides/examples/example-weather-api/weather-tool-with-schemas.md +74 -0
- package/catalog/frontmcp-guides/references/example-knowledge-base.md +15 -0
- package/catalog/frontmcp-guides/references/example-task-manager.md +30 -21
- package/catalog/frontmcp-guides/references/example-weather-api.md +18 -6
- package/catalog/frontmcp-observability/SKILL.md +144 -0
- package/catalog/frontmcp-observability/examples/structured-logging/stdout-logging.md +71 -0
- package/catalog/frontmcp-observability/examples/structured-logging/winston-integration.md +70 -0
- package/catalog/frontmcp-observability/examples/telemetry-api/agent-nested-tracing.md +86 -0
- package/catalog/frontmcp-observability/examples/telemetry-api/plugin-telemetry.md +93 -0
- package/catalog/frontmcp-observability/examples/telemetry-api/tool-custom-spans.md +72 -0
- package/catalog/frontmcp-observability/examples/testing-observability/test-custom-spans.md +90 -0
- package/catalog/frontmcp-observability/examples/testing-observability/test-log-correlation.md +104 -0
- package/catalog/frontmcp-observability/examples/tracing-setup/basic-tracing.md +82 -0
- package/catalog/frontmcp-observability/examples/tracing-setup/production-tracing.md +73 -0
- package/catalog/frontmcp-observability/examples/vendor-integrations/coralogix-setup.md +74 -0
- package/catalog/frontmcp-observability/references/structured-logging.md +114 -0
- package/catalog/frontmcp-observability/references/telemetry-api.md +155 -0
- package/catalog/frontmcp-observability/references/testing-observability.md +169 -0
- package/catalog/frontmcp-observability/references/tracing-setup.md +146 -0
- package/catalog/frontmcp-observability/references/vendor-integrations.md +164 -0
- package/catalog/frontmcp-production-readiness/SKILL.md +99 -0
- package/catalog/frontmcp-production-readiness/examples/common-checklist/caching-and-performance.md +102 -0
- package/catalog/frontmcp-production-readiness/examples/common-checklist/observability-setup.md +104 -0
- package/catalog/frontmcp-production-readiness/examples/common-checklist/security-hardening.md +95 -0
- package/catalog/frontmcp-production-readiness/examples/health-readiness-endpoints/basic-health-setup.md +81 -0
- package/catalog/frontmcp-production-readiness/examples/health-readiness-endpoints/custom-probes.md +136 -0
- package/catalog/frontmcp-production-readiness/examples/production-browser/browser-bundle-config.md +93 -0
- package/catalog/frontmcp-production-readiness/examples/production-browser/cross-platform-crypto.md +116 -0
- package/catalog/frontmcp-production-readiness/examples/production-browser/security-and-performance.md +128 -0
- package/catalog/frontmcp-production-readiness/examples/production-cli-binary/binary-build-config.md +109 -0
- package/catalog/frontmcp-production-readiness/examples/production-cli-binary/stdio-transport-error-handling.md +132 -0
- package/catalog/frontmcp-production-readiness/examples/production-cli-daemon/daemon-socket-config.md +82 -0
- package/catalog/frontmcp-production-readiness/examples/production-cli-daemon/graceful-shutdown-cleanup.md +107 -0
- package/catalog/frontmcp-production-readiness/examples/production-cli-daemon/security-and-permissions.md +119 -0
- package/catalog/frontmcp-production-readiness/examples/production-cloudflare/durable-objects-state.md +124 -0
- package/catalog/frontmcp-production-readiness/examples/production-cloudflare/workers-runtime-constraints.md +103 -0
- package/catalog/frontmcp-production-readiness/examples/production-cloudflare/wrangler-config.md +89 -0
- package/catalog/frontmcp-production-readiness/examples/production-lambda/cold-start-connection-reuse.md +122 -0
- package/catalog/frontmcp-production-readiness/examples/production-lambda/sam-template.md +107 -0
- package/catalog/frontmcp-production-readiness/examples/production-lambda/scaling-and-monitoring.md +138 -0
- package/catalog/frontmcp-production-readiness/examples/production-node-sdk/basic-sdk-lifecycle.md +85 -0
- package/catalog/frontmcp-production-readiness/examples/production-node-sdk/multi-instance-cleanup.md +110 -0
- package/catalog/frontmcp-production-readiness/examples/production-node-sdk/package-json-config.md +107 -0
- package/catalog/frontmcp-production-readiness/examples/production-node-server/docker-multi-stage.md +103 -0
- package/catalog/frontmcp-production-readiness/examples/production-node-server/graceful-shutdown.md +87 -0
- package/catalog/frontmcp-production-readiness/examples/production-node-server/redis-session-scaling.md +97 -0
- package/catalog/frontmcp-production-readiness/examples/production-vercel/cold-start-optimization.md +104 -0
- package/catalog/frontmcp-production-readiness/examples/production-vercel/stateless-serverless-design.md +91 -0
- package/catalog/frontmcp-production-readiness/examples/production-vercel/vercel-edge-config.md +78 -0
- package/catalog/frontmcp-production-readiness/references/common-checklist.md +175 -0
- package/catalog/frontmcp-production-readiness/references/health-readiness-endpoints.md +198 -0
- package/catalog/frontmcp-production-readiness/references/production-browser.md +56 -0
- package/catalog/frontmcp-production-readiness/references/production-cli-binary.md +71 -0
- package/catalog/frontmcp-production-readiness/references/production-cli-daemon.md +71 -0
- package/catalog/frontmcp-production-readiness/references/production-cloudflare.md +62 -0
- package/catalog/frontmcp-production-readiness/references/production-lambda.md +63 -0
- package/catalog/frontmcp-production-readiness/references/production-node-sdk.md +76 -0
- package/catalog/frontmcp-production-readiness/references/production-node-server.md +71 -0
- package/catalog/frontmcp-production-readiness/references/production-vercel.md +62 -0
- package/catalog/frontmcp-setup/SKILL.md +19 -14
- package/catalog/frontmcp-setup/examples/frontmcp-skills-usage/bundle-presets-scaffolding.md +61 -0
- package/catalog/frontmcp-setup/examples/frontmcp-skills-usage/install-and-search-skills.md +83 -0
- package/catalog/frontmcp-setup/examples/multi-app-composition/local-apps-with-shared-tools.md +87 -0
- package/catalog/frontmcp-setup/examples/multi-app-composition/per-app-auth-and-isolation.md +88 -0
- package/catalog/frontmcp-setup/examples/multi-app-composition/remote-and-esm-apps.md +81 -0
- package/catalog/frontmcp-setup/examples/nx-workflow/build-test-affected.md +77 -0
- package/catalog/frontmcp-setup/examples/nx-workflow/multi-server-deployment.md +93 -0
- package/catalog/frontmcp-setup/examples/nx-workflow/scaffold-and-generate.md +62 -0
- package/catalog/frontmcp-setup/examples/project-structure-nx/nx-generator-scaffolding.md +73 -0
- package/catalog/frontmcp-setup/examples/project-structure-nx/nx-workspace-with-apps.md +85 -0
- package/catalog/frontmcp-setup/examples/project-structure-nx/shared-library-usage.md +89 -0
- package/catalog/frontmcp-setup/examples/project-structure-standalone/dev-workflow-commands.md +64 -0
- package/catalog/frontmcp-setup/examples/project-structure-standalone/feature-folder-organization.md +111 -0
- package/catalog/frontmcp-setup/examples/project-structure-standalone/minimal-standalone-layout.md +73 -0
- package/catalog/frontmcp-setup/examples/readme-guide/node-server-readme.md +89 -0
- package/catalog/frontmcp-setup/examples/readme-guide/vercel-deployment-readme.md +90 -0
- package/catalog/frontmcp-setup/examples/setup-project/basic-node-server.md +99 -0
- package/catalog/frontmcp-setup/examples/setup-project/cli-scaffold-with-flags.md +77 -0
- package/catalog/frontmcp-setup/examples/setup-project/vercel-serverless-server.md +89 -0
- package/catalog/frontmcp-setup/examples/setup-redis/docker-redis-local-dev.md +88 -0
- package/catalog/frontmcp-setup/examples/setup-redis/hybrid-vercel-kv-with-pubsub.md +78 -0
- package/catalog/frontmcp-setup/examples/setup-redis/vercel-kv-serverless.md +78 -0
- package/catalog/frontmcp-setup/examples/setup-sqlite/basic-sqlite-setup.md +75 -0
- package/catalog/frontmcp-setup/examples/setup-sqlite/encrypted-sqlite-storage.md +55 -0
- package/catalog/frontmcp-setup/examples/setup-sqlite/unix-socket-daemon.md +70 -0
- package/catalog/frontmcp-setup/references/frontmcp-skills-usage.md +33 -9
- package/catalog/frontmcp-setup/references/multi-app-composition.md +15 -0
- package/catalog/frontmcp-setup/references/nx-workflow.md +15 -0
- package/catalog/frontmcp-setup/references/project-structure-nx.md +15 -0
- package/catalog/frontmcp-setup/references/project-structure-standalone.md +15 -0
- package/catalog/frontmcp-setup/references/readme-guide.md +235 -0
- package/catalog/frontmcp-setup/references/setup-project.md +16 -1
- package/catalog/frontmcp-setup/references/setup-redis.md +15 -0
- package/catalog/frontmcp-setup/references/setup-sqlite.md +15 -0
- package/catalog/frontmcp-testing/SKILL.md +41 -27
- package/catalog/frontmcp-testing/examples/setup-testing/fixture-based-e2e-test.md +70 -0
- package/catalog/frontmcp-testing/examples/setup-testing/jest-config-with-coverage.md +59 -0
- package/catalog/frontmcp-testing/examples/setup-testing/unit-test-tool-resource-prompt.md +115 -0
- package/catalog/frontmcp-testing/examples/test-auth/oauth-flow-test.md +78 -0
- package/catalog/frontmcp-testing/examples/test-auth/role-based-access-test.md +88 -0
- package/catalog/frontmcp-testing/examples/test-auth/token-factory-test.md +71 -0
- package/catalog/frontmcp-testing/examples/test-browser-build/browser-bundle-validation.md +58 -0
- package/catalog/frontmcp-testing/examples/test-browser-build/playwright-browser-test.md +69 -0
- package/catalog/frontmcp-testing/examples/test-cli-binary/binary-startup-test.md +77 -0
- package/catalog/frontmcp-testing/examples/test-cli-binary/js-bundle-import-test.md +56 -0
- package/catalog/frontmcp-testing/examples/test-direct-client/basic-create-test.md +74 -0
- package/catalog/frontmcp-testing/examples/test-direct-client/openai-claude-format-test.md +79 -0
- package/catalog/frontmcp-testing/examples/test-e2e-handler/basic-e2e-test.md +67 -0
- package/catalog/frontmcp-testing/examples/test-e2e-handler/manual-client-with-transport.md +72 -0
- package/catalog/frontmcp-testing/examples/test-e2e-handler/tool-call-and-error-e2e.md +73 -0
- package/catalog/frontmcp-testing/examples/test-tool-unit/basic-tool-test.md +69 -0
- package/catalog/frontmcp-testing/examples/test-tool-unit/schema-validation-test.md +82 -0
- package/catalog/frontmcp-testing/examples/test-tool-unit/tool-error-handling-test.md +92 -0
- package/catalog/frontmcp-testing/references/setup-testing.md +17 -0
- package/catalog/frontmcp-testing/references/test-auth.md +15 -0
- package/catalog/frontmcp-testing/references/test-browser-build.md +14 -0
- package/catalog/frontmcp-testing/references/test-cli-binary.md +14 -0
- package/catalog/frontmcp-testing/references/test-direct-client.md +14 -0
- package/catalog/frontmcp-testing/references/test-e2e-handler.md +15 -0
- package/catalog/frontmcp-testing/references/test-tool-unit.md +15 -0
- package/catalog/skills-manifest.json +2849 -32
- package/package.json +2 -2
- package/src/index.d.ts +1 -1
- package/src/index.js.map +1 -1
- package/src/loader.js +0 -1
- package/src/loader.js.map +1 -1
- package/src/manifest.d.ts +36 -1
- package/src/manifest.js +6 -1
- package/src/manifest.js.map +1 -1
|
@@ -2,64 +2,2881 @@
|
|
|
2
2
|
"version": 1,
|
|
3
3
|
"skills": [
|
|
4
4
|
{
|
|
5
|
-
"name": "frontmcp-
|
|
6
|
-
"category": "
|
|
7
|
-
"description": "
|
|
8
|
-
"path": "frontmcp-
|
|
9
|
-
"targets": ["all"],
|
|
10
|
-
"hasResources": true,
|
|
11
|
-
"tags": ["router", "setup", "scaffold", "project", "nx", "redis", "sqlite", "structure", "guide"],
|
|
12
|
-
"bundle": ["recommended", "minimal", "full"]
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
"name": "frontmcp-development",
|
|
16
|
-
"category": "development",
|
|
17
|
-
"description": "Domain router for building MCP components \u2014 tools, resources, prompts, agents, providers, jobs, workflows, and skills. Use when starting any FrontMCP development task and need to find the right skill.",
|
|
18
|
-
"path": "frontmcp-development",
|
|
5
|
+
"name": "frontmcp-config",
|
|
6
|
+
"category": "config",
|
|
7
|
+
"description": "Use when you want to configure auth, set up CORS, add rate limiting, throttle requests, manage sessions, choose transport, set HTTP options, add authentication, configure JWT, or set up OAuth. The skill for server CONFIGURATION.",
|
|
8
|
+
"path": "frontmcp-config",
|
|
19
9
|
"targets": ["all"],
|
|
20
10
|
"hasResources": true,
|
|
21
|
-
"tags": ["router", "
|
|
22
|
-
"bundle": ["recommended", "
|
|
11
|
+
"tags": ["router", "config", "transport", "http", "auth", "session", "redis", "sqlite", "throttle", "guide"],
|
|
12
|
+
"bundle": ["recommended", "full"],
|
|
13
|
+
"references": [
|
|
14
|
+
{
|
|
15
|
+
"name": "configure-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
|
+
]
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"name": "configure-auth",
|
|
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
|
+
]
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"name": "configure-elicitation",
|
|
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
|
+
]
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"name": "configure-http",
|
|
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
|
+
]
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
"name": "configure-session",
|
|
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
|
+
]
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"name": "configure-throttle-guard-config",
|
|
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
|
+
]
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
"name": "configure-throttle",
|
|
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
|
+
]
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
"name": "configure-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
|
+
]
|
|
313
|
+
},
|
|
314
|
+
{
|
|
315
|
+
"name": "configure-transport",
|
|
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
|
+
]
|
|
357
|
+
},
|
|
358
|
+
{
|
|
359
|
+
"name": "setup-redis",
|
|
360
|
+
"description": "Cross-reference to the full Redis configuration guide in frontmcp-setup",
|
|
361
|
+
"examples": []
|
|
362
|
+
},
|
|
363
|
+
{
|
|
364
|
+
"name": "setup-sqlite",
|
|
365
|
+
"description": "Cross-reference to the full SQLite configuration guide in frontmcp-setup",
|
|
366
|
+
"examples": []
|
|
367
|
+
}
|
|
368
|
+
]
|
|
23
369
|
},
|
|
24
370
|
{
|
|
25
371
|
"name": "frontmcp-deployment",
|
|
26
372
|
"category": "deployment",
|
|
27
|
-
"description": "
|
|
373
|
+
"description": "Use when you need to deploy, build for production, containerize, or ship a FrontMCP server. Covers Vercel, Lambda, Cloudflare, Docker, edge runtime, serverless, bundle for CLI, and Node targets. Triggers: deploy, build for production, dockerize, serverless, go live.",
|
|
28
374
|
"path": "frontmcp-deployment",
|
|
29
375
|
"targets": ["all"],
|
|
30
376
|
"hasResources": true,
|
|
31
377
|
"tags": ["router", "deployment", "node", "vercel", "lambda", "cloudflare", "cli", "browser", "sdk", "guide"],
|
|
32
|
-
"bundle": ["recommended", "minimal", "full"]
|
|
378
|
+
"bundle": ["recommended", "minimal", "full"],
|
|
379
|
+
"references": [
|
|
380
|
+
{
|
|
381
|
+
"name": "build-for-browser",
|
|
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
|
+
]
|
|
415
|
+
},
|
|
416
|
+
{
|
|
417
|
+
"name": "build-for-cli",
|
|
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
|
+
]
|
|
443
|
+
},
|
|
444
|
+
{
|
|
445
|
+
"name": "build-for-sdk",
|
|
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
|
+
]
|
|
482
|
+
},
|
|
483
|
+
{
|
|
484
|
+
"name": "deploy-to-cloudflare",
|
|
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
|
+
]
|
|
521
|
+
},
|
|
522
|
+
{
|
|
523
|
+
"name": "deploy-to-lambda",
|
|
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
|
+
]
|
|
560
|
+
},
|
|
561
|
+
{
|
|
562
|
+
"name": "deploy-to-node-dockerfile",
|
|
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
|
+
]
|
|
588
|
+
},
|
|
589
|
+
{
|
|
590
|
+
"name": "deploy-to-node",
|
|
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
|
+
]
|
|
627
|
+
},
|
|
628
|
+
{
|
|
629
|
+
"name": "deploy-to-vercel-config",
|
|
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
|
+
]
|
|
655
|
+
},
|
|
656
|
+
{
|
|
657
|
+
"name": "deploy-to-vercel",
|
|
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
|
+
]
|
|
694
|
+
}
|
|
695
|
+
]
|
|
33
696
|
},
|
|
34
697
|
{
|
|
35
|
-
"name": "frontmcp-
|
|
36
|
-
"category": "
|
|
37
|
-
"description": "
|
|
38
|
-
"path": "frontmcp-
|
|
698
|
+
"name": "frontmcp-development",
|
|
699
|
+
"category": "development",
|
|
700
|
+
"description": "Use when you want to create a tool, add a resource, build a prompt, write a provider, implement an adapter, add OpenAPI integration, create a plugin, agent, job, or workflow. The skill for BUILDING any FrontMCP component.",
|
|
701
|
+
"path": "frontmcp-development",
|
|
39
702
|
"targets": ["all"],
|
|
40
703
|
"hasResources": true,
|
|
41
|
-
"tags": ["router", "
|
|
42
|
-
"bundle": ["recommended", "full"]
|
|
704
|
+
"tags": ["router", "development", "tools", "resources", "prompts", "agents", "skills", "guide"],
|
|
705
|
+
"bundle": ["recommended", "minimal", "full"],
|
|
706
|
+
"references": [
|
|
707
|
+
{
|
|
708
|
+
"name": "create-adapter",
|
|
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
|
+
]
|
|
736
|
+
},
|
|
737
|
+
{
|
|
738
|
+
"name": "create-agent-llm-config",
|
|
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
|
+
]
|
|
766
|
+
},
|
|
767
|
+
{
|
|
768
|
+
"name": "create-agent",
|
|
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
|
+
]
|
|
809
|
+
},
|
|
810
|
+
{
|
|
811
|
+
"name": "create-job",
|
|
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
|
+
]
|
|
850
|
+
},
|
|
851
|
+
{
|
|
852
|
+
"name": "create-plugin-hooks",
|
|
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
|
+
]
|
|
893
|
+
},
|
|
894
|
+
{
|
|
895
|
+
"name": "create-plugin",
|
|
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
|
+
]
|
|
937
|
+
},
|
|
938
|
+
{
|
|
939
|
+
"name": "create-prompt",
|
|
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
|
+
]
|
|
979
|
+
},
|
|
980
|
+
{
|
|
981
|
+
"name": "create-provider",
|
|
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
|
+
]
|
|
1009
|
+
},
|
|
1010
|
+
{
|
|
1011
|
+
"name": "create-resource",
|
|
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
|
+
]
|
|
1051
|
+
},
|
|
1052
|
+
{
|
|
1053
|
+
"name": "create-skill-with-tools",
|
|
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
|
+
]
|
|
1095
|
+
},
|
|
1096
|
+
{
|
|
1097
|
+
"name": "create-skill",
|
|
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
|
+
]
|
|
1139
|
+
},
|
|
1140
|
+
{
|
|
1141
|
+
"name": "create-tool-annotations",
|
|
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
|
+
]
|
|
1171
|
+
},
|
|
1172
|
+
{
|
|
1173
|
+
"name": "create-tool-output-schema-types",
|
|
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
|
+
]
|
|
1214
|
+
},
|
|
1215
|
+
{
|
|
1216
|
+
"name": "create-tool",
|
|
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
|
+
]
|
|
1257
|
+
},
|
|
1258
|
+
{
|
|
1259
|
+
"name": "create-workflow",
|
|
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
|
+
]
|
|
1301
|
+
},
|
|
1302
|
+
{
|
|
1303
|
+
"name": "decorators-guide",
|
|
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
|
+
]
|
|
1348
|
+
},
|
|
1349
|
+
{
|
|
1350
|
+
"name": "official-adapters",
|
|
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
|
+
]
|
|
1392
|
+
},
|
|
1393
|
+
{
|
|
1394
|
+
"name": "official-plugins",
|
|
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
|
+
]
|
|
1442
|
+
}
|
|
1443
|
+
]
|
|
43
1444
|
},
|
|
44
1445
|
{
|
|
45
|
-
"name": "frontmcp-
|
|
46
|
-
"category": "
|
|
47
|
-
"description": "
|
|
48
|
-
"path": "frontmcp-
|
|
1446
|
+
"name": "frontmcp-extensibility",
|
|
1447
|
+
"category": "extensibility",
|
|
1448
|
+
"description": "Extend FrontMCP servers with external npm packages and libraries. Covers VectoriaDB for semantic search, and patterns for integrating third-party services into providers and tools. Use when adding search, ML, database, or external API capabilities beyond the core SDK.",
|
|
1449
|
+
"path": "frontmcp-extensibility",
|
|
49
1450
|
"targets": ["all"],
|
|
50
1451
|
"hasResources": true,
|
|
51
|
-
"tags": ["
|
|
52
|
-
"bundle": ["
|
|
1452
|
+
"tags": ["extensibility", "vectoriadb", "search", "integration", "npm", "provider", "external-services"],
|
|
1453
|
+
"bundle": ["full"],
|
|
1454
|
+
"references": [
|
|
1455
|
+
{
|
|
1456
|
+
"name": "vectoriadb",
|
|
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
|
+
]
|
|
1501
|
+
}
|
|
1502
|
+
]
|
|
53
1503
|
},
|
|
54
1504
|
{
|
|
55
1505
|
"name": "frontmcp-guides",
|
|
56
1506
|
"category": "guides",
|
|
57
|
-
"description": "
|
|
1507
|
+
"description": "Tutorials, walkthroughs, and end-to-end examples for building FrontMCP servers. Use when you want a getting started guide, how to build a complete project, learn best practices, or follow a step-by-step example. Triggers: tutorial, walkthrough, how to build, getting started, learn FrontMCP.",
|
|
58
1508
|
"path": "frontmcp-guides",
|
|
59
1509
|
"targets": ["all"],
|
|
60
1510
|
"hasResources": true,
|
|
61
1511
|
"tags": ["guides", "examples", "best-practices", "architecture", "walkthrough", "end-to-end"],
|
|
62
|
-
"bundle": ["recommended", "full"]
|
|
1512
|
+
"bundle": ["recommended", "full"],
|
|
1513
|
+
"references": [
|
|
1514
|
+
{
|
|
1515
|
+
"name": "example-knowledge-base",
|
|
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
|
+
]
|
|
1558
|
+
},
|
|
1559
|
+
{
|
|
1560
|
+
"name": "example-task-manager",
|
|
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
|
+
]
|
|
1604
|
+
},
|
|
1605
|
+
{
|
|
1606
|
+
"name": "example-weather-api",
|
|
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
|
+
]
|
|
1648
|
+
}
|
|
1649
|
+
]
|
|
1650
|
+
},
|
|
1651
|
+
{
|
|
1652
|
+
"name": "frontmcp-production-readiness",
|
|
1653
|
+
"category": "production",
|
|
1654
|
+
"description": "Pre-production audit and checklist for FrontMCP servers. Use before go-live to verify security hardening, performance checks, observability, monitoring, and health checks. Triggers: production ready, security audit, performance check, production checklist, hardening, go live.",
|
|
1655
|
+
"path": "frontmcp-production-readiness",
|
|
1656
|
+
"targets": ["all"],
|
|
1657
|
+
"hasResources": true,
|
|
1658
|
+
"tags": ["production", "security", "performance", "reliability", "observability", "audit", "best-practices"],
|
|
1659
|
+
"bundle": ["recommended", "full"],
|
|
1660
|
+
"references": [
|
|
1661
|
+
{
|
|
1662
|
+
"name": "common-checklist",
|
|
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
|
+
]
|
|
1703
|
+
},
|
|
1704
|
+
{
|
|
1705
|
+
"name": "production-browser",
|
|
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
|
+
]
|
|
1747
|
+
},
|
|
1748
|
+
{
|
|
1749
|
+
"name": "production-cli-binary",
|
|
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
|
+
]
|
|
1779
|
+
},
|
|
1780
|
+
{
|
|
1781
|
+
"name": "production-cli-daemon",
|
|
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
|
+
]
|
|
1824
|
+
},
|
|
1825
|
+
{
|
|
1826
|
+
"name": "production-cloudflare",
|
|
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
|
+
]
|
|
1867
|
+
},
|
|
1868
|
+
{
|
|
1869
|
+
"name": "production-lambda",
|
|
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
|
+
]
|
|
1911
|
+
},
|
|
1912
|
+
{
|
|
1913
|
+
"name": "production-node-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
|
+
]
|
|
1954
|
+
},
|
|
1955
|
+
{
|
|
1956
|
+
"name": "production-node-server",
|
|
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
|
+
]
|
|
1998
|
+
},
|
|
1999
|
+
{
|
|
2000
|
+
"name": "production-vercel",
|
|
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
|
+
]
|
|
2040
|
+
},
|
|
2041
|
+
{
|
|
2042
|
+
"name": "health-readiness-endpoints",
|
|
2043
|
+
"description": "Configure /healthz and /readyz endpoints with custom probes, runtime-aware readiness, and dependency health checks",
|
|
2044
|
+
"examples": [
|
|
2045
|
+
{
|
|
2046
|
+
"name": "basic-health-setup",
|
|
2047
|
+
"description": "Default health endpoints with Redis session store, showing /healthz and /readyz responses.",
|
|
2048
|
+
"level": "basic",
|
|
2049
|
+
"tags": ["production", "health", "readiness", "redis", "kubernetes", "docker"],
|
|
2050
|
+
"features": [
|
|
2051
|
+
"Zero-config /healthz and /readyz endpoints enabled by default",
|
|
2052
|
+
"Auto-discovered session-store probe via Redis persistence",
|
|
2053
|
+
"Catalog hash for config drift detection across instances",
|
|
2054
|
+
"Docker HEALTHCHECK directive using /healthz"
|
|
2055
|
+
]
|
|
2056
|
+
},
|
|
2057
|
+
{
|
|
2058
|
+
"name": "custom-probes",
|
|
2059
|
+
"description": "Custom database and API probes with Kubernetes deployment configuration.",
|
|
2060
|
+
"level": "intermediate",
|
|
2061
|
+
"tags": ["production", "health", "readiness", "kubernetes", "postgres", "probes", "custom"],
|
|
2062
|
+
"features": [
|
|
2063
|
+
"Custom health probes for PostgreSQL and external API dependencies",
|
|
2064
|
+
"Kubernetes liveness and readiness probe configuration",
|
|
2065
|
+
"Production includeDetails: false to hide infrastructure topology",
|
|
2066
|
+
"Per-probe timeout to prevent slow dependencies from blocking readiness"
|
|
2067
|
+
]
|
|
2068
|
+
}
|
|
2069
|
+
]
|
|
2070
|
+
}
|
|
2071
|
+
]
|
|
2072
|
+
},
|
|
2073
|
+
{
|
|
2074
|
+
"name": "frontmcp-setup",
|
|
2075
|
+
"category": "setup",
|
|
2076
|
+
"description": "Domain router for project setup, scaffolding, and organization. Use this skill whenever someone asks to create a new FrontMCP project, set up an Nx monorepo, configure Redis or SQLite storage, organize project structure, compose multiple apps into one server, or manage the skills system. Also triggers for questions like 'how do I start', 'project layout', 'folder structure', 'add redis', 'set up database', or 'create a new app'.",
|
|
2077
|
+
"path": "frontmcp-setup",
|
|
2078
|
+
"targets": ["all"],
|
|
2079
|
+
"hasResources": true,
|
|
2080
|
+
"tags": ["router", "setup", "scaffold", "project", "nx", "redis", "sqlite", "structure", "guide"],
|
|
2081
|
+
"bundle": ["recommended", "minimal", "full"],
|
|
2082
|
+
"references": [
|
|
2083
|
+
{
|
|
2084
|
+
"name": "frontmcp-skills-usage",
|
|
2085
|
+
"description": "Search, install, and manage FrontMCP skill catalog for AI agents (Claude Code, Codex)",
|
|
2086
|
+
"examples": [
|
|
2087
|
+
{
|
|
2088
|
+
"name": "bundle-presets-scaffolding",
|
|
2089
|
+
"description": "Use `--skills` flag during project creation to install a skill bundle preset.",
|
|
2090
|
+
"level": "intermediate",
|
|
2091
|
+
"tags": ["setup", "skills", "usage", "bundle", "presets", "scaffolding"],
|
|
2092
|
+
"features": [
|
|
2093
|
+
"`--skills` flag accepts `recommended`, `minimal`, `full`, or `none` presets",
|
|
2094
|
+
"Static installs are snapshots; re-run `install` to update to the latest catalog version",
|
|
2095
|
+
"Hybrid approach: install core skills statically, search the rest on demand",
|
|
2096
|
+
"Fewer static installs reduce token usage in AI agent context"
|
|
2097
|
+
]
|
|
2098
|
+
},
|
|
2099
|
+
{
|
|
2100
|
+
"name": "install-and-search-skills",
|
|
2101
|
+
"description": "Install skills statically for Claude Code and use dynamic CLI search for on-demand discovery.",
|
|
2102
|
+
"level": "basic",
|
|
2103
|
+
"tags": ["setup", "cli", "anthropic", "skills", "usage", "install"],
|
|
2104
|
+
"features": [
|
|
2105
|
+
"`frontmcp skills list` and `search` for discovering available skills",
|
|
2106
|
+
"`frontmcp skills read` for viewing skill content and references on demand",
|
|
2107
|
+
"`frontmcp skills install --provider claude` for static installation to `.claude/skills/`",
|
|
2108
|
+
"Installed skills are auto-loaded by Claude Code in its system prompt context"
|
|
2109
|
+
]
|
|
2110
|
+
}
|
|
2111
|
+
]
|
|
2112
|
+
},
|
|
2113
|
+
{
|
|
2114
|
+
"name": "multi-app-composition",
|
|
2115
|
+
"description": "Compose multiple @App classes, ESM packages, and remote MCP servers into a single FrontMCP gateway",
|
|
2116
|
+
"examples": [
|
|
2117
|
+
{
|
|
2118
|
+
"name": "local-apps-with-shared-tools",
|
|
2119
|
+
"description": "Compose multiple local `@App` classes into a server with shared tools available to all apps.",
|
|
2120
|
+
"level": "basic",
|
|
2121
|
+
"tags": ["setup", "multi-app", "local", "multi", "app", "composition"],
|
|
2122
|
+
"features": [
|
|
2123
|
+
"Multiple `@App` classes with unique `id` fields for tool namespacing (`billing:charge`, `inventory:check_stock`)",
|
|
2124
|
+
"Server-level `tools` array for shared tools available to all apps without namespace prefix",
|
|
2125
|
+
"Each app is self-contained with its own tools array",
|
|
2126
|
+
"The `id` field on `@App` controls the namespace prefix for tool names"
|
|
2127
|
+
]
|
|
2128
|
+
},
|
|
2129
|
+
{
|
|
2130
|
+
"name": "per-app-auth-and-isolation",
|
|
2131
|
+
"description": "Configure mixed authentication modes and scope isolation for different apps in a single server.",
|
|
2132
|
+
"level": "advanced",
|
|
2133
|
+
"tags": ["setup", "oauth", "auth", "multi-app", "remote", "multi"],
|
|
2134
|
+
"features": [
|
|
2135
|
+
"Per-app `auth` overrides the server-level auth (public vs remote OAuth per app)",
|
|
2136
|
+
"`standalone: true` fully isolates the Admin app (not visible in parent tool listing)",
|
|
2137
|
+
"`standalone: 'includeInParent'` gives Analytics its own scope but keeps tools visible",
|
|
2138
|
+
"Per-app `plugins` (BillingAuditPlugin) are scoped to that app only",
|
|
2139
|
+
"Server-level `plugins` (TracingPlugin, PiiRedactionPlugin) apply to all apps"
|
|
2140
|
+
]
|
|
2141
|
+
},
|
|
2142
|
+
{
|
|
2143
|
+
"name": "remote-and-esm-apps",
|
|
2144
|
+
"description": "Compose local, ESM (npm package), and remote (external MCP server) apps into a single gateway.",
|
|
2145
|
+
"level": "intermediate",
|
|
2146
|
+
"tags": ["setup", "oauth", "auth", "transport", "multi-app", "remote"],
|
|
2147
|
+
"features": [
|
|
2148
|
+
"`app.esm()` loads an `@App` class from an npm package with namespace and auto-update",
|
|
2149
|
+
"`app.remote()` proxies tools from external MCP servers with configurable auth modes",
|
|
2150
|
+
"`remoteAuth` supports `'static'` (fixed credentials), `'forward'` (pass gateway user token), and `'oauth'`",
|
|
2151
|
+
"`namespace` prevents tool name collisions between apps (`crm:tool_name`, `slack:tool_name`)",
|
|
2152
|
+
"`transportOptions` configure timeout, retries, and SSE fallback for remote connections"
|
|
2153
|
+
]
|
|
2154
|
+
}
|
|
2155
|
+
]
|
|
2156
|
+
},
|
|
2157
|
+
{
|
|
2158
|
+
"name": "nx-workflow",
|
|
2159
|
+
"description": "Scaffold, build, test, and deploy FrontMCP projects using the @frontmcp/nx plugin in a monorepo",
|
|
2160
|
+
"examples": [
|
|
2161
|
+
{
|
|
2162
|
+
"name": "build-test-affected",
|
|
2163
|
+
"description": "Use Nx commands for efficient building, testing, and CI with affected-only execution.",
|
|
2164
|
+
"level": "intermediate",
|
|
2165
|
+
"tags": ["setup", "nx", "workflow", "affected"],
|
|
2166
|
+
"features": [
|
|
2167
|
+
"`nx build <server>` resolves the dependency graph and builds with caching",
|
|
2168
|
+
"`nx affected -t test` only runs tests for changed projects, saving CI time",
|
|
2169
|
+
"`nx run-many -t build,test,lint` parallelizes multiple targets across all projects",
|
|
2170
|
+
"`nx graph` visualizes project dependencies to detect circular imports"
|
|
2171
|
+
]
|
|
2172
|
+
},
|
|
2173
|
+
{
|
|
2174
|
+
"name": "multi-server-deployment",
|
|
2175
|
+
"description": "Generate multiple servers in an Nx workspace, each composing different apps for different deployment targets.",
|
|
2176
|
+
"level": "advanced",
|
|
2177
|
+
"tags": ["setup", "vercel", "nx", "node", "workflow", "multi"],
|
|
2178
|
+
"features": [
|
|
2179
|
+
"Multiple servers composing different combinations of apps from the same workspace",
|
|
2180
|
+
"Each server has its own deployment target (`node` vs `vercel`) and storage configuration",
|
|
2181
|
+
"Apps are reusable across servers via Nx path aliases",
|
|
2182
|
+
"`nx build <server>` builds the server and all its app and lib dependencies"
|
|
2183
|
+
]
|
|
2184
|
+
},
|
|
2185
|
+
{
|
|
2186
|
+
"name": "scaffold-and-generate",
|
|
2187
|
+
"description": "Initialize an Nx workspace and use generators to scaffold an app with tools, resources, and a server.",
|
|
2188
|
+
"level": "basic",
|
|
2189
|
+
"tags": ["setup", "nx", "workflow", "scaffold", "generate"],
|
|
2190
|
+
"features": [
|
|
2191
|
+
"`@frontmcp/nx:workspace` initializes the Nx monorepo structure with `apps/`, `libs/`, `servers/`",
|
|
2192
|
+
"All primitive generators require `--project=<app-name>` to target the correct app",
|
|
2193
|
+
"Each generator creates an implementation file, a `.spec.ts` test file, and updates barrel exports",
|
|
2194
|
+
"`@frontmcp/nx:server` with `--apps` and `--deploymentTarget` creates the deployment entry point"
|
|
2195
|
+
]
|
|
2196
|
+
}
|
|
2197
|
+
]
|
|
2198
|
+
},
|
|
2199
|
+
{
|
|
2200
|
+
"name": "project-structure-nx",
|
|
2201
|
+
"description": "Canonical directory layout, generators, and dependency rules for FrontMCP Nx monorepos",
|
|
2202
|
+
"examples": [
|
|
2203
|
+
{
|
|
2204
|
+
"name": "nx-generator-scaffolding",
|
|
2205
|
+
"description": "Use `@frontmcp/nx` generators to scaffold tools, resources, and providers within an app, with automatic barrel export updates.",
|
|
2206
|
+
"level": "basic",
|
|
2207
|
+
"tags": ["setup", "nx", "structure", "generator", "scaffolding"],
|
|
2208
|
+
"features": [
|
|
2209
|
+
"All primitive generators require `--project=<app-name>` to target the correct app",
|
|
2210
|
+
"Each generator creates the implementation file and a `.spec.ts` test file",
|
|
2211
|
+
"Barrel exports (`index.ts`) are updated automatically after each generator run",
|
|
2212
|
+
"Files follow the `<name>.<type>.ts` naming convention"
|
|
2213
|
+
]
|
|
2214
|
+
},
|
|
2215
|
+
{
|
|
2216
|
+
"name": "nx-workspace-with-apps",
|
|
2217
|
+
"description": "Scaffold an Nx monorepo with two apps and a server that composes them into a single gateway.",
|
|
2218
|
+
"level": "basic",
|
|
2219
|
+
"tags": ["setup", "nx", "structure", "workspace", "apps"],
|
|
2220
|
+
"features": [
|
|
2221
|
+
"`apps/` directory holding self-contained `@App` classes with their tools and resources",
|
|
2222
|
+
"`servers/` directory holding `@FrontMcp` entry points that compose apps",
|
|
2223
|
+
"Nx path aliases (`@my-workspace/billing`) for clean imports across the monorepo",
|
|
2224
|
+
"Apps are independently testable and do not import from each other"
|
|
2225
|
+
]
|
|
2226
|
+
},
|
|
2227
|
+
{
|
|
2228
|
+
"name": "shared-library-usage",
|
|
2229
|
+
"description": "Create a shared library in an Nx monorepo and use it from multiple apps to avoid cross-app imports.",
|
|
2230
|
+
"level": "intermediate",
|
|
2231
|
+
"tags": ["setup", "nx", "database", "structure", "shared", "library"],
|
|
2232
|
+
"features": [
|
|
2233
|
+
"Shared libraries live in `libs/` with barrel `index.ts` exports",
|
|
2234
|
+
"Both apps import `DatabaseProvider` from the shared library, not from each other",
|
|
2235
|
+
"Nx dependency graph: `servers/ --> apps/ --> libs/` (apps never import other apps)",
|
|
2236
|
+
"Path aliases configured in `tsconfig.base.json` keep imports clean (`@my-workspace/shared-utils`)"
|
|
2237
|
+
]
|
|
2238
|
+
}
|
|
2239
|
+
]
|
|
2240
|
+
},
|
|
2241
|
+
{
|
|
2242
|
+
"name": "project-structure-standalone",
|
|
2243
|
+
"description": "File layout, naming conventions, and dev workflow for standalone FrontMCP projects",
|
|
2244
|
+
"examples": [
|
|
2245
|
+
{
|
|
2246
|
+
"name": "dev-workflow-commands",
|
|
2247
|
+
"description": "Run the standard development workflow for a standalone FrontMCP project: dev server, build, and tests.",
|
|
2248
|
+
"level": "basic",
|
|
2249
|
+
"tags": ["setup", "e2e", "structure", "standalone", "dev", "workflow"],
|
|
2250
|
+
"features": [
|
|
2251
|
+
"`frontmcp dev` for hot-reloading development server",
|
|
2252
|
+
"`frontmcp build --target <target>` for production builds targeting different runtimes",
|
|
2253
|
+
"Test files use `.spec.ts` extension (not `.test.ts`) per FrontMCP convention",
|
|
2254
|
+
"E2E tests live in the `e2e/` directory with `*.e2e.spec.ts` naming"
|
|
2255
|
+
]
|
|
2256
|
+
},
|
|
2257
|
+
{
|
|
2258
|
+
"name": "feature-folder-organization",
|
|
2259
|
+
"description": "Organize a growing standalone project into domain-specific feature folders instead of flat type-based directories.",
|
|
2260
|
+
"level": "intermediate",
|
|
2261
|
+
"tags": ["setup", "structure", "standalone", "feature", "folder", "organization"],
|
|
2262
|
+
"features": [
|
|
2263
|
+
"Feature folders (`src/billing/`) grouping related tools, resources, and providers by domain",
|
|
2264
|
+
"Each entity still follows the `<name>.<type>.ts` naming convention inside its feature folder",
|
|
2265
|
+
"One class per file across tools, resources, and providers",
|
|
2266
|
+
"Feature folders scale better than flat `src/tools/` directories for larger projects"
|
|
2267
|
+
]
|
|
2268
|
+
},
|
|
2269
|
+
{
|
|
2270
|
+
"name": "minimal-standalone-layout",
|
|
2271
|
+
"description": "Set up the canonical file structure for a standalone FrontMCP project with one app, one tool, and the required entry point.",
|
|
2272
|
+
"level": "basic",
|
|
2273
|
+
"tags": ["setup", "structure", "standalone", "minimal", "layout"],
|
|
2274
|
+
"features": [
|
|
2275
|
+
"`<name>.<type>.ts` file naming convention (`fetch-weather.tool.ts`, `my-app.app.ts`)",
|
|
2276
|
+
"`main.ts` with a default-exported `@FrontMcp` server class",
|
|
2277
|
+
"One class per file pattern",
|
|
2278
|
+
"`@App` grouping tools and registered in the server `apps` array"
|
|
2279
|
+
]
|
|
2280
|
+
}
|
|
2281
|
+
]
|
|
2282
|
+
},
|
|
2283
|
+
{
|
|
2284
|
+
"name": "readme-guide",
|
|
2285
|
+
"description": "Generate deployment-target-aware README.md files for FrontMCP MCP servers",
|
|
2286
|
+
"examples": [
|
|
2287
|
+
{
|
|
2288
|
+
"name": "node-server-readme",
|
|
2289
|
+
"description": "Generate a README for a FrontMCP server deployed as a Docker/Node.js service with tools and resources.",
|
|
2290
|
+
"level": "basic",
|
|
2291
|
+
"tags": ["setup", "docker", "readme", "node"],
|
|
2292
|
+
"features": [
|
|
2293
|
+
"Standard README sections: Features, Quick Start, Tools table, Resources table, Environment Variables",
|
|
2294
|
+
"Docker-specific deployment section with build and run commands",
|
|
2295
|
+
"Development commands using `frontmcp dev`, `frontmcp test`, `frontmcp inspect`",
|
|
2296
|
+
"Tool and resource tables generated from source code decorators"
|
|
2297
|
+
]
|
|
2298
|
+
},
|
|
2299
|
+
{
|
|
2300
|
+
"name": "vercel-deployment-readme",
|
|
2301
|
+
"description": "Generate a README for a FrontMCP server deployed to Vercel with Vercel KV storage.",
|
|
2302
|
+
"level": "intermediate",
|
|
2303
|
+
"tags": ["setup", "vercel-kv", "vercel", "readme", "deployment"],
|
|
2304
|
+
"features": [
|
|
2305
|
+
"Vercel-specific deployment instructions with `frontmcp build --target vercel` and `vercel deploy`",
|
|
2306
|
+
"Vercel KV environment variables (`KV_REST_API_URL`, `KV_REST_API_TOKEN`) noted as auto-injected",
|
|
2307
|
+
"`vercel.json` configuration reference for route setup",
|
|
2308
|
+
"Consistent README structure adapted to the Vercel deployment target"
|
|
2309
|
+
]
|
|
2310
|
+
}
|
|
2311
|
+
]
|
|
2312
|
+
},
|
|
2313
|
+
{
|
|
2314
|
+
"name": "setup-project",
|
|
2315
|
+
"description": "Scaffold a new FrontMCP project with CLI or manual setup, decorators, apps, and deployment config",
|
|
2316
|
+
"examples": [
|
|
2317
|
+
{
|
|
2318
|
+
"name": "basic-node-server",
|
|
2319
|
+
"description": "Scaffold a minimal FrontMCP server with one app and one tool, running on Node.js with HTTP transport.",
|
|
2320
|
+
"level": "basic",
|
|
2321
|
+
"tags": ["setup", "transport", "node"],
|
|
2322
|
+
"features": [
|
|
2323
|
+
"Minimal `@FrontMcp` server with `info` and `apps` fields",
|
|
2324
|
+
"`@App` decorator grouping a single tool",
|
|
2325
|
+
"`@Tool` decorator with Zod input/output schemas extending `ToolContext`",
|
|
2326
|
+
"Required tsconfig flags: `experimentalDecorators` and `emitDecoratorMetadata`",
|
|
2327
|
+
"`reflect-metadata` imported as the first line of the entry point"
|
|
2328
|
+
]
|
|
2329
|
+
},
|
|
2330
|
+
{
|
|
2331
|
+
"name": "cli-scaffold-with-flags",
|
|
2332
|
+
"description": "Use the `frontmcp create` CLI to scaffold a complete project non-interactively with explicit flags for deployment target, Redis, and package manager.",
|
|
2333
|
+
"level": "basic",
|
|
2334
|
+
"tags": ["setup", "redis", "cli", "nx", "scaffold", "flags"],
|
|
2335
|
+
"features": [
|
|
2336
|
+
"Non-interactive scaffolding with `--yes` to accept all defaults",
|
|
2337
|
+
"Explicit `--target`, `--redis`, `--pm`, `--skills`, and `--cicd` flags",
|
|
2338
|
+
"Nx monorepo scaffolding with `--nx`",
|
|
2339
|
+
"Verifying the server responds to MCP `initialize` requests after startup"
|
|
2340
|
+
]
|
|
2341
|
+
},
|
|
2342
|
+
{
|
|
2343
|
+
"name": "vercel-serverless-server",
|
|
2344
|
+
"description": "Configure a FrontMCP server for Vercel deployment with Vercel KV storage and modern transport protocol.",
|
|
2345
|
+
"level": "intermediate",
|
|
2346
|
+
"tags": ["setup", "vercel-kv", "redis", "vercel", "session", "transport"],
|
|
2347
|
+
"features": [
|
|
2348
|
+
"`transport: { protocol: 'modern' }` for streamable HTTP with strict sessions on Vercel",
|
|
2349
|
+
"`redis: { provider: 'vercel-kv' }` for managed Redis-compatible storage without external provisioning",
|
|
2350
|
+
"Building with `frontmcp build --target vercel` for serverless output",
|
|
2351
|
+
"Vercel KV credentials are auto-injected via environment variables"
|
|
2352
|
+
]
|
|
2353
|
+
}
|
|
2354
|
+
]
|
|
2355
|
+
},
|
|
2356
|
+
{
|
|
2357
|
+
"name": "setup-redis",
|
|
2358
|
+
"description": "Provision and configure Redis or Vercel KV for session storage and distributed state",
|
|
2359
|
+
"examples": [
|
|
2360
|
+
{
|
|
2361
|
+
"name": "docker-redis-local-dev",
|
|
2362
|
+
"description": "Provision Redis with Docker Compose and connect a FrontMCP server for local session storage.",
|
|
2363
|
+
"level": "basic",
|
|
2364
|
+
"tags": ["setup", "docker-compose", "redis", "docker", "session", "local"],
|
|
2365
|
+
"features": [
|
|
2366
|
+
"Docker Compose with Redis 7 Alpine, AOF persistence, and health checks",
|
|
2367
|
+
"`redis` config in `@FrontMcp` with `provider: 'redis'` and environment variable fallbacks",
|
|
2368
|
+
"`--appendonly yes` preserves data across container restarts",
|
|
2369
|
+
"`keyPrefix: 'mcp:'` namespaces all session keys"
|
|
2370
|
+
]
|
|
2371
|
+
},
|
|
2372
|
+
{
|
|
2373
|
+
"name": "hybrid-vercel-kv-with-pubsub",
|
|
2374
|
+
"description": "Use Vercel KV for session storage and a separate Redis instance for pub/sub resource subscriptions.",
|
|
2375
|
+
"level": "advanced",
|
|
2376
|
+
"tags": ["setup", "vercel-kv", "redis", "vercel", "session", "hybrid"],
|
|
2377
|
+
"features": [
|
|
2378
|
+
"Vercel KV handles sessions (`redis` config) while a real Redis handles pub/sub (`pubsub` config)",
|
|
2379
|
+
"Vercel KV does not support pub/sub operations, so a separate Redis instance is required",
|
|
2380
|
+
"Resources with `subscribe: true` rely on the `pubsub` config for real-time notifications",
|
|
2381
|
+
"The `pubsub` field accepts `provider: 'redis'` only (no Vercel KV support)"
|
|
2382
|
+
]
|
|
2383
|
+
},
|
|
2384
|
+
{
|
|
2385
|
+
"name": "vercel-kv-serverless",
|
|
2386
|
+
"description": "Configure a FrontMCP server with Vercel KV as the session store for serverless deployment.",
|
|
2387
|
+
"level": "intermediate",
|
|
2388
|
+
"tags": ["setup", "vercel-kv", "redis", "vercel", "session", "transport"],
|
|
2389
|
+
"features": [
|
|
2390
|
+
"`provider: 'vercel-kv'` for managed Redis-compatible storage on Vercel",
|
|
2391
|
+
"`transport: { protocol: 'modern' }` required for Streamable HTTP on serverless",
|
|
2392
|
+
"Vercel auto-injects `KV_REST_API_URL` and `KV_REST_API_TOKEN` in production",
|
|
2393
|
+
"Explicit `url` and `token` fields for local testing outside Vercel"
|
|
2394
|
+
]
|
|
2395
|
+
}
|
|
2396
|
+
]
|
|
2397
|
+
},
|
|
2398
|
+
{
|
|
2399
|
+
"name": "setup-sqlite",
|
|
2400
|
+
"description": "Configure SQLite with WAL mode and optional encryption for local single-instance deployments",
|
|
2401
|
+
"examples": [
|
|
2402
|
+
{
|
|
2403
|
+
"name": "basic-sqlite-setup",
|
|
2404
|
+
"description": "Configure a FrontMCP server with SQLite for local session storage with WAL mode enabled.",
|
|
2405
|
+
"level": "basic",
|
|
2406
|
+
"tags": ["setup", "sqlite", "session", "database", "local"],
|
|
2407
|
+
"features": [
|
|
2408
|
+
"`@frontmcp/storage-sqlite` and `better-sqlite3` as required dependencies",
|
|
2409
|
+
"`sqlite` config in `@FrontMcp` with `path` and `walMode`",
|
|
2410
|
+
"WAL mode creates three files (`.sqlite`, `.sqlite-wal`, `.sqlite-shm`)",
|
|
2411
|
+
"Tilde-prefixed paths for stable storage across working directories"
|
|
2412
|
+
]
|
|
2413
|
+
},
|
|
2414
|
+
{
|
|
2415
|
+
"name": "encrypted-sqlite-storage",
|
|
2416
|
+
"description": "Enable AES-256-GCM at-rest encryption for sensitive session data stored in SQLite.",
|
|
2417
|
+
"level": "intermediate",
|
|
2418
|
+
"tags": ["setup", "sqlite", "session", "database", "encrypted", "storage"],
|
|
2419
|
+
"features": [
|
|
2420
|
+
"`encryption.secret` enables AES-256-GCM encryption with HKDF-SHA256 key derivation",
|
|
2421
|
+
"The secret must be at least 32 characters and sourced from environment variables",
|
|
2422
|
+
"The same secret must be used across server restarts to decrypt existing data",
|
|
2423
|
+
"Never hardcode the encryption secret in source code"
|
|
2424
|
+
]
|
|
2425
|
+
},
|
|
2426
|
+
{
|
|
2427
|
+
"name": "unix-socket-daemon",
|
|
2428
|
+
"description": "Configure a FrontMCP daemon that listens on a unix socket and uses SQLite for persistent storage.",
|
|
2429
|
+
"level": "advanced",
|
|
2430
|
+
"tags": ["setup", "unix-socket", "sqlite", "session", "transport", "database"],
|
|
2431
|
+
"features": [
|
|
2432
|
+
"`http.unixSocket` for unix socket transport instead of TCP port",
|
|
2433
|
+
"`transport: { protocol: 'modern' }` for Streamable HTTP with strict sessions",
|
|
2434
|
+
"`ttlCleanupIntervalMs: 15000` for more aggressive cleanup on high-throughput daemons",
|
|
2435
|
+
"Absolute path for the database file in system-level storage (`/var/lib/`)"
|
|
2436
|
+
]
|
|
2437
|
+
}
|
|
2438
|
+
]
|
|
2439
|
+
}
|
|
2440
|
+
]
|
|
2441
|
+
},
|
|
2442
|
+
{
|
|
2443
|
+
"name": "frontmcp-testing",
|
|
2444
|
+
"category": "testing",
|
|
2445
|
+
"description": "Use when you want to write tests, run tests, add e2e tests, improve test coverage, test a tool, test a resource, or learn how to test any FrontMCP component. The skill for ALL testing needs.",
|
|
2446
|
+
"path": "frontmcp-testing",
|
|
2447
|
+
"targets": ["all"],
|
|
2448
|
+
"hasResources": true,
|
|
2449
|
+
"tags": ["router", "testing", "jest", "e2e", "coverage", "quality", "guide"],
|
|
2450
|
+
"bundle": ["recommended", "full"],
|
|
2451
|
+
"references": [
|
|
2452
|
+
{
|
|
2453
|
+
"name": "setup-testing",
|
|
2454
|
+
"description": "Configure Jest, write unit and E2E tests, and enforce 95%+ coverage for FrontMCP applications",
|
|
2455
|
+
"examples": [
|
|
2456
|
+
{
|
|
2457
|
+
"name": "fixture-based-e2e-test",
|
|
2458
|
+
"description": "Write E2E tests using the fixture API from `@frontmcp/testing` that manages server lifecycle automatically and uses MCP-specific custom matchers.",
|
|
2459
|
+
"level": "advanced",
|
|
2460
|
+
"tags": ["testing", "jest", "e2e", "setup", "fixture", "based"],
|
|
2461
|
+
"features": [
|
|
2462
|
+
"Using `test.use()` to configure server path and port for automatic lifecycle management",
|
|
2463
|
+
"Importing `test` and `expect` from `@frontmcp/testing` (not from Jest) to access MCP-specific matchers",
|
|
2464
|
+
"Custom matchers: `toContainTool()`, `toBeSuccessful()`, `toHaveTextContent()` for MCP assertions",
|
|
2465
|
+
"Testing all three MCP primitives (tools, resources, prompts) in a single E2E suite"
|
|
2466
|
+
]
|
|
2467
|
+
},
|
|
2468
|
+
{
|
|
2469
|
+
"name": "jest-config-with-coverage",
|
|
2470
|
+
"description": "Set up a Jest configuration file that enforces 95%+ coverage across all metrics for a FrontMCP library.",
|
|
2471
|
+
"level": "basic",
|
|
2472
|
+
"tags": ["testing", "jest", "setup", "config", "coverage"],
|
|
2473
|
+
"features": [
|
|
2474
|
+
"How to configure Jest with `ts-jest` for TypeScript test files",
|
|
2475
|
+
"Setting 95%+ coverage thresholds required by FrontMCP standards",
|
|
2476
|
+
"Proper `tsconfig.spec.json` that extends the base config and includes `.spec.ts` files"
|
|
2477
|
+
]
|
|
2478
|
+
},
|
|
2479
|
+
{
|
|
2480
|
+
"name": "unit-test-tool-resource-prompt",
|
|
2481
|
+
"description": "Write unit tests for the three core MCP primitives, verifying that outputs match the expected MCP response shapes.",
|
|
2482
|
+
"level": "intermediate",
|
|
2483
|
+
"tags": ["testing", "jest", "unit-test", "setup", "unit", "tool"],
|
|
2484
|
+
"features": [
|
|
2485
|
+
"Testing tool `execute()` with a mock context object assigned via `Object.assign`",
|
|
2486
|
+
"Verifying resource `read()` output matches the MCP `ReadResourceResult` shape",
|
|
2487
|
+
"Verifying prompt `execute()` output matches the MCP `GetPromptResult` shape",
|
|
2488
|
+
"Using Jest matchers like `expect.stringContaining` and `expect.objectContaining` for flexible assertions"
|
|
2489
|
+
]
|
|
2490
|
+
}
|
|
2491
|
+
]
|
|
2492
|
+
},
|
|
2493
|
+
{
|
|
2494
|
+
"name": "test-auth",
|
|
2495
|
+
"description": "Test authenticated MCP servers with TestTokenFactory, MockOAuthServer, and role-based access",
|
|
2496
|
+
"examples": [
|
|
2497
|
+
{
|
|
2498
|
+
"name": "oauth-flow-test",
|
|
2499
|
+
"description": "Use `MockOAuthServer` to simulate an OAuth identity provider and test the authorization code flow.",
|
|
2500
|
+
"level": "advanced",
|
|
2501
|
+
"tags": ["testing", "oauth", "auth", "flow"],
|
|
2502
|
+
"features": [
|
|
2503
|
+
"Setting up `MockOAuthServer` with a mock issuer URL and port",
|
|
2504
|
+
"Starting an OAuth flow with `startFlow()` specifying client ID, redirect URI, and scopes",
|
|
2505
|
+
"Verifying the authorization URL contains an authorization code",
|
|
2506
|
+
"Testing concurrent OAuth flows with different client configurations",
|
|
2507
|
+
"Proper cleanup with `mockOAuth.close()` in `afterAll`"
|
|
2508
|
+
]
|
|
2509
|
+
},
|
|
2510
|
+
{
|
|
2511
|
+
"name": "role-based-access-test",
|
|
2512
|
+
"description": "Verify that tools enforce role-based access by testing admin and user tokens against protected endpoints.",
|
|
2513
|
+
"level": "intermediate",
|
|
2514
|
+
"tags": ["testing", "auth", "role", "based", "access"],
|
|
2515
|
+
"features": [
|
|
2516
|
+
"Creating tokens with different `roles` arrays to simulate admin and user access",
|
|
2517
|
+
"Testing that admin-only tools accept admin tokens and reject user tokens",
|
|
2518
|
+
"Verifying that user-level tools remain accessible to users with the correct role",
|
|
2519
|
+
"Each test creates and closes its own client for proper isolation"
|
|
2520
|
+
]
|
|
2521
|
+
},
|
|
2522
|
+
{
|
|
2523
|
+
"name": "token-factory-test",
|
|
2524
|
+
"description": "Use `TestTokenFactory` to create tokens and verify authenticated and unauthenticated requests.",
|
|
2525
|
+
"level": "basic",
|
|
2526
|
+
"tags": ["testing", "auth", "token", "factory"],
|
|
2527
|
+
"features": [
|
|
2528
|
+
"Creating a `TestTokenFactory` with issuer and audience configuration",
|
|
2529
|
+
"Generating test tokens with specific subjects and scopes via `createToken()`",
|
|
2530
|
+
"Passing tokens to `server.connect({ authToken })` for authenticated client connections",
|
|
2531
|
+
"Verifying that unauthenticated requests are rejected with `isError`"
|
|
2532
|
+
]
|
|
2533
|
+
}
|
|
2534
|
+
]
|
|
2535
|
+
},
|
|
2536
|
+
{
|
|
2537
|
+
"name": "test-browser-build",
|
|
2538
|
+
"description": "Validate browser build output for Node.js-free bundles and test with Playwright",
|
|
2539
|
+
"examples": [
|
|
2540
|
+
{
|
|
2541
|
+
"name": "browser-bundle-validation",
|
|
2542
|
+
"description": "Verify that the browser build produces a valid bundle without Node.js-only module references.",
|
|
2543
|
+
"level": "basic",
|
|
2544
|
+
"tags": ["testing", "browser", "node", "bundle", "validation"],
|
|
2545
|
+
"features": [
|
|
2546
|
+
"Checking that the browser build output directory contains `.js` files",
|
|
2547
|
+
"Scanning the bundle for Node.js-only `require()` calls that would break in browsers",
|
|
2548
|
+
"Using dynamic `import()` to verify the bundle is loadable",
|
|
2549
|
+
"Targeting the `dist/browser/` directory where `frontmcp build --target browser` places output"
|
|
2550
|
+
]
|
|
2551
|
+
},
|
|
2552
|
+
{
|
|
2553
|
+
"name": "playwright-browser-test",
|
|
2554
|
+
"description": "Use Playwright to test a browser-based MCP client that loads and calls tools from an MCP server.",
|
|
2555
|
+
"level": "advanced",
|
|
2556
|
+
"tags": ["testing", "browser", "playwright", "e2e"],
|
|
2557
|
+
"features": [
|
|
2558
|
+
"Using Playwright's `test` and `expect` from `@playwright/test` for browser E2E testing",
|
|
2559
|
+
"Waiting for DOM elements with `waitForSelector` before asserting tool list counts",
|
|
2560
|
+
"Filling form inputs and clicking buttons to simulate tool calls in the browser",
|
|
2561
|
+
"Asserting tool results via `textContent` on result elements",
|
|
2562
|
+
"Using the `.pw.spec.ts` file suffix required by FrontMCP naming conventions"
|
|
2563
|
+
]
|
|
2564
|
+
}
|
|
2565
|
+
]
|
|
2566
|
+
},
|
|
2567
|
+
{
|
|
2568
|
+
"name": "test-cli-binary",
|
|
2569
|
+
"description": "Test CLI binary and SEA build for startup, health check, and JS bundle import",
|
|
2570
|
+
"examples": [
|
|
2571
|
+
{
|
|
2572
|
+
"name": "binary-startup-test",
|
|
2573
|
+
"description": "Verify that a compiled CLI binary starts correctly and responds to health checks.",
|
|
2574
|
+
"level": "basic",
|
|
2575
|
+
"tags": ["testing", "cli", "binary", "startup"],
|
|
2576
|
+
"features": [
|
|
2577
|
+
"Using `execSync` to test that `--help` flag exits with code 0 and prints usage info",
|
|
2578
|
+
"Spawning the binary as a child process with `PORT=0` for dynamic port assignment",
|
|
2579
|
+
"Waiting for the \"listening\" log message before sending requests",
|
|
2580
|
+
"Testing the `/health` endpoint for server readiness",
|
|
2581
|
+
"Cleaning up the child process with `child.kill()`"
|
|
2582
|
+
]
|
|
2583
|
+
},
|
|
2584
|
+
{
|
|
2585
|
+
"name": "js-bundle-import-test",
|
|
2586
|
+
"description": "Verify that the compiled JS bundle can be imported and exports the expected modules after a `frontmcp build` step.",
|
|
2587
|
+
"level": "intermediate",
|
|
2588
|
+
"tags": ["testing", "cli", "binary", "js", "bundle", "import"],
|
|
2589
|
+
"features": [
|
|
2590
|
+
"Using dynamic `import()` to test that the built JS bundle is importable",
|
|
2591
|
+
"Verifying the bundle has a default export (server class or factory)",
|
|
2592
|
+
"Testing CommonJS `require()` compatibility to ensure the bundle works in CJS environments",
|
|
2593
|
+
"Pointing to the `dist/` output directory where `frontmcp build` places artifacts"
|
|
2594
|
+
]
|
|
2595
|
+
}
|
|
2596
|
+
]
|
|
2597
|
+
},
|
|
2598
|
+
{
|
|
2599
|
+
"name": "test-direct-client",
|
|
2600
|
+
"description": "In-memory testing with create() and connectOpenAI/connectClaude without HTTP overhead",
|
|
2601
|
+
"examples": [
|
|
2602
|
+
{
|
|
2603
|
+
"name": "basic-create-test",
|
|
2604
|
+
"description": "Test tools in-memory without any HTTP overhead using the `create()` function from `@frontmcp/sdk`.",
|
|
2605
|
+
"level": "basic",
|
|
2606
|
+
"tags": ["testing", "sdk", "transport", "direct-client", "direct", "client"],
|
|
2607
|
+
"features": [
|
|
2608
|
+
"Using `create()` to spin up an in-memory server with no HTTP transport",
|
|
2609
|
+
"Defining tools inline with the functional `tool()` API and Zod schemas",
|
|
2610
|
+
"Calling tools directly via `server.callTool()` and checking text content",
|
|
2611
|
+
"Proper cleanup with `server.dispose()` in each test"
|
|
2612
|
+
]
|
|
2613
|
+
},
|
|
2614
|
+
{
|
|
2615
|
+
"name": "openai-claude-format-test",
|
|
2616
|
+
"description": "Verify that tools are returned in the correct format for OpenAI and Claude clients using `connectOpenAI` and `connectClaude`.",
|
|
2617
|
+
"level": "intermediate",
|
|
2618
|
+
"tags": ["testing", "openai", "anthropic", "direct-client", "direct", "client"],
|
|
2619
|
+
"features": [
|
|
2620
|
+
"Using `connectOpenAI()` with `serve: false` to get an in-memory client without starting an HTTP server",
|
|
2621
|
+
"Verifying OpenAI tool format: `{ type: 'function', function: { name, parameters } }`",
|
|
2622
|
+
"Using dynamic import for `connectClaude` to test Claude tool format: `{ name, description, input_schema }`",
|
|
2623
|
+
"Proper cleanup with `client.close()` after each test"
|
|
2624
|
+
]
|
|
2625
|
+
}
|
|
2626
|
+
]
|
|
2627
|
+
},
|
|
2628
|
+
{
|
|
2629
|
+
"name": "test-e2e-handler",
|
|
2630
|
+
"description": "Full MCP protocol E2E tests over HTTP with McpTestClient and TestServer",
|
|
2631
|
+
"examples": [
|
|
2632
|
+
{
|
|
2633
|
+
"name": "basic-e2e-test",
|
|
2634
|
+
"description": "Set up a basic E2E test that starts a server, connects a client, and verifies tools are listed.",
|
|
2635
|
+
"level": "basic",
|
|
2636
|
+
"tags": ["testing", "e2e", "handler"],
|
|
2637
|
+
"features": [
|
|
2638
|
+
"Using `TestServer.create()` to start a server from its module export",
|
|
2639
|
+
"Connecting a client via `server.connect()` for automatic base URL wiring",
|
|
2640
|
+
"Proper lifecycle management with `beforeAll` / `afterAll` for setup and teardown",
|
|
2641
|
+
"Using the `toContainTool` custom matcher from `@frontmcp/testing`"
|
|
2642
|
+
]
|
|
2643
|
+
},
|
|
2644
|
+
{
|
|
2645
|
+
"name": "manual-client-with-transport",
|
|
2646
|
+
"description": "Use `McpTestClient.create()` with explicit transport settings for fine-grained control over E2E tests.",
|
|
2647
|
+
"level": "advanced",
|
|
2648
|
+
"tags": ["testing", "session", "transport", "e2e", "handler", "manual"],
|
|
2649
|
+
"features": [
|
|
2650
|
+
"Using `TestServer.start()` with an explicit command and port for process-based server startup",
|
|
2651
|
+
"Building a client with `McpTestClient.create().withTransport('modern').buildAndConnect()` for streamable HTTP + strict sessions",
|
|
2652
|
+
"Using `server.info.baseUrl` to wire the client to the correct address",
|
|
2653
|
+
"Separate `disconnect()` / `stop()` calls for client and server teardown",
|
|
2654
|
+
"The `toBeError()` and `toHaveTextContent()` custom matchers"
|
|
2655
|
+
]
|
|
2656
|
+
},
|
|
2657
|
+
{
|
|
2658
|
+
"name": "tool-call-and-error-e2e",
|
|
2659
|
+
"description": "Test successful tool calls and verify that invalid inputs produce proper error responses over the full MCP protocol.",
|
|
2660
|
+
"level": "intermediate",
|
|
2661
|
+
"tags": ["testing", "e2e", "handler", "tool", "call", "error"],
|
|
2662
|
+
"features": [
|
|
2663
|
+
"Calling tools via `client.callTool()` and asserting success with `toBeSuccessful()`",
|
|
2664
|
+
"Verifying text content in tool results with `result.content[0].text`",
|
|
2665
|
+
"Checking `result.isError` for invalid input and nonexistent tool calls",
|
|
2666
|
+
"Testing edge cases like zero values and missing optional parameters"
|
|
2667
|
+
]
|
|
2668
|
+
}
|
|
2669
|
+
]
|
|
2670
|
+
},
|
|
2671
|
+
{
|
|
2672
|
+
"name": "test-tool-unit",
|
|
2673
|
+
"description": "Unit test a ToolContext execute method with mock context, inputs, and Zod schema validation",
|
|
2674
|
+
"examples": [
|
|
2675
|
+
{
|
|
2676
|
+
"name": "basic-tool-test",
|
|
2677
|
+
"description": "Test a simple tool's `execute()` method with mock context and verify the output.",
|
|
2678
|
+
"level": "basic",
|
|
2679
|
+
"tags": ["testing", "tool", "unit"],
|
|
2680
|
+
"features": [
|
|
2681
|
+
"Creating a mock `ToolContext` with all required methods (`get`, `tryGet`, `fail`, `mark`, `notify`, `respondProgress`)",
|
|
2682
|
+
"Assigning the mock context to the tool instance via `Object.assign`",
|
|
2683
|
+
"Testing multiple input scenarios including edge cases (negatives, zero)"
|
|
2684
|
+
]
|
|
2685
|
+
},
|
|
2686
|
+
{
|
|
2687
|
+
"name": "schema-validation-test",
|
|
2688
|
+
"description": "Validate that a tool's Zod input schema rejects invalid data before `execute()` is called.",
|
|
2689
|
+
"level": "intermediate",
|
|
2690
|
+
"tags": ["testing", "tool", "unit", "schema", "validation"],
|
|
2691
|
+
"features": [
|
|
2692
|
+
"Testing the Zod input schema separately from the `execute()` method",
|
|
2693
|
+
"Using `safeParse()` to check validation results without throwing",
|
|
2694
|
+
"Covering rejection of wrong types, missing fields, and empty input",
|
|
2695
|
+
"Combining schema validation with execution to test the full flow"
|
|
2696
|
+
]
|
|
2697
|
+
},
|
|
2698
|
+
{
|
|
2699
|
+
"name": "tool-error-handling-test",
|
|
2700
|
+
"description": "Test that a tool throws the correct MCP error classes with proper error codes and JSON-RPC error shapes.",
|
|
2701
|
+
"level": "advanced",
|
|
2702
|
+
"tags": ["testing", "json-rpc", "tool", "unit", "error", "handling"],
|
|
2703
|
+
"features": [
|
|
2704
|
+
"Verifying specific error classes with `toBeInstanceOf` instead of just checking that something threw",
|
|
2705
|
+
"Asserting MCP error codes from `MCP_ERROR_CODES` constants",
|
|
2706
|
+
"Validating the JSON-RPC error shape returned by `toJsonRpcError()`",
|
|
2707
|
+
"Testing both success and failure paths in the same suite"
|
|
2708
|
+
]
|
|
2709
|
+
}
|
|
2710
|
+
]
|
|
2711
|
+
}
|
|
2712
|
+
]
|
|
2713
|
+
},
|
|
2714
|
+
{
|
|
2715
|
+
"name": "frontmcp-observability",
|
|
2716
|
+
"category": "observability",
|
|
2717
|
+
"description": "Use when you want to add tracing, structured logging, or monitoring to your FrontMCP server. Covers OpenTelemetry instrumentation, vendor integrations (Coralogix, Datadog, Logz.io, Grafana), this.telemetry API for custom spans, structured JSON logging with sinks, and testing observability. Triggers: observability, telemetry, tracing, logging, monitoring, opentelemetry, otel, spans, datadog, coralogix, logz, grafana, winston, pino.",
|
|
2718
|
+
"path": "frontmcp-observability",
|
|
2719
|
+
"targets": ["all"],
|
|
2720
|
+
"hasResources": true,
|
|
2721
|
+
"tags": [
|
|
2722
|
+
"router",
|
|
2723
|
+
"observability",
|
|
2724
|
+
"telemetry",
|
|
2725
|
+
"tracing",
|
|
2726
|
+
"logging",
|
|
2727
|
+
"monitoring",
|
|
2728
|
+
"opentelemetry",
|
|
2729
|
+
"otel",
|
|
2730
|
+
"spans"
|
|
2731
|
+
],
|
|
2732
|
+
"bundle": ["recommended", "full"],
|
|
2733
|
+
"references": [
|
|
2734
|
+
{
|
|
2735
|
+
"name": "tracing-setup",
|
|
2736
|
+
"description": "Enable OpenTelemetry distributed tracing for all FrontMCP flows with zero configuration.",
|
|
2737
|
+
"examples": [
|
|
2738
|
+
{
|
|
2739
|
+
"name": "basic-tracing",
|
|
2740
|
+
"description": "Enable auto-tracing and see spans printed to your terminal.",
|
|
2741
|
+
"level": "basic",
|
|
2742
|
+
"tags": ["tracing", "setup", "console", "basic"],
|
|
2743
|
+
"features": [
|
|
2744
|
+
"Zero-config tracing via observability: true",
|
|
2745
|
+
"Console exporter for local development",
|
|
2746
|
+
"Single trace ID shared across all spans in a request"
|
|
2747
|
+
]
|
|
2748
|
+
},
|
|
2749
|
+
{
|
|
2750
|
+
"name": "production-tracing",
|
|
2751
|
+
"description": "Full production observability — traces to OTLP, structured logs to stdout, per-request log collection.",
|
|
2752
|
+
"level": "intermediate",
|
|
2753
|
+
"tags": ["tracing", "production", "otlp", "logging", "request-logs"],
|
|
2754
|
+
"features": [
|
|
2755
|
+
"OTLP exporter with env var configuration",
|
|
2756
|
+
"Structured logging with sensitive field redaction",
|
|
2757
|
+
"Request log collection with error alerting",
|
|
2758
|
+
"Full tracing across all SDK flows"
|
|
2759
|
+
]
|
|
2760
|
+
}
|
|
2761
|
+
]
|
|
2762
|
+
},
|
|
2763
|
+
{
|
|
2764
|
+
"name": "structured-logging",
|
|
2765
|
+
"description": "Add structured JSON logging with trace correlation and configurable sinks.",
|
|
2766
|
+
"examples": [
|
|
2767
|
+
{
|
|
2768
|
+
"name": "stdout-logging",
|
|
2769
|
+
"description": "Enable NDJSON structured logging to stdout with automatic trace correlation and field redaction.",
|
|
2770
|
+
"level": "basic",
|
|
2771
|
+
"tags": ["logging", "stdout", "ndjson", "redaction", "basic"],
|
|
2772
|
+
"features": [
|
|
2773
|
+
"NDJSON format for stdout (Docker/K8s log collection)",
|
|
2774
|
+
"Automatic trace context enrichment (trace_id, span_id)",
|
|
2775
|
+
"Sensitive field redaction (token \u2192 [REDACTED])"
|
|
2776
|
+
]
|
|
2777
|
+
},
|
|
2778
|
+
{
|
|
2779
|
+
"name": "winston-integration",
|
|
2780
|
+
"description": "Forward FrontMCP structured log entries to your existing winston logger. Each entry includes trace_id and span_id as metadata.",
|
|
2781
|
+
"level": "intermediate",
|
|
2782
|
+
"tags": ["logging", "winston", "integration", "intermediate"],
|
|
2783
|
+
"features": [
|
|
2784
|
+
"WinstonSink forwarding structured entries with trace metadata",
|
|
2785
|
+
"Multiple sinks running simultaneously (stdout + winston)",
|
|
2786
|
+
"Winston transports handle file logging, remote forwarding, etc."
|
|
2787
|
+
]
|
|
2788
|
+
}
|
|
2789
|
+
]
|
|
2790
|
+
},
|
|
2791
|
+
{
|
|
2792
|
+
"name": "telemetry-api",
|
|
2793
|
+
"description": "Use this.telemetry in tools, plugins, and agents to create custom spans, events, and attributes.",
|
|
2794
|
+
"examples": [
|
|
2795
|
+
{
|
|
2796
|
+
"name": "tool-custom-spans",
|
|
2797
|
+
"description": "Create child spans, events, and attributes inside a tool's execute method using this.telemetry.",
|
|
2798
|
+
"level": "basic",
|
|
2799
|
+
"tags": ["telemetry", "tool", "spans", "events", "attributes"],
|
|
2800
|
+
"features": [
|
|
2801
|
+
"this.telemetry.withSpan() creates auto-managed child spans",
|
|
2802
|
+
"this.telemetry.addEvent() adds events to the parent tool span",
|
|
2803
|
+
"this.telemetry.setAttributes() adds metadata to the parent tool span",
|
|
2804
|
+
"Child spans inherit the trace ID automatically"
|
|
2805
|
+
]
|
|
2806
|
+
},
|
|
2807
|
+
{
|
|
2808
|
+
"name": "plugin-telemetry",
|
|
2809
|
+
"description": "Add telemetry events from a custom plugin's hooks. Events appear on the tool execution span, giving you visibility into plugin behavior within the trace.",
|
|
2810
|
+
"level": "intermediate",
|
|
2811
|
+
"tags": ["telemetry", "plugin", "hooks", "cache", "audit"],
|
|
2812
|
+
"features": [
|
|
2813
|
+
"Plugin hooks can access toolCtx.telemetry to add events to the active span",
|
|
2814
|
+
"Events from plugins appear in the same trace as the tool execution",
|
|
2815
|
+
"Graceful degradation when observability is not enabled"
|
|
2816
|
+
]
|
|
2817
|
+
},
|
|
2818
|
+
{
|
|
2819
|
+
"name": "agent-nested-tracing",
|
|
2820
|
+
"description": "Trace an agent's execution lifecycle including its nested tool calls. Every span shares the same trace ID.",
|
|
2821
|
+
"level": "advanced",
|
|
2822
|
+
"tags": ["telemetry", "agent", "nested", "tools", "trace-id"],
|
|
2823
|
+
"features": [
|
|
2824
|
+
"Agent span wraps the entire execution (including LLM loop)",
|
|
2825
|
+
"Nested tool calls automatically get their own spans",
|
|
2826
|
+
"All spans share the same trace ID for end-to-end visibility",
|
|
2827
|
+
"this.telemetry works identically in agents and tools"
|
|
2828
|
+
]
|
|
2829
|
+
}
|
|
2830
|
+
]
|
|
2831
|
+
},
|
|
2832
|
+
{
|
|
2833
|
+
"name": "vendor-integrations",
|
|
2834
|
+
"description": "Connect FrontMCP observability to Coralogix, Datadog, Logz.io, Grafana Cloud, or any OTLP backend.",
|
|
2835
|
+
"examples": [
|
|
2836
|
+
{
|
|
2837
|
+
"name": "coralogix-setup",
|
|
2838
|
+
"description": "Send both traces and structured logs to Coralogix. Logs include trace_id so Coralogix links them to traces automatically.",
|
|
2839
|
+
"level": "intermediate",
|
|
2840
|
+
"tags": ["coralogix", "otlp", "vendor", "integration", "production"],
|
|
2841
|
+
"features": [
|
|
2842
|
+
"Traces and logs both sent to Coralogix via OTLP",
|
|
2843
|
+
"Automatic trace_id correlation — click a trace, see its logs",
|
|
2844
|
+
"Environment variable configuration for production"
|
|
2845
|
+
]
|
|
2846
|
+
}
|
|
2847
|
+
]
|
|
2848
|
+
},
|
|
2849
|
+
{
|
|
2850
|
+
"name": "testing-observability",
|
|
2851
|
+
"description": "Test that your spans, log entries, and telemetry instrumentation work correctly.",
|
|
2852
|
+
"examples": [
|
|
2853
|
+
{
|
|
2854
|
+
"name": "test-custom-spans",
|
|
2855
|
+
"description": "Verify that your tool creates the expected child spans with correct attributes.",
|
|
2856
|
+
"level": "basic",
|
|
2857
|
+
"tags": ["testing", "spans", "assertions", "jest", "basic"],
|
|
2858
|
+
"features": [
|
|
2859
|
+
"createTestTracer() provides isolated OTel setup (no global pollution)",
|
|
2860
|
+
"assertSpanExists() throws helpful errors when spans are missing",
|
|
2861
|
+
"assertSpanAttribute() verifies span attributes",
|
|
2862
|
+
"findSpansByAttribute() queries spans by attribute value"
|
|
2863
|
+
]
|
|
2864
|
+
},
|
|
2865
|
+
{
|
|
2866
|
+
"name": "test-log-correlation",
|
|
2867
|
+
"description": "Verify that structured log entries include trace context fields for correlation with spans.",
|
|
2868
|
+
"level": "intermediate",
|
|
2869
|
+
"tags": ["testing", "logging", "correlation", "trace-id", "intermediate"],
|
|
2870
|
+
"features": [
|
|
2871
|
+
"CallbackSink captures log entries for test assertions",
|
|
2872
|
+
"StructuredLogTransport with mock context accessor provides trace fields",
|
|
2873
|
+
"Verifying trace_id, span_id, request_id are present",
|
|
2874
|
+
"Testing field redaction behavior"
|
|
2875
|
+
]
|
|
2876
|
+
}
|
|
2877
|
+
]
|
|
2878
|
+
}
|
|
2879
|
+
]
|
|
63
2880
|
}
|
|
64
2881
|
]
|
|
65
2882
|
}
|