@frontmcp/skills 1.1.2 → 1.2.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/catalog/TEMPLATE.md +16 -11
- package/catalog/frontmcp-authorities/SKILL.md +116 -11
- package/catalog/frontmcp-authorities/references/authority-profiles.md +39 -36
- package/catalog/frontmcp-authorities/references/claims-mapping.md +7 -0
- package/catalog/frontmcp-authorities/references/custom-evaluators.md +63 -14
- package/catalog/frontmcp-channels/SKILL.md +36 -0
- package/catalog/frontmcp-channels/examples/channel-sources/file-watcher.md +8 -2
- package/catalog/frontmcp-channels/examples/channel-sources/replay-buffer.md +111 -30
- package/catalog/frontmcp-channels/examples/channel-two-way/whatsapp-bridge.md +45 -3
- package/catalog/frontmcp-channels/references/channel-sources.md +11 -3
- package/catalog/frontmcp-channels/references/channel-two-way.md +60 -89
- package/catalog/frontmcp-config/SKILL.md +111 -8
- package/catalog/frontmcp-config/examples/configure-auth-modes/local-self-signed-tokens.md +4 -4
- package/catalog/frontmcp-config/examples/configure-auth-modes/remote-enterprise-oauth.md +7 -1
- package/catalog/frontmcp-config/examples/configure-deployment-targets/distributed-ha-config.md +1 -1
- package/catalog/frontmcp-config/examples/configure-deployment-targets/json-schema-ide-support.md +1 -1
- package/catalog/frontmcp-config/examples/configure-deployment-targets/multi-target-with-security.md +12 -9
- package/catalog/frontmcp-config/examples/configure-http/cors-restricted-origins.md +2 -2
- package/catalog/frontmcp-config/examples/configure-http/entry-path-reverse-proxy.md +1 -1
- package/catalog/frontmcp-config/examples/configure-security-headers/csp-report-only.md +1 -1
- package/catalog/frontmcp-config/examples/configure-security-headers/full-production-headers.md +1 -1
- package/catalog/frontmcp-config/examples/configure-skills-http/audit-log-basic.md +76 -0
- package/catalog/frontmcp-config/examples/configure-skills-http/audit-log-redis.md +116 -0
- package/catalog/frontmcp-config/examples/configure-skills-http/inject-instructions.md +59 -0
- package/catalog/frontmcp-config/references/configure-auth-modes.md +5 -5
- package/catalog/frontmcp-config/references/configure-deployment-targets.md +27 -24
- package/catalog/frontmcp-config/references/configure-http.md +14 -10
- package/catalog/frontmcp-config/references/configure-security-headers.md +2 -2
- package/catalog/frontmcp-config/references/configure-session.md +25 -25
- package/catalog/frontmcp-config/references/configure-skills-http.md +157 -0
- package/catalog/frontmcp-config/references/configure-throttle.md +1 -1
- package/catalog/frontmcp-config/references/configure-transport.md +2 -2
- package/catalog/frontmcp-deployment/SKILL.md +112 -9
- package/catalog/frontmcp-deployment/examples/build-for-browser/browser-build-with-custom-entry.md +23 -11
- package/catalog/frontmcp-deployment/examples/build-for-browser/browser-crypto-and-storage.md +44 -17
- package/catalog/frontmcp-deployment/examples/build-for-browser/react-provider-setup.md +53 -21
- package/catalog/frontmcp-deployment/examples/build-for-cli/cli-binary-build.md +1 -1
- package/catalog/frontmcp-deployment/examples/build-for-cli/unix-socket-daemon.md +1 -1
- package/catalog/frontmcp-deployment/examples/build-for-mcpb/mcpb-bundle-build.md +1 -1
- package/catalog/frontmcp-deployment/examples/build-for-sdk/connect-openai.md +1 -1
- package/catalog/frontmcp-deployment/examples/build-for-sdk/multi-platform-connect.md +1 -1
- package/catalog/frontmcp-deployment/examples/deploy-to-cloudflare/basic-worker-deploy.md +7 -8
- package/catalog/frontmcp-deployment/examples/deploy-to-cloudflare/worker-custom-domain.md +8 -6
- package/catalog/frontmcp-deployment/examples/deploy-to-cloudflare/worker-with-kv-storage.md +5 -4
- package/catalog/frontmcp-deployment/examples/deploy-to-lambda/cdk-deployment.md +8 -5
- package/catalog/frontmcp-deployment/examples/deploy-to-lambda/lambda-handler-with-cors.md +20 -18
- package/catalog/frontmcp-deployment/examples/deploy-to-lambda/sam-template-basic.md +8 -5
- package/catalog/frontmcp-deployment/examples/deploy-to-node/docker-compose-with-redis.md +3 -3
- package/catalog/frontmcp-deployment/examples/deploy-to-node/pm2-with-nginx.md +1 -1
- package/catalog/frontmcp-deployment/examples/deploy-to-node/resource-limits.md +2 -2
- package/catalog/frontmcp-deployment/examples/deploy-to-node-dockerfile/basic-multistage-dockerfile.md +2 -2
- package/catalog/frontmcp-deployment/examples/deploy-to-node-dockerfile/secure-nonroot-dockerfile.md +1 -1
- package/catalog/frontmcp-deployment/examples/deploy-to-vercel/vercel-mcp-endpoint-test.md +23 -21
- package/catalog/frontmcp-deployment/examples/deploy-to-vercel/vercel-with-kv.md +25 -22
- package/catalog/frontmcp-deployment/examples/deploy-to-vercel/vercel-with-skills-cache.md +23 -30
- package/catalog/frontmcp-deployment/examples/deploy-to-vercel-config/minimal-vercel-config.md +52 -28
- package/catalog/frontmcp-deployment/examples/deploy-to-vercel-config/vercel-config-with-security-headers.md +32 -55
- package/catalog/frontmcp-deployment/examples/mcp-client-integration/http-remote.md +9 -0
- package/catalog/frontmcp-deployment/references/build-for-browser.md +40 -17
- package/catalog/frontmcp-deployment/references/build-for-cli.md +8 -8
- package/catalog/frontmcp-deployment/references/deploy-to-cloudflare.md +43 -24
- package/catalog/frontmcp-deployment/references/deploy-to-lambda.md +36 -25
- package/catalog/frontmcp-deployment/references/deploy-to-node-dockerfile.md +56 -14
- package/catalog/frontmcp-deployment/references/deploy-to-node.md +9 -6
- package/catalog/frontmcp-deployment/references/deploy-to-vercel-config.md +57 -58
- package/catalog/frontmcp-deployment/references/deploy-to-vercel.md +49 -59
- package/catalog/frontmcp-deployment/references/mcp-client-integration.md +2 -0
- package/catalog/frontmcp-development/SKILL.md +186 -11
- package/catalog/frontmcp-development/examples/create-agent/custom-multi-pass-agent.md +1 -1
- package/catalog/frontmcp-development/examples/create-agent/nested-agents-with-swarm.md +30 -27
- package/catalog/frontmcp-development/examples/create-job/job-with-permissions.md +13 -8
- package/catalog/frontmcp-development/examples/create-provider/basic-database-provider.md +33 -23
- package/catalog/frontmcp-development/examples/create-provider/config-and-api-providers.md +19 -10
- package/catalog/frontmcp-development/examples/create-tool/tool-with-rate-limiting-and-progress.md +3 -3
- package/catalog/frontmcp-development/examples/create-workflow/webhook-triggered-workflow.md +6 -4
- package/catalog/frontmcp-development/examples/decorators-guide/agent-skill-job-workflow.md +1 -1
- package/catalog/frontmcp-development/examples/decorators-guide/basic-server-with-app-and-tools.md +13 -8
- package/catalog/frontmcp-development/examples/decorators-guide/multi-app-with-plugins-and-providers.md +50 -23
- package/catalog/frontmcp-development/references/create-agent.md +47 -30
- package/catalog/frontmcp-development/references/create-job.md +69 -54
- package/catalog/frontmcp-development/references/create-plugin-hooks.md +45 -28
- package/catalog/frontmcp-development/references/create-plugin.md +10 -8
- package/catalog/frontmcp-development/references/create-prompt.md +3 -3
- package/catalog/frontmcp-development/references/create-provider.md +91 -51
- package/catalog/frontmcp-development/references/create-resource.md +3 -3
- package/catalog/frontmcp-development/references/create-skill.md +2 -2
- package/catalog/frontmcp-development/references/create-tool.md +7 -7
- package/catalog/frontmcp-development/references/create-workflow.md +8 -10
- package/catalog/frontmcp-development/references/decorators-guide.md +92 -56
- package/catalog/frontmcp-development/references/official-plugins.md +4 -3
- package/catalog/frontmcp-development/references/openapi-adapter.md +1 -1
- package/catalog/frontmcp-extensibility/SKILL.md +70 -10
- package/catalog/frontmcp-extensibility/examples/skill-audit-log/custom-store.md +197 -0
- package/catalog/frontmcp-extensibility/examples/skill-audit-log/verify-chain.md +68 -0
- package/catalog/frontmcp-extensibility/examples/vectoriadb/product-catalog-search.md +3 -5
- package/catalog/frontmcp-extensibility/examples/vectoriadb/semantic-search-with-persistence.md +4 -11
- package/catalog/frontmcp-extensibility/examples/vectoriadb/tfidf-keyword-search.md +41 -30
- package/catalog/frontmcp-extensibility/references/skill-audit-log.md +233 -0
- package/catalog/frontmcp-extensibility/references/vectoriadb.md +73 -63
- package/catalog/frontmcp-guides/SKILL.md +84 -27
- package/catalog/frontmcp-guides/examples/example-knowledge-base/agent-and-plugin.md +72 -62
- package/catalog/frontmcp-guides/examples/example-knowledge-base/vector-search-and-resources.md +32 -43
- package/catalog/frontmcp-guides/examples/example-task-manager/auth-and-crud-tools.md +24 -17
- package/catalog/frontmcp-guides/examples/example-task-manager/authenticated-e2e-tests.md +23 -21
- package/catalog/frontmcp-guides/examples/example-task-manager/redis-provider-with-di.md +47 -39
- package/catalog/frontmcp-guides/examples/example-weather-api/server-and-app-setup.md +16 -6
- package/catalog/frontmcp-guides/examples/example-weather-api/unit-and-e2e-tests.md +9 -8
- package/catalog/frontmcp-guides/references/example-knowledge-base.md +192 -265
- package/catalog/frontmcp-guides/references/example-task-manager.md +60 -54
- package/catalog/frontmcp-guides/references/example-weather-api.md +22 -24
- package/catalog/frontmcp-observability/SKILL.md +66 -2
- package/catalog/frontmcp-observability/examples/telemetry-api/skill-counters.md +100 -0
- package/catalog/frontmcp-observability/examples/tracing-setup/production-tracing.md +7 -2
- package/catalog/frontmcp-observability/examples/vendor-integrations/coralogix-setup.md +6 -2
- package/catalog/frontmcp-observability/references/telemetry-api.md +72 -8
- package/catalog/frontmcp-observability/references/testing-observability.md +33 -49
- package/catalog/frontmcp-observability/references/tracing-setup.md +12 -5
- package/catalog/frontmcp-observability/references/vendor-integrations.md +46 -1
- package/catalog/frontmcp-production-readiness/SKILL.md +134 -3
- package/catalog/frontmcp-production-readiness/examples/common-checklist/caching-and-performance.md +57 -36
- package/catalog/frontmcp-production-readiness/examples/common-checklist/observability-setup.md +1 -1
- package/catalog/frontmcp-production-readiness/examples/common-checklist/security-hardening.md +102 -6
- package/catalog/frontmcp-production-readiness/examples/production-cli-daemon/daemon-socket-config.md +2 -1
- package/catalog/frontmcp-production-readiness/examples/production-cli-daemon/graceful-shutdown-cleanup.md +66 -58
- package/catalog/frontmcp-production-readiness/examples/production-cli-daemon/security-and-permissions.md +5 -3
- package/catalog/frontmcp-production-readiness/examples/production-cloudflare/durable-objects-state.md +2 -1
- package/catalog/frontmcp-production-readiness/examples/production-cloudflare/wrangler-config.md +55 -76
- package/catalog/frontmcp-production-readiness/examples/production-lambda/cold-start-connection-reuse.md +43 -40
- package/catalog/frontmcp-production-readiness/examples/production-lambda/sam-template.md +63 -94
- package/catalog/frontmcp-production-readiness/examples/production-lambda/scaling-and-monitoring.md +28 -18
- package/catalog/frontmcp-production-readiness/examples/production-node-sdk/multi-instance-cleanup.md +29 -14
- package/catalog/frontmcp-production-readiness/examples/production-node-server/graceful-shutdown.md +58 -42
- package/catalog/frontmcp-production-readiness/examples/production-node-server/redis-session-scaling.md +5 -2
- package/catalog/frontmcp-production-readiness/examples/production-vercel/cold-start-optimization.md +41 -24
- package/catalog/frontmcp-production-readiness/examples/production-vercel/vercel-edge-config.md +56 -65
- package/catalog/frontmcp-production-readiness/references/common-checklist.md +17 -5
- package/catalog/frontmcp-production-readiness/references/production-cli-daemon.md +5 -5
- package/catalog/frontmcp-production-readiness/references/production-cloudflare.md +5 -5
- package/catalog/frontmcp-production-readiness/references/production-lambda.md +5 -5
- package/catalog/frontmcp-production-readiness/references/production-node-sdk.md +5 -5
- package/catalog/frontmcp-production-readiness/references/production-node-server.md +1 -1
- package/catalog/frontmcp-production-readiness/references/production-vercel.md +5 -5
- package/catalog/frontmcp-setup/SKILL.md +88 -0
- package/catalog/frontmcp-setup/examples/project-structure-nx/nx-workspace-with-apps.md +10 -4
- package/catalog/frontmcp-setup/examples/project-structure-standalone/dev-workflow-commands.md +21 -8
- package/catalog/frontmcp-setup/examples/readme-guide/node-server-readme.md +3 -3
- package/catalog/frontmcp-setup/references/multi-app-composition.md +4 -3
- package/catalog/frontmcp-setup/references/project-structure-nx.md +15 -6
- package/catalog/frontmcp-setup/references/project-structure-standalone.md +18 -15
- package/catalog/frontmcp-setup/references/readme-guide.md +1 -1
- package/catalog/frontmcp-setup/references/setup-project.md +19 -5
- package/catalog/frontmcp-setup/references/setup-redis.md +27 -39
- package/catalog/frontmcp-setup/references/setup-sqlite.md +25 -18
- package/catalog/frontmcp-testing/SKILL.md +102 -15
- package/catalog/frontmcp-testing/examples/setup-testing/unit-test-tool-resource-prompt.md +3 -3
- package/catalog/frontmcp-testing/examples/test-auth/oauth-flow-test.md +50 -39
- package/catalog/frontmcp-testing/examples/test-auth/role-based-access-test.md +52 -29
- package/catalog/frontmcp-testing/examples/test-auth/token-factory-test.md +37 -20
- package/catalog/frontmcp-testing/examples/test-direct-client/basic-create-test.md +25 -15
- package/catalog/frontmcp-testing/examples/test-direct-client/openai-claude-format-test.md +27 -21
- package/catalog/frontmcp-testing/examples/test-e2e-handler/basic-e2e-test.md +29 -20
- package/catalog/frontmcp-testing/examples/test-e2e-handler/manual-client-with-transport.md +5 -3
- package/catalog/frontmcp-testing/examples/test-e2e-handler/tool-call-and-error-e2e.md +35 -26
- package/catalog/frontmcp-testing/examples/test-tool-unit/basic-tool-test.md +8 -3
- package/catalog/frontmcp-testing/examples/test-tool-unit/schema-validation-test.md +4 -1
- package/catalog/frontmcp-testing/examples/test-tool-unit/tool-error-handling-test.md +6 -3
- package/catalog/frontmcp-testing/references/setup-testing.md +35 -39
- package/catalog/frontmcp-testing/references/test-auth.md +86 -43
- package/catalog/frontmcp-testing/references/test-browser-build.md +1 -1
- package/catalog/frontmcp-testing/references/test-direct-client.md +29 -19
- package/catalog/frontmcp-testing/references/test-e2e-handler.md +31 -19
- package/catalog/frontmcp-testing/references/test-tool-unit.md +6 -2
- package/catalog/skills-manifest.json +428 -339
- package/package.json +1 -1
- package/src/manifest.d.ts +13 -0
- package/src/manifest.js.map +1 -1
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"references": [
|
|
14
14
|
{
|
|
15
15
|
"name": "configure-auth-modes",
|
|
16
|
-
"description": "Detailed comparison of public, transparent,
|
|
16
|
+
"description": "Detailed comparison of public, transparent, local, and remote auth modes",
|
|
17
17
|
"examples": [
|
|
18
18
|
{
|
|
19
19
|
"name": "local-self-signed-tokens",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"tags": ["config", "auth", "redis", "local", "auth-modes", "modes"],
|
|
23
23
|
"features": [
|
|
24
24
|
"Using `mode: 'local'` so the server signs its own JWTs",
|
|
25
|
-
"Setting `local.issuer` and `
|
|
25
|
+
"Setting `local.issuer` and `expectedAudience` to control token claims",
|
|
26
26
|
"Enabling `consent` for explicit user authorization flow",
|
|
27
27
|
"Enabling `incrementalAuth` to request additional scopes progressively",
|
|
28
28
|
"Using Redis for token storage in production"
|
|
@@ -92,6 +92,48 @@
|
|
|
92
92
|
}
|
|
93
93
|
]
|
|
94
94
|
},
|
|
95
|
+
{
|
|
96
|
+
"name": "configure-deployment-targets",
|
|
97
|
+
"description": "Configure multi-target builds with frontmcp.config.ts for node, distributed, vercel, lambda, cloudflare, browser, cli, sdk, and mcpb targets",
|
|
98
|
+
"examples": [
|
|
99
|
+
{
|
|
100
|
+
"name": "distributed-ha-config",
|
|
101
|
+
"description": "Configure a distributed deployment target with HA settings for heartbeat, session takeover, and Redis-backed session persistence",
|
|
102
|
+
"level": "advanced",
|
|
103
|
+
"tags": ["config", "deployment", "distributed", "ha", "redis", "heartbeat", "session-takeover"],
|
|
104
|
+
"features": [
|
|
105
|
+
"Configuring the distributed deployment target with HA options",
|
|
106
|
+
"Setting custom heartbeat intervals and TTL for pod liveness detection",
|
|
107
|
+
"Combining server config (CSP, cookies) with HA config in the same target",
|
|
108
|
+
"Using per-target environment variables for Redis connection"
|
|
109
|
+
]
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"name": "json-schema-ide-support",
|
|
113
|
+
"description": "Use frontmcp.config.json with JSON Schema for VS Code and WebStorm autocomplete",
|
|
114
|
+
"level": "basic",
|
|
115
|
+
"tags": ["config", "deployment", "json", "schema", "ide", "autocomplete"],
|
|
116
|
+
"features": [
|
|
117
|
+
"Adding $schema field for IDE autocomplete in JSON config files",
|
|
118
|
+
"Configuring multiple deployment targets in JSON format",
|
|
119
|
+
"Using the frontmcp.schema.json for property validation and hover docs"
|
|
120
|
+
]
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"name": "multi-target-with-security",
|
|
124
|
+
"description": "Configure a FrontMCP project with node + distributed targets, CSP headers, and HSTS",
|
|
125
|
+
"level": "intermediate",
|
|
126
|
+
"tags": ["config", "deployment", "csp", "security", "distributed", "hsts", "multi-target"],
|
|
127
|
+
"features": [
|
|
128
|
+
"Using defineConfig() for typed configuration with IDE autocomplete",
|
|
129
|
+
"Multi-target deployments with per-target server settings",
|
|
130
|
+
"CSP directives including value-less directives like upgrade-insecure-requests",
|
|
131
|
+
"Security headers (HSTS, X-Frame-Options, X-Content-Type-Options)",
|
|
132
|
+
"HA configuration for the distributed target"
|
|
133
|
+
]
|
|
134
|
+
}
|
|
135
|
+
]
|
|
136
|
+
},
|
|
95
137
|
{
|
|
96
138
|
"name": "configure-elicitation",
|
|
97
139
|
"description": "Configure interactive user input during tool execution for confirmations, choices, and forms",
|
|
@@ -164,6 +206,35 @@
|
|
|
164
206
|
}
|
|
165
207
|
]
|
|
166
208
|
},
|
|
209
|
+
{
|
|
210
|
+
"name": "configure-security-headers",
|
|
211
|
+
"description": "Configure CSP, HSTS, X-Frame-Options, and X-Content-Type-Options via frontmcp.config server settings",
|
|
212
|
+
"examples": [
|
|
213
|
+
{
|
|
214
|
+
"name": "csp-report-only",
|
|
215
|
+
"description": "Test CSP policies in report-only mode to identify violations before enforcement",
|
|
216
|
+
"level": "basic",
|
|
217
|
+
"tags": ["config", "csp", "security", "report-only", "headers"],
|
|
218
|
+
"features": [
|
|
219
|
+
"Enabling CSP in report-only mode with reportUri for violation monitoring",
|
|
220
|
+
"Using the object-format directives in frontmcp.config",
|
|
221
|
+
"Verifying report-only header is emitted instead of enforcement header"
|
|
222
|
+
]
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
"name": "full-production-headers",
|
|
226
|
+
"description": "Complete security headers configuration for production with CSP enforcement, HSTS preload, and clickjacking protection",
|
|
227
|
+
"level": "intermediate",
|
|
228
|
+
"tags": ["config", "csp", "security", "hsts", "production", "headers", "frame-options"],
|
|
229
|
+
"features": [
|
|
230
|
+
"Full CSP enforcement with multiple directive types including value-less directives",
|
|
231
|
+
"HSTS with preload and includeSubDomains for HTTPS enforcement",
|
|
232
|
+
"X-Frame-Options DENY for clickjacking protection",
|
|
233
|
+
"Custom headers for additional security controls"
|
|
234
|
+
]
|
|
235
|
+
}
|
|
236
|
+
]
|
|
237
|
+
},
|
|
167
238
|
{
|
|
168
239
|
"name": "configure-session",
|
|
169
240
|
"description": "Set up session storage with Redis or Vercel KV for persistent user state across requests",
|
|
@@ -366,72 +437,43 @@
|
|
|
366
437
|
"examples": []
|
|
367
438
|
},
|
|
368
439
|
{
|
|
369
|
-
"name": "configure-
|
|
370
|
-
"description": "
|
|
440
|
+
"name": "configure-skills-http",
|
|
441
|
+
"description": "Full reference for skillsConfig — HTTP catalog endpoints, auth, caching, instructions injection, and tamper-evident audit log.",
|
|
371
442
|
"examples": [
|
|
372
443
|
{
|
|
373
|
-
"name": "
|
|
374
|
-
"description": "
|
|
375
|
-
"level": "intermediate",
|
|
376
|
-
"tags": ["config", "deployment", "csp", "security", "distributed", "hsts", "multi-target"],
|
|
377
|
-
"features": [
|
|
378
|
-
"Using defineConfig() for typed configuration with IDE autocomplete",
|
|
379
|
-
"Multi-target deployments with per-target server settings",
|
|
380
|
-
"CSP directives including value-less directives like upgrade-insecure-requests",
|
|
381
|
-
"Security headers (HSTS, X-Frame-Options, X-Content-Type-Options)",
|
|
382
|
-
"HA configuration for the distributed target"
|
|
383
|
-
]
|
|
384
|
-
},
|
|
385
|
-
{
|
|
386
|
-
"name": "distributed-ha-config",
|
|
387
|
-
"description": "Configure a distributed deployment target with HA settings for heartbeat, session takeover, and Redis-backed session persistence",
|
|
388
|
-
"level": "advanced",
|
|
389
|
-
"tags": ["config", "deployment", "distributed", "ha", "redis", "heartbeat", "session-takeover"],
|
|
390
|
-
"features": [
|
|
391
|
-
"Configuring the distributed deployment target with HA options",
|
|
392
|
-
"Setting custom heartbeat intervals and TTL for pod liveness detection",
|
|
393
|
-
"Combining server config (CSP, cookies) with HA config in the same target",
|
|
394
|
-
"Using per-target environment variables for Redis connection"
|
|
395
|
-
]
|
|
396
|
-
},
|
|
397
|
-
{
|
|
398
|
-
"name": "json-schema-ide-support",
|
|
399
|
-
"description": "Use frontmcp.config.json with JSON Schema for VS Code and WebStorm autocomplete",
|
|
444
|
+
"name": "inject-instructions",
|
|
445
|
+
"description": "Set a server-level instructions string and append the skill catalog summary on every initialize response.",
|
|
400
446
|
"level": "basic",
|
|
401
|
-
"tags": ["config", "
|
|
447
|
+
"tags": ["config", "skills", "instructions", "injection", "initialize"],
|
|
402
448
|
"features": [
|
|
403
|
-
"
|
|
404
|
-
"
|
|
405
|
-
"
|
|
449
|
+
"Top-level `instructions` on `@FrontMcp` exposes a global system prompt to MCP clients",
|
|
450
|
+
"`skillsConfig.injectInstructions: 'append'` adds the skill catalog summary after the user prompt",
|
|
451
|
+
"Dynamic skills are picked up because the composer runs on every initialize request",
|
|
452
|
+
"Catalog summary is bounded at 16 KB with a truncation footer pointing at skill://catalog"
|
|
406
453
|
]
|
|
407
|
-
}
|
|
408
|
-
]
|
|
409
|
-
},
|
|
410
|
-
{
|
|
411
|
-
"name": "configure-security-headers",
|
|
412
|
-
"description": "Configure CSP, HSTS, X-Frame-Options, and X-Content-Type-Options via frontmcp.config server settings",
|
|
413
|
-
"examples": [
|
|
454
|
+
},
|
|
414
455
|
{
|
|
415
|
-
"name": "
|
|
416
|
-
"description": "
|
|
456
|
+
"name": "audit-log-basic",
|
|
457
|
+
"description": "Enable the skill audit log with the in-memory store and HS256 signer for development and tests.",
|
|
417
458
|
"level": "basic",
|
|
418
|
-
"tags": ["config", "
|
|
459
|
+
"tags": ["config", "skills", "audit", "hs256", "development"],
|
|
419
460
|
"features": [
|
|
420
|
-
"
|
|
421
|
-
"
|
|
422
|
-
"
|
|
461
|
+
"Bootstraps the audit subsystem via setSkillAuditFactory(...) before FrontMcp registers",
|
|
462
|
+
"MemoryAuditStore keeps records in-process — perfect for tests, lost on restart",
|
|
463
|
+
"Hs256AuditSigner refuses to start when NODE_ENV === production with a random key",
|
|
464
|
+
"subjectMode: 'hash' redacts user identifiers while keeping them correlatable"
|
|
423
465
|
]
|
|
424
466
|
},
|
|
425
467
|
{
|
|
426
|
-
"name": "
|
|
427
|
-
"description": "
|
|
428
|
-
"level": "
|
|
429
|
-
"tags": ["config", "
|
|
468
|
+
"name": "audit-log-redis",
|
|
469
|
+
"description": "Production-grade audit log with the Redis-backed StorageAdapterAuditStore and the RS256 bundle-signing key.",
|
|
470
|
+
"level": "advanced",
|
|
471
|
+
"tags": ["config", "skills", "audit", "rs256", "redis", "production"],
|
|
430
472
|
"features": [
|
|
431
|
-
"
|
|
432
|
-
"
|
|
433
|
-
"
|
|
434
|
-
"
|
|
473
|
+
"StorageAdapterAuditStore persists records to Redis via the standard storage adapter",
|
|
474
|
+
"Rs256AuditSigner reuses the bundle-signing keypair for forensic-friendly signatures",
|
|
475
|
+
"Single-writer constraint: only one pod should write the chain in v1.2.0",
|
|
476
|
+
"verifyChain(records, trustedKeys, defaultAuditSignatureVerifier) detects tampering"
|
|
435
477
|
]
|
|
436
478
|
}
|
|
437
479
|
]
|
|
@@ -454,32 +496,35 @@
|
|
|
454
496
|
"examples": [
|
|
455
497
|
{
|
|
456
498
|
"name": "browser-build-with-custom-entry",
|
|
457
|
-
"description": "Build a browser bundle using a dedicated client entry file that avoids Node.js-only imports.",
|
|
499
|
+
"description": "Build a browser bundle using a dedicated client entry file that avoids Node.js-only imports. Re-export the real `@frontmcp/react` symbols (`useListTools`, `useListResources`, `useCallTool`) — `useTools`/`useResources` do not exist.",
|
|
458
500
|
"level": "intermediate",
|
|
459
|
-
"tags": ["deployment", "browser", "
|
|
501
|
+
"tags": ["deployment", "browser", "custom", "entry"],
|
|
460
502
|
"features": [
|
|
461
|
-
"Creating a separate browser entry point (`src/client.ts`) that
|
|
503
|
+
"Creating a separate browser entry point (`src/client.ts`) that re-exports only browser-safe symbols",
|
|
504
|
+
"Using the real `@frontmcp/react` hook names (`useListTools`, `useListResources`, etc.)",
|
|
462
505
|
"Using the `-e` and `-o` flags to customize the entry file and output directory"
|
|
463
506
|
]
|
|
464
507
|
},
|
|
465
508
|
{
|
|
466
509
|
"name": "browser-crypto-and-storage",
|
|
467
|
-
"description": "Use `@frontmcp/utils` crypto
|
|
510
|
+
"description": "Use `@frontmcp/utils` crypto in the browser, and create the FrontMCP server with `create()` from `@frontmcp/sdk` so the React provider can consume it via the `server` prop.",
|
|
468
511
|
"level": "advanced",
|
|
469
|
-
"tags": ["deployment", "browser", "
|
|
512
|
+
"tags": ["deployment", "browser", "crypto", "react"],
|
|
470
513
|
"features": [
|
|
471
514
|
"Using `@frontmcp/utils` for PKCE and hashing in the browser (backed by WebCrypto, not `node:crypto`)",
|
|
472
|
-
"
|
|
515
|
+
"Creating a `DirectMcpServer` with `create()` and passing it to `FrontMcpProvider` via `server={...}` (no `config={{ serverUrl }}`)",
|
|
516
|
+
"Using `useListTools` (real hook) instead of the non-existent `useTools`"
|
|
473
517
|
]
|
|
474
518
|
},
|
|
475
519
|
{
|
|
476
520
|
"name": "react-provider-setup",
|
|
477
|
-
"description": "Connect a React application to a
|
|
521
|
+
"description": "Connect a React application to a FrontMCP server using `@frontmcp/react`. `FrontMcpProvider` takes a `DirectMcpServer` instance via the `server` prop — there is no `serverUrl` option.",
|
|
478
522
|
"level": "basic",
|
|
479
|
-
"tags": ["deployment", "react", "browser", "
|
|
523
|
+
"tags": ["deployment", "react", "browser", "provider", "setup"],
|
|
480
524
|
"features": [
|
|
481
|
-
"Wrapping your React app with `FrontMcpProvider` and
|
|
482
|
-
"Using
|
|
525
|
+
"Wrapping your React app with `FrontMcpProvider` and passing a real `DirectMcpServer` via `server={...}`",
|
|
526
|
+
"Using `useListTools` to fetch the tools list and `useCallTool` to invoke one",
|
|
527
|
+
"Creating the server with `create()` from `@frontmcp/sdk` (in-memory direct connection)"
|
|
483
528
|
]
|
|
484
529
|
}
|
|
485
530
|
]
|
|
@@ -624,13 +669,13 @@
|
|
|
624
669
|
},
|
|
625
670
|
{
|
|
626
671
|
"name": "lambda-handler-with-cors",
|
|
627
|
-
"description": "
|
|
672
|
+
"description": "CORS for a FrontMCP Lambda is configured at the API Gateway HTTP API level, not in the handler. `frontmcp build --target lambda` writes `dist/lambda/handler.cjs` — your `@FrontMcp` server is wrapped automatically with `@codegenie/serverless-express`, so CORS belongs on the gateway.",
|
|
628
673
|
"level": "intermediate",
|
|
629
674
|
"tags": ["deployment", "lambda", "handler", "cors"],
|
|
630
675
|
"features": [
|
|
631
|
-
"
|
|
632
|
-
"
|
|
633
|
-
"
|
|
676
|
+
"Configuring CORS at the API Gateway HTTP API layer (not the handler) via `CorsConfiguration`",
|
|
677
|
+
"Linking the function events to the explicit API via `ApiId: !Ref`",
|
|
678
|
+
"Pointing SAM `CodeUri` at `dist/lambda/` so the auto-generated `handler.cjs` is uploaded"
|
|
634
679
|
]
|
|
635
680
|
},
|
|
636
681
|
{
|
|
@@ -719,24 +764,24 @@
|
|
|
719
764
|
"examples": [
|
|
720
765
|
{
|
|
721
766
|
"name": "minimal-vercel-config",
|
|
722
|
-
"description": "
|
|
767
|
+
"description": "`frontmcp build --target vercel` writes this minimal `vercel.json` for you. The package manager is detected from your lockfile.",
|
|
723
768
|
"level": "basic",
|
|
724
769
|
"tags": ["deployment", "vercel", "serverless", "config", "minimal"],
|
|
725
770
|
"features": [
|
|
726
|
-
"The
|
|
727
|
-
"
|
|
728
|
-
"
|
|
771
|
+
"The exact shape of the auto-generated `vercel.json` — three keys, nothing else",
|
|
772
|
+
"That routing and function configuration live in `.vercel/output/`, not `vercel.json`",
|
|
773
|
+
"That hand-authoring `api/frontmcp.ts` references in `vercel.json` is unnecessary and breaks deploys"
|
|
729
774
|
]
|
|
730
775
|
},
|
|
731
776
|
{
|
|
732
777
|
"name": "vercel-config-with-security-headers",
|
|
733
|
-
"description": "
|
|
778
|
+
"description": "The Vercel adapter emits a minimal `vercel.json` (version + buildCommand + installCommand). You can layer extra Vercel-supported keys on top after the build — but never add `functions: { 'api/frontmcp.ts': ... }` or `rewrites` to `/api/frontmcp` (the build does not produce an `api/` directory).",
|
|
734
779
|
"level": "intermediate",
|
|
735
|
-
"tags": ["deployment", "vercel", "
|
|
780
|
+
"tags": ["deployment", "vercel", "security", "config", "headers"],
|
|
736
781
|
"features": [
|
|
737
|
-
"
|
|
738
|
-
"
|
|
739
|
-
"
|
|
782
|
+
"Adding `regions` to constrain function placement (e.g., `iad1` for US East)",
|
|
783
|
+
"Per-route `Cache-Control: no-store` on `/healthz` and `/mcp` to prevent caching",
|
|
784
|
+
"Global security headers applied to all routes via the catch-all `source: \"/(.*)\"`"
|
|
740
785
|
]
|
|
741
786
|
}
|
|
742
787
|
]
|
|
@@ -747,35 +792,35 @@
|
|
|
747
792
|
"examples": [
|
|
748
793
|
{
|
|
749
794
|
"name": "vercel-mcp-endpoint-test",
|
|
750
|
-
"description": "Verify a Vercel-deployed FrontMCP server by testing health, tool listing, and tool invocation.",
|
|
795
|
+
"description": "Verify a Vercel-deployed FrontMCP server by testing health, tool listing, and tool invocation. The CLI emits the Build Output API v3 structure — there is no `api/frontmcp.ts` to test against; the function lives at `.vercel/output/functions/index.func/handler.cjs` and is routed via `.vercel/output/config.json`.",
|
|
751
796
|
"level": "advanced",
|
|
752
797
|
"tags": ["deployment", "json-rpc", "vercel", "mcp", "endpoint"],
|
|
753
798
|
"features": [
|
|
754
|
-
"Testing the health endpoint and MCP JSON-RPC API of a deployed Vercel function",
|
|
799
|
+
"Testing the health endpoint (`/healthz`) and MCP JSON-RPC API of a deployed Vercel function",
|
|
755
800
|
"Using preview deployments to validate changes before promoting to production",
|
|
756
|
-
"
|
|
801
|
+
"Vercel plan limits for `maxDuration` (Hobby: 10s, Pro: 60s, Enterprise: 900s) — configure these in the Vercel dashboard, not via `functions: { 'api/frontmcp.ts': ... }`"
|
|
757
802
|
]
|
|
758
803
|
},
|
|
759
804
|
{
|
|
760
805
|
"name": "vercel-with-kv",
|
|
761
|
-
"description": "Deploy a FrontMCP server to Vercel serverless functions with Vercel KV for session persistence.",
|
|
806
|
+
"description": "Deploy a FrontMCP server to Vercel serverless functions with Vercel KV for session persistence. The CLI emits the full Build Output API v3 structure for you — you do **not** author `api/frontmcp.ts` and you do **not** add a `rewrites` block.",
|
|
762
807
|
"level": "basic",
|
|
763
808
|
"tags": ["deployment", "vercel-kv", "vercel", "session", "performance", "serverless"],
|
|
764
809
|
"features": [
|
|
765
810
|
"Configuring `{ provider: 'vercel-kv' }` for automatic Vercel KV session storage",
|
|
766
|
-
"
|
|
767
|
-
"
|
|
811
|
+
"Letting the CLI produce the Build Output API v3 structure (no manual `api/` directory or `rewrites`)",
|
|
812
|
+
"Deploying with `vercel --prod` after the build emits `.vercel/output/`"
|
|
768
813
|
]
|
|
769
814
|
},
|
|
770
815
|
{
|
|
771
816
|
"name": "vercel-with-skills-cache",
|
|
772
|
-
"description": "Deploy a FrontMCP server to Vercel with skills enabled and KV-backed skill caching.",
|
|
817
|
+
"description": "Deploy a FrontMCP server to Vercel with skills enabled and KV-backed skill caching. The CLI handles the Build Output API v3 emission for you — your job is to configure the server and provision Vercel KV.",
|
|
773
818
|
"level": "intermediate",
|
|
774
|
-
"tags": ["deployment", "vercel-kv", "vercel", "cache", "
|
|
819
|
+
"tags": ["deployment", "vercel-kv", "vercel", "cache", "skills"],
|
|
775
820
|
"features": [
|
|
776
821
|
"Enabling skills cache backed by Vercel KV with a 60-second TTL",
|
|
777
822
|
"Setting environment variables via `vercel env add` instead of hardcoding in source",
|
|
778
|
-
"
|
|
823
|
+
"Letting the CLI emit the Build Output API v3 structure rather than hand-authoring `api/frontmcp.ts`"
|
|
779
824
|
]
|
|
780
825
|
}
|
|
781
826
|
]
|
|
@@ -784,18 +829,6 @@
|
|
|
784
829
|
"name": "mcp-client-integration",
|
|
785
830
|
"description": "Configure MCP clients (Claude Desktop, Claude Code, Cursor, VS Code) to connect to a FrontMCP server via stdio, HTTP, or Unix socket",
|
|
786
831
|
"examples": [
|
|
787
|
-
{
|
|
788
|
-
"name": "stdio-npx",
|
|
789
|
-
"description": "Publish a FrontMCP server to npm and configure MCP clients to use it with npx --stdio.",
|
|
790
|
-
"level": "basic",
|
|
791
|
-
"tags": ["deployment", "stdio", "npx", "npm", "mcp-client", "claude-code", "claude-desktop"],
|
|
792
|
-
"features": [
|
|
793
|
-
"Building a FrontMCP server as a distributable CLI bundle",
|
|
794
|
-
"Configuring package.json bin field for npx execution",
|
|
795
|
-
"Setting up Claude Code, Claude Desktop, and Cursor to use the server via stdio",
|
|
796
|
-
"Passing environment variables from MCP client config to the server"
|
|
797
|
-
]
|
|
798
|
-
},
|
|
799
832
|
{
|
|
800
833
|
"name": "http-remote",
|
|
801
834
|
"description": "Connect an MCP client to a FrontMCP server running as an HTTP server, locally or remotely.",
|
|
@@ -819,6 +852,18 @@
|
|
|
819
852
|
"Using absolute paths for reliable binary resolution",
|
|
820
853
|
"Configuring different environments (dev, staging) via env vars"
|
|
821
854
|
]
|
|
855
|
+
},
|
|
856
|
+
{
|
|
857
|
+
"name": "stdio-npx",
|
|
858
|
+
"description": "Publish a FrontMCP server to npm and configure MCP clients to use it with npx --stdio.",
|
|
859
|
+
"level": "basic",
|
|
860
|
+
"tags": ["deployment", "stdio", "npx", "npm", "mcp-client", "claude-code", "claude-desktop"],
|
|
861
|
+
"features": [
|
|
862
|
+
"Building a FrontMCP server as a distributable CLI bundle",
|
|
863
|
+
"Configuring package.json bin field for npx execution",
|
|
864
|
+
"Setting up Claude Code, Claude Desktop, and Cursor to use the server via stdio",
|
|
865
|
+
"Passing environment variables from MCP client config to the server"
|
|
866
|
+
]
|
|
822
867
|
}
|
|
823
868
|
]
|
|
824
869
|
}
|
|
@@ -925,13 +970,13 @@
|
|
|
925
970
|
},
|
|
926
971
|
{
|
|
927
972
|
"name": "nested-agents-with-swarm",
|
|
928
|
-
"description": "Composing specialized
|
|
973
|
+
"description": "Composing specialized agents into a swarm where an orchestrator can discover and call peers at runtime as `use-agent:<id>` tools. Routing is driven by the orchestrator's LLM, not a declarative handoff table.",
|
|
929
974
|
"level": "advanced",
|
|
930
975
|
"tags": ["development", "agent", "nested", "agents", "swarm"],
|
|
931
976
|
"features": [
|
|
932
|
-
"
|
|
933
|
-
"
|
|
934
|
-
"
|
|
977
|
+
"Setting `swarm: { canSeeOtherAgents: true, visibleAgents: [...] }` on the orchestrator so peers appear as `use-agent:*` tools",
|
|
978
|
+
"Setting `swarm: { isVisible: true }` (the default) on specialist peers so they can be called",
|
|
979
|
+
"Routing is driven by the orchestrator LLM choosing among `use-agent:<peer>` tools, not by a declarative handoff table",
|
|
935
980
|
"Each agent has its own `llm` config, `tools`, and `systemInstructions` for specialization"
|
|
936
981
|
]
|
|
937
982
|
}
|
|
@@ -958,7 +1003,7 @@
|
|
|
958
1003
|
"level": "advanced",
|
|
959
1004
|
"tags": ["development", "redis", "job", "permissions"],
|
|
960
1005
|
"features": [
|
|
961
|
-
"Declarative `permissions`
|
|
1006
|
+
"Declarative `permissions` as an array of `{ action, roles, scopes, custom }` rules",
|
|
962
1007
|
"Using `tags` and `labels` for categorization and filtering",
|
|
963
1008
|
"The `job()` function builder for simple jobs that need no class",
|
|
964
1009
|
"Full server registration with `jobs.enabled: true` and a Redis store"
|
|
@@ -1113,14 +1158,14 @@
|
|
|
1113
1158
|
"examples": [
|
|
1114
1159
|
{
|
|
1115
1160
|
"name": "basic-database-provider",
|
|
1116
|
-
"description": "A provider that manages a database connection pool
|
|
1161
|
+
"description": "A provider that manages a database connection pool, bound through `AsyncProvider({ useFactory })` so the pool is opened before any tool runs.",
|
|
1117
1162
|
"level": "basic",
|
|
1118
1163
|
"tags": ["development", "database", "provider"],
|
|
1119
1164
|
"features": [
|
|
1120
1165
|
"Defining a typed token with `Token<T>` using a `Symbol` for DI identification",
|
|
1121
|
-
"Using
|
|
1166
|
+
"Using `AsyncProvider({ provide, name, scope, useFactory })` so async setup completes before tool execution",
|
|
1122
1167
|
"Consuming the provider in a tool via `this.get(DB_TOKEN)` with full type safety",
|
|
1123
|
-
"Registering the
|
|
1168
|
+
"Registering the factory in the `providers` array so tools can resolve it"
|
|
1124
1169
|
]
|
|
1125
1170
|
},
|
|
1126
1171
|
{
|
|
@@ -1129,8 +1174,8 @@
|
|
|
1129
1174
|
"level": "intermediate",
|
|
1130
1175
|
"tags": ["development", "provider", "config", "api", "providers"],
|
|
1131
1176
|
"features": [
|
|
1132
|
-
"A configuration provider using `readonly` properties from environment variables (
|
|
1133
|
-
"An API client provider
|
|
1177
|
+
"A configuration provider using `readonly` properties from environment variables (sync construction)",
|
|
1178
|
+
"An API client provider that reads credentials in the constructor (no `onInit` — `@Provider` has no lifecycle hooks)",
|
|
1134
1179
|
"Registering providers at `@FrontMcp` level for server-wide sharing across all apps",
|
|
1135
1180
|
"Separating token definitions from provider implementations for clean dependency boundaries"
|
|
1136
1181
|
]
|
|
@@ -1377,7 +1422,7 @@
|
|
|
1377
1422
|
"tags": ["development", "throttle", "tool", "rate", "limiting", "progress"],
|
|
1378
1423
|
"features": [
|
|
1379
1424
|
"Configuring `rateLimit`, `concurrency`, and `timeout` for throttling protection",
|
|
1380
|
-
"Sending progress updates to the client with `this.
|
|
1425
|
+
"Sending progress updates to the client with `this.progress(progress, total, message?)`",
|
|
1381
1426
|
"Using `this.mark(stage)` for execution stage tracking and debugging",
|
|
1382
1427
|
"Sending log-level notifications with `this.notify(message, level)`",
|
|
1383
1428
|
"Setting tool `annotations` to communicate behavioral hints to clients"
|
|
@@ -1455,8 +1500,8 @@
|
|
|
1455
1500
|
"features": [
|
|
1456
1501
|
"The `@FrontMcp` -> `@App` -> `@Tool`/`@Resource`/`@Prompt` nesting hierarchy",
|
|
1457
1502
|
"Tool classes extend `ToolContext` and implement `execute()`",
|
|
1458
|
-
"Resource classes extend `ResourceContext` and implement `
|
|
1459
|
-
"Prompt classes extend `PromptContext` and implement `execute()`",
|
|
1503
|
+
"Resource classes extend `ResourceContext` and implement `execute(uri, params)`",
|
|
1504
|
+
"Prompt classes extend `PromptContext` and implement `execute(args: Record<string, string>)`",
|
|
1460
1505
|
"Apps group related tools, resources, and prompts into logical modules"
|
|
1461
1506
|
]
|
|
1462
1507
|
},
|
|
@@ -1467,8 +1512,8 @@
|
|
|
1467
1512
|
"tags": ["development", "database", "multi-app", "decorators", "multi", "app"],
|
|
1468
1513
|
"features": [
|
|
1469
1514
|
"Organizing a server into multiple `@App` modules (`analytics` and `admin`)",
|
|
1470
|
-
"
|
|
1471
|
-
"Accessing injected dependencies via `this.get(
|
|
1515
|
+
"Decorating a service class with `@Provider({ name, scope })` so it acts as its own DI token (the strict schema rejects `useFactory`/`useClass`/`provide` — use `AsyncProvider` for those)",
|
|
1516
|
+
"Accessing injected dependencies via `this.get(DatabaseClient)` in tools and resources",
|
|
1472
1517
|
"Using `@ResourceTemplate` with URI parameters (`{dashboardId}`) for dynamic resources",
|
|
1473
1518
|
"Registering a `@Plugin` at the server level so it applies across all apps",
|
|
1474
1519
|
"Global plugins go in `@FrontMcp({ plugins })`, app-scoped providers go in `@App({ providers })`"
|
|
@@ -1481,75 +1526,6 @@
|
|
|
1481
1526
|
"description": "Overview of all official FrontMCP adapters that convert external definitions into MCP primitives",
|
|
1482
1527
|
"examples": []
|
|
1483
1528
|
},
|
|
1484
|
-
{
|
|
1485
|
-
"name": "openapi-adapter",
|
|
1486
|
-
"description": "Convert OpenAPI 3.x specifications into MCP tools with authentication, polling, transforms, format resolution, and $ref security",
|
|
1487
|
-
"examples": [
|
|
1488
|
-
{
|
|
1489
|
-
"name": "basic-openapi-adapter",
|
|
1490
|
-
"description": "Demonstrates converting an OpenAPI specification into MCP tools automatically using `OpenapiAdapter` with minimal configuration.",
|
|
1491
|
-
"level": "basic",
|
|
1492
|
-
"tags": ["development", "openapi", "adapters", "adapter"],
|
|
1493
|
-
"features": [
|
|
1494
|
-
"Using `OpenapiAdapter.init()` with just `name` and `url` to auto-generate MCP tools",
|
|
1495
|
-
"Each OpenAPI operation becomes a tool named `<adapter-name>:<operationId>`",
|
|
1496
|
-
"The adapter is registered in the `adapters` array of `@App`, not in `plugins`",
|
|
1497
|
-
"The `name` field serves as the namespace prefix to prevent tool name collisions"
|
|
1498
|
-
]
|
|
1499
|
-
},
|
|
1500
|
-
{
|
|
1501
|
-
"name": "authenticated-adapter-with-polling",
|
|
1502
|
-
"description": "Demonstrates configuring authentication (API key and bearer token) and automatic spec polling for OpenAPI adapters.",
|
|
1503
|
-
"level": "intermediate",
|
|
1504
|
-
"tags": ["development", "auth", "openapi", "security", "adapters", "authenticated"],
|
|
1505
|
-
"features": [
|
|
1506
|
-
"Three authentication methods: `staticAuth.apiKey`, `staticAuth.jwt`, and dynamic `securityResolver`",
|
|
1507
|
-
"Using `securityResolver` for per-request dynamic authentication based on the calling context",
|
|
1508
|
-
"Enabling `polling` to automatically refresh tool definitions when the upstream spec changes",
|
|
1509
|
-
"Loading secrets from environment variables instead of hardcoding them",
|
|
1510
|
-
"Each adapter has a unique `name` to avoid tool naming collisions"
|
|
1511
|
-
]
|
|
1512
|
-
},
|
|
1513
|
-
{
|
|
1514
|
-
"name": "format-resolution-and-custom-resolvers",
|
|
1515
|
-
"description": "Demonstrates using built-in and custom format resolvers to enrich tool input schemas with concrete constraints from OpenAPI format values.",
|
|
1516
|
-
"level": "intermediate",
|
|
1517
|
-
"tags": ["development", "openapi", "adapters", "format", "schema", "validation"],
|
|
1518
|
-
"features": [
|
|
1519
|
-
"Enabling built-in format resolvers with `resolveFormats: true` for uuid, date-time, email, int32, etc.",
|
|
1520
|
-
"Adding custom format resolvers for domain-specific formats (phone, currency)",
|
|
1521
|
-
"Merging custom resolvers with built-ins where custom takes precedence",
|
|
1522
|
-
"Using custom-only resolvers without built-ins for full control"
|
|
1523
|
-
]
|
|
1524
|
-
},
|
|
1525
|
-
{
|
|
1526
|
-
"name": "ref-security-and-filtering",
|
|
1527
|
-
"description": "Demonstrates configuring $ref resolution security to prevent SSRF attacks and filtering which API operations become MCP tools.",
|
|
1528
|
-
"level": "intermediate",
|
|
1529
|
-
"tags": ["development", "openapi", "adapters", "security", "ssrf", "filtering"],
|
|
1530
|
-
"features": [
|
|
1531
|
-
"Configuring `refResolution` to restrict which hosts and protocols are allowed for external `$ref` pointers",
|
|
1532
|
-
"Using `allowedHosts` to restrict $refs to trusted schema servers",
|
|
1533
|
-
"Using `allowedProtocols` to enable or disable file://, http://, https://, and other protocols",
|
|
1534
|
-
"Filtering operations with `includeOperations`, `excludeOperations`, and `filterFn`",
|
|
1535
|
-
"Combining security hardening with operation filtering for a production-ready setup"
|
|
1536
|
-
]
|
|
1537
|
-
},
|
|
1538
|
-
{
|
|
1539
|
-
"name": "multi-api-hub-with-inline-spec",
|
|
1540
|
-
"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.",
|
|
1541
|
-
"level": "advanced",
|
|
1542
|
-
"tags": ["development", "openapi", "remote", "adapters", "multi", "api"],
|
|
1543
|
-
"features": [
|
|
1544
|
-
"Registering multiple adapters in a single `@App` with unique names for tool namespacing",
|
|
1545
|
-
"Using `additionalHeaders` for header-based authentication (GitHub token)",
|
|
1546
|
-
"Providing an inline `spec` object instead of a remote `url` for APIs without hosted specs",
|
|
1547
|
-
"Each adapter's tools are namespaced: `github:*`, `jira:*`, `internal:*`",
|
|
1548
|
-
"Only one of `url` or `spec` should be provided per adapter; `spec` takes precedence"
|
|
1549
|
-
]
|
|
1550
|
-
}
|
|
1551
|
-
]
|
|
1552
|
-
},
|
|
1553
1529
|
{
|
|
1554
1530
|
"name": "official-plugins",
|
|
1555
1531
|
"description": "Guide to the 6 official plugins for discovery, memory, auth, caching, flags, and monitoring",
|
|
@@ -1599,6 +1575,75 @@
|
|
|
1599
1575
|
]
|
|
1600
1576
|
}
|
|
1601
1577
|
]
|
|
1578
|
+
},
|
|
1579
|
+
{
|
|
1580
|
+
"name": "openapi-adapter",
|
|
1581
|
+
"description": "Convert OpenAPI 3.x specifications into MCP tools with authentication, polling, transforms, format resolution, and $ref security",
|
|
1582
|
+
"examples": [
|
|
1583
|
+
{
|
|
1584
|
+
"name": "authenticated-adapter-with-polling",
|
|
1585
|
+
"description": "Demonstrates configuring authentication (API key and bearer token) and automatic spec polling for OpenAPI adapters.",
|
|
1586
|
+
"level": "intermediate",
|
|
1587
|
+
"tags": ["development", "auth", "openapi", "security", "adapters", "authenticated"],
|
|
1588
|
+
"features": [
|
|
1589
|
+
"Three authentication methods: `staticAuth.apiKey`, `staticAuth.jwt`, and dynamic `securityResolver`",
|
|
1590
|
+
"Using `securityResolver` for per-request dynamic authentication based on the calling context",
|
|
1591
|
+
"Enabling `polling` to automatically refresh tool definitions when the upstream spec changes",
|
|
1592
|
+
"Loading secrets from environment variables instead of hardcoding them",
|
|
1593
|
+
"Each adapter has a unique `name` to avoid tool naming collisions"
|
|
1594
|
+
]
|
|
1595
|
+
},
|
|
1596
|
+
{
|
|
1597
|
+
"name": "basic-openapi-adapter",
|
|
1598
|
+
"description": "Demonstrates converting an OpenAPI specification into MCP tools automatically using `OpenapiAdapter` with minimal configuration.",
|
|
1599
|
+
"level": "basic",
|
|
1600
|
+
"tags": ["development", "openapi", "adapters", "adapter"],
|
|
1601
|
+
"features": [
|
|
1602
|
+
"Using `OpenapiAdapter.init()` with just `name` and `url` to auto-generate MCP tools",
|
|
1603
|
+
"Each OpenAPI operation becomes a tool named `<adapter-name>:<operationId>`",
|
|
1604
|
+
"The adapter is registered in the `adapters` array of `@App`, not in `plugins`",
|
|
1605
|
+
"The `name` field serves as the namespace prefix to prevent tool name collisions"
|
|
1606
|
+
]
|
|
1607
|
+
},
|
|
1608
|
+
{
|
|
1609
|
+
"name": "format-resolution-and-custom-resolvers",
|
|
1610
|
+
"description": "Demonstrates using built-in and custom format resolvers to enrich tool input schemas with concrete constraints from OpenAPI format values.",
|
|
1611
|
+
"level": "intermediate",
|
|
1612
|
+
"tags": ["development", "openapi", "adapters", "format", "schema", "validation"],
|
|
1613
|
+
"features": [
|
|
1614
|
+
"Enabling built-in format resolvers with `resolveFormats: true` for uuid, date-time, email, int32, etc.",
|
|
1615
|
+
"Adding custom format resolvers for domain-specific formats (phone, currency)",
|
|
1616
|
+
"Merging custom resolvers with built-ins where custom takes precedence",
|
|
1617
|
+
"Using custom-only resolvers without built-ins for full control"
|
|
1618
|
+
]
|
|
1619
|
+
},
|
|
1620
|
+
{
|
|
1621
|
+
"name": "multi-api-hub-with-inline-spec",
|
|
1622
|
+
"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.",
|
|
1623
|
+
"level": "advanced",
|
|
1624
|
+
"tags": ["development", "openapi", "remote", "adapters", "multi", "api"],
|
|
1625
|
+
"features": [
|
|
1626
|
+
"Registering multiple adapters in a single `@App` with unique names for tool namespacing",
|
|
1627
|
+
"Using `additionalHeaders` for header-based authentication (GitHub token)",
|
|
1628
|
+
"Providing an inline `spec` object instead of a remote `url` for APIs without hosted specs",
|
|
1629
|
+
"Each adapter's tools are namespaced: `github:*`, `jira:*`, `internal:*`",
|
|
1630
|
+
"Only one of `url` or `spec` should be provided per adapter; `spec` takes precedence"
|
|
1631
|
+
]
|
|
1632
|
+
},
|
|
1633
|
+
{
|
|
1634
|
+
"name": "ref-security-and-filtering",
|
|
1635
|
+
"description": "Demonstrates configuring $ref resolution security to prevent SSRF attacks and filtering which API operations become MCP tools.",
|
|
1636
|
+
"level": "intermediate",
|
|
1637
|
+
"tags": ["development", "openapi", "adapters", "security", "ssrf", "filtering"],
|
|
1638
|
+
"features": [
|
|
1639
|
+
"Configuring `refResolution` to restrict which hosts and protocols are allowed for external `$ref` pointers",
|
|
1640
|
+
"Using `allowedHosts` to restrict $refs to trusted schema servers",
|
|
1641
|
+
"Using `allowedProtocols` to enable or disable file://, http://, https://, and other protocols",
|
|
1642
|
+
"Filtering operations with `includeOperations`, `excludeOperations`, and `filterFn`",
|
|
1643
|
+
"Combining security hardening with operation filtering for a production-ready setup"
|
|
1644
|
+
]
|
|
1645
|
+
}
|
|
1646
|
+
]
|
|
1602
1647
|
}
|
|
1603
1648
|
]
|
|
1604
1649
|
},
|
|
@@ -1646,15 +1691,45 @@
|
|
|
1646
1691
|
},
|
|
1647
1692
|
{
|
|
1648
1693
|
"name": "tfidf-keyword-search",
|
|
1649
|
-
"description": "Shows how to use `TFIDFVectoria` for zero-dependency keyword search in a FrontMCP provider,
|
|
1694
|
+
"description": "Shows how to use `TFIDFVectoria` for zero-dependency keyword search in a FrontMCP provider. `TFIDFVectoria` indexes a single text string per document, so multi-field documents are concatenated into one searchable blob; the original fields are kept in `metadata` for use on search results.",
|
|
1650
1695
|
"level": "basic",
|
|
1651
1696
|
"tags": ["extensibility", "vectoriadb", "keyword-search", "tfidf", "keyword", "search"],
|
|
1652
1697
|
"features": [
|
|
1653
1698
|
"Using `TFIDFVectoria` for zero-dependency keyword search (no model downloads)",
|
|
1654
|
-
"
|
|
1655
|
-
"Calling `
|
|
1699
|
+
"Calling `addDocument(id, text, metadata)` with a single concatenated text string",
|
|
1700
|
+
"Calling `reindex()` after adding documents (required for TFIDFVectoria)",
|
|
1656
1701
|
"Wrapping the search engine in a FrontMCP provider with `ProviderScope.GLOBAL`",
|
|
1657
|
-
"Injecting the provider into tools via `this.get(
|
|
1702
|
+
"Injecting the provider into tools via `this.get(FAQSearchProvider)`"
|
|
1703
|
+
]
|
|
1704
|
+
}
|
|
1705
|
+
]
|
|
1706
|
+
},
|
|
1707
|
+
{
|
|
1708
|
+
"name": "skill-audit-log",
|
|
1709
|
+
"description": "Tamper-evident, hash-chained audit log for skill action executions — pluggable signer, pluggable store, offline verification.",
|
|
1710
|
+
"examples": [
|
|
1711
|
+
{
|
|
1712
|
+
"name": "verify-chain",
|
|
1713
|
+
"description": "Verify a stored chain offline using verifyChain and the bundle-signing key registry.",
|
|
1714
|
+
"level": "intermediate",
|
|
1715
|
+
"tags": ["extensibility", "audit", "verification", "chain", "rs256"],
|
|
1716
|
+
"features": [
|
|
1717
|
+
"verifyChain returns { ok, breakAt?, reason? } and exits with the first detected break",
|
|
1718
|
+
"defaultAuditSignatureVerifier dispatches on record.signatureAlg (HS256 or RS256)",
|
|
1719
|
+
"Trusted-keys registry maps signatureKeyId → public key PEM",
|
|
1720
|
+
"iterate() reads the chain in order from any SkillAuditStore implementation"
|
|
1721
|
+
]
|
|
1722
|
+
},
|
|
1723
|
+
{
|
|
1724
|
+
"name": "custom-store",
|
|
1725
|
+
"description": "Implement a custom SkillAuditStore that streams records to S3 with one object per sequence.",
|
|
1726
|
+
"level": "advanced",
|
|
1727
|
+
"tags": ["extensibility", "audit", "custom", "s3", "store"],
|
|
1728
|
+
"features": [
|
|
1729
|
+
"Implements the SkillAuditStore interface (nextSequence, appendAtSequence, tail, read)",
|
|
1730
|
+
"One S3 object per sequence keeps individual records immutable and verifiable",
|
|
1731
|
+
"tail() returns the latest record so the writer can chain prevHash deterministically",
|
|
1732
|
+
"read({ from, limit }) supports incremental verifyChain runs in CI"
|
|
1658
1733
|
]
|
|
1659
1734
|
}
|
|
1660
1735
|
]
|
|
@@ -1677,15 +1752,15 @@
|
|
|
1677
1752
|
"examples": [
|
|
1678
1753
|
{
|
|
1679
1754
|
"name": "agent-and-plugin",
|
|
1680
|
-
"description": "Shows an autonomous research agent with inner tools and
|
|
1755
|
+
"description": "Shows an autonomous research agent with inner tools and a real `ToolHook`-based plugin that hooks into the `tools:call-tool` flow for audit logging.",
|
|
1681
1756
|
"level": "advanced",
|
|
1682
1757
|
"tags": ["guides", "knowledge-base", "knowledge", "base", "agent", "plugin"],
|
|
1683
1758
|
"features": [
|
|
1684
1759
|
"Agent with `@Agent` decorator, LLM config, inner tools, and system instructions",
|
|
1685
|
-
"
|
|
1686
|
-
"
|
|
1687
|
-
"
|
|
1688
|
-
"Using `
|
|
1760
|
+
"Configuring the inner-loop limit via `@Agent({ execution: { maxIterations } })` (framework drives iteration; no `this.run(...)`)",
|
|
1761
|
+
"Plugin built on real `ToolHook` decorators: `@ToolHook.Will/Did/Around(\"execute\")`",
|
|
1762
|
+
"Using `flowCtx.state.set/get()` for hook-local state",
|
|
1763
|
+
"Using `flowCtx.state.required.toolContext` to read tool metadata and authInfo inside hooks",
|
|
1689
1764
|
"Non-blocking audit logging (`.catch()` prevents audit failures from breaking tools)"
|
|
1690
1765
|
]
|
|
1691
1766
|
},
|
|
@@ -1705,9 +1780,9 @@
|
|
|
1705
1780
|
"name": "vector-search-and-resources",
|
|
1706
1781
|
"description": "Shows a semantic search tool with embedding generation and a resource template for retrieving documents by ID using URI parameters.",
|
|
1707
1782
|
"level": "intermediate",
|
|
1708
|
-
"tags": ["guides", "
|
|
1783
|
+
"tags": ["guides", "vectoriadb", "semantic-search", "knowledge-base", "knowledge", "base"],
|
|
1709
1784
|
"features": [
|
|
1710
|
-
"Semantic search tool that
|
|
1785
|
+
"Semantic search tool that delegates embedding generation to VectoriaDB via `store.search(query, topK)`",
|
|
1711
1786
|
"Using `this.mark()` for execution phase tracing",
|
|
1712
1787
|
"Resource template with `uriTemplate: 'kb://documents/{documentId}'` for parameterized URIs",
|
|
1713
1788
|
"Typed params via `ResourceContext<{ documentId: string }>` for type-safe URI parameters",
|
|
@@ -1722,13 +1797,13 @@
|
|
|
1722
1797
|
"examples": [
|
|
1723
1798
|
{
|
|
1724
1799
|
"name": "auth-and-crud-tools",
|
|
1725
|
-
"description": "Shows how to create CRUD tools with authentication, using `this.
|
|
1800
|
+
"description": "Shows how to create CRUD tools with authentication, using `this.auth?.user.sub` (the FrontMcpAuthContext exposed on every execution context) for user isolation and `this.get()` for dependency injection.",
|
|
1726
1801
|
"level": "basic",
|
|
1727
1802
|
"tags": ["guides", "auth", "session", "task-manager", "task", "manager"],
|
|
1728
1803
|
"features": [
|
|
1729
|
-
"Using `this.
|
|
1730
|
-
"Using `this.get(
|
|
1731
|
-
"Enforcing authentication with `this.fail()` when no
|
|
1804
|
+
"Using `this.auth?.user.sub` (FrontMcpAuthContext) for per-user data isolation",
|
|
1805
|
+
"Using `this.get(TaskStoreProvider)` for dependency injection of providers (class-as-token)",
|
|
1806
|
+
"Enforcing authentication with `this.fail()` when no authenticated user is present in `this.auth`",
|
|
1732
1807
|
"Optional input fields with `.optional()` for filtering",
|
|
1733
1808
|
"`outputSchema` with nested `z.array(z.object(...))` for structured responses"
|
|
1734
1809
|
]
|
|
@@ -1741,21 +1816,20 @@
|
|
|
1741
1816
|
"features": [
|
|
1742
1817
|
"Using `TestTokenFactory` to create JWT tokens for authenticated E2E tests",
|
|
1743
1818
|
"Chaining `.withToken(token).buildAndConnect()` for authenticated clients",
|
|
1744
|
-
"Unit testing
|
|
1745
|
-
"Mocking
|
|
1746
|
-
"Testing the unauthenticated error path (no
|
|
1819
|
+
"Unit testing tools by mocking `this.get(TaskStoreProvider)` and the `auth` getter",
|
|
1820
|
+
"Mocking `this.auth = { user: { sub } }` (FrontMcpAuthContext) for auth-dependent tools",
|
|
1821
|
+
"Testing the unauthenticated error path (no `auth` / anonymous user)"
|
|
1747
1822
|
]
|
|
1748
1823
|
},
|
|
1749
1824
|
{
|
|
1750
1825
|
"name": "redis-provider-with-di",
|
|
1751
|
-
"description": "Shows how to create a Redis-backed provider
|
|
1826
|
+
"description": "Shows how to create a Redis-backed provider using the class-as-token DI pattern (`@Provider({ name, scope })`) plus an `AsyncProvider` factory that runs the async Redis setup before any tool is invoked.",
|
|
1752
1827
|
"level": "intermediate",
|
|
1753
1828
|
"tags": ["guides", "redis", "node", "task-manager", "task", "manager"],
|
|
1754
1829
|
"features": [
|
|
1755
|
-
"
|
|
1756
|
-
"
|
|
1757
|
-
"
|
|
1758
|
-
"Lazy-loading `ioredis` via dynamic `import()` in `onInit()`",
|
|
1830
|
+
"Class-as-token DI: `@Provider({ name, scope })` and inject via `this.get(TaskStoreProvider)`",
|
|
1831
|
+
"Building the singleton with `AsyncProvider({ provide, name, scope, useFactory })` for async setup",
|
|
1832
|
+
"Cleanup: explicit `disconnect()` method (called from the host before `server.dispose()`) — `@Provider` has no `onDestroy` hook",
|
|
1759
1833
|
"Using `@frontmcp/utils` for `randomUUID()` instead of `node:crypto`",
|
|
1760
1834
|
"Per-user data isolation using Redis hash keys (`tasks:${userId}`)"
|
|
1761
1835
|
]
|
|
@@ -1774,7 +1848,7 @@
|
|
|
1774
1848
|
"features": [
|
|
1775
1849
|
"Server entry point with `@FrontMcp` decorator and `info` configuration",
|
|
1776
1850
|
"App registration with `@App` grouping tools and resources together",
|
|
1777
|
-
"Static resource that returns JSON data via `
|
|
1851
|
+
"Static resource that returns JSON data via `execute(uri)` and `ReadResourceResult`",
|
|
1778
1852
|
"Clean separation between server, app, tools, and resources"
|
|
1779
1853
|
]
|
|
1780
1854
|
},
|
|
@@ -1787,7 +1861,7 @@
|
|
|
1787
1861
|
"Unit testing tools by mocking `this.fetch()`, `this.fail()`, and other context methods",
|
|
1788
1862
|
"Using `Object.assign(tool, ctx)` to inject mock context into the tool instance",
|
|
1789
1863
|
"E2E testing with `TestServer.start()` and `McpTestClient.create()`",
|
|
1790
|
-
"
|
|
1864
|
+
"Asserting tool presence via `expect(tools.map((t) => t.name)).toContain(...)` and parsing resource JSON via `result.json<T>()`",
|
|
1791
1865
|
"Proper cleanup with `client.disconnect()` and `server.stop()` in `afterAll`"
|
|
1792
1866
|
]
|
|
1793
1867
|
},
|
|
@@ -1824,15 +1898,15 @@
|
|
|
1824
1898
|
"examples": [
|
|
1825
1899
|
{
|
|
1826
1900
|
"name": "caching-and-performance",
|
|
1827
|
-
"description": "Shows how to configure caching with
|
|
1901
|
+
"description": "Shows how to configure caching with the real `CachePlugin.init(...)` API and how to size connection pools so the server does not exhaust downstream resources.",
|
|
1828
1902
|
"level": "advanced",
|
|
1829
1903
|
"tags": ["production", "redis", "cache", "session", "performance", "checklist"],
|
|
1830
1904
|
"features": [
|
|
1831
|
-
"
|
|
1905
|
+
"Using the real `CachePlugin.init({ type, defaultTTL, toolPatterns })` shape (NOT `new CachePlugin({ ttl: { ... } })`)",
|
|
1906
|
+
"Setting per-tool TTL via `@Tool({ cache: { ttl } })` metadata in seconds",
|
|
1832
1907
|
"Using Redis-backed cache for multi-instance consistency",
|
|
1833
|
-
"
|
|
1834
|
-
"
|
|
1835
|
-
"Using connection pool limits and timeouts to prevent resource exhaustion"
|
|
1908
|
+
"Configuring connection pool limits and timeouts to prevent resource exhaustion",
|
|
1909
|
+
"Providers do not implement `onInit` / `onDestroy` — initialize in the constructor and let framework shutdown handle cleanup"
|
|
1836
1910
|
]
|
|
1837
1911
|
},
|
|
1838
1912
|
{
|
|
@@ -1849,14 +1923,65 @@
|
|
|
1849
1923
|
},
|
|
1850
1924
|
{
|
|
1851
1925
|
"name": "security-hardening",
|
|
1852
|
-
"description": "Shows how to configure authentication, CORS, input validation,
|
|
1926
|
+
"description": "Shows how to configure authentication, CORS, input validation, rate limiting, audit logging, and observability counters for a production FrontMCP server.",
|
|
1853
1927
|
"level": "basic",
|
|
1854
|
-
"tags": ["production", "redis", "session", "security", "throttle", "checklist"],
|
|
1928
|
+
"tags": ["production", "redis", "session", "security", "throttle", "audit", "observability", "checklist"],
|
|
1855
1929
|
"features": [
|
|
1856
1930
|
"Restricting CORS origins to known domains instead of using `'*'`",
|
|
1857
1931
|
"Configuring rate limiting via the `throttle` option",
|
|
1858
1932
|
"Using Redis for session storage in multi-instance deployments",
|
|
1859
|
-
"Defining both `inputSchema` and `outputSchema` on tools to prevent data leaks"
|
|
1933
|
+
"Defining both `inputSchema` and `outputSchema` on tools to prevent data leaks",
|
|
1934
|
+
"Enabling the tamper-evident skill audit log with RS256 + a persistent store and a CI verifier",
|
|
1935
|
+
"Wiring an OTel MeterProvider so framework counters (bundle pulls, signature failures, replay rejects) are exported",
|
|
1936
|
+
"Keeping the auto-injected skill catalog summary inside the 16 KB initialize ceiling"
|
|
1937
|
+
]
|
|
1938
|
+
}
|
|
1939
|
+
]
|
|
1940
|
+
},
|
|
1941
|
+
{
|
|
1942
|
+
"name": "distributed-ha",
|
|
1943
|
+
"description": "Deploy FrontMCP across multiple pods with heartbeat, session takeover, and notification relay for zero-downtime failover",
|
|
1944
|
+
"examples": [
|
|
1945
|
+
{
|
|
1946
|
+
"name": "ha-kubernetes-3-replicas",
|
|
1947
|
+
"description": "Deploy FrontMCP with 3 replicas, Redis, and automatic session failover on Kubernetes",
|
|
1948
|
+
"level": "intermediate",
|
|
1949
|
+
"tags": ["ha", "kubernetes", "redis", "distributed", "session-takeover", "heartbeat"],
|
|
1950
|
+
"features": [
|
|
1951
|
+
"Configuring @FrontMcp with Redis for distributed deployment",
|
|
1952
|
+
"Kubernetes Deployment YAML with 3 replicas and readiness probes",
|
|
1953
|
+
"Verifying heartbeat keys and session takeover via redis-cli",
|
|
1954
|
+
"NGINX sticky sessions for session affinity"
|
|
1955
|
+
]
|
|
1956
|
+
}
|
|
1957
|
+
]
|
|
1958
|
+
},
|
|
1959
|
+
{
|
|
1960
|
+
"name": "health-readiness-endpoints",
|
|
1961
|
+
"description": "Configure /healthz and /readyz endpoints with custom probes, runtime-aware readiness, and dependency health checks",
|
|
1962
|
+
"examples": [
|
|
1963
|
+
{
|
|
1964
|
+
"name": "basic-health-setup",
|
|
1965
|
+
"description": "Default health endpoints with Redis session store, showing /healthz and /readyz responses.",
|
|
1966
|
+
"level": "basic",
|
|
1967
|
+
"tags": ["production", "health", "readiness", "redis", "kubernetes", "docker"],
|
|
1968
|
+
"features": [
|
|
1969
|
+
"Zero-config /healthz and /readyz endpoints enabled by default",
|
|
1970
|
+
"Auto-discovered session-store probe via Redis persistence",
|
|
1971
|
+
"Catalog hash for config drift detection across instances",
|
|
1972
|
+
"Docker HEALTHCHECK directive using /healthz"
|
|
1973
|
+
]
|
|
1974
|
+
},
|
|
1975
|
+
{
|
|
1976
|
+
"name": "custom-probes",
|
|
1977
|
+
"description": "Custom database and API probes with Kubernetes deployment configuration.",
|
|
1978
|
+
"level": "intermediate",
|
|
1979
|
+
"tags": ["production", "health", "readiness", "kubernetes", "postgres", "probes", "custom"],
|
|
1980
|
+
"features": [
|
|
1981
|
+
"Custom health probes for PostgreSQL and external API dependencies",
|
|
1982
|
+
"Kubernetes liveness and readiness probe configuration",
|
|
1983
|
+
"Production includeDetails: false to hide infrastructure topology",
|
|
1984
|
+
"Per-probe timeout to prevent slow dependencies from blocking readiness"
|
|
1860
1985
|
]
|
|
1861
1986
|
}
|
|
1862
1987
|
]
|
|
@@ -1956,15 +2081,16 @@
|
|
|
1956
2081
|
},
|
|
1957
2082
|
{
|
|
1958
2083
|
"name": "graceful-shutdown-cleanup",
|
|
1959
|
-
"description": "Shows how to
|
|
2084
|
+
"description": "Shows how to layer daemon-specific cleanup (socket file, PID file) **on top of** the framework's built-in SIGTERM/SIGINT handler.",
|
|
1960
2085
|
"level": "intermediate",
|
|
1961
2086
|
"tags": ["production", "unix-socket", "cli", "database", "daemon", "graceful"],
|
|
1962
2087
|
"features": [
|
|
1963
|
-
"SIGTERM
|
|
2088
|
+
"The framework already wires SIGTERM/SIGINT — daemon cleanup attaches _additional_ listeners and does not call `process.exit()`",
|
|
2089
|
+
"Using `server.dispose()` (the only real method) instead of fictional `server.close()`",
|
|
1964
2090
|
"Removing the Unix socket file to prevent stale `.sock` files on restart",
|
|
1965
2091
|
"Cleaning up the PID file on shutdown",
|
|
1966
2092
|
"Using `@frontmcp/utils` (`unlink`, `fileExists`, `ensureDir`) for file operations",
|
|
1967
|
-
"
|
|
2093
|
+
"Providers initialize in the constructor — there is no `onInit` / `onDestroy`"
|
|
1968
2094
|
]
|
|
1969
2095
|
},
|
|
1970
2096
|
{
|
|
@@ -2013,14 +2139,14 @@
|
|
|
2013
2139
|
},
|
|
2014
2140
|
{
|
|
2015
2141
|
"name": "wrangler-config",
|
|
2016
|
-
"description": "
|
|
2142
|
+
"description": "Checklist for verifying the `wrangler.toml` produced by `frontmcp build --target cloudflare` is production-ready. **Note:** configuration authoring lives in `frontmcp-deployment → references/deploy-to-cloudflare.md`; this file is checklist-only.",
|
|
2017
2143
|
"level": "basic",
|
|
2018
|
-
"tags": ["production", "cloudflare", "cache", "session", "wrangler", "
|
|
2144
|
+
"tags": ["production", "cloudflare", "cache", "session", "wrangler", "checklist"],
|
|
2019
2145
|
"features": [
|
|
2020
|
-
"
|
|
2021
|
-
"
|
|
2022
|
-
"
|
|
2023
|
-
"
|
|
2146
|
+
"Verify `main = \"dist/cloudflare/index.js\"` (the build adapter writes this — never override)",
|
|
2147
|
+
"Verify KV bindings for sessions and cache exist",
|
|
2148
|
+
"Verify staging / production environment configs are separated",
|
|
2149
|
+
"Verify secrets are NOT in `wrangler.toml` — use `wrangler secret put`"
|
|
2024
2150
|
]
|
|
2025
2151
|
}
|
|
2026
2152
|
]
|
|
@@ -2031,27 +2157,27 @@
|
|
|
2031
2157
|
"examples": [
|
|
2032
2158
|
{
|
|
2033
2159
|
"name": "cold-start-connection-reuse",
|
|
2034
|
-
"description": "Shows how to minimize Lambda cold starts with lazy initialization
|
|
2160
|
+
"description": "Shows how to minimize Lambda cold starts with lazy initialization on first call and the module-scope connection-reuse pattern for external services.",
|
|
2035
2161
|
"level": "intermediate",
|
|
2036
2162
|
"tags": ["production", "lambda", "performance", "cold", "start", "connection"],
|
|
2037
2163
|
"features": [
|
|
2038
|
-
"Connection reuse pattern: caching
|
|
2039
|
-
"Lazy-loading heavy dependencies (`pg`) via dynamic `import()`
|
|
2040
|
-
"Not closing connections
|
|
2164
|
+
"Connection reuse pattern: caching the connection promise in module scope so it survives Lambda freeze/thaw",
|
|
2165
|
+
"Lazy-loading heavy dependencies (`pg`) via dynamic `import()` on first use, not at module load",
|
|
2166
|
+
"Not closing connections on shutdown for Lambda (they survive freeze/thaw — and providers have no `onDestroy` hook anyway)",
|
|
2041
2167
|
"Keeping module scope lightweight with no heavy initialization"
|
|
2042
2168
|
]
|
|
2043
2169
|
},
|
|
2044
2170
|
{
|
|
2045
2171
|
"name": "sam-template",
|
|
2046
|
-
"description": "
|
|
2172
|
+
"description": "Checklist for verifying the SAM template pairs correctly with the bundle produced by `frontmcp build --target lambda`. **Note:** configuration authoring lives in `frontmcp-deployment → references/deploy-to-lambda.md`; this file is checklist-only.",
|
|
2047
2173
|
"level": "basic",
|
|
2048
|
-
"tags": ["production", "lambda", "session", "sam", "
|
|
2174
|
+
"tags": ["production", "lambda", "session", "sam", "checklist"],
|
|
2049
2175
|
"features": [
|
|
2050
|
-
"
|
|
2051
|
-
"
|
|
2052
|
-
"
|
|
2053
|
-
"
|
|
2054
|
-
"
|
|
2176
|
+
"Verify `Handler: handler.handler` with `CodeUri: dist/lambda/` (the build emits `dist/lambda/handler.cjs`)",
|
|
2177
|
+
"No hand-written `src/lambda.ts` with a fictional `createLambdaHandler` import",
|
|
2178
|
+
"DynamoDB session table has TTL enabled for automatic cleanup",
|
|
2179
|
+
"IAM policies are scoped (no `*` resources / actions)",
|
|
2180
|
+
"API Gateway proxy route forwards to the function"
|
|
2055
2181
|
]
|
|
2056
2182
|
},
|
|
2057
2183
|
{
|
|
@@ -2087,11 +2213,11 @@
|
|
|
2087
2213
|
},
|
|
2088
2214
|
{
|
|
2089
2215
|
"name": "multi-instance-cleanup",
|
|
2090
|
-
"description": "Shows how multiple SDK instances can coexist without conflicts, and how to
|
|
2216
|
+
"description": "Shows how multiple SDK instances can coexist without conflicts, and how to clean up timers and listeners — given that `@Provider` classes have **no** `onInit` / `onDestroy` lifecycle hooks. The pattern is: initialize in the constructor, expose an explicit `stop()` method, and have the host app call it before `server.dispose()`.",
|
|
2091
2217
|
"level": "advanced",
|
|
2092
2218
|
"tags": ["production", "sdk", "node", "multi", "instance", "cleanup"],
|
|
2093
2219
|
"features": [
|
|
2094
|
-
"
|
|
2220
|
+
"Explicit `stop()` method on providers (since `@Provider` classes have no `onDestroy` lifecycle hook)",
|
|
2095
2221
|
"Ensuring multiple instances coexist without sharing global state",
|
|
2096
2222
|
"Testing that dispose removes all event listeners (no leaks)",
|
|
2097
2223
|
"Verifying one instance still works after another is disposed"
|
|
@@ -2131,14 +2257,14 @@
|
|
|
2131
2257
|
},
|
|
2132
2258
|
{
|
|
2133
2259
|
"name": "graceful-shutdown",
|
|
2134
|
-
"description": "Shows how to
|
|
2260
|
+
"description": "Shows how to expose load-balancer drain state without overriding the FrontMCP framework's built-in SIGTERM / SIGINT graceful shutdown.",
|
|
2135
2261
|
"level": "intermediate",
|
|
2136
2262
|
"tags": ["production", "redis", "database", "node", "graceful", "shutdown"],
|
|
2137
2263
|
"features": [
|
|
2138
|
-
"
|
|
2139
|
-
"
|
|
2140
|
-
"
|
|
2141
|
-
"
|
|
2264
|
+
"The framework already handles SIGTERM/SIGINT — never call `server.close()` (no such method) or `process.exit()` on top of it",
|
|
2265
|
+
"Use `server.dispose()` if you need explicit cleanup in non-server (SDK) contexts",
|
|
2266
|
+
"Add a _drain probe_ on `/healthz` so load balancers stop sending traffic during the framework's drain window",
|
|
2267
|
+
"Avoid handler conflicts: registering a second SIGTERM that calls `process.exit(0)` races the framework's own exit path"
|
|
2142
2268
|
]
|
|
2143
2269
|
},
|
|
2144
2270
|
{
|
|
@@ -2162,14 +2288,14 @@
|
|
|
2162
2288
|
"examples": [
|
|
2163
2289
|
{
|
|
2164
2290
|
"name": "cold-start-optimization",
|
|
2165
|
-
"description": "Shows how to minimize cold start time by lazy-loading dependencies, avoiding heavy initialization at module scope, and caching expensive operations.",
|
|
2291
|
+
"description": "Shows how to minimize cold start time by lazy-loading dependencies on first use, avoiding heavy initialization at module scope, and caching expensive operations across warm invocations.",
|
|
2166
2292
|
"level": "intermediate",
|
|
2167
2293
|
"tags": ["production", "vercel", "openapi", "performance", "cold", "start"],
|
|
2168
2294
|
"features": [
|
|
2169
|
-
"Lazy-loading heavy
|
|
2295
|
+
"Lazy-loading heavy SDKs via dynamic `import()` on **first use**, not at module scope (and not in a fictional `Provider.onInit`)",
|
|
2170
2296
|
"Caching expensive fetches (e.g., OpenAPI specs) across warm invocations",
|
|
2171
2297
|
"Keeping the module scope lightweight with no side effects",
|
|
2172
|
-
"No `top-level await
|
|
2298
|
+
"No `top-level await` and no heavy global initialization or network calls at import time (lightweight module-scope caching of cheap synchronous values like `cachedSpec` is fine)"
|
|
2173
2299
|
]
|
|
2174
2300
|
},
|
|
2175
2301
|
{
|
|
@@ -2186,62 +2312,14 @@
|
|
|
2186
2312
|
},
|
|
2187
2313
|
{
|
|
2188
2314
|
"name": "vercel-edge-config",
|
|
2189
|
-
"description": "
|
|
2190
|
-
"level": "basic",
|
|
2191
|
-
"tags": ["production", "vercel-kv", "vercel", "session", "serverless", "edge"],
|
|
2192
|
-
"features": [
|
|
2193
|
-
"Correct `vercel.json` with function routes, memory limits, and max duration",
|
|
2194
|
-
"Using Vercel KV (`provider: 'vercel-kv'`) for session storage instead of in-memory",
|
|
2195
|
-
"Setting CORS origins dynamically using `VERCEL_URL`",
|
|
2196
|
-
"Serverless function entry point via `createVercelHandler`"
|
|
2197
|
-
]
|
|
2198
|
-
}
|
|
2199
|
-
]
|
|
2200
|
-
},
|
|
2201
|
-
{
|
|
2202
|
-
"name": "health-readiness-endpoints",
|
|
2203
|
-
"description": "Configure /healthz and /readyz endpoints with custom probes, runtime-aware readiness, and dependency health checks",
|
|
2204
|
-
"examples": [
|
|
2205
|
-
{
|
|
2206
|
-
"name": "basic-health-setup",
|
|
2207
|
-
"description": "Default health endpoints with Redis session store, showing /healthz and /readyz responses.",
|
|
2315
|
+
"description": "Checklist for verifying the Vercel Build Output API v3 artifact and edge config produced by `frontmcp build --target vercel`. **Note:** configuration authoring lives in `frontmcp-deployment → references/deploy-to-vercel.md`; this file is checklist-only.",
|
|
2208
2316
|
"level": "basic",
|
|
2209
|
-
"tags": ["production", "
|
|
2210
|
-
"features": [
|
|
2211
|
-
"Zero-config /healthz and /readyz endpoints enabled by default",
|
|
2212
|
-
"Auto-discovered session-store probe via Redis persistence",
|
|
2213
|
-
"Catalog hash for config drift detection across instances",
|
|
2214
|
-
"Docker HEALTHCHECK directive using /healthz"
|
|
2215
|
-
]
|
|
2216
|
-
},
|
|
2217
|
-
{
|
|
2218
|
-
"name": "custom-probes",
|
|
2219
|
-
"description": "Custom database and API probes with Kubernetes deployment configuration.",
|
|
2220
|
-
"level": "intermediate",
|
|
2221
|
-
"tags": ["production", "health", "readiness", "kubernetes", "postgres", "probes", "custom"],
|
|
2222
|
-
"features": [
|
|
2223
|
-
"Custom health probes for PostgreSQL and external API dependencies",
|
|
2224
|
-
"Kubernetes liveness and readiness probe configuration",
|
|
2225
|
-
"Production includeDetails: false to hide infrastructure topology",
|
|
2226
|
-
"Per-probe timeout to prevent slow dependencies from blocking readiness"
|
|
2227
|
-
]
|
|
2228
|
-
}
|
|
2229
|
-
]
|
|
2230
|
-
},
|
|
2231
|
-
{
|
|
2232
|
-
"name": "distributed-ha",
|
|
2233
|
-
"description": "Deploy FrontMCP across multiple pods with heartbeat, session takeover, and notification relay for zero-downtime failover",
|
|
2234
|
-
"examples": [
|
|
2235
|
-
{
|
|
2236
|
-
"name": "ha-kubernetes-3-replicas",
|
|
2237
|
-
"description": "Deploy FrontMCP with 3 replicas, Redis, and automatic session failover on Kubernetes",
|
|
2238
|
-
"level": "intermediate",
|
|
2239
|
-
"tags": ["ha", "kubernetes", "redis", "distributed", "session-takeover", "heartbeat"],
|
|
2317
|
+
"tags": ["production", "vercel-kv", "vercel", "session", "serverless", "checklist"],
|
|
2240
2318
|
"features": [
|
|
2241
|
-
"
|
|
2242
|
-
"
|
|
2243
|
-
"
|
|
2244
|
-
"
|
|
2319
|
+
"Verify `frontmcp build --target vercel` produced `.vercel/output/functions/index.func/handler.cjs`",
|
|
2320
|
+
"No hand-written `vercel.json` `builds`/`routes` — the build adapter uses Build Output API v3",
|
|
2321
|
+
"Verify Vercel KV (`provider: 'vercel-kv'`) is configured for session/cache state",
|
|
2322
|
+
"Verify CORS origins include `VERCEL_URL` and any custom production domain"
|
|
2245
2323
|
]
|
|
2246
2324
|
}
|
|
2247
2325
|
]
|
|
@@ -2470,7 +2548,7 @@
|
|
|
2470
2548
|
"features": [
|
|
2471
2549
|
"Standard README sections: Features, Quick Start, Tools table, Resources table, Environment Variables",
|
|
2472
2550
|
"Docker-specific deployment section with build and run commands",
|
|
2473
|
-
"Development commands using `frontmcp dev`, `frontmcp test`, `frontmcp
|
|
2551
|
+
"Development commands using `frontmcp dev`, `frontmcp test`, `frontmcp inspector`",
|
|
2474
2552
|
"Tool and resource tables generated from source code decorators"
|
|
2475
2553
|
]
|
|
2476
2554
|
},
|
|
@@ -2661,7 +2739,7 @@
|
|
|
2661
2739
|
"tags": ["testing", "jest", "unit-test", "setup", "unit", "tool"],
|
|
2662
2740
|
"features": [
|
|
2663
2741
|
"Testing tool `execute()` with a mock context object assigned via `Object.assign`",
|
|
2664
|
-
"Verifying resource `
|
|
2742
|
+
"Verifying resource `execute(uri, params)` output matches the MCP `ReadResourceResult` shape",
|
|
2665
2743
|
"Verifying prompt `execute()` output matches the MCP `GetPromptResult` shape",
|
|
2666
2744
|
"Using Jest matchers like `expect.stringContaining` and `expect.objectContaining` for flexible assertions"
|
|
2667
2745
|
]
|
|
@@ -2674,39 +2752,38 @@
|
|
|
2674
2752
|
"examples": [
|
|
2675
2753
|
{
|
|
2676
2754
|
"name": "oauth-flow-test",
|
|
2677
|
-
"description": "Use `MockOAuthServer` to simulate an OAuth identity provider
|
|
2755
|
+
"description": "Use `MockOAuthServer` to simulate an OAuth/OIDC identity provider. The server publishes a JWKS endpoint backed by your `TestTokenFactory`, so any token created by that factory is valid against the mock IDP.",
|
|
2678
2756
|
"level": "advanced",
|
|
2679
2757
|
"tags": ["testing", "oauth", "auth", "flow"],
|
|
2680
2758
|
"features": [
|
|
2681
|
-
"
|
|
2682
|
-
"
|
|
2683
|
-
"
|
|
2684
|
-
"
|
|
2685
|
-
"Proper cleanup with `mockOAuth.close()` in `afterAll`"
|
|
2759
|
+
"Constructing `MockOAuthServer` with a `TestTokenFactory` and starting it with `.start()`",
|
|
2760
|
+
"Reading server info from `mockOAuth.info.baseUrl` / `mockOAuth.info.jwksUrl` after start",
|
|
2761
|
+
"Issuing tokens via the same `TestTokenFactory` so the mock JWKS can verify them",
|
|
2762
|
+
"Cleaning up with `mockOAuth.stop()` in `afterAll`"
|
|
2686
2763
|
]
|
|
2687
2764
|
},
|
|
2688
2765
|
{
|
|
2689
2766
|
"name": "role-based-access-test",
|
|
2690
2767
|
"description": "Verify that tools enforce role-based access by testing admin and user tokens against protected endpoints.",
|
|
2691
2768
|
"level": "intermediate",
|
|
2692
|
-
"tags": ["testing", "auth", "role
|
|
2769
|
+
"tags": ["testing", "auth", "role-based-access"],
|
|
2693
2770
|
"features": [
|
|
2694
|
-
"
|
|
2771
|
+
"Putting roles inside `claims` (the `CreateTokenOptions` shape has no top-level `roles` field)",
|
|
2695
2772
|
"Testing that admin-only tools accept admin tokens and reject user tokens",
|
|
2696
2773
|
"Verifying that user-level tools remain accessible to users with the correct role",
|
|
2697
|
-
"Each test creates and
|
|
2774
|
+
"Each test creates and disconnects its own client for proper isolation"
|
|
2698
2775
|
]
|
|
2699
2776
|
},
|
|
2700
2777
|
{
|
|
2701
2778
|
"name": "token-factory-test",
|
|
2702
2779
|
"description": "Use `TestTokenFactory` to create tokens and verify authenticated and unauthenticated requests.",
|
|
2703
2780
|
"level": "basic",
|
|
2704
|
-
"tags": ["testing", "auth", "token
|
|
2781
|
+
"tags": ["testing", "auth", "token-factory"],
|
|
2705
2782
|
"features": [
|
|
2706
2783
|
"Creating a `TestTokenFactory` with issuer and audience configuration",
|
|
2707
|
-
"Generating test tokens with specific subjects and scopes via `
|
|
2708
|
-
"
|
|
2709
|
-
"
|
|
2784
|
+
"Generating test tokens with specific subjects and scopes via `createTestToken()`",
|
|
2785
|
+
"Building authenticated clients with `McpTestClient.create(...).withToken(token)`",
|
|
2786
|
+
"Using `.withPublicMode()` to suppress the anonymous token request and test unauthenticated rejection"
|
|
2710
2787
|
]
|
|
2711
2788
|
}
|
|
2712
2789
|
]
|
|
@@ -2781,11 +2858,11 @@
|
|
|
2781
2858
|
"name": "basic-create-test",
|
|
2782
2859
|
"description": "Test tools in-memory without any HTTP overhead using the `create()` function from `@frontmcp/sdk`.",
|
|
2783
2860
|
"level": "basic",
|
|
2784
|
-
"tags": ["testing", "sdk", "
|
|
2861
|
+
"tags": ["testing", "sdk", "direct-client"],
|
|
2785
2862
|
"features": [
|
|
2786
|
-
"Using `create()` to spin up an in-memory
|
|
2787
|
-
"Defining tools
|
|
2788
|
-
"Calling tools directly via `server.callTool()` and checking
|
|
2863
|
+
"Using `create()` to spin up an in-memory `DirectMcpServer` with no HTTP transport",
|
|
2864
|
+
"Defining tools as classes with the `@Tool` decorator and Zod schemas",
|
|
2865
|
+
"Calling tools directly via `server.callTool()` and checking the structured output",
|
|
2789
2866
|
"Proper cleanup with `server.dispose()` in each test"
|
|
2790
2867
|
]
|
|
2791
2868
|
},
|
|
@@ -2793,11 +2870,11 @@
|
|
|
2793
2870
|
"name": "openai-claude-format-test",
|
|
2794
2871
|
"description": "Verify that tools are returned in the correct format for OpenAI and Claude clients using `connectOpenAI` and `connectClaude`.",
|
|
2795
2872
|
"level": "intermediate",
|
|
2796
|
-
"tags": ["testing", "openai", "anthropic", "direct-client"
|
|
2873
|
+
"tags": ["testing", "openai", "anthropic", "direct-client"],
|
|
2797
2874
|
"features": [
|
|
2798
|
-
"Using `connectOpenAI()`
|
|
2875
|
+
"Using `connectOpenAI(ServerConfig)` to get an in-memory `DirectClient` (no HTTP server is started)",
|
|
2799
2876
|
"Verifying OpenAI tool format: `{ type: 'function', function: { name, parameters } }`",
|
|
2800
|
-
"Using
|
|
2877
|
+
"Using `connectClaude(ServerConfig)` to verify Claude format: `{ name, description, input_schema }`",
|
|
2801
2878
|
"Proper cleanup with `client.close()` after each test"
|
|
2802
2879
|
]
|
|
2803
2880
|
}
|
|
@@ -2813,10 +2890,10 @@
|
|
|
2813
2890
|
"level": "basic",
|
|
2814
2891
|
"tags": ["testing", "e2e", "handler"],
|
|
2815
2892
|
"features": [
|
|
2816
|
-
"Using `TestServer.
|
|
2817
|
-
"
|
|
2818
|
-
"
|
|
2819
|
-
"
|
|
2893
|
+
"Using `TestServer.start({ command, port })` to spawn the server as a child process",
|
|
2894
|
+
"Building a client with `McpTestClient.create(...).withTransport(...).buildAndConnect()`",
|
|
2895
|
+
"Calling the namespaced public API: `client.tools.list()`, `client.resources.list()`, `client.prompts.get(...)`",
|
|
2896
|
+
"Cleaning up with `client.disconnect()` and `server.stop()`"
|
|
2820
2897
|
]
|
|
2821
2898
|
},
|
|
2822
2899
|
{
|
|
@@ -2826,7 +2903,7 @@
|
|
|
2826
2903
|
"tags": ["testing", "session", "transport", "e2e", "handler", "manual"],
|
|
2827
2904
|
"features": [
|
|
2828
2905
|
"Using `TestServer.start()` with an explicit command and port for process-based server startup",
|
|
2829
|
-
"Building a client with `McpTestClient.create().withTransport('
|
|
2906
|
+
"Building a client with `McpTestClient.create().withTransport('streamable-http').buildAndConnect()`",
|
|
2830
2907
|
"Using `server.info.baseUrl` to wire the client to the correct address",
|
|
2831
2908
|
"Separate `disconnect()` / `stop()` calls for client and server teardown",
|
|
2832
2909
|
"The `toBeError()` and `toHaveTextContent()` custom matchers"
|
|
@@ -2836,12 +2913,12 @@
|
|
|
2836
2913
|
"name": "tool-call-and-error-e2e",
|
|
2837
2914
|
"description": "Test successful tool calls and verify that invalid inputs produce proper error responses over the full MCP protocol.",
|
|
2838
2915
|
"level": "intermediate",
|
|
2839
|
-
"tags": ["testing", "e2e", "handler", "tool
|
|
2916
|
+
"tags": ["testing", "e2e", "handler", "tool-call", "error"],
|
|
2840
2917
|
"features": [
|
|
2841
|
-
"Calling tools via `client.
|
|
2842
|
-
"
|
|
2843
|
-
"
|
|
2844
|
-
"Testing edge cases like zero values
|
|
2918
|
+
"Calling tools via `client.tools.call(name, args)` and asserting success with `toBeSuccessful()`",
|
|
2919
|
+
"Asserting text content with the `toHaveTextContent()` matcher",
|
|
2920
|
+
"Asserting error results with `toBeError()` for invalid input and unknown tools",
|
|
2921
|
+
"Testing edge cases like zero values"
|
|
2845
2922
|
]
|
|
2846
2923
|
}
|
|
2847
2924
|
]
|
|
@@ -2856,7 +2933,7 @@
|
|
|
2856
2933
|
"level": "basic",
|
|
2857
2934
|
"tags": ["testing", "tool", "unit"],
|
|
2858
2935
|
"features": [
|
|
2859
|
-
"
|
|
2936
|
+
"Mocking the real `ExecutionContextBase` API surface (`get`, `tryGet`, `scope`, `fail`, `mark`, `fetch`) plus `notify` from `ToolContext`",
|
|
2860
2937
|
"Assigning the mock context to the tool instance via `Object.assign`",
|
|
2861
2938
|
"Testing multiple input scenarios including edge cases (negatives, zero)"
|
|
2862
2939
|
]
|
|
@@ -2950,7 +3027,7 @@
|
|
|
2950
3027
|
"features": [
|
|
2951
3028
|
"NDJSON format for stdout (Docker/K8s log collection)",
|
|
2952
3029
|
"Automatic trace context enrichment (trace_id, span_id)",
|
|
2953
|
-
"Sensitive field redaction (token
|
|
3030
|
+
"Sensitive field redaction (token → [REDACTED])"
|
|
2954
3031
|
]
|
|
2955
3032
|
},
|
|
2956
3033
|
{
|
|
@@ -3004,6 +3081,18 @@
|
|
|
3004
3081
|
"All spans share the same trace ID for end-to-end visibility",
|
|
3005
3082
|
"this.telemetry works identically in agents and tools"
|
|
3006
3083
|
]
|
|
3084
|
+
},
|
|
3085
|
+
{
|
|
3086
|
+
"name": "skill-counters",
|
|
3087
|
+
"description": "Read built-in skill counters from the in-memory snapshot for tests and wire an OTel MeterProvider so counters export to OTLP in production.",
|
|
3088
|
+
"level": "intermediate",
|
|
3089
|
+
"tags": ["telemetry", "counters", "metrics", "skills", "otel", "meter-provider"],
|
|
3090
|
+
"features": [
|
|
3091
|
+
"this.telemetry.createCounter(name, description) creates a custom counter",
|
|
3092
|
+
"counter.inc(by, attrs) increments with bounded label cardinality",
|
|
3093
|
+
"getMetricSnapshot() reads framework counters in tests without a MeterProvider",
|
|
3094
|
+
"metrics.setGlobalMeterProvider() wires counters into OTLP for production"
|
|
3095
|
+
]
|
|
3007
3096
|
}
|
|
3008
3097
|
]
|
|
3009
3098
|
},
|
|
@@ -3152,14 +3241,14 @@
|
|
|
3152
3241
|
},
|
|
3153
3242
|
{
|
|
3154
3243
|
"name": "replay-buffer",
|
|
3155
|
-
"description": "Buffer channel events so Claude Code receives them when it connects, even if events occurred while offline",
|
|
3244
|
+
"description": "Buffer channel events so Claude Code receives them when it connects, even if events occurred while offline.",
|
|
3156
3245
|
"level": "advanced",
|
|
3157
3246
|
"tags": ["replay", "buffer", "persistence", "offline", "reconnect"],
|
|
3158
3247
|
"features": [
|
|
3159
|
-
"Replay configuration with maxEvents cap",
|
|
3248
|
+
"Replay configuration with `maxEvents` cap",
|
|
3160
3249
|
"In-memory ring buffer for event storage",
|
|
3161
|
-
"
|
|
3162
|
-
"Persistent store pattern with onConnect"
|
|
3250
|
+
"Where `replayBufferedEvents` actually lives (on `ChannelInstance`, not on `ChannelContext`)",
|
|
3251
|
+
"Persistent store pattern with `onConnect` and a user-defined Redis provider"
|
|
3163
3252
|
]
|
|
3164
3253
|
}
|
|
3165
3254
|
]
|