@frontmcp/skills 1.0.0-beta.13 → 1.0.0-beta.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/catalog/TEMPLATE.md +55 -0
- package/catalog/frontmcp-config/SKILL.md +2 -2
- 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 +10 -0
- package/catalog/frontmcp-config/references/configure-auth.md +10 -0
- package/catalog/frontmcp-config/references/configure-elicitation.md +9 -0
- package/catalog/frontmcp-config/references/configure-http.md +10 -0
- package/catalog/frontmcp-config/references/configure-session.md +10 -0
- package/catalog/frontmcp-config/references/configure-throttle-guard-config.md +9 -0
- package/catalog/frontmcp-config/references/configure-throttle.md +10 -0
- package/catalog/frontmcp-config/references/configure-transport-protocol-presets.md +9 -0
- package/catalog/frontmcp-config/references/configure-transport.md +10 -0
- package/catalog/frontmcp-config/references/setup-redis.md +5 -0
- package/catalog/frontmcp-config/references/setup-sqlite.md +5 -0
- package/catalog/frontmcp-deployment/SKILL.md +2 -2
- 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 +10 -0
- package/catalog/frontmcp-deployment/references/build-for-cli.md +9 -0
- package/catalog/frontmcp-deployment/references/build-for-sdk.md +10 -0
- package/catalog/frontmcp-deployment/references/deploy-to-cloudflare.md +10 -0
- package/catalog/frontmcp-deployment/references/deploy-to-lambda.md +10 -0
- package/catalog/frontmcp-deployment/references/deploy-to-node-dockerfile.md +9 -0
- package/catalog/frontmcp-deployment/references/deploy-to-node.md +10 -0
- package/catalog/frontmcp-deployment/references/deploy-to-vercel-config.md +9 -0
- package/catalog/frontmcp-deployment/references/deploy-to-vercel.md +10 -0
- package/catalog/frontmcp-development/SKILL.md +2 -2
- 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 +9 -0
- package/catalog/frontmcp-development/references/create-agent-llm-config.md +9 -0
- package/catalog/frontmcp-development/references/create-agent.md +10 -0
- package/catalog/frontmcp-development/references/create-job.md +10 -0
- package/catalog/frontmcp-development/references/create-plugin-hooks.md +10 -0
- package/catalog/frontmcp-development/references/create-plugin.md +10 -0
- package/catalog/frontmcp-development/references/create-prompt.md +10 -0
- package/catalog/frontmcp-development/references/create-provider.md +9 -0
- package/catalog/frontmcp-development/references/create-resource.md +52 -15
- package/catalog/frontmcp-development/references/create-skill-with-tools.md +10 -0
- package/catalog/frontmcp-development/references/create-skill.md +10 -0
- package/catalog/frontmcp-development/references/create-tool-annotations.md +9 -0
- package/catalog/frontmcp-development/references/create-tool-output-schema-types.md +10 -0
- package/catalog/frontmcp-development/references/create-tool.md +10 -0
- package/catalog/frontmcp-development/references/create-workflow.md +10 -0
- package/catalog/frontmcp-development/references/decorators-guide.md +10 -0
- package/catalog/frontmcp-development/references/official-adapters.md +10 -0
- package/catalog/frontmcp-development/references/official-plugins.md +10 -0
- package/catalog/frontmcp-extensibility/SKILL.md +1 -1
- 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 +10 -0
- package/catalog/frontmcp-guides/SKILL.md +2 -2
- 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 +10 -0
- package/catalog/frontmcp-guides/references/example-task-manager.md +10 -0
- package/catalog/frontmcp-guides/references/example-weather-api.md +10 -0
- package/catalog/frontmcp-production-readiness/SKILL.md +2 -2
- 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/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 +10 -0
- package/catalog/frontmcp-production-readiness/references/production-browser.md +10 -0
- package/catalog/frontmcp-production-readiness/references/production-cli-binary.md +9 -0
- package/catalog/frontmcp-production-readiness/references/production-cli-daemon.md +10 -0
- package/catalog/frontmcp-production-readiness/references/production-cloudflare.md +10 -0
- package/catalog/frontmcp-production-readiness/references/production-lambda.md +10 -0
- package/catalog/frontmcp-production-readiness/references/production-node-sdk.md +10 -0
- package/catalog/frontmcp-production-readiness/references/production-node-server.md +10 -0
- package/catalog/frontmcp-production-readiness/references/production-vercel.md +10 -0
- 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 +9 -0
- package/catalog/frontmcp-setup/references/multi-app-composition.md +10 -0
- package/catalog/frontmcp-setup/references/nx-workflow.md +10 -0
- package/catalog/frontmcp-setup/references/project-structure-nx.md +10 -0
- package/catalog/frontmcp-setup/references/project-structure-standalone.md +10 -0
- package/catalog/frontmcp-setup/references/readme-guide.md +9 -0
- package/catalog/frontmcp-setup/references/setup-project.md +10 -0
- package/catalog/frontmcp-setup/references/setup-redis.md +10 -0
- package/catalog/frontmcp-setup/references/setup-sqlite.md +10 -0
- 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 +10 -0
- package/catalog/frontmcp-testing/references/test-auth.md +10 -0
- package/catalog/frontmcp-testing/references/test-browser-build.md +9 -0
- package/catalog/frontmcp-testing/references/test-cli-binary.md +9 -0
- package/catalog/frontmcp-testing/references/test-direct-client.md +9 -0
- package/catalog/frontmcp-testing/references/test-e2e-handler.md +10 -0
- package/catalog/frontmcp-testing/references/test-tool-unit.md +10 -0
- package/catalog/skills-manifest.json +2383 -67
- package/package.json +1 -1
- package/src/manifest.d.ts +23 -0
- package/src/manifest.js +3 -1
- package/src/manifest.js.map +1 -1
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cors-restricted-origins
|
|
3
|
+
reference: configure-http
|
|
4
|
+
level: basic
|
|
5
|
+
description: 'Configure CORS to allow only specific frontend origins with credentials.'
|
|
6
|
+
tags: [config, browser, http, cors, restricted, origins]
|
|
7
|
+
features:
|
|
8
|
+
- 'Restricting CORS to explicit origins instead of the permissive default'
|
|
9
|
+
- 'Enabling `credentials: true` with specific origins (required -- browsers reject `*` with credentials)'
|
|
10
|
+
- 'Setting `maxAge` to reduce preflight request overhead'
|
|
11
|
+
- 'Reading port from an environment variable with a fallback'
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# CORS with Restricted Origins
|
|
15
|
+
|
|
16
|
+
Configure CORS to allow only specific frontend origins with credentials.
|
|
17
|
+
|
|
18
|
+
## Code
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
// src/server.ts
|
|
22
|
+
import { FrontMcp, App } from '@frontmcp/sdk';
|
|
23
|
+
|
|
24
|
+
@App({ name: 'my-app' })
|
|
25
|
+
class MyApp {}
|
|
26
|
+
|
|
27
|
+
@FrontMcp({
|
|
28
|
+
info: { name: 'cors-server', version: '1.0.0' },
|
|
29
|
+
apps: [MyApp],
|
|
30
|
+
http: {
|
|
31
|
+
port: Number(process.env['PORT']) || 3001,
|
|
32
|
+
cors: {
|
|
33
|
+
origin: ['https://myapp.com', 'https://staging.myapp.com'],
|
|
34
|
+
credentials: true,
|
|
35
|
+
maxAge: 86400, // cache preflight for 24 hours
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
})
|
|
39
|
+
class Server {}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## What This Demonstrates
|
|
43
|
+
|
|
44
|
+
- Restricting CORS to explicit origins instead of the permissive default
|
|
45
|
+
- Enabling `credentials: true` with specific origins (required -- browsers reject `*` with credentials)
|
|
46
|
+
- Setting `maxAge` to reduce preflight request overhead
|
|
47
|
+
- Reading port from an environment variable with a fallback
|
|
48
|
+
|
|
49
|
+
## Related
|
|
50
|
+
|
|
51
|
+
- See `configure-http` for the full HTTP configuration reference
|
|
52
|
+
- See `configure-throttle` for rate limiting and IP filtering
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: entry-path-reverse-proxy
|
|
3
|
+
reference: configure-http
|
|
4
|
+
level: intermediate
|
|
5
|
+
description: 'Mount the MCP server under a URL prefix for reverse proxy or multi-service setups.'
|
|
6
|
+
tags: [config, nx, http, entry, path, reverse]
|
|
7
|
+
features:
|
|
8
|
+
- 'Using `entryPath` to mount the server under a URL prefix (no trailing slash)'
|
|
9
|
+
- 'All MCP endpoints are prefixed: `/api/mcp/sse`, `/api/mcp/`, etc.'
|
|
10
|
+
- 'Using a dynamic CORS origin function to allow wildcard subdomains'
|
|
11
|
+
- 'Suitable for running behind nginx, Caddy, or other reverse proxies'
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Entry Path Prefix Behind a Reverse Proxy
|
|
15
|
+
|
|
16
|
+
Mount the MCP server under a URL prefix for reverse proxy or multi-service setups.
|
|
17
|
+
|
|
18
|
+
## Code
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
// src/server.ts
|
|
22
|
+
import { FrontMcp, App, Tool, ToolContext } from '@frontmcp/sdk';
|
|
23
|
+
import { z } from 'zod';
|
|
24
|
+
|
|
25
|
+
@Tool({
|
|
26
|
+
name: 'health_check',
|
|
27
|
+
description: 'Check service health',
|
|
28
|
+
inputSchema: {},
|
|
29
|
+
outputSchema: { status: z.string() },
|
|
30
|
+
})
|
|
31
|
+
class HealthCheckTool extends ToolContext {
|
|
32
|
+
async execute() {
|
|
33
|
+
return { status: 'ok' };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
@App({
|
|
38
|
+
name: 'api',
|
|
39
|
+
tools: [HealthCheckTool],
|
|
40
|
+
})
|
|
41
|
+
class ApiApp {}
|
|
42
|
+
|
|
43
|
+
@FrontMcp({
|
|
44
|
+
info: { name: 'proxy-server', version: '1.0.0' },
|
|
45
|
+
apps: [ApiApp],
|
|
46
|
+
http: {
|
|
47
|
+
port: 3001,
|
|
48
|
+
entryPath: '/api/mcp', // no trailing slash
|
|
49
|
+
cors: {
|
|
50
|
+
origin: (origin: string) => {
|
|
51
|
+
// allow any *.myapp.com subdomain
|
|
52
|
+
return origin.endsWith('.myapp.com');
|
|
53
|
+
},
|
|
54
|
+
credentials: true,
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
})
|
|
58
|
+
class Server {}
|
|
59
|
+
// Endpoints become: /api/mcp/sse, /api/mcp/, etc.
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## What This Demonstrates
|
|
63
|
+
|
|
64
|
+
- Using `entryPath` to mount the server under a URL prefix (no trailing slash)
|
|
65
|
+
- All MCP endpoints are prefixed: `/api/mcp/sse`, `/api/mcp/`, etc.
|
|
66
|
+
- Using a dynamic CORS origin function to allow wildcard subdomains
|
|
67
|
+
- Suitable for running behind nginx, Caddy, or other reverse proxies
|
|
68
|
+
|
|
69
|
+
## Related
|
|
70
|
+
|
|
71
|
+
- See `configure-http` for the full HTTP configuration reference
|
|
72
|
+
- See `configure-transport` for protocol options behind a proxy
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: unix-socket-local
|
|
3
|
+
reference: configure-http
|
|
4
|
+
level: intermediate
|
|
5
|
+
description: 'Bind the server to a unix socket instead of a TCP port for local-only communication.'
|
|
6
|
+
tags: [config, unix-socket, cli, local, http, unix]
|
|
7
|
+
features:
|
|
8
|
+
- 'Using `socketPath` to bind to a unix socket instead of a TCP port'
|
|
9
|
+
- 'When `socketPath` is set, the `port` field is ignored'
|
|
10
|
+
- 'Disabling CORS with `cors: false` since unix sockets are local-only'
|
|
11
|
+
- 'Suitable for CLI tools, daemons, and process manager integrations'
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Unix Socket for Local Access
|
|
15
|
+
|
|
16
|
+
Bind the server to a unix socket instead of a TCP port for local-only communication.
|
|
17
|
+
|
|
18
|
+
## Code
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
// src/server.ts
|
|
22
|
+
import { FrontMcp, App, Tool, ToolContext } from '@frontmcp/sdk';
|
|
23
|
+
import { z } from 'zod';
|
|
24
|
+
|
|
25
|
+
@Tool({
|
|
26
|
+
name: 'system_status',
|
|
27
|
+
description: 'Get system status',
|
|
28
|
+
inputSchema: {},
|
|
29
|
+
outputSchema: { uptime: z.number(), healthy: z.boolean() },
|
|
30
|
+
})
|
|
31
|
+
class SystemStatusTool extends ToolContext {
|
|
32
|
+
async execute() {
|
|
33
|
+
return { uptime: process.uptime(), healthy: true };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
@App({
|
|
38
|
+
name: 'daemon',
|
|
39
|
+
tools: [SystemStatusTool],
|
|
40
|
+
})
|
|
41
|
+
class DaemonApp {}
|
|
42
|
+
|
|
43
|
+
@FrontMcp({
|
|
44
|
+
info: { name: 'daemon-server', version: '1.0.0' },
|
|
45
|
+
apps: [DaemonApp],
|
|
46
|
+
http: {
|
|
47
|
+
socketPath: '/tmp/my-mcp-server.sock',
|
|
48
|
+
cors: false, // no CORS needed for local socket
|
|
49
|
+
},
|
|
50
|
+
})
|
|
51
|
+
class Server {}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## What This Demonstrates
|
|
55
|
+
|
|
56
|
+
- Using `socketPath` to bind to a unix socket instead of a TCP port
|
|
57
|
+
- When `socketPath` is set, the `port` field is ignored
|
|
58
|
+
- Disabling CORS with `cors: false` since unix sockets are local-only
|
|
59
|
+
- Suitable for CLI tools, daemons, and process manager integrations
|
|
60
|
+
|
|
61
|
+
## Related
|
|
62
|
+
|
|
63
|
+
- See `configure-http` for the full HTTP configuration reference
|
|
64
|
+
- See `configure-transport` for transport protocol options
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: multi-server-key-prefix
|
|
3
|
+
reference: configure-session
|
|
4
|
+
level: intermediate
|
|
5
|
+
description: 'Use unique key prefixes when multiple FrontMCP servers share one Redis instance.'
|
|
6
|
+
tags: [config, redis, session, multi, key, prefix]
|
|
7
|
+
features:
|
|
8
|
+
- 'Using unique `keyPrefix` values per server to avoid session key collisions'
|
|
9
|
+
- 'Both servers share the same Redis instance but have isolated session namespaces'
|
|
10
|
+
- 'Tuning `defaultTtlMs` per server based on workload pattern'
|
|
11
|
+
- '`billing-mcp:session:` vs `analytics-mcp:session:` prevents cross-contamination'
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Multi-Server Key Prefix Isolation
|
|
15
|
+
|
|
16
|
+
Use unique key prefixes when multiple FrontMCP servers share one Redis instance.
|
|
17
|
+
|
|
18
|
+
## Code
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
// src/billing-server.ts
|
|
22
|
+
import { FrontMcp, App } from '@frontmcp/sdk';
|
|
23
|
+
|
|
24
|
+
@App({ name: 'billing-app' })
|
|
25
|
+
class BillingApp {}
|
|
26
|
+
|
|
27
|
+
@FrontMcp({
|
|
28
|
+
info: { name: 'billing-server', version: '1.0.0' },
|
|
29
|
+
apps: [BillingApp],
|
|
30
|
+
redis: {
|
|
31
|
+
provider: 'redis',
|
|
32
|
+
host: 'shared-redis.internal',
|
|
33
|
+
port: 6379,
|
|
34
|
+
keyPrefix: 'billing-mcp:session:',
|
|
35
|
+
defaultTtlMs: 86_400_000, // 24 hours for long-running agent workflows
|
|
36
|
+
},
|
|
37
|
+
})
|
|
38
|
+
class BillingServer {}
|
|
39
|
+
|
|
40
|
+
// src/analytics-server.ts
|
|
41
|
+
@App({ name: 'analytics-app' })
|
|
42
|
+
class AnalyticsApp {}
|
|
43
|
+
|
|
44
|
+
@FrontMcp({
|
|
45
|
+
info: { name: 'analytics-server', version: '1.0.0' },
|
|
46
|
+
apps: [AnalyticsApp],
|
|
47
|
+
redis: {
|
|
48
|
+
provider: 'redis',
|
|
49
|
+
host: 'shared-redis.internal',
|
|
50
|
+
port: 6379,
|
|
51
|
+
keyPrefix: 'analytics-mcp:session:',
|
|
52
|
+
defaultTtlMs: 600_000, // 10 minutes for short CI/CD operations
|
|
53
|
+
},
|
|
54
|
+
})
|
|
55
|
+
class AnalyticsServer {}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## What This Demonstrates
|
|
59
|
+
|
|
60
|
+
- Using unique `keyPrefix` values per server to avoid session key collisions
|
|
61
|
+
- Both servers share the same Redis instance but have isolated session namespaces
|
|
62
|
+
- Tuning `defaultTtlMs` per server based on workload pattern
|
|
63
|
+
- `billing-mcp:session:` vs `analytics-mcp:session:` prevents cross-contamination
|
|
64
|
+
|
|
65
|
+
## Related
|
|
66
|
+
|
|
67
|
+
- See `configure-session` for the full session configuration reference
|
|
68
|
+
- See `setup-redis` for Redis provisioning details
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: redis-session-store
|
|
3
|
+
reference: configure-session
|
|
4
|
+
level: basic
|
|
5
|
+
description: 'Configure Redis-backed session storage for production deployments.'
|
|
6
|
+
tags: [config, redis, session, store]
|
|
7
|
+
features:
|
|
8
|
+
- 'Configuring Redis as the session storage provider for production persistence'
|
|
9
|
+
- 'Using `keyPrefix` to namespace session keys and prevent collisions with other servers'
|
|
10
|
+
- 'Setting `defaultTtlMs` to control session lifetime (1 hour for interactive use)'
|
|
11
|
+
- 'Loading Redis connection details from environment variables'
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Redis Session Store
|
|
15
|
+
|
|
16
|
+
Configure Redis-backed session storage for production deployments.
|
|
17
|
+
|
|
18
|
+
## Code
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
// src/server.ts
|
|
22
|
+
import { FrontMcp, App } from '@frontmcp/sdk';
|
|
23
|
+
|
|
24
|
+
@App({ name: 'my-app' })
|
|
25
|
+
class MyApp {}
|
|
26
|
+
|
|
27
|
+
@FrontMcp({
|
|
28
|
+
info: { name: 'prod-server', version: '1.0.0' },
|
|
29
|
+
apps: [MyApp],
|
|
30
|
+
redis: {
|
|
31
|
+
provider: 'redis',
|
|
32
|
+
host: process.env['REDIS_HOST'] ?? 'localhost',
|
|
33
|
+
port: Number(process.env['REDIS_PORT'] ?? 6379),
|
|
34
|
+
password: process.env['REDIS_PASSWORD'],
|
|
35
|
+
keyPrefix: 'myapp-mcp:session:',
|
|
36
|
+
defaultTtlMs: 3_600_000, // 1 hour for interactive sessions
|
|
37
|
+
},
|
|
38
|
+
})
|
|
39
|
+
class Server {}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## What This Demonstrates
|
|
43
|
+
|
|
44
|
+
- Configuring Redis as the session storage provider for production persistence
|
|
45
|
+
- Using `keyPrefix` to namespace session keys and prevent collisions with other servers
|
|
46
|
+
- Setting `defaultTtlMs` to control session lifetime (1 hour for interactive use)
|
|
47
|
+
- Loading Redis connection details from environment variables
|
|
48
|
+
|
|
49
|
+
## Related
|
|
50
|
+
|
|
51
|
+
- See `configure-session` for all session storage options
|
|
52
|
+
- See `setup-redis` for Redis provisioning details
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vercel-kv-session
|
|
3
|
+
reference: configure-session
|
|
4
|
+
level: intermediate
|
|
5
|
+
description: 'Configure Vercel KV for session storage in serverless Vercel deployments.'
|
|
6
|
+
tags: [config, vercel-kv, vercel, session, transport, serverless]
|
|
7
|
+
features:
|
|
8
|
+
- "Using `provider: 'vercel-kv'` for Vercel platform deployments"
|
|
9
|
+
- 'Vercel automatically injects `KV_REST_API_URL` and `KV_REST_API_TOKEN` environment variables'
|
|
10
|
+
- 'Combining with `stateless-api` transport preset for serverless execution'
|
|
11
|
+
- 'No explicit host/port needed -- Vercel KV uses REST API under the hood'
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Vercel KV Session Store
|
|
15
|
+
|
|
16
|
+
Configure Vercel KV for session storage in serverless Vercel deployments.
|
|
17
|
+
|
|
18
|
+
## Code
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
// src/server.ts
|
|
22
|
+
import { FrontMcp, App } from '@frontmcp/sdk';
|
|
23
|
+
|
|
24
|
+
@App({ name: 'my-app' })
|
|
25
|
+
class MyApp {}
|
|
26
|
+
|
|
27
|
+
@FrontMcp({
|
|
28
|
+
info: { name: 'vercel-server', version: '1.0.0' },
|
|
29
|
+
apps: [MyApp],
|
|
30
|
+
redis: {
|
|
31
|
+
provider: 'vercel-kv',
|
|
32
|
+
// KV_REST_API_URL and KV_REST_API_TOKEN are auto-injected by Vercel
|
|
33
|
+
},
|
|
34
|
+
transport: {
|
|
35
|
+
protocol: 'stateless-api',
|
|
36
|
+
sessionMode: 'stateless',
|
|
37
|
+
},
|
|
38
|
+
})
|
|
39
|
+
class Server {}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## What This Demonstrates
|
|
43
|
+
|
|
44
|
+
- Using `provider: 'vercel-kv'` for Vercel platform deployments
|
|
45
|
+
- Vercel automatically injects `KV_REST_API_URL` and `KV_REST_API_TOKEN` environment variables
|
|
46
|
+
- Combining with `stateless-api` transport preset for serverless execution
|
|
47
|
+
- No explicit host/port needed -- Vercel KV uses REST API under the hood
|
|
48
|
+
|
|
49
|
+
## Related
|
|
50
|
+
|
|
51
|
+
- See `configure-session` for all session storage options
|
|
52
|
+
- See `configure-transport` for transport protocol configuration
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: distributed-redis-throttle
|
|
3
|
+
reference: configure-throttle
|
|
4
|
+
level: advanced
|
|
5
|
+
description: 'Configure Redis-backed rate limiting for multi-instance deployments behind a load balancer.'
|
|
6
|
+
tags: [config, redis, session, throttle, distributed]
|
|
7
|
+
features:
|
|
8
|
+
- "Configuring `storage: { type: 'redis' }` so rate limit counters are shared across instances"
|
|
9
|
+
- 'Using `keyPrefix` to namespace guard keys in a shared Redis instance'
|
|
10
|
+
- "Combining `partitionBy: 'ip'` for global limits with `partitionBy: 'session'` per tool"
|
|
11
|
+
- 'In-memory counters are per-process and would allow N times the intended rate with N instances'
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Distributed Rate Limiting with Redis
|
|
15
|
+
|
|
16
|
+
Configure Redis-backed rate limiting for multi-instance deployments behind a load balancer.
|
|
17
|
+
|
|
18
|
+
## Code
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
// src/server.ts
|
|
22
|
+
import { FrontMcp, App, Tool, ToolContext } from '@frontmcp/sdk';
|
|
23
|
+
import { z } from 'zod';
|
|
24
|
+
|
|
25
|
+
@Tool({
|
|
26
|
+
name: 'process_payment',
|
|
27
|
+
description: 'Process a payment transaction',
|
|
28
|
+
inputSchema: {
|
|
29
|
+
amount: z.number(),
|
|
30
|
+
currency: z.string(),
|
|
31
|
+
},
|
|
32
|
+
outputSchema: { transactionId: z.string(), status: z.string() },
|
|
33
|
+
rateLimit: {
|
|
34
|
+
maxRequests: 5,
|
|
35
|
+
windowMs: 60000,
|
|
36
|
+
partitionBy: 'session',
|
|
37
|
+
},
|
|
38
|
+
concurrency: {
|
|
39
|
+
maxConcurrent: 1,
|
|
40
|
+
partitionBy: 'session',
|
|
41
|
+
},
|
|
42
|
+
})
|
|
43
|
+
class ProcessPaymentTool extends ToolContext {
|
|
44
|
+
async execute(input: { amount: number; currency: string }) {
|
|
45
|
+
return { transactionId: 'txn-abc123', status: 'completed' };
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
@App({
|
|
50
|
+
name: 'payments',
|
|
51
|
+
tools: [ProcessPaymentTool],
|
|
52
|
+
})
|
|
53
|
+
class PaymentsApp {}
|
|
54
|
+
|
|
55
|
+
@FrontMcp({
|
|
56
|
+
info: { name: 'payment-server', version: '1.0.0' },
|
|
57
|
+
apps: [PaymentsApp],
|
|
58
|
+
throttle: {
|
|
59
|
+
enabled: true,
|
|
60
|
+
storage: {
|
|
61
|
+
type: 'redis',
|
|
62
|
+
redis: {
|
|
63
|
+
config: {
|
|
64
|
+
host: process.env['REDIS_HOST'] ?? 'redis.internal',
|
|
65
|
+
port: Number(process.env['REDIS_PORT'] ?? 6379),
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
keyPrefix: 'payments:guard:',
|
|
70
|
+
global: {
|
|
71
|
+
maxRequests: 500,
|
|
72
|
+
windowMs: 60000,
|
|
73
|
+
partitionBy: 'ip',
|
|
74
|
+
},
|
|
75
|
+
globalConcurrency: {
|
|
76
|
+
maxConcurrent: 20,
|
|
77
|
+
partitionBy: 'global',
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
})
|
|
81
|
+
class Server {}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## What This Demonstrates
|
|
85
|
+
|
|
86
|
+
- Configuring `storage: { type: 'redis' }` so rate limit counters are shared across instances
|
|
87
|
+
- Using `keyPrefix` to namespace guard keys in a shared Redis instance
|
|
88
|
+
- Combining `partitionBy: 'ip'` for global limits with `partitionBy: 'session'` per tool
|
|
89
|
+
- In-memory counters are per-process and would allow N times the intended rate with N instances
|
|
90
|
+
|
|
91
|
+
## Related
|
|
92
|
+
|
|
93
|
+
- See `configure-throttle` for the full throttle configuration reference
|
|
94
|
+
- See `setup-redis` for Redis provisioning details
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: per-tool-rate-limit
|
|
3
|
+
reference: configure-throttle
|
|
4
|
+
level: intermediate
|
|
5
|
+
description: 'Override server defaults with per-tool rate limits and concurrency caps.'
|
|
6
|
+
tags: [config, session, throttle, per, tool, rate]
|
|
7
|
+
features:
|
|
8
|
+
- 'Setting per-tool `rateLimit`, `concurrency`, and `timeout` on the `@Tool` decorator'
|
|
9
|
+
- "Using `partitionBy: 'session'` for per-user fairness on expensive tools"
|
|
10
|
+
- 'Setting `queueTimeoutMs` to briefly queue excess requests instead of rejecting immediately'
|
|
11
|
+
- 'Tools without overrides (`QuickLookupTool`) inherit server defaults'
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Per-Tool Rate Limiting
|
|
15
|
+
|
|
16
|
+
Override server defaults with per-tool rate limits and concurrency caps.
|
|
17
|
+
|
|
18
|
+
## Code
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
// src/server.ts
|
|
22
|
+
import { FrontMcp, App, Tool, ToolContext } from '@frontmcp/sdk';
|
|
23
|
+
import { z } from 'zod';
|
|
24
|
+
|
|
25
|
+
@Tool({
|
|
26
|
+
name: 'expensive_query',
|
|
27
|
+
description: 'Run an expensive database query',
|
|
28
|
+
inputSchema: { query: z.string() },
|
|
29
|
+
outputSchema: { rows: z.array(z.record(z.unknown())), rowCount: z.number() },
|
|
30
|
+
rateLimit: {
|
|
31
|
+
maxRequests: 10,
|
|
32
|
+
windowMs: 60000,
|
|
33
|
+
partitionBy: 'session', // per-session rate limit
|
|
34
|
+
},
|
|
35
|
+
concurrency: {
|
|
36
|
+
maxConcurrent: 3,
|
|
37
|
+
queueTimeoutMs: 5000, // wait up to 5s for a slot
|
|
38
|
+
partitionBy: 'session',
|
|
39
|
+
},
|
|
40
|
+
timeout: {
|
|
41
|
+
executeMs: 60000, // 60 second timeout for this tool
|
|
42
|
+
},
|
|
43
|
+
})
|
|
44
|
+
class ExpensiveQueryTool extends ToolContext {
|
|
45
|
+
async execute(input: { query: string }) {
|
|
46
|
+
return { rows: [{ id: 1 }], rowCount: 1 };
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@Tool({
|
|
51
|
+
name: 'quick_lookup',
|
|
52
|
+
description: 'Fast key-value lookup',
|
|
53
|
+
inputSchema: { key: z.string() },
|
|
54
|
+
outputSchema: { value: z.string().nullable() },
|
|
55
|
+
// No overrides -- uses server defaults
|
|
56
|
+
})
|
|
57
|
+
class QuickLookupTool extends ToolContext {
|
|
58
|
+
async execute(input: { key: string }) {
|
|
59
|
+
return { value: 'cached-value' };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
@App({
|
|
64
|
+
name: 'data-api',
|
|
65
|
+
tools: [ExpensiveQueryTool, QuickLookupTool],
|
|
66
|
+
})
|
|
67
|
+
class DataApp {}
|
|
68
|
+
|
|
69
|
+
@FrontMcp({
|
|
70
|
+
info: { name: 'data-server', version: '1.0.0' },
|
|
71
|
+
apps: [DataApp],
|
|
72
|
+
throttle: {
|
|
73
|
+
enabled: true,
|
|
74
|
+
defaultRateLimit: { maxRequests: 100, windowMs: 60000 },
|
|
75
|
+
defaultConcurrency: { maxConcurrent: 10 },
|
|
76
|
+
defaultTimeout: { executeMs: 30000 },
|
|
77
|
+
},
|
|
78
|
+
})
|
|
79
|
+
class Server {}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## What This Demonstrates
|
|
83
|
+
|
|
84
|
+
- Setting per-tool `rateLimit`, `concurrency`, and `timeout` on the `@Tool` decorator
|
|
85
|
+
- Using `partitionBy: 'session'` for per-user fairness on expensive tools
|
|
86
|
+
- Setting `queueTimeoutMs` to briefly queue excess requests instead of rejecting immediately
|
|
87
|
+
- Tools without overrides (`QuickLookupTool`) inherit server defaults
|
|
88
|
+
|
|
89
|
+
## Related
|
|
90
|
+
|
|
91
|
+
- See `configure-throttle` for the full throttle configuration reference
|
|
92
|
+
- See `configure-throttle-guard-config` for the complete GuardConfig interface
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: server-level-rate-limit
|
|
3
|
+
reference: configure-throttle
|
|
4
|
+
level: basic
|
|
5
|
+
description: 'Configure global rate limits and IP filtering at the server level.'
|
|
6
|
+
tags: [config, throttle, level, rate, limit]
|
|
7
|
+
features:
|
|
8
|
+
- 'Enabling throttle with `throttle: { enabled: true }`'
|
|
9
|
+
- 'Setting `global` rate limit shared across all clients'
|
|
10
|
+
- 'Configuring `globalConcurrency` to cap simultaneous executions'
|
|
11
|
+
- 'Setting `defaultTimeout` to prevent runaway tool executions'
|
|
12
|
+
- 'Using `ipFilter` with deny-by-default posture and an explicit allow list'
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Server-Level Rate Limiting
|
|
16
|
+
|
|
17
|
+
Configure global rate limits and IP filtering at the server level.
|
|
18
|
+
|
|
19
|
+
## Code
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
// src/server.ts
|
|
23
|
+
import { FrontMcp, App, Tool, ToolContext } from '@frontmcp/sdk';
|
|
24
|
+
import { z } from 'zod';
|
|
25
|
+
|
|
26
|
+
@Tool({
|
|
27
|
+
name: 'search',
|
|
28
|
+
description: 'Search records',
|
|
29
|
+
inputSchema: { query: z.string() },
|
|
30
|
+
outputSchema: { results: z.array(z.string()) },
|
|
31
|
+
})
|
|
32
|
+
class SearchTool extends ToolContext {
|
|
33
|
+
async execute(input: { query: string }) {
|
|
34
|
+
return { results: [`Result for: ${input.query}`] };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
@App({
|
|
39
|
+
name: 'api',
|
|
40
|
+
tools: [SearchTool],
|
|
41
|
+
})
|
|
42
|
+
class ApiApp {}
|
|
43
|
+
|
|
44
|
+
@FrontMcp({
|
|
45
|
+
info: { name: 'throttled-server', version: '1.0.0' },
|
|
46
|
+
apps: [ApiApp],
|
|
47
|
+
throttle: {
|
|
48
|
+
enabled: true,
|
|
49
|
+
global: {
|
|
50
|
+
maxRequests: 1000,
|
|
51
|
+
windowMs: 60000, // 1 minute window
|
|
52
|
+
partitionBy: 'global',
|
|
53
|
+
},
|
|
54
|
+
globalConcurrency: {
|
|
55
|
+
maxConcurrent: 50,
|
|
56
|
+
partitionBy: 'global',
|
|
57
|
+
},
|
|
58
|
+
defaultTimeout: {
|
|
59
|
+
executeMs: 30000, // 30 second timeout
|
|
60
|
+
},
|
|
61
|
+
ipFilter: {
|
|
62
|
+
allowList: ['10.0.0.0/8'],
|
|
63
|
+
defaultAction: 'deny',
|
|
64
|
+
trustProxy: true,
|
|
65
|
+
trustedProxyDepth: 1,
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
})
|
|
69
|
+
class Server {}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## What This Demonstrates
|
|
73
|
+
|
|
74
|
+
- Enabling throttle with `throttle: { enabled: true }`
|
|
75
|
+
- Setting `global` rate limit shared across all clients
|
|
76
|
+
- Configuring `globalConcurrency` to cap simultaneous executions
|
|
77
|
+
- Setting `defaultTimeout` to prevent runaway tool executions
|
|
78
|
+
- Using `ipFilter` with deny-by-default posture and an explicit allow list
|
|
79
|
+
|
|
80
|
+
## Related
|
|
81
|
+
|
|
82
|
+
- See `configure-throttle` for the full throttle configuration reference
|
|
83
|
+
- See `configure-throttle-guard-config` for the complete GuardConfig interface
|