@frontmcp/skills 1.1.2 → 1.2.1
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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: configure-deployment-targets
|
|
3
|
-
description: Configure multi-target builds with frontmcp.config.ts for node, distributed, vercel, lambda, cloudflare, browser, cli, and
|
|
3
|
+
description: Configure multi-target builds with frontmcp.config.ts for node, distributed, vercel, lambda, cloudflare, browser, cli, sdk, and mcpb targets
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Configure Deployment Targets
|
|
@@ -29,14 +29,14 @@ FrontMCP's configuration file defines one or more deployment targets, each with
|
|
|
29
29
|
|
|
30
30
|
## Prerequisites
|
|
31
31
|
|
|
32
|
-
-
|
|
32
|
+
- `frontmcp` installed
|
|
33
33
|
- A working FrontMCP server (see `frontmcp-development`)
|
|
34
34
|
|
|
35
35
|
## Step 1: Create Configuration File
|
|
36
36
|
|
|
37
37
|
```typescript
|
|
38
38
|
// frontmcp.config.ts
|
|
39
|
-
import { defineConfig } from '
|
|
39
|
+
import { defineConfig } from 'frontmcp';
|
|
40
40
|
|
|
41
41
|
export default defineConfig({
|
|
42
42
|
name: 'my-server',
|
|
@@ -70,10 +70,13 @@ export default defineConfig({
|
|
|
70
70
|
{
|
|
71
71
|
target: 'node',
|
|
72
72
|
server: {
|
|
73
|
-
http: { port: 3000, cors: {
|
|
73
|
+
http: { port: 3000, cors: { origins: ['https://app.example.com'] } },
|
|
74
74
|
csp: {
|
|
75
75
|
enabled: true,
|
|
76
|
-
directives:
|
|
76
|
+
directives: {
|
|
77
|
+
'default-src': "'self'",
|
|
78
|
+
'upgrade-insecure-requests': '',
|
|
79
|
+
},
|
|
77
80
|
},
|
|
78
81
|
headers: {
|
|
79
82
|
hsts: 'max-age=31536000; includeSubDomains',
|
|
@@ -117,25 +120,25 @@ frontmcp build --target vercel
|
|
|
117
120
|
| `browser` | In-memory | Memory | Web browser |
|
|
118
121
|
| `cli` | stdio | SQLite, memory | Standalone binary |
|
|
119
122
|
| `sdk` | Direct | Configurable | Library embedding |
|
|
123
|
+
| `mcpb` | stdio | SQLite, memory | `.mcpb` MCP bundles |
|
|
120
124
|
|
|
121
125
|
### Server HTTP Options
|
|
122
126
|
|
|
123
|
-
| Field
|
|
124
|
-
|
|
|
125
|
-
| `port`
|
|
126
|
-
| `socketPath`
|
|
127
|
-
| `entryPath`
|
|
128
|
-
| `cors.
|
|
129
|
-
| `portRange` | [number, number] | --- | Auto-find available port |
|
|
127
|
+
| Field | Type | Default | Description |
|
|
128
|
+
| -------------- | -------- | ------- | ---------------------------- |
|
|
129
|
+
| `port` | number | 3000 | Listen port |
|
|
130
|
+
| `socketPath` | string | --- | Unix socket (overrides port) |
|
|
131
|
+
| `entryPath` | string | `/` | Base path |
|
|
132
|
+
| `cors.origins` | string[] | --- | CORS allowed origins |
|
|
130
133
|
|
|
131
134
|
### CSP Options
|
|
132
135
|
|
|
133
|
-
| Field | Type
|
|
134
|
-
| ------------ |
|
|
135
|
-
| `enabled` | boolean
|
|
136
|
-
| `directives` | string
|
|
137
|
-
| `reportUri` | string
|
|
138
|
-
| `reportOnly` | boolean
|
|
136
|
+
| Field | Type | Default | Description |
|
|
137
|
+
| ------------ | ------------------------------------ | ------- | ---------------------- |
|
|
138
|
+
| `enabled` | boolean | false | Enable CSP headers |
|
|
139
|
+
| `directives` | `Record<string, string \| string[]>` | --- | Directive-to-value map |
|
|
140
|
+
| `reportUri` | string | --- | Violation report URI |
|
|
141
|
+
| `reportOnly` | boolean | false | Report-only mode |
|
|
139
142
|
|
|
140
143
|
### Security Headers
|
|
141
144
|
|
|
@@ -169,7 +172,7 @@ For JSON configs, add `$schema` for autocomplete:
|
|
|
169
172
|
|
|
170
173
|
```json
|
|
171
174
|
{
|
|
172
|
-
"$schema": "./node_modules
|
|
175
|
+
"$schema": "./node_modules/frontmcp/frontmcp.schema.json",
|
|
173
176
|
"name": "my-server",
|
|
174
177
|
"deployments": [{ "target": "node" }]
|
|
175
178
|
}
|
|
@@ -177,11 +180,11 @@ For JSON configs, add `$schema` for autocomplete:
|
|
|
177
180
|
|
|
178
181
|
## Common Patterns
|
|
179
182
|
|
|
180
|
-
| Pattern | Correct
|
|
181
|
-
| -------------- |
|
|
182
|
-
| Config helper | `defineConfig({...})`
|
|
183
|
-
| HA config | Only on `distributed` target
|
|
184
|
-
| CSP directives |
|
|
183
|
+
| Pattern | Correct | Incorrect | Why |
|
|
184
|
+
| -------------- | ------------------------------------------------------ | ----------------------------------- | ------------------------------------------------------------ |
|
|
185
|
+
| Config helper | `defineConfig({...})` | Plain object export | Loses IDE autocomplete |
|
|
186
|
+
| HA config | Only on `distributed` target | On `node` or `vercel` target | HA requires Redis + multi-pod |
|
|
187
|
+
| CSP directives | `{ 'default-src': "'self'" }` (record of name → value) | A single semicolon-separated string | Schema is `Record<string, string \| string[]>`, not a string |
|
|
185
188
|
|
|
186
189
|
## Verification Checklist
|
|
187
190
|
|
|
@@ -27,7 +27,7 @@ Configure the HTTP server — port, CORS policy, unix sockets, and entry path pr
|
|
|
27
27
|
- Only need rate limiting or IP filtering without changing HTTP binding -- use `configure-throttle`
|
|
28
28
|
- Need to configure TLS/HTTPS termination -- handle at the reverse proxy or load balancer level, not in FrontMCP
|
|
29
29
|
|
|
30
|
-
> **Decision:** Use this skill when you need to customize how the HTTP listener binds (port, socket, prefix) or how it handles CORS; skip if the default port
|
|
30
|
+
> **Decision:** Use this skill when you need to customize how the HTTP listener binds (port, socket, prefix) or how it handles CORS; skip if the default port 3000 with permissive CORS is sufficient.
|
|
31
31
|
|
|
32
32
|
## HttpOptionsInput
|
|
33
33
|
|
|
@@ -36,7 +36,7 @@ Configure the HTTP server — port, CORS policy, unix sockets, and entry path pr
|
|
|
36
36
|
info: { name: 'my-server', version: '1.0.0' },
|
|
37
37
|
apps: [MyApp],
|
|
38
38
|
http: {
|
|
39
|
-
port:
|
|
39
|
+
port: 3000, // default: 3000
|
|
40
40
|
entryPath: '', // default: '' (root)
|
|
41
41
|
socketPath: undefined, // unix socket path (overrides port)
|
|
42
42
|
cors: {
|
|
@@ -53,14 +53,14 @@ class Server {}
|
|
|
53
53
|
## Port Configuration
|
|
54
54
|
|
|
55
55
|
```typescript
|
|
56
|
-
// Default: port
|
|
56
|
+
// Default: port 3000
|
|
57
57
|
http: {
|
|
58
|
-
port:
|
|
58
|
+
port: 3000;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
61
|
// Use environment variable
|
|
62
62
|
http: {
|
|
63
|
-
port: Number(process.env.PORT) ||
|
|
63
|
+
port: Number(process.env.PORT) || 3000;
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
// Random port (useful for testing)
|
|
@@ -103,12 +103,16 @@ http: {
|
|
|
103
103
|
|
|
104
104
|
### Dynamic Origin
|
|
105
105
|
|
|
106
|
+
The `origin` callback uses Node-style `(origin, callback)` signature so origin checks
|
|
107
|
+
can be async (e.g., look up the allowlist from a database):
|
|
108
|
+
|
|
106
109
|
```typescript
|
|
107
110
|
http: {
|
|
108
111
|
cors: {
|
|
109
|
-
origin: (origin
|
|
110
|
-
//
|
|
111
|
-
|
|
112
|
+
origin: (origin, callback) => {
|
|
113
|
+
// origin is `string | undefined` (undefined for same-origin / non-browser requests)
|
|
114
|
+
const allowed = !!origin && origin.endsWith('.myapp.com');
|
|
115
|
+
callback(null, allowed);
|
|
112
116
|
},
|
|
113
117
|
credentials: true,
|
|
114
118
|
},
|
|
@@ -167,7 +171,7 @@ curl --unix-socket /tmp/my-mcp-server.sock http://localhost/
|
|
|
167
171
|
|
|
168
172
|
| Pattern | Correct | Incorrect | Why |
|
|
169
173
|
| --------------------- | ------------------------------------------------------------ | -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
|
|
170
|
-
| Port from environment | `port: Number(process.env.PORT) \|\|
|
|
174
|
+
| Port from environment | `port: Number(process.env.PORT) \|\| 3000` | `port: process.env.PORT` | The `port` field expects a number; passing a string causes a silent bind failure |
|
|
171
175
|
| CORS with credentials | `cors: { origin: ['https://myapp.com'], credentials: true }` | `cors: { origin: true, credentials: true }` | Browsers reject `Access-Control-Allow-Origin: *` when credentials are enabled; you must list explicit origins |
|
|
172
176
|
| Unix socket mode | `socketPath: '/tmp/my-mcp.sock'` with no `port` field | Setting both `socketPath` and `port` | When `socketPath` is set, `port` is silently ignored which can cause confusion during debugging |
|
|
173
177
|
| Entry path prefix | `entryPath: '/api/mcp'` (no trailing slash) | `entryPath: '/api/mcp/'` with trailing slash | Trailing slashes cause double-slash issues in route matching (e.g., `/api/mcp//sse`) |
|
|
@@ -201,7 +205,7 @@ curl --unix-socket /tmp/my-mcp-server.sock http://localhost/
|
|
|
201
205
|
| `EADDRINUSE` on startup | Another process is already using the configured port | Change the port, stop the other process, or use `port: 0` for a random available port |
|
|
202
206
|
| CORS errors in the browser console | Origin not included in the `cors.origin` list or `credentials: true` with wildcard origin | Add the frontend origin to the `origin` array and ensure credentials and origin settings are compatible |
|
|
203
207
|
| Unix socket file not created | Missing write permissions on the target directory or stale socket file from a previous run | Check directory permissions and remove the stale `.sock` file before restarting |
|
|
204
|
-
| Routes return 404 after setting `entryPath` | Client is still requesting the root path without the prefix | Update client base URL to include the entry path (e.g., `http://localhost:
|
|
208
|
+
| Routes return 404 after setting `entryPath` | Client is still requesting the root path without the prefix | Update client base URL to include the entry path (e.g., `http://localhost:3000/api/mcp`) |
|
|
205
209
|
| Server binds but external clients cannot connect | Server bound to `localhost` or `127.0.0.1` inside a container | Set `host: '0.0.0.0'` or use Docker port mapping to expose the container port |
|
|
206
210
|
|
|
207
211
|
## Examples
|
|
@@ -30,7 +30,7 @@ Set Content Security Policy (CSP), HSTS, and other security headers on every HTT
|
|
|
30
30
|
|
|
31
31
|
## Prerequisites
|
|
32
32
|
|
|
33
|
-
-
|
|
33
|
+
- `frontmcp` installed
|
|
34
34
|
- A `frontmcp.config.ts` or `.json` file (see `configure-deployment-targets`)
|
|
35
35
|
|
|
36
36
|
## Step 1: Add CSP to Your Config
|
|
@@ -39,7 +39,7 @@ CSP directives are specified as a record (object) mapping directive names to val
|
|
|
39
39
|
|
|
40
40
|
```typescript
|
|
41
41
|
// frontmcp.config.ts
|
|
42
|
-
import { defineConfig } from '
|
|
42
|
+
import { defineConfig } from 'frontmcp';
|
|
43
43
|
|
|
44
44
|
export default defineConfig({
|
|
45
45
|
name: 'my-server',
|
|
@@ -44,7 +44,7 @@ Never use the memory store in production. Sessions are lost on process restart,
|
|
|
44
44
|
Configure Redis session storage via the `@FrontMcp` decorator:
|
|
45
45
|
|
|
46
46
|
```typescript
|
|
47
|
-
import {
|
|
47
|
+
import { App, FrontMcp } from '@frontmcp/sdk';
|
|
48
48
|
|
|
49
49
|
@App({ name: 'MyApp' })
|
|
50
50
|
class MyApp {}
|
|
@@ -62,7 +62,7 @@ class MyApp {}
|
|
|
62
62
|
class MyServer {}
|
|
63
63
|
```
|
|
64
64
|
|
|
65
|
-
The SDK internally
|
|
65
|
+
The SDK internally constructs a `RedisSessionStore` from the config block, lazy-loading `ioredis` so it is not bundled when you use a different provider. There is no need to import the factory yourself — pass the config to `@FrontMcp` and the SDK takes care of the rest.
|
|
66
66
|
|
|
67
67
|
## Vercel KV
|
|
68
68
|
|
|
@@ -143,35 +143,35 @@ class MyServer {}
|
|
|
143
143
|
|
|
144
144
|
## Pub/Sub for Resource Subscriptions
|
|
145
145
|
|
|
146
|
-
If your server uses resource subscriptions (clients subscribe to resource change notifications), you need a pub/sub channel. Vercel KV does not support pub/sub, so you must
|
|
146
|
+
If your server uses resource subscriptions (clients subscribe to resource change notifications), you need a pub/sub channel. Vercel KV does not support pub/sub, so you must configure a separate `pubsub` block pointing at Redis even when using Vercel KV for sessions. The SDK reads `pubsub` from the `@FrontMcp` decorator and constructs the pub/sub channel automatically — there is no public subpath import for the factories:
|
|
147
147
|
|
|
148
148
|
```typescript
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
provider: 'vercel-kv',
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
port: 6379,
|
|
163
|
-
});
|
|
149
|
+
@FrontMcp({
|
|
150
|
+
info: { name: 'my-server', version: '1.0.0' },
|
|
151
|
+
apps: [MyApp],
|
|
152
|
+
// Sessions in Vercel KV
|
|
153
|
+
redis: { provider: 'vercel-kv' },
|
|
154
|
+
// Pub/sub requires real Redis
|
|
155
|
+
pubsub: {
|
|
156
|
+
provider: 'redis',
|
|
157
|
+
host: process.env['REDIS_HOST'] ?? 'localhost',
|
|
158
|
+
port: 6379,
|
|
159
|
+
},
|
|
160
|
+
})
|
|
161
|
+
class MyServer {}
|
|
164
162
|
```
|
|
165
163
|
|
|
164
|
+
When the global `redis` config already points at a real Redis instance, `pubsub` falls back to it automatically and can be omitted.
|
|
165
|
+
|
|
166
166
|
## Common Patterns
|
|
167
167
|
|
|
168
|
-
| Pattern | Correct | Incorrect
|
|
169
|
-
| ---------------------- | -------------------------------------------------------------------------------------------- |
|
|
170
|
-
| Store construction |
|
|
171
|
-
| Vercel KV
|
|
172
|
-
| Key prefix per server | `keyPrefix: 'billing-mcp:session:'` unique per server | Same `keyPrefix` across multiple servers sharing one Redis instance
|
|
173
|
-
| Production storage | `redis: { provider: 'redis', host: '...' }` or `redis: { provider: 'vercel-kv' }` | Omitting redis config in production (falls back to memory)
|
|
174
|
-
| Pub/sub with Vercel KV | Separate `pubsub` config pointing to real Redis alongside `redis: { provider: 'vercel-kv' }` | Expecting Vercel KV to handle pub/sub
|
|
168
|
+
| Pattern | Correct | Incorrect | Why |
|
|
169
|
+
| ---------------------- | -------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- |
|
|
170
|
+
| Store construction | Pass a `redis` config block to `@FrontMcp({ redis: { provider: ... } })` | Importing `createSessionStore` / `new RedisSessionStore(...)` directly | The SDK constructs and lazy-loads the right store internally based on `provider`; there is no public subpath |
|
|
171
|
+
| Vercel KV provider | `redis: { provider: 'vercel-kv' }` | Calling `createSessionStore({ provider: 'vercel-kv' })` from user code | The SDK awaits the async Vercel KV connection internally during startup |
|
|
172
|
+
| Key prefix per server | `keyPrefix: 'billing-mcp:session:'` unique per server | Same `keyPrefix` across multiple servers sharing one Redis instance | Shared prefixes cause session key collisions; one server may read or overwrite another's sessions |
|
|
173
|
+
| Production storage | `redis: { provider: 'redis', host: '...' }` or `redis: { provider: 'vercel-kv' }` | Omitting redis config in production (falls back to memory) | Memory sessions vanish on restart; all connected clients must re-authenticate and in-flight workflows are lost |
|
|
174
|
+
| Pub/sub with Vercel KV | Separate `pubsub` config pointing to real Redis alongside `redis: { provider: 'vercel-kv' }` | Expecting Vercel KV to handle pub/sub | Vercel KV does not support pub/sub operations; a real Redis instance is required for resource subscriptions |
|
|
175
175
|
|
|
176
176
|
## Verification Checklist
|
|
177
177
|
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: configure-skills-http
|
|
3
|
+
description: Full reference for skillsConfig — HTTP catalog endpoints, auth, caching, instructions injection, and tamper-evident audit log.
|
|
4
|
+
tags: [config, skills, skills-http, llm-txt, instructions, audit, injection]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Configure `skillsConfig`
|
|
8
|
+
|
|
9
|
+
`skillsConfig` is the single configuration object on `@FrontMcp({ ... })` that controls everything about the Skills HTTP surface (`/skills`, `/llm.txt`, `/llm_full.txt`), the MCP `skill://` resource catalog (SEP-2640 — singular scheme), the auto-injected `instructions` field on the MCP `initialize` response, and the tamper-evident skill audit log.
|
|
10
|
+
|
|
11
|
+
## Top-Level Shape
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
@FrontMcp({
|
|
15
|
+
info: { name: 'my-server', version: '1.0.0' },
|
|
16
|
+
apps: [MainApp],
|
|
17
|
+
|
|
18
|
+
// Server-level instructions, exposed as `instructions` on initialize.
|
|
19
|
+
// Combined with the skill catalog summary per skillsConfig.injectInstructions.
|
|
20
|
+
instructions: 'You are a helpful assistant for booking flights.',
|
|
21
|
+
|
|
22
|
+
skillsConfig: {
|
|
23
|
+
enabled: true, // turn on /skills, /llm.txt, skill:// resources
|
|
24
|
+
mcpResources: true, // expose skills as MCP resources (skill://index.json, skill://<skillPath>/SKILL.md)
|
|
25
|
+
llmTxt: true, // serve /llm.txt
|
|
26
|
+
llmFullTxt: false, // serve /llm_full.txt (full SKILL.md bodies)
|
|
27
|
+
auth: 'api-key', // 'inherit' (default) | 'public' | 'api-key' | 'bearer'
|
|
28
|
+
apiKeys: ['sk-xxx', 'sk-yyy'],
|
|
29
|
+
jwt: { issuer: 'https://auth.example.com', audience: 'skills-api' },
|
|
30
|
+
cache: {
|
|
31
|
+
enabled: true,
|
|
32
|
+
redis: { provider: 'redis', host: 'localhost', port: 6379 },
|
|
33
|
+
ttlMs: 60_000,
|
|
34
|
+
},
|
|
35
|
+
injectInstructions: 'append', // 'off' | 'append' | 'prepend' | 'replace'
|
|
36
|
+
audit: {
|
|
37
|
+
enabled: true,
|
|
38
|
+
signer: customSigner, // SkillAuditSigner — see audit section below
|
|
39
|
+
store: customStore, // SkillAuditStore — see audit section below
|
|
40
|
+
subjectMode: 'hash', // 'plain' | 'hash' | 'omit'
|
|
41
|
+
headAnchorIntervalMs: 300_000,
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
})
|
|
45
|
+
class MyServer {}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Server-Level `instructions`
|
|
49
|
+
|
|
50
|
+
The new top-level `instructions?: string` field on `@FrontMcp` is forwarded verbatim into the MCP `initialize` response. MCP clients use it as the global system prompt for the connected server.
|
|
51
|
+
|
|
52
|
+
| Field | Type | Default | Description |
|
|
53
|
+
| -------------- | -------- | ------- | ----------------------------------------------------------------------- |
|
|
54
|
+
| `instructions` | `string` | `''` | High-level prompt the server gives to the LLM client at connection time |
|
|
55
|
+
|
|
56
|
+
`skillsConfig.injectInstructions` controls whether (and how) FrontMCP appends a generated **skill catalog summary** to those instructions on every `initialize` request.
|
|
57
|
+
|
|
58
|
+
## Skill Catalog Injection Policy
|
|
59
|
+
|
|
60
|
+
| Mode | Behavior |
|
|
61
|
+
| --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
62
|
+
| `off` | The catalog summary is suppressed. Server `instructions` and channel hints are still surfaced. |
|
|
63
|
+
| `append` | Server `instructions`, then channel hints, then the catalog summary, joined by `\n\n---\n\n`. **(Default.)** |
|
|
64
|
+
| `prepend` | Catalog summary first, then channel hints, then server `instructions`. |
|
|
65
|
+
| `replace` | Surface ONLY the server `instructions`; the catalog AND channel hints are dropped. When `instructions` is empty/undefined this falls back to `'append'` so a misconfig doesn't drop everything. |
|
|
66
|
+
|
|
67
|
+
The catalog summary is built by `composeInitializeInstructions(...)` and `buildSkillsCatalogSummary(...)` (exported from `@frontmcp/sdk`). It is bounded at **16 KB** with a truncation footer; the footer points clients at `skill://index.json` and `skill://<skillPath>/SKILL.md` for full content (SEP-2640 — singular scheme).
|
|
68
|
+
|
|
69
|
+
> **Dynamic skills:** because the composer recomputes the summary on every `initialize` request, skills registered after server boot **are** picked up automatically.
|
|
70
|
+
|
|
71
|
+
## Skills HTTP Authentication
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
// API key auth
|
|
75
|
+
skillsConfig: {
|
|
76
|
+
enabled: true,
|
|
77
|
+
auth: 'api-key',
|
|
78
|
+
apiKeys: [process.env.SKILLS_API_KEY!],
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// JWT bearer auth
|
|
82
|
+
skillsConfig: {
|
|
83
|
+
enabled: true,
|
|
84
|
+
auth: 'bearer',
|
|
85
|
+
jwt: {
|
|
86
|
+
issuer: 'https://auth.example.com',
|
|
87
|
+
audience: 'skills-api',
|
|
88
|
+
},
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
When `auth` is omitted it defaults to `'inherit'`, which means the Skills HTTP
|
|
93
|
+
surface adopts whatever authentication policy the parent server enforces
|
|
94
|
+
(typically the same `auth` block on `@FrontMcp(...)`). Use `'public'`
|
|
95
|
+
explicitly to opt out of authentication; use `'api-key'` or `'bearer'` to
|
|
96
|
+
override the inherited policy with a Skills-specific one. **In production,
|
|
97
|
+
set `auth` explicitly so the policy is visible at the call site.**
|
|
98
|
+
|
|
99
|
+
## Skills HTTP Caching
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
skillsConfig: {
|
|
103
|
+
enabled: true,
|
|
104
|
+
cache: {
|
|
105
|
+
enabled: true,
|
|
106
|
+
// memory cache (default): no redis option
|
|
107
|
+
// distributed cache: pass redis options
|
|
108
|
+
redis: { provider: 'redis', host: 'localhost', port: 6379 },
|
|
109
|
+
ttlMs: 60_000,
|
|
110
|
+
},
|
|
111
|
+
}
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Memory cache is the default; for multi-pod deployments use Redis or another supported provider.
|
|
115
|
+
|
|
116
|
+
## Audit Log
|
|
117
|
+
|
|
118
|
+
`skillsConfig.audit` enables a tamper-evident, hash-chained audit log of skill action executions (authority pass / authority fail / HTTP success / HTTP failure phases). Records are signed and chained so that any later mutation breaks verification.
|
|
119
|
+
|
|
120
|
+
| Field | Type | Default | Description |
|
|
121
|
+
| ---------------------- | ----------------------------- | --------- | --------------------------------------------------------------------------------------------------------- |
|
|
122
|
+
| `enabled` | `boolean` | `false` | Turn the audit writer on |
|
|
123
|
+
| `signer` | `SkillAuditSigner` | dev HS256 | The signer used to sign each record. **Use `Rs256AuditSigner` in production.** |
|
|
124
|
+
| `store` | `SkillAuditStore` | memory | Where records are persisted. Use `StorageAdapterAuditStore` for Redis/Vercel KV/SQLite-backed persistence |
|
|
125
|
+
| `subjectMode` | `'plain' \| 'hash' \| 'omit'` | `'hash'` | Redaction policy for the subject (e.g., user ID) embedded in each record |
|
|
126
|
+
| `headAnchorIntervalMs` | `number` | unset | Periodically anchor the chain head out-of-band so tail truncation is detectable (queued for v1.3.0 use) |
|
|
127
|
+
|
|
128
|
+
**Production constraint:** `Hs256AuditSigner` initialized with an in-memory `randomBytes` key refuses to fire when `NODE_ENV === 'production'`. The recommended production pattern is `Rs256AuditSigner` reusing the bundle-signing keypair.
|
|
129
|
+
|
|
130
|
+
**Multi-pod constraint (v1.2.0):** the audit chain is **single-writer**. Running multiple pods that share the same `SkillAuditStore` will produce a loud warning; CAS-based atomic chain-head updates are queued for v1.3.0. Until then, route audit writes to a single elected leader pod or to per-pod chains that you stitch offline.
|
|
131
|
+
|
|
132
|
+
See [`skill-audit-log`](../../frontmcp-extensibility/references/skill-audit-log.md) for the full architecture, threat model, custom signer / custom store recipes, and chain verification with `verifyChain(...)`.
|
|
133
|
+
|
|
134
|
+
## Decision Matrix
|
|
135
|
+
|
|
136
|
+
| Situation | Recommended setting |
|
|
137
|
+
| ----------------------------------------- | ----------------------------------------------------------------------------------------------------- |
|
|
138
|
+
| Local dev, no skills | `skillsConfig` unset |
|
|
139
|
+
| Public server, hand-curated server prompt | `instructions: '...'`, `injectInstructions: 'off'` |
|
|
140
|
+
| Server with many dynamic skills | `injectInstructions: 'append'` (default) or `'replace'` if you want skills to drive the entire prompt |
|
|
141
|
+
| Multi-pod production | `cache: { enabled: true, redis: {...} }`, `audit: { signer: Rs256, store: StorageAdapterAuditStore }` |
|
|
142
|
+
| Compliance / forensic requirements | RS256 signer + persistent store + scheduled `verifyChain(...)` in CI |
|
|
143
|
+
|
|
144
|
+
## Examples
|
|
145
|
+
|
|
146
|
+
| Example | Level | Description |
|
|
147
|
+
| --------------------------------------------------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------- |
|
|
148
|
+
| [`inject-instructions`](../examples/configure-skills-http/inject-instructions.md) | Basic | Set a server-level instructions string and append the skill catalog summary on every initialize response. |
|
|
149
|
+
| [`audit-log-basic`](../examples/configure-skills-http/audit-log-basic.md) | Basic | Enable the skill audit log with the in-memory store and HS256 signer for development and tests. |
|
|
150
|
+
| [`audit-log-redis`](../examples/configure-skills-http/audit-log-redis.md) | Advanced | Production-grade audit log with the Redis-backed StorageAdapterAuditStore and the RS256 bundle-signing key. |
|
|
151
|
+
|
|
152
|
+
> See all examples in [`examples/configure-skills-http/`](../examples/configure-skills-http/)
|
|
153
|
+
|
|
154
|
+
## Reference
|
|
155
|
+
|
|
156
|
+
- [Skills HTTP](https://docs.agentfront.dev/frontmcp/features/skill-based-workflows)
|
|
157
|
+
- Related skills: `decorators-guide`, `skill-audit-log`, `vendor-integrations`
|
|
@@ -175,7 +175,7 @@ frontmcp dev
|
|
|
175
175
|
|
|
176
176
|
# Test rate limiting (send 101 requests rapidly)
|
|
177
177
|
for i in $(seq 1 101); do
|
|
178
|
-
curl -s -o /dev/null -w "%{http_code}\n" -X POST http://localhost:
|
|
178
|
+
curl -s -o /dev/null -w "%{http_code}\n" -X POST http://localhost:3000/ \
|
|
179
179
|
-H 'Content-Type: application/json' \
|
|
180
180
|
-d '{"jsonrpc":"2.0","method":"tools/list","id":1}'
|
|
181
181
|
done
|
|
@@ -140,10 +140,10 @@ transport: {
|
|
|
140
140
|
frontmcp dev
|
|
141
141
|
|
|
142
142
|
# Test SSE endpoint
|
|
143
|
-
curl -N http://localhost:
|
|
143
|
+
curl -N http://localhost:3000/sse
|
|
144
144
|
|
|
145
145
|
# Test streamable HTTP
|
|
146
|
-
curl -X POST http://localhost:
|
|
146
|
+
curl -X POST http://localhost:3000/ -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","method":"tools/list","id":1}'
|
|
147
147
|
```
|
|
148
148
|
|
|
149
149
|
## Common Patterns
|
|
@@ -98,20 +98,22 @@ Beyond `frontmcp build`, the CLI provides commands for the full deployment lifec
|
|
|
98
98
|
| Lambda | Streamable HTTP (stateless) | DynamoDB, ElastiCache | ~500ms | No | AWS ecosystem, event-driven |
|
|
99
99
|
| Cloudflare | Streamable HTTP (stateless) | KV, Durable Objects | ~5ms | Limited | Edge-first, global latency |
|
|
100
100
|
| CLI | stdio | SQLite, memory | None | Yes | Desktop tools, local agents |
|
|
101
|
-
| Browser | In-
|
|
101
|
+
| Browser | In-process direct client | memory | None | Yes | Client-side AI, demos |
|
|
102
102
|
| SDK | Programmatic | Configurable | None | Yes | Embedding in existing apps |
|
|
103
103
|
|
|
104
|
-
> **Note on storage:**
|
|
104
|
+
> **Note on storage:** Only `redis` and `vercel-kv` are SDK-native providers. DynamoDB, Cloudflare KV, D1, and Durable Objects are platform-side — wire them in your tools using the platform SDK / Workers bindings. The Cloudflare build adapter actively rejects `redis: { ... }` and `sqlite: { ... }` configs at build time because Workers has no Node TCP / fs.
|
|
105
|
+
>
|
|
106
|
+
> **Note on browser:** "In-process direct client" means an in-memory `DirectClient` created via `connect()`/`create()` from `@frontmcp/sdk`. There is no separate "in-memory transport" — the client and server share the same JS heap.
|
|
105
107
|
|
|
106
108
|
## Cross-Cutting Patterns
|
|
107
109
|
|
|
108
|
-
| Pattern | Rule
|
|
109
|
-
| --------------------- |
|
|
110
|
-
| Transport selection | Stateful servers (Node, CLI) can use stdio or SSE; serverless must use Streamable HTTP (stateless)
|
|
111
|
-
| Storage mapping |
|
|
112
|
-
| Environment variables | Never hardcode secrets; use `.env` locally, platform secrets in production
|
|
113
|
-
| Build command | All targets: `frontmcp build --target <target>` produces optimized output
|
|
114
|
-
| Entry point | All targets require `export default` of the `@FrontMcp` class from `main.ts`
|
|
110
|
+
| Pattern | Rule |
|
|
111
|
+
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
112
|
+
| Transport selection | Stateful servers (Node, CLI) can use stdio or SSE; serverless must use Streamable HTTP (stateless) |
|
|
113
|
+
| Storage mapping | SDK-native: `redis` (Node, Lambda+ElastiCache, CLI), `vercel-kv` (Vercel, can also work on Cloudflare via Upstash HTTP). Platform-side (you wire it in tools): DynamoDB, Cloudflare KV/D1/DO. Cloudflare build rejects `redis`/`sqlite` configs. |
|
|
114
|
+
| Environment variables | Never hardcode secrets; use `.env` locally, platform secrets in production |
|
|
115
|
+
| Build command | All targets: `frontmcp build --target <target>` produces optimized output |
|
|
116
|
+
| Entry point | All targets require `export default` of the `@FrontMcp` class from `main.ts` |
|
|
115
117
|
|
|
116
118
|
## Common Patterns
|
|
117
119
|
|
|
@@ -147,6 +149,107 @@ Beyond `frontmcp build`, the CLI provides commands for the full deployment lifec
|
|
|
147
149
|
| CORS errors on browser/web clients | HTTP CORS not configured | Add CORS config via `configure-http` skill |
|
|
148
150
|
| Build fails with missing module | Node-only module in browser/edge build | Use conditional imports or `@frontmcp/utils` cross-platform utilities |
|
|
149
151
|
|
|
152
|
+
## Examples
|
|
153
|
+
|
|
154
|
+
Each reference has matching examples under [`examples/<reference>/`](./examples/):
|
|
155
|
+
|
|
156
|
+
### `build-for-browser`
|
|
157
|
+
|
|
158
|
+
| Example | Level | Description |
|
|
159
|
+
| ---------------------------------------------------------------------------------------------------- | ------------ | ----------------------------------------------------------------------------------------------------- |
|
|
160
|
+
| [`browser-build-with-custom-entry`](./examples/build-for-browser/browser-build-with-custom-entry.md) | Intermediate | Build a browser bundle using a dedicated client entry file that avoids Node.js-only imports. |
|
|
161
|
+
| [`browser-crypto-and-storage`](./examples/build-for-browser/browser-crypto-and-storage.md) | Advanced | Use `@frontmcp/utils` crypto functions (WebCrypto API) and in-memory storage in browser environments. |
|
|
162
|
+
| [`react-provider-setup`](./examples/build-for-browser/react-provider-setup.md) | Basic | Connect a React application to a remote FrontMCP server using `@frontmcp/react`. |
|
|
163
|
+
|
|
164
|
+
### `build-for-cli`
|
|
165
|
+
|
|
166
|
+
| Example | Level | Description |
|
|
167
|
+
| ---------------------------------------------------------------------- | ------------ | ------------------------------------------------------------------------------------------------------------ |
|
|
168
|
+
| [`cli-binary-build`](./examples/build-for-cli/cli-binary-build.md) | Basic | Build a FrontMCP server as a standalone binary using Node.js Single Executable Applications (SEA). |
|
|
169
|
+
| [`unix-socket-daemon`](./examples/build-for-cli/unix-socket-daemon.md) | Intermediate | Run a FrontMCP server as a local daemon accessible via Unix socket for IDE extensions and local MCP clients. |
|
|
170
|
+
|
|
171
|
+
### `build-for-mcpb`
|
|
172
|
+
|
|
173
|
+
| Example | Level | Description |
|
|
174
|
+
| --------------------------------------------------------------------- | ----- | ---------------------------------------------------------------------------------------------- |
|
|
175
|
+
| [`mcpb-bundle-build`](./examples/build-for-mcpb/mcpb-bundle-build.md) | Basic | Produce a .mcpb archive for Claude Desktop with metadata, tools, and install-time user_config. |
|
|
176
|
+
|
|
177
|
+
### `build-for-sdk`
|
|
178
|
+
|
|
179
|
+
| Example | Level | Description |
|
|
180
|
+
| ------------------------------------------------------------------------------ | ------------ | ---------------------------------------------------------------------------------------------------------- |
|
|
181
|
+
| [`connect-openai`](./examples/build-for-sdk/connect-openai.md) | Intermediate | Use `connectOpenAI()` to get tools formatted for OpenAI's function-calling API. |
|
|
182
|
+
| [`create-flat-config`](./examples/build-for-sdk/create-flat-config.md) | Basic | Spin up an in-memory FrontMCP server from a flat config object using `create()`. |
|
|
183
|
+
| [`multi-platform-connect`](./examples/build-for-sdk/multi-platform-connect.md) | Advanced | Connect the same FrontMCP server to multiple LLM platforms using platform-specific `connect*()` functions. |
|
|
184
|
+
|
|
185
|
+
### `deploy-to-cloudflare`
|
|
186
|
+
|
|
187
|
+
| Example | Level | Description |
|
|
188
|
+
| ------------------------------------------------------------------------------------- | ------------ | ------------------------------------------------------------------------------------------------------- |
|
|
189
|
+
| [`basic-worker-deploy`](./examples/deploy-to-cloudflare/basic-worker-deploy.md) | Basic | Deploy a FrontMCP server to Cloudflare Workers with a minimal configuration. |
|
|
190
|
+
| [`worker-custom-domain`](./examples/deploy-to-cloudflare/worker-custom-domain.md) | Advanced | Scaffold a FrontMCP project targeting Cloudflare, configure a custom domain, and verify the deployment. |
|
|
191
|
+
| [`worker-with-kv-storage`](./examples/deploy-to-cloudflare/worker-with-kv-storage.md) | Intermediate | Deploy a FrontMCP server to Cloudflare Workers with KV namespace for session and state storage. |
|
|
192
|
+
|
|
193
|
+
### `deploy-to-lambda`
|
|
194
|
+
|
|
195
|
+
| Example | Level | Description |
|
|
196
|
+
| ------------------------------------------------------------------------------------- | ------------ | ----------------------------------------------------------------------------------------------------- |
|
|
197
|
+
| [`cdk-deployment`](./examples/deploy-to-lambda/cdk-deployment.md) | Advanced | Deploy a FrontMCP server to AWS Lambda using CDK with provisioned concurrency and secrets management. |
|
|
198
|
+
| [`lambda-handler-with-cors`](./examples/deploy-to-lambda/lambda-handler-with-cors.md) | Intermediate | Create a custom Lambda handler with an explicit API Gateway definition for CORS support. |
|
|
199
|
+
| [`sam-template-basic`](./examples/deploy-to-lambda/sam-template-basic.md) | Basic | Deploy a FrontMCP server to AWS Lambda with API Gateway using a SAM template. |
|
|
200
|
+
|
|
201
|
+
### `deploy-to-node-dockerfile`
|
|
202
|
+
|
|
203
|
+
| Example | Level | Description |
|
|
204
|
+
| ---------------------------------------------------------------------------------------------------- | -------- | ------------------------------------------------------------------------------------------ |
|
|
205
|
+
| [`basic-multistage-dockerfile`](./examples/deploy-to-node-dockerfile/basic-multistage-dockerfile.md) | Basic | A minimal multi-stage Dockerfile for building and running a FrontMCP server in production. |
|
|
206
|
+
| [`secure-nonroot-dockerfile`](./examples/deploy-to-node-dockerfile/secure-nonroot-dockerfile.md) | Advanced | A production Dockerfile with a non-root user, proper ownership, and security hardening. |
|
|
207
|
+
|
|
208
|
+
### `deploy-to-node`
|
|
209
|
+
|
|
210
|
+
| Example | Level | Description |
|
|
211
|
+
| ------------------------------------------------------------------------------------- | ------------ | --------------------------------------------------------------------------------------------------------- |
|
|
212
|
+
| [`docker-compose-with-redis`](./examples/deploy-to-node/docker-compose-with-redis.md) | Basic | Deploy a FrontMCP server with Redis using Docker Compose for production. |
|
|
213
|
+
| [`pm2-with-nginx`](./examples/deploy-to-node/pm2-with-nginx.md) | Intermediate | Deploy a FrontMCP server on bare metal using PM2 for process management and NGINX for TLS termination. |
|
|
214
|
+
| [`resource-limits`](./examples/deploy-to-node/resource-limits.md) | Advanced | Configure resource limits, health checks, and environment variables for a production FrontMCP deployment. |
|
|
215
|
+
|
|
216
|
+
### `deploy-to-vercel-config`
|
|
217
|
+
|
|
218
|
+
| Example | Level | Description |
|
|
219
|
+
| ------------------------------------------------------------------------------------------------------------------ | ------------ | -------------------------------------------------------------------------------------------------- |
|
|
220
|
+
| [`minimal-vercel-config`](./examples/deploy-to-vercel-config/minimal-vercel-config.md) | Basic | The minimum `vercel.json` needed to deploy a FrontMCP server to Vercel. |
|
|
221
|
+
| [`vercel-config-with-security-headers`](./examples/deploy-to-vercel-config/vercel-config-with-security-headers.md) | Intermediate | A complete `vercel.json` with per-route security headers for health, MCP, and all other endpoints. |
|
|
222
|
+
|
|
223
|
+
### `deploy-to-vercel`
|
|
224
|
+
|
|
225
|
+
| Example | Level | Description |
|
|
226
|
+
| ------------------------------------------------------------------------------------- | ------------ | ----------------------------------------------------------------------------------------------- |
|
|
227
|
+
| [`vercel-mcp-endpoint-test`](./examples/deploy-to-vercel/vercel-mcp-endpoint-test.md) | Advanced | Verify a Vercel-deployed FrontMCP server by testing health, tool listing, and tool invocation. |
|
|
228
|
+
| [`vercel-with-kv`](./examples/deploy-to-vercel/vercel-with-kv.md) | Basic | Deploy a FrontMCP server to Vercel serverless functions with Vercel KV for session persistence. |
|
|
229
|
+
| [`vercel-with-skills-cache`](./examples/deploy-to-vercel/vercel-with-skills-cache.md) | Intermediate | Deploy a FrontMCP server to Vercel with skills enabled and KV-backed skill caching. |
|
|
230
|
+
|
|
231
|
+
### `mcp-client-integration`
|
|
232
|
+
|
|
233
|
+
| Example | Level | Description |
|
|
234
|
+
| ------------------------------------------------------------------------------------- | ------------ | ------------------------------------------------------------------------------------------------------------ |
|
|
235
|
+
| [`stdio-npx`](./examples/mcp-client-integration/stdio-npx.md) | Basic | Publish a FrontMCP server to npm and configure MCP clients to use it with npx --stdio. |
|
|
236
|
+
| [`http-remote`](./examples/mcp-client-integration/http-remote.md) | Basic | Connect an MCP client to a FrontMCP server running as an HTTP server, locally or remotely. |
|
|
237
|
+
| [`stdio-binary-with-env`](./examples/mcp-client-integration/stdio-binary-with-env.md) | Intermediate | Configure a local FrontMCP CLI binary with environment variables and custom arguments in MCP client configs. |
|
|
238
|
+
|
|
239
|
+
## Accessing This Skill
|
|
240
|
+
|
|
241
|
+
Skills are distributed as plain SKILL.md files plus a sibling `references/`
|
|
242
|
+
and `examples/` tree, so consumers can pick whichever access mode fits:
|
|
243
|
+
|
|
244
|
+
| Mode | How it works |
|
|
245
|
+
| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
246
|
+
| **Filesystem** | Read `libs/skills/catalog/frontmcp-deployment/` directly from a clone of the catalog repo, or from a published `@frontmcp/skills` install. SKILL.md is the entry point. |
|
|
247
|
+
| **`frontmcp` CLI** | `frontmcp skills list`, `frontmcp skills read frontmcp-deployment`, `frontmcp skills read frontmcp-deployment:references/<file>.md`, `frontmcp skills install frontmcp-deployment` — no server required. |
|
|
248
|
+
| **MCP `skill://`** | When a developer mounts this skill into their own FrontMCP server (`@FrontMcp({ skills: [...] })`), the SDK exposes it via SEP-2640 resources: `skill://frontmcp-deployment/SKILL.md`, `skill://frontmcp-deployment/references/{file}.md`, etc. The server’s `skill://index.json` returns the SEP-2640 discovery document for everything mounted on it. |
|
|
249
|
+
|
|
250
|
+
The catalog itself is **not** an MCP server. The `skill://` URIs only resolve
|
|
251
|
+
when a server has been configured to host this skill.
|
|
252
|
+
|
|
150
253
|
## Reference
|
|
151
254
|
|
|
152
255
|
- [Runtime Modes](https://docs.agentfront.dev/frontmcp/deployment/runtime-modes)
|