@frontmcp/skills 1.0.4 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/catalog/frontmcp-authorities/SKILL.md +272 -0
  2. package/catalog/frontmcp-authorities/references/authority-profiles.md +262 -0
  3. package/catalog/frontmcp-authorities/references/claims-mapping.md +266 -0
  4. package/catalog/frontmcp-authorities/references/custom-evaluators.md +420 -0
  5. package/catalog/frontmcp-authorities/references/rbac-abac-rebac.md +391 -0
  6. package/catalog/frontmcp-channels/SKILL.md +122 -0
  7. package/catalog/frontmcp-channels/examples/channel-sources/agent-notify.md +70 -0
  8. package/catalog/frontmcp-channels/examples/channel-sources/app-errors.md +71 -0
  9. package/catalog/frontmcp-channels/examples/channel-sources/file-watcher.md +102 -0
  10. package/catalog/frontmcp-channels/examples/channel-sources/job-completion.md +79 -0
  11. package/catalog/frontmcp-channels/examples/channel-sources/replay-buffer.md +106 -0
  12. package/catalog/frontmcp-channels/examples/channel-sources/service-connector.md +136 -0
  13. package/catalog/frontmcp-channels/examples/channel-sources/webhook-github.md +85 -0
  14. package/catalog/frontmcp-channels/examples/channel-two-way/whatsapp-bridge.md +133 -0
  15. package/catalog/frontmcp-channels/references/channel-sources.md +214 -0
  16. package/catalog/frontmcp-channels/references/channel-two-way.md +195 -0
  17. package/catalog/frontmcp-config/SKILL.md +20 -18
  18. package/catalog/frontmcp-config/examples/configure-auth/multi-app-auth.md +1 -2
  19. package/catalog/frontmcp-config/examples/configure-auth/public-mode-setup.md +1 -2
  20. package/catalog/frontmcp-config/examples/configure-auth/remote-oauth-with-vault.md +1 -2
  21. package/catalog/frontmcp-config/examples/configure-auth-modes/local-self-signed-tokens.md +1 -2
  22. package/catalog/frontmcp-config/examples/configure-auth-modes/remote-enterprise-oauth.md +1 -2
  23. package/catalog/frontmcp-config/examples/configure-auth-modes/transparent-jwt-validation.md +1 -2
  24. package/catalog/frontmcp-config/examples/configure-deployment-targets/distributed-ha-config.md +121 -0
  25. package/catalog/frontmcp-config/examples/configure-deployment-targets/json-schema-ide-support.md +64 -0
  26. package/catalog/frontmcp-config/examples/configure-deployment-targets/multi-target-with-security.md +113 -0
  27. package/catalog/frontmcp-config/examples/configure-elicitation/basic-confirmation-gate.md +1 -2
  28. package/catalog/frontmcp-config/examples/configure-elicitation/distributed-elicitation-redis.md +1 -2
  29. package/catalog/frontmcp-config/examples/configure-http/entry-path-reverse-proxy.md +1 -2
  30. package/catalog/frontmcp-config/examples/configure-http/unix-socket-local.md +1 -2
  31. package/catalog/frontmcp-config/examples/configure-security-headers/csp-report-only.md +69 -0
  32. package/catalog/frontmcp-config/examples/configure-security-headers/full-production-headers.md +91 -0
  33. package/catalog/frontmcp-config/examples/configure-throttle/distributed-redis-throttle.md +1 -2
  34. package/catalog/frontmcp-config/examples/configure-throttle/per-tool-rate-limit.md +1 -2
  35. package/catalog/frontmcp-config/examples/configure-throttle/server-level-rate-limit.md +1 -2
  36. package/catalog/frontmcp-config/examples/configure-transport/custom-protocol-flags.md +1 -2
  37. package/catalog/frontmcp-config/examples/configure-transport/distributed-sessions-redis.md +1 -2
  38. package/catalog/frontmcp-config/examples/configure-transport/stateless-serverless.md +1 -2
  39. package/catalog/frontmcp-config/examples/configure-transport-protocol-presets/legacy-preset-nodejs.md +1 -2
  40. package/catalog/frontmcp-config/examples/configure-transport-protocol-presets/stateless-api-serverless.md +1 -2
  41. package/catalog/frontmcp-config/references/configure-deployment-targets.md +214 -0
  42. package/catalog/frontmcp-config/references/configure-elicitation.md +1 -2
  43. package/catalog/frontmcp-config/references/configure-security-headers.md +198 -0
  44. package/catalog/frontmcp-deployment/SKILL.md +1 -0
  45. package/catalog/frontmcp-deployment/examples/build-for-cli/cli-binary-build.md +1 -2
  46. package/catalog/frontmcp-deployment/examples/build-for-cli/unix-socket-daemon.md +1 -2
  47. package/catalog/frontmcp-deployment/examples/build-for-mcpb/mcpb-bundle-build.md +117 -0
  48. package/catalog/frontmcp-deployment/examples/build-for-sdk/connect-openai.md +1 -3
  49. package/catalog/frontmcp-deployment/examples/build-for-sdk/create-flat-config.md +1 -2
  50. package/catalog/frontmcp-deployment/examples/build-for-sdk/multi-platform-connect.md +3 -3
  51. package/catalog/frontmcp-deployment/examples/deploy-to-cloudflare/basic-worker-deploy.md +1 -2
  52. package/catalog/frontmcp-deployment/examples/deploy-to-cloudflare/worker-custom-domain.md +1 -2
  53. package/catalog/frontmcp-deployment/examples/deploy-to-cloudflare/worker-with-kv-storage.md +1 -2
  54. package/catalog/frontmcp-deployment/examples/deploy-to-lambda/lambda-handler-with-cors.md +1 -2
  55. package/catalog/frontmcp-deployment/examples/deploy-to-vercel/vercel-with-kv.md +1 -2
  56. package/catalog/frontmcp-deployment/examples/mcp-client-integration/http-remote.md +106 -0
  57. package/catalog/frontmcp-deployment/examples/mcp-client-integration/stdio-binary-with-env.md +107 -0
  58. package/catalog/frontmcp-deployment/examples/mcp-client-integration/stdio-npx.md +89 -0
  59. package/catalog/frontmcp-deployment/references/build-for-mcpb.md +209 -0
  60. package/catalog/frontmcp-deployment/references/build-for-sdk.md +1 -2
  61. package/catalog/frontmcp-deployment/references/mcp-client-integration.md +225 -0
  62. package/catalog/frontmcp-development/examples/create-agent/basic-agent-with-tools.md +3 -6
  63. package/catalog/frontmcp-development/examples/create-agent/custom-multi-pass-agent.md +1 -2
  64. package/catalog/frontmcp-development/examples/create-agent/nested-agents-with-swarm.md +2 -4
  65. package/catalog/frontmcp-development/examples/create-agent-llm-config/anthropic-config.md +1 -2
  66. package/catalog/frontmcp-development/examples/create-agent-llm-config/openai-config.md +1 -2
  67. package/catalog/frontmcp-development/examples/create-job/basic-report-job.md +1 -2
  68. package/catalog/frontmcp-development/examples/create-job/job-with-permissions.md +2 -3
  69. package/catalog/frontmcp-development/examples/create-job/job-with-retry.md +1 -2
  70. package/catalog/frontmcp-development/examples/create-plugin-hooks/tool-level-hooks-and-stage-replacement.md +2 -5
  71. package/catalog/frontmcp-development/examples/create-provider/basic-database-provider.md +4 -3
  72. package/catalog/frontmcp-development/examples/create-skill-with-tools/directory-skill-with-tools.md +2 -3
  73. package/catalog/frontmcp-development/examples/create-tool/basic-class-tool.md +1 -2
  74. package/catalog/frontmcp-development/examples/create-tool/tool-with-di-and-errors.md +2 -2
  75. package/catalog/frontmcp-development/examples/create-tool/tool-with-rate-limiting-and-progress.md +1 -2
  76. package/catalog/frontmcp-development/examples/create-tool-annotations/destructive-delete-tool.md +2 -4
  77. package/catalog/frontmcp-development/examples/create-tool-annotations/readonly-query-tool.md +1 -2
  78. package/catalog/frontmcp-development/examples/create-tool-output-schema-types/primitive-and-media-outputs.md +3 -6
  79. package/catalog/frontmcp-development/examples/create-tool-output-schema-types/zod-raw-shape-output.md +1 -2
  80. package/catalog/frontmcp-development/examples/create-tool-output-schema-types/zod-schema-advanced-output.md +2 -4
  81. package/catalog/frontmcp-development/examples/decorators-guide/agent-skill-job-workflow.md +3 -5
  82. package/catalog/frontmcp-development/examples/decorators-guide/basic-server-with-app-and-tools.md +5 -5
  83. package/catalog/frontmcp-development/examples/decorators-guide/multi-app-with-plugins-and-providers.md +4 -6
  84. package/catalog/frontmcp-development/examples/official-plugins/cache-and-feature-flags.md +3 -5
  85. package/catalog/frontmcp-development/examples/official-plugins/production-multi-plugin-setup.md +4 -5
  86. package/catalog/frontmcp-development/examples/official-plugins/remember-plugin-session-memory.md +3 -5
  87. package/catalog/frontmcp-development/references/create-agent.md +4 -7
  88. package/catalog/frontmcp-development/references/create-job.md +3 -6
  89. package/catalog/frontmcp-development/references/create-plugin-hooks.md +12 -16
  90. package/catalog/frontmcp-development/references/create-skill-with-tools.md +2 -3
  91. package/catalog/frontmcp-development/references/create-tool.md +93 -23
  92. package/catalog/frontmcp-development/references/create-workflow.md +2 -3
  93. package/catalog/frontmcp-development/references/decorators-guide.md +32 -36
  94. package/catalog/frontmcp-extensibility/examples/vectoriadb/product-catalog-search.md +4 -4
  95. package/catalog/frontmcp-extensibility/examples/vectoriadb/semantic-search-with-persistence.md +4 -4
  96. package/catalog/frontmcp-extensibility/examples/vectoriadb/tfidf-keyword-search.md +4 -3
  97. package/catalog/frontmcp-guides/SKILL.md +3 -3
  98. package/catalog/frontmcp-guides/examples/example-knowledge-base/agent-and-plugin.md +4 -5
  99. package/catalog/frontmcp-guides/examples/example-knowledge-base/vector-search-and-resources.md +4 -3
  100. package/catalog/frontmcp-guides/examples/example-task-manager/auth-and-crud-tools.md +4 -4
  101. package/catalog/frontmcp-guides/examples/example-weather-api/weather-tool-with-schemas.md +1 -2
  102. package/catalog/frontmcp-guides/references/example-knowledge-base.md +22 -17
  103. package/catalog/frontmcp-guides/references/example-task-manager.md +16 -11
  104. package/catalog/frontmcp-guides/references/example-weather-api.md +6 -3
  105. package/catalog/frontmcp-observability/examples/telemetry-api/tool-custom-spans.md +2 -3
  106. package/catalog/frontmcp-observability/examples/tracing-setup/basic-tracing.md +4 -3
  107. package/catalog/frontmcp-observability/references/telemetry-api.md +2 -3
  108. package/catalog/frontmcp-production-readiness/examples/common-checklist/observability-setup.md +1 -2
  109. package/catalog/frontmcp-production-readiness/examples/common-checklist/security-hardening.md +3 -4
  110. package/catalog/frontmcp-production-readiness/examples/distributed-ha/ha-kubernetes-3-replicas.md +229 -0
  111. package/catalog/frontmcp-production-readiness/examples/production-browser/cross-platform-crypto.md +2 -3
  112. package/catalog/frontmcp-production-readiness/examples/production-cli-binary/stdio-transport-error-handling.md +1 -2
  113. package/catalog/frontmcp-production-readiness/examples/production-cloudflare/durable-objects-state.md +2 -4
  114. package/catalog/frontmcp-production-readiness/examples/production-cloudflare/workers-runtime-constraints.md +2 -3
  115. package/catalog/frontmcp-production-readiness/examples/production-lambda/cold-start-connection-reuse.md +3 -2
  116. package/catalog/frontmcp-production-readiness/examples/production-vercel/cold-start-optimization.md +2 -2
  117. package/catalog/frontmcp-production-readiness/examples/production-vercel/stateless-serverless-design.md +3 -3
  118. package/catalog/frontmcp-production-readiness/references/distributed-ha.md +194 -0
  119. package/catalog/frontmcp-setup/SKILL.md +11 -11
  120. package/catalog/frontmcp-setup/examples/project-structure-standalone/feature-folder-organization.md +5 -3
  121. package/catalog/frontmcp-setup/examples/project-structure-standalone/minimal-standalone-layout.md +4 -2
  122. package/catalog/frontmcp-setup/examples/setup-project/basic-node-server.md +4 -2
  123. package/catalog/frontmcp-setup/examples/setup-project/vercel-serverless-server.md +4 -2
  124. package/catalog/frontmcp-setup/examples/setup-redis/hybrid-vercel-kv-with-pubsub.md +8 -7
  125. package/catalog/frontmcp-setup/references/setup-project.md +10 -9
  126. package/catalog/frontmcp-setup/references/setup-redis.md +19 -16
  127. package/catalog/frontmcp-testing/examples/test-direct-client/basic-create-test.md +1 -3
  128. package/catalog/frontmcp-testing/examples/test-direct-client/openai-claude-format-test.md +1 -3
  129. package/catalog/frontmcp-testing/examples/test-tool-unit/schema-validation-test.md +2 -2
  130. package/catalog/frontmcp-testing/references/test-direct-client.md +1 -3
  131. package/catalog/frontmcp-testing/references/test-tool-unit.md +2 -2
  132. package/catalog/skills-manifest.json +325 -3
  133. package/package.json +1 -1
@@ -19,8 +19,7 @@ Configure a FrontMCP server for Vercel deployment with Vercel KV storage and mod
19
19
 
20
20
  ```typescript
21
21
  // src/tools/lookup-user.tool.ts
22
- import { Tool, ToolContext } from '@frontmcp/sdk';
23
- import { z } from 'zod';
22
+ import { Tool, ToolContext, z } from '@frontmcp/sdk';
24
23
 
25
24
  @Tool({
26
25
  name: 'lookup_user',
@@ -37,6 +36,7 @@ export default class LookupUserTool extends ToolContext {
37
36
  ```typescript
38
37
  // src/apps/users.app.ts
39
38
  import { App } from '@frontmcp/sdk';
39
+
40
40
  import LookupUserTool from '../tools/lookup-user.tool';
41
41
 
42
42
  @App({
@@ -49,7 +49,9 @@ export class UsersApp {}
49
49
  ```typescript
50
50
  // src/main.ts
51
51
  import 'reflect-metadata';
52
+
52
53
  import { FrontMcp } from '@frontmcp/sdk';
54
+
53
55
  import { UsersApp } from './apps/users.app';
54
56
 
55
57
  @FrontMcp({
@@ -2,18 +2,20 @@
2
2
  name: hybrid-vercel-kv-with-pubsub
3
3
  reference: setup-redis
4
4
  level: advanced
5
- description: 'Use Vercel KV for session storage and a separate Redis instance for pub/sub resource subscriptions.'
5
+ description: 'Use Vercel KV for session storage and a separate Redis instance for pub/sub resource subscriptions in distributed multi-instance deployments.'
6
6
  tags: [setup, vercel-kv, redis, vercel, session, hybrid]
7
7
  features:
8
8
  - 'Vercel KV handles sessions (`redis` config) while a real Redis handles pub/sub (`pubsub` config)'
9
- - 'Vercel KV does not support pub/sub operations, so a separate Redis instance is required'
10
- - 'Resources with `subscribe: true` rely on the `pubsub` config for real-time notifications'
9
+ - 'Vercel KV does not support pub/sub operations, so a separate Redis instance is required for distributed setups'
10
+ - 'Resource subscriptions across multiple server instances rely on the `pubsub` config for cross-instance notifications (single-instance servers use in-memory subscriptions automatically)'
11
11
  - "The `pubsub` field accepts `provider: 'redis'` only (no Vercel KV support)"
12
12
  ---
13
13
 
14
14
  # Hybrid Vercel KV with Redis Pub/Sub
15
15
 
16
- Use Vercel KV for session storage and a separate Redis instance for pub/sub resource subscriptions.
16
+ Use Vercel KV for session storage and a separate Redis instance for pub/sub resource subscriptions in distributed multi-instance deployments.
17
+
18
+ > **Note:** Single-server deployments (stdio, binary, or single-instance HTTP) do not need pub/sub — resource subscriptions work in-memory out of the box.
17
19
 
18
20
  ## Code
19
21
 
@@ -50,7 +52,6 @@ import { Resource, ResourceContext } from '@frontmcp/sdk';
50
52
  uri: 'metrics://live',
51
53
  name: 'Live Metrics',
52
54
  mimeType: 'application/json',
53
- subscribe: true,
54
55
  })
55
56
  export default class LiveMetricsResource extends ResourceContext {
56
57
  async read() {
@@ -69,8 +70,8 @@ REDIS_PUBSUB_PASSWORD=secret
69
70
  ## What This Demonstrates
70
71
 
71
72
  - Vercel KV handles sessions (`redis` config) while a real Redis handles pub/sub (`pubsub` config)
72
- - Vercel KV does not support pub/sub operations, so a separate Redis instance is required
73
- - Resources with `subscribe: true` rely on the `pubsub` config for real-time notifications
73
+ - Vercel KV does not support pub/sub operations, so a separate Redis instance is required for distributed setups
74
+ - Resource subscriptions across multiple server instances rely on the `pubsub` config for cross-instance notifications (single-instance servers use in-memory subscriptions automatically)
74
75
  - The `pubsub` field accepts `provider: 'redis'` only (no Vercel KV support)
75
76
 
76
77
  ## Related
@@ -141,6 +141,7 @@ The `@FrontMcp` decorator accepts a `FrontMcpMetadata` object with these fields:
141
141
 
142
142
  ```typescript
143
143
  import 'reflect-metadata';
144
+
144
145
  import { FrontMcp } from '@frontmcp/sdk';
145
146
 
146
147
  @FrontMcp({
@@ -180,6 +181,7 @@ export default class Server {}
180
181
 
181
182
  ```typescript
182
183
  import 'reflect-metadata';
184
+
183
185
  import { FrontMcp } from '@frontmcp/sdk';
184
186
 
185
187
  @FrontMcp({
@@ -225,8 +227,7 @@ export default class Server {}
225
227
  Create `src/tools/add.tool.ts`:
226
228
 
227
229
  ```typescript
228
- import { Tool, ToolContext } from '@frontmcp/sdk';
229
- import { z } from 'zod';
230
+ import { Tool, ToolContext, z } from '@frontmcp/sdk';
230
231
 
231
232
  @Tool({
232
233
  name: 'add',
@@ -249,6 +250,7 @@ Create `src/apps/calc.app.ts`:
249
250
 
250
251
  ```typescript
251
252
  import { App } from '@frontmcp/sdk';
253
+
252
254
  import AddTool from '../tools/add.tool';
253
255
 
254
256
  @App({
@@ -276,7 +278,9 @@ Update `src/main.ts`:
276
278
 
277
279
  ```typescript
278
280
  import 'reflect-metadata';
281
+
279
282
  import { FrontMcp } from '@frontmcp/sdk';
283
+
280
284
  import { CalcApp } from './apps/calc.app';
281
285
 
282
286
  @FrontMcp({
@@ -292,24 +296,21 @@ Resources, Prompts, and Skills follow the same decorator pattern:
292
296
 
293
297
  ```typescript
294
298
  // Resource - returns MCP ReadResourceResult
295
- import { Resource, ResourceContext } from '@frontmcp/sdk';
299
+ // Prompt - returns MCP GetPromptResult
300
+
301
+ // Skill - compound capability with tools + instructions
302
+ import { Prompt, PromptContext, Resource, ResourceContext, Skill, SkillContext } from '@frontmcp/sdk';
296
303
 
297
304
  @Resource({ uri: 'config://app', name: 'App Config', mimeType: 'application/json' })
298
305
  export default class AppConfigResource extends ResourceContext {
299
306
  /* ... */
300
307
  }
301
308
 
302
- // Prompt - returns MCP GetPromptResult
303
- import { Prompt, PromptContext } from '@frontmcp/sdk';
304
-
305
309
  @Prompt({ name: 'summarize', description: 'Summarize a document' })
306
310
  export default class SummarizePrompt extends PromptContext {
307
311
  /* ... */
308
312
  }
309
313
 
310
- // Skill - compound capability with tools + instructions
311
- import { Skill, SkillContext } from '@frontmcp/sdk';
312
-
313
314
  @Skill({ name: 'data-analysis', description: 'Analyze datasets' })
314
315
  export default class DataAnalysisSkill extends SkillContext {
315
316
  /* ... */
@@ -15,15 +15,16 @@ description: Provision and configure Redis or Vercel KV for session storage and
15
15
 
16
16
  ### Recommended
17
17
 
18
- - Resource subscriptions with `subscribe: true` are enabled and need pub/sub
18
+ - Resource subscriptions with `subscribe: true` across **multiple server instances** (distributed pub/sub)
19
19
  - Auth sessions or elicitation state must persist across server restarts
20
20
  - Distributed rate limiting is configured in the throttle guard
21
21
 
22
22
  ### Skip When
23
23
 
24
- - Running a single-instance stdio-only server for local development -- use `setup-sqlite` or in-memory stores
24
+ - Running a single-instance stdio-only server for local development -- use `setup-sqlite` or in-memory stores (resource subscriptions work in-memory without Redis)
25
25
  - Only need to configure session TTL and key prefix on an already-provisioned Redis -- use `configure-session`
26
26
  - Deploying a read-only MCP server with no sessions, subscriptions, or stateful tools
27
+ - Using resource subscriptions on a single server instance -- subscriptions work in-memory out of the box
27
28
 
28
29
  > **Decision:** Use this skill to provision and connect Redis (Docker, existing instance, or Vercel KV); use `configure-session` to tune session-specific options after Redis is available.
29
30
 
@@ -217,9 +218,11 @@ const sessionStore = createSessionStoreSync({
217
218
  });
218
219
  ```
219
220
 
220
- ## Step 4 -- Pub/Sub for Resource Subscriptions
221
+ ## Step 4 -- Pub/Sub for Resource Subscriptions (Multi-Instance Only)
221
222
 
222
- If your server exposes resources with `subscribe: true`, you need pub/sub. Pub/sub requires a real Redis instance -- Vercel KV does not support pub/sub operations.
223
+ > **Single-server note:** If you run a single server instance (stdio, binary, or single-instance HTTP), resource subscriptions work in-memory without any Redis or pub/sub configuration. Skip this step for local development and single-server deployments.
224
+
225
+ For **distributed multi-instance** deployments where subscription state must be shared across server instances, you need pub/sub. Pub/sub requires a real Redis instance -- Vercel KV does not support pub/sub operations.
223
226
 
224
227
  For a hybrid setup (Vercel KV for sessions, Redis for pub/sub):
225
228
 
@@ -318,13 +321,13 @@ You should see session keys like `mcp:session:<session-id>`.
318
321
 
319
322
  ## Common Patterns
320
323
 
321
- | Pattern | Correct | Incorrect | Why |
322
- | ---------------------- | ------------------------------------------------------------------------------------------ | ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
323
- | Redis provider field | `redis: { provider: 'redis', host: '...', port: 6379 }` | `redis: { host: '...', port: 6379 }` without `provider` | Both forms are type-safe (the SDK's `RedisOptions` union accepts both shapes), but explicit `provider: 'redis'` improves clarity and intent |
324
- | Environment variables | `host: process.env['REDIS_HOST'] ?? 'localhost'` | Hardcoding `host: 'redis.internal'` in source | Hardcoded values break across environments (dev, staging, prod); always read from env with a sensible fallback |
325
- | Vercel KV credentials | Let Vercel auto-inject `KV_REST_API_URL` and `KV_REST_API_TOKEN` | Manually setting KV tokens in the `redis` config object | Auto-injection is safer and ensures tokens rotate correctly; manual values risk stale or committed secrets |
326
- | Docker persistence | `command: redis-server --appendonly yes` in docker-compose | Running Redis without `--appendonly` in development | Without AOF persistence, data is lost on container restart; `--appendonly yes` preserves data across restarts |
327
- | Pub/sub with Vercel KV | Separate `pubsub: { provider: 'redis', ... }` alongside `redis: { provider: 'vercel-kv' }` | Expecting Vercel KV to handle pub/sub | Vercel KV does not support pub/sub; a real Redis instance is required for resource subscriptions |
324
+ | Pattern | Correct | Incorrect | Why |
325
+ | ---------------------- | ------------------------------------------------------------------------------------------ | ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
326
+ | Redis provider field | `redis: { provider: 'redis', host: '...', port: 6379 }` | `redis: { host: '...', port: 6379 }` without `provider` | Both forms are type-safe (the SDK's `RedisOptions` union accepts both shapes), but explicit `provider: 'redis'` improves clarity and intent |
327
+ | Environment variables | `host: process.env['REDIS_HOST'] ?? 'localhost'` | Hardcoding `host: 'redis.internal'` in source | Hardcoded values break across environments (dev, staging, prod); always read from env with a sensible fallback |
328
+ | Vercel KV credentials | Let Vercel auto-inject `KV_REST_API_URL` and `KV_REST_API_TOKEN` | Manually setting KV tokens in the `redis` config object | Auto-injection is safer and ensures tokens rotate correctly; manual values risk stale or committed secrets |
329
+ | Docker persistence | `command: redis-server --appendonly yes` in docker-compose | Running Redis without `--appendonly` in development | Without AOF persistence, data is lost on container restart; `--appendonly yes` preserves data across restarts |
330
+ | Pub/sub with Vercel KV | Separate `pubsub: { provider: 'redis', ... }` alongside `redis: { provider: 'vercel-kv' }` | Expecting Vercel KV to handle pub/sub | Vercel KV does not support pub/sub; a real Redis instance is required for distributed resource subscriptions (single-instance servers use in-memory subscriptions and do not need pub/sub) |
328
331
 
329
332
  ## Verification Checklist
330
333
 
@@ -359,11 +362,11 @@ You should see session keys like `mcp:session:<session-id>`.
359
362
 
360
363
  ## Examples
361
364
 
362
- | Example | Level | Description |
363
- | ----------------------------------------------------------------------------------------- | ------------ | --------------------------------------------------------------------------------------------------- |
364
- | [`docker-redis-local-dev`](../examples/setup-redis/docker-redis-local-dev.md) | Basic | Provision Redis with Docker Compose and connect a FrontMCP server for local session storage. |
365
- | [`hybrid-vercel-kv-with-pubsub`](../examples/setup-redis/hybrid-vercel-kv-with-pubsub.md) | Advanced | Use Vercel KV for session storage and a separate Redis instance for pub/sub resource subscriptions. |
366
- | [`vercel-kv-serverless`](../examples/setup-redis/vercel-kv-serverless.md) | Intermediate | Configure a FrontMCP server with Vercel KV as the session store for serverless deployment. |
365
+ | Example | Level | Description |
366
+ | ----------------------------------------------------------------------------------------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------- |
367
+ | [`docker-redis-local-dev`](../examples/setup-redis/docker-redis-local-dev.md) | Basic | Provision Redis with Docker Compose and connect a FrontMCP server for local session storage. |
368
+ | [`hybrid-vercel-kv-with-pubsub`](../examples/setup-redis/hybrid-vercel-kv-with-pubsub.md) | Advanced | Use Vercel KV for session storage and a separate Redis instance for pub/sub resource subscriptions in distributed multi-instance deployments. |
369
+ | [`vercel-kv-serverless`](../examples/setup-redis/vercel-kv-serverless.md) | Intermediate | Configure a FrontMCP server with Vercel KV as the session store for serverless deployment. |
367
370
 
368
371
  > See all examples in [`examples/setup-redis/`](../examples/setup-redis/)
369
372
 
@@ -19,9 +19,7 @@ Test tools in-memory without any HTTP overhead using the `create()` function fro
19
19
 
20
20
  ```typescript
21
21
  // src/__tests__/direct-client.spec.ts
22
- import { create } from '@frontmcp/sdk';
23
- import { tool } from '@frontmcp/sdk';
24
- import { z } from 'zod';
22
+ import { create, tool, z } from '@frontmcp/sdk';
25
23
 
26
24
  const AddTool = tool({
27
25
  name: 'add',
@@ -19,9 +19,7 @@ Verify that tools are returned in the correct format for OpenAI and Claude clien
19
19
 
20
20
  ```typescript
21
21
  // src/__tests__/client-formats.spec.ts
22
- import { connectOpenAI } from '@frontmcp/sdk';
23
- import { tool } from '@frontmcp/sdk';
24
- import { z } from 'zod';
22
+ import { connectOpenAI, tool, z } from '@frontmcp/sdk';
25
23
 
26
24
  const AddTool = tool({
27
25
  name: 'add',
@@ -19,8 +19,8 @@ Validate that a tool's Zod input schema rejects invalid data before `execute()`
19
19
 
20
20
  ```typescript
21
21
  // src/tools/__tests__/add.tool.schema.spec.ts
22
- import { z } from 'zod';
23
- import { ToolContext } from '@frontmcp/sdk';
22
+ import { ToolContext, z } from '@frontmcp/sdk';
23
+
24
24
  import { AddTool } from '../add.tool';
25
25
 
26
26
  describe('AddTool schema validation', () => {
@@ -8,9 +8,7 @@ description: In-memory testing with create() and connectOpenAI/connectClaude wit
8
8
  Uses `connect()` or `create()` for in-memory testing without HTTP overhead.
9
9
 
10
10
  ```typescript
11
- import { create, connectOpenAI } from '@frontmcp/sdk';
12
- import { tool } from '@frontmcp/sdk';
13
- import { z } from 'zod';
11
+ import { connectOpenAI, create, tool, z } from '@frontmcp/sdk';
14
12
 
15
13
  const AddTool = tool({
16
14
  name: 'add',
@@ -6,8 +6,8 @@ description: Unit test a ToolContext execute method with mock context, inputs, a
6
6
  # Unit Testing a Tool
7
7
 
8
8
  ```typescript
9
- import { z } from 'zod';
10
- import { ToolContext } from '@frontmcp/sdk';
9
+ import { ToolContext, z } from '@frontmcp/sdk';
10
+
11
11
  import { AddTool } from '../tools/add.tool';
12
12
 
13
13
  describe('AddTool', () => {
@@ -364,6 +364,77 @@
364
364
  "name": "setup-sqlite",
365
365
  "description": "Cross-reference to the full SQLite configuration guide in frontmcp-setup",
366
366
  "examples": []
367
+ },
368
+ {
369
+ "name": "configure-deployment-targets",
370
+ "description": "Configure multi-target builds with frontmcp.config.ts for node, distributed, vercel, lambda, cloudflare, browser, cli, and sdk targets",
371
+ "examples": [
372
+ {
373
+ "name": "multi-target-with-security",
374
+ "description": "Configure a FrontMCP project with node + distributed targets, CSP headers, and HSTS",
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",
400
+ "level": "basic",
401
+ "tags": ["config", "deployment", "json", "schema", "ide", "autocomplete"],
402
+ "features": [
403
+ "Adding $schema field for IDE autocomplete in JSON config files",
404
+ "Configuring multiple deployment targets in JSON format",
405
+ "Using the frontmcp.schema.json for property validation and hover docs"
406
+ ]
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": [
414
+ {
415
+ "name": "csp-report-only",
416
+ "description": "Test CSP policies in report-only mode to identify violations before enforcement",
417
+ "level": "basic",
418
+ "tags": ["config", "csp", "security", "report-only", "headers"],
419
+ "features": [
420
+ "Enabling CSP in report-only mode with reportUri for violation monitoring",
421
+ "Using the object-format directives in frontmcp.config",
422
+ "Verifying report-only header is emitted instead of enforcement header"
423
+ ]
424
+ },
425
+ {
426
+ "name": "full-production-headers",
427
+ "description": "Complete security headers configuration for production with CSP enforcement, HSTS preload, and clickjacking protection",
428
+ "level": "intermediate",
429
+ "tags": ["config", "csp", "security", "hsts", "production", "headers", "frame-options"],
430
+ "features": [
431
+ "Full CSP enforcement with multiple directive types including value-less directives",
432
+ "HSTS with preload and includeSubDomains for HTTPS enforcement",
433
+ "X-Frame-Options DENY for clickjacking protection",
434
+ "Custom headers for additional security controls"
435
+ ]
436
+ }
437
+ ]
367
438
  }
368
439
  ]
369
440
  },
@@ -441,6 +512,23 @@
441
512
  }
442
513
  ]
443
514
  },
515
+ {
516
+ "name": "build-for-mcpb",
517
+ "description": "Package a FrontMCP server as a .mcpb archive that Claude Desktop and other MCPB-aware clients install with one click",
518
+ "examples": [
519
+ {
520
+ "name": "mcpb-bundle-build",
521
+ "description": "Produce a .mcpb archive for Claude Desktop with metadata, tools, and install-time user_config.",
522
+ "level": "basic",
523
+ "tags": ["deployment", "mcpb", "bundle", "claude-desktop", "user-config"],
524
+ "features": [
525
+ "Using `frontmcp build --target mcpb` to produce a single `.mcpb` archive",
526
+ "Translating `setup.steps` into MCPB `user_config` + `${user_config.KEY}` env bindings",
527
+ "Validating the archive round-trip with `frontmcp mcpb validate`"
528
+ ]
529
+ }
530
+ ]
531
+ },
444
532
  {
445
533
  "name": "build-for-sdk",
446
534
  "description": "Build a FrontMCP server as an embeddable library with create() and connect() APIs",
@@ -691,6 +779,48 @@
691
779
  ]
692
780
  }
693
781
  ]
782
+ },
783
+ {
784
+ "name": "mcp-client-integration",
785
+ "description": "Configure MCP clients (Claude Desktop, Claude Code, Cursor, VS Code) to connect to a FrontMCP server via stdio, HTTP, or Unix socket",
786
+ "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
+ {
800
+ "name": "http-remote",
801
+ "description": "Connect an MCP client to a FrontMCP server running as an HTTP server, locally or remotely.",
802
+ "level": "basic",
803
+ "tags": ["deployment", "http", "mcp-client", "remote", "cloud", "production"],
804
+ "features": [
805
+ "Connecting to a local FrontMCP dev server on a custom port",
806
+ "Connecting to a remote production FrontMCP server with authentication",
807
+ "Configuring HTTP transport in Claude Code and Claude Desktop",
808
+ "Using a background daemon on a TCP port for persistent local access"
809
+ ]
810
+ },
811
+ {
812
+ "name": "stdio-binary-with-env",
813
+ "description": "Configure a local FrontMCP CLI binary with environment variables and custom arguments in MCP client configs.",
814
+ "level": "intermediate",
815
+ "tags": ["deployment", "stdio", "cli", "binary", "env", "mcp-client", "configuration"],
816
+ "features": [
817
+ "Pointing MCP clients at a locally installed FrontMCP binary",
818
+ "Passing database URLs, API keys, and feature flags via environment variables",
819
+ "Using absolute paths for reliable binary resolution",
820
+ "Configuring different environments (dev, staging) via env vars"
821
+ ]
822
+ }
823
+ ]
694
824
  }
695
825
  ]
696
826
  },
@@ -2097,6 +2227,24 @@
2097
2227
  ]
2098
2228
  }
2099
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"],
2240
+ "features": [
2241
+ "Configuring @FrontMcp with Redis for distributed deployment",
2242
+ "Kubernetes Deployment YAML with 3 replicas and readiness probes",
2243
+ "Verifying heartbeat keys and session takeover via redis-cli",
2244
+ "NGINX sticky sessions for session affinity"
2245
+ ]
2246
+ }
2247
+ ]
2100
2248
  }
2101
2249
  ]
2102
2250
  },
@@ -2401,13 +2549,13 @@
2401
2549
  },
2402
2550
  {
2403
2551
  "name": "hybrid-vercel-kv-with-pubsub",
2404
- "description": "Use Vercel KV for session storage and a separate Redis instance for pub/sub resource subscriptions.",
2552
+ "description": "Use Vercel KV for session storage and a separate Redis instance for pub/sub resource subscriptions in distributed multi-instance deployments.",
2405
2553
  "level": "advanced",
2406
2554
  "tags": ["setup", "vercel-kv", "redis", "vercel", "session", "hybrid"],
2407
2555
  "features": [
2408
2556
  "Vercel KV handles sessions (`redis` config) while a real Redis handles pub/sub (`pubsub` config)",
2409
- "Vercel KV does not support pub/sub operations, so a separate Redis instance is required",
2410
- "Resources with `subscribe: true` rely on the `pubsub` config for real-time notifications",
2557
+ "Vercel KV does not support pub/sub operations, so a separate Redis instance is required for distributed setups",
2558
+ "Resource subscriptions across multiple server instances rely on the `pubsub` config for cross-instance notifications (single-instance servers use in-memory subscriptions automatically)",
2411
2559
  "The `pubsub` field accepts `provider: 'redis'` only (no Vercel KV support)"
2412
2560
  ]
2413
2561
  },
@@ -2907,6 +3055,180 @@
2907
3055
  ]
2908
3056
  }
2909
3057
  ]
3058
+ },
3059
+ {
3060
+ "name": "frontmcp-channels",
3061
+ "category": "development",
3062
+ "description": "Use when you want to push real-time notifications into Claude Code sessions. Build webhook channels, chat bridges (WhatsApp, Telegram, Slack), agent completion alerts, job status notifications, or error forwarding. The skill for CHANNELS and NOTIFICATIONS.",
3063
+ "path": "frontmcp-channels",
3064
+ "targets": ["all"],
3065
+ "hasResources": true,
3066
+ "tags": [
3067
+ "channels",
3068
+ "notifications",
3069
+ "claude-code",
3070
+ "webhooks",
3071
+ "messaging",
3072
+ "real-time",
3073
+ "two-way",
3074
+ "whatsapp",
3075
+ "telegram",
3076
+ "slack",
3077
+ "chat-bridge"
3078
+ ],
3079
+ "bundle": ["full"],
3080
+ "references": [
3081
+ {
3082
+ "name": "channel-sources",
3083
+ "description": "Configure different channel source types - webhooks, app events, agent completion, job completion, and manual push",
3084
+ "examples": [
3085
+ {
3086
+ "name": "webhook-github",
3087
+ "description": "Forward GitHub webhook events (PRs, pushes, CI) into Claude Code",
3088
+ "level": "basic",
3089
+ "tags": ["webhook", "github", "ci", "notifications"],
3090
+ "features": [
3091
+ "Webhook source with HTTP POST endpoint",
3092
+ "GitHub event type routing",
3093
+ "Static meta for team context"
3094
+ ]
3095
+ },
3096
+ {
3097
+ "name": "app-errors",
3098
+ "description": "Forward application errors to Claude Code via the in-process event bus",
3099
+ "level": "basic",
3100
+ "tags": ["errors", "app-event", "debugging", "monitoring"],
3101
+ "features": [
3102
+ "App event source with ChannelEventBus",
3103
+ "Error severity classification",
3104
+ "Stack trace forwarding"
3105
+ ]
3106
+ },
3107
+ {
3108
+ "name": "agent-notify",
3109
+ "description": "Notify Claude Code when AI agents complete their tasks",
3110
+ "level": "intermediate",
3111
+ "tags": ["agents", "completion", "notifications", "automation"],
3112
+ "features": [
3113
+ "Agent completion source with ID filtering",
3114
+ "Duration and output reporting",
3115
+ "Integration with agent registry emitter"
3116
+ ]
3117
+ },
3118
+ {
3119
+ "name": "job-completion",
3120
+ "description": "Notify Claude Code when background jobs and workflows complete",
3121
+ "level": "intermediate",
3122
+ "tags": ["jobs", "workflows", "completion", "background", "notifications"],
3123
+ "features": [
3124
+ "Job completion source with name filtering",
3125
+ "Status-aware notification formatting",
3126
+ "Duration and output reporting"
3127
+ ]
3128
+ },
3129
+ {
3130
+ "name": "service-connector",
3131
+ "description": "Build a persistent service connector that lets Claude send and receive messages through WhatsApp, Telegram, or any messaging API",
3132
+ "level": "advanced",
3133
+ "tags": ["service", "connector", "whatsapp", "persistent-connection", "bidirectional"],
3134
+ "features": [
3135
+ "Service source type with onConnect/onDisconnect lifecycle",
3136
+ "Channel-contributed tools for outbound messages",
3137
+ "pushIncoming() for feeding service events into the notification pipeline",
3138
+ "Bidirectional conversation flow"
3139
+ ]
3140
+ },
3141
+ {
3142
+ "name": "file-watcher",
3143
+ "description": "Watch files for changes and notify Claude Code in real-time",
3144
+ "level": "intermediate",
3145
+ "tags": ["file-watcher", "filesystem", "logs", "monitoring", "real-time"],
3146
+ "features": [
3147
+ "File watcher source type with glob patterns",
3148
+ "onConnect lifecycle for starting the watcher",
3149
+ "pushIncoming for streaming file events",
3150
+ "Log file monitoring example"
3151
+ ]
3152
+ },
3153
+ {
3154
+ "name": "replay-buffer",
3155
+ "description": "Buffer channel events so Claude Code receives them when it connects, even if events occurred while offline",
3156
+ "level": "advanced",
3157
+ "tags": ["replay", "buffer", "persistence", "offline", "reconnect"],
3158
+ "features": [
3159
+ "Replay configuration with maxEvents cap",
3160
+ "In-memory ring buffer for event storage",
3161
+ "Replay on session connect",
3162
+ "Persistent store pattern with onConnect"
3163
+ ]
3164
+ }
3165
+ ]
3166
+ },
3167
+ {
3168
+ "name": "channel-two-way",
3169
+ "description": "Build two-way chat bridges connecting WhatsApp, Telegram, Slack, and Discord to Claude Code",
3170
+ "examples": [
3171
+ {
3172
+ "name": "whatsapp-bridge",
3173
+ "description": "Full WhatsApp Business API bridge allowing users to chat with Claude Code via WhatsApp",
3174
+ "level": "advanced",
3175
+ "tags": ["whatsapp", "chat", "two-way", "messaging", "bridge"],
3176
+ "features": [
3177
+ "Two-way channel with reply support",
3178
+ "WhatsApp Cloud API integration",
3179
+ "Sender verification and allowlisting",
3180
+ "Webhook signature validation"
3181
+ ]
3182
+ }
3183
+ ]
3184
+ }
3185
+ ]
3186
+ },
3187
+ {
3188
+ "name": "frontmcp-authorities",
3189
+ "category": "development",
3190
+ "description": "Use when implementing authorization, access control, RBAC, ABAC, or ReBAC for tools, resources, or prompts. Covers JWT claims mapping, authority profiles, and policy enforcement.",
3191
+ "path": "frontmcp-authorities",
3192
+ "targets": ["all"],
3193
+ "hasResources": true,
3194
+ "tags": [
3195
+ "authorization",
3196
+ "rbac",
3197
+ "abac",
3198
+ "rebac",
3199
+ "security",
3200
+ "permissions",
3201
+ "roles",
3202
+ "access-control",
3203
+ "authorities",
3204
+ "jwt"
3205
+ ],
3206
+ "bundle": ["full"],
3207
+ "priority": 9,
3208
+ "visibility": "both",
3209
+ "license": "Apache-2.0",
3210
+ "references": [
3211
+ {
3212
+ "name": "claims-mapping",
3213
+ "description": "JWT claims mapping per identity provider (Auth0, Keycloak, Okta, Cognito, Frontegg)",
3214
+ "examples": []
3215
+ },
3216
+ {
3217
+ "name": "authority-profiles",
3218
+ "description": "Registering and using named authority profiles for reusable access patterns",
3219
+ "examples": []
3220
+ },
3221
+ {
3222
+ "name": "rbac-abac-rebac",
3223
+ "description": "Comparison of RBAC, ABAC, and ReBAC authorization models with usage guidance",
3224
+ "examples": []
3225
+ },
3226
+ {
3227
+ "name": "custom-evaluators",
3228
+ "description": "Creating custom authority evaluators for domain-specific access control",
3229
+ "examples": []
3230
+ }
3231
+ ]
2910
3232
  }
2911
3233
  ]
2912
3234
  }