@frontmcp/skills 0.0.1 → 1.0.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/catalog/TEMPLATE.md +58 -13
- package/catalog/frontmcp-config/SKILL.md +143 -0
- package/catalog/frontmcp-config/references/configure-auth.md +238 -0
- package/catalog/frontmcp-config/references/configure-elicitation.md +178 -0
- package/catalog/frontmcp-config/references/configure-http.md +205 -0
- package/catalog/frontmcp-config/references/configure-session.md +205 -0
- package/catalog/frontmcp-config/references/configure-throttle.md +229 -0
- package/catalog/frontmcp-config/references/configure-transport.md +195 -0
- package/catalog/frontmcp-config/references/setup-redis.md +4 -0
- package/catalog/frontmcp-config/references/setup-sqlite.md +4 -0
- package/catalog/frontmcp-deployment/SKILL.md +127 -0
- package/catalog/frontmcp-deployment/references/build-for-browser.md +138 -0
- package/catalog/frontmcp-deployment/references/build-for-cli.md +138 -0
- package/catalog/{deployment/build-for-sdk/SKILL.md → frontmcp-deployment/references/build-for-sdk.md} +65 -24
- package/catalog/frontmcp-deployment/references/deploy-to-cloudflare.md +213 -0
- package/catalog/{deployment/deploy-to-lambda/SKILL.md → frontmcp-deployment/references/deploy-to-lambda.md} +76 -63
- package/catalog/{deployment/deploy-to-node/references/Dockerfile.example → frontmcp-deployment/references/deploy-to-node-dockerfile.md} +13 -4
- package/catalog/{deployment/deploy-to-node/SKILL.md → frontmcp-deployment/references/deploy-to-node.md} +68 -40
- package/catalog/frontmcp-deployment/references/deploy-to-vercel-config.md +60 -0
- package/catalog/frontmcp-deployment/references/deploy-to-vercel.md +224 -0
- package/catalog/frontmcp-development/SKILL.md +121 -0
- package/catalog/frontmcp-development/references/create-adapter.md +165 -0
- package/catalog/{development/create-agent/references/llm-config.md → frontmcp-development/references/create-agent-llm-config.md} +5 -5
- package/catalog/{development/create-agent/SKILL.md → frontmcp-development/references/create-agent.md} +82 -44
- package/catalog/{development/create-job/SKILL.md → frontmcp-development/references/create-job.md} +61 -19
- package/catalog/{plugins/create-plugin-hooks/SKILL.md → frontmcp-development/references/create-plugin-hooks.md} +63 -11
- package/catalog/{plugins/create-plugin/SKILL.md → frontmcp-development/references/create-plugin.md} +65 -60
- package/catalog/{development/create-prompt/SKILL.md → frontmcp-development/references/create-prompt.md} +62 -26
- package/catalog/{development/create-provider/SKILL.md → frontmcp-development/references/create-provider.md} +62 -27
- package/catalog/{development/create-resource/SKILL.md → frontmcp-development/references/create-resource.md} +62 -30
- package/catalog/{development/create-skill-with-tools/SKILL.md → frontmcp-development/references/create-skill-with-tools.md} +69 -24
- package/catalog/{development/create-skill/SKILL.md → frontmcp-development/references/create-skill.md} +96 -22
- package/catalog/{development/create-tool/SKILL.md → frontmcp-development/references/create-tool.md} +62 -26
- package/catalog/{development/create-workflow/SKILL.md → frontmcp-development/references/create-workflow.md} +60 -18
- package/catalog/{development/decorators-guide/SKILL.md → frontmcp-development/references/decorators-guide.md} +123 -34
- package/catalog/frontmcp-development/references/official-adapters.md +194 -0
- package/catalog/{plugins/official-plugins/SKILL.md → frontmcp-development/references/official-plugins.md} +96 -31
- package/catalog/frontmcp-guides/SKILL.md +420 -0
- package/catalog/frontmcp-guides/references/example-knowledge-base.md +636 -0
- package/catalog/frontmcp-guides/references/example-task-manager.md +512 -0
- package/catalog/frontmcp-guides/references/example-weather-api.md +292 -0
- package/catalog/frontmcp-production-readiness/SKILL.md +253 -0
- package/catalog/frontmcp-setup/SKILL.md +130 -0
- package/catalog/frontmcp-setup/references/frontmcp-skills-usage.md +265 -0
- package/catalog/{setup/multi-app-composition/SKILL.md → frontmcp-setup/references/multi-app-composition.md} +65 -23
- package/catalog/{setup/nx-workflow/SKILL.md → frontmcp-setup/references/nx-workflow.md} +78 -21
- package/catalog/frontmcp-setup/references/project-structure-nx.md +246 -0
- package/catalog/frontmcp-setup/references/project-structure-standalone.md +212 -0
- package/catalog/{setup/setup-project/SKILL.md → frontmcp-setup/references/setup-project.md} +62 -62
- package/catalog/{setup/setup-redis/SKILL.md → frontmcp-setup/references/setup-redis.md} +59 -86
- package/catalog/{setup/setup-sqlite/SKILL.md → frontmcp-setup/references/setup-sqlite.md} +64 -76
- package/catalog/frontmcp-testing/SKILL.md +127 -0
- package/catalog/{testing/setup-testing/SKILL.md → frontmcp-testing/references/setup-testing.md} +78 -67
- package/catalog/{testing/setup-testing → frontmcp-testing}/references/test-tool-unit.md +1 -0
- package/catalog/skills-manifest.json +39 -378
- package/package.json +2 -2
- package/src/loader.js +0 -1
- package/src/loader.js.map +1 -1
- package/src/manifest.d.ts +3 -3
- package/src/manifest.js +2 -3
- package/src/manifest.js.map +1 -1
- package/catalog/adapters/create-adapter/SKILL.md +0 -127
- package/catalog/adapters/official-adapters/SKILL.md +0 -136
- package/catalog/auth/configure-auth/SKILL.md +0 -250
- package/catalog/auth/configure-session/SKILL.md +0 -201
- package/catalog/config/configure-elicitation/SKILL.md +0 -136
- package/catalog/config/configure-http/SKILL.md +0 -167
- package/catalog/config/configure-throttle/SKILL.md +0 -189
- package/catalog/config/configure-transport/SKILL.md +0 -151
- package/catalog/deployment/build-for-browser/SKILL.md +0 -95
- package/catalog/deployment/build-for-cli/SKILL.md +0 -100
- package/catalog/deployment/deploy-to-cloudflare/SKILL.md +0 -192
- package/catalog/deployment/deploy-to-vercel/SKILL.md +0 -196
- package/catalog/deployment/deploy-to-vercel/references/vercel.json.example +0 -60
- package/catalog/setup/frontmcp-skills-usage/SKILL.md +0 -200
- package/catalog/setup/project-structure-nx/SKILL.md +0 -186
- package/catalog/setup/project-structure-standalone/SKILL.md +0 -153
- /package/catalog/{auth/configure-auth/references/auth-modes.md → frontmcp-config/references/configure-auth-modes.md} +0 -0
- /package/catalog/{config/configure-throttle/references/guard-config.md → frontmcp-config/references/configure-throttle-guard-config.md} +0 -0
- /package/catalog/{config/configure-transport/references/protocol-presets.md → frontmcp-config/references/configure-transport-protocol-presets.md} +0 -0
- /package/catalog/{development/create-tool/references/tool-annotations.md → frontmcp-development/references/create-tool-annotations.md} +0 -0
- /package/catalog/{development/create-tool/references/output-schema-types.md → frontmcp-development/references/create-tool-output-schema-types.md} +0 -0
- /package/catalog/{testing/setup-testing → frontmcp-testing}/references/test-auth.md +0 -0
- /package/catalog/{testing/setup-testing → frontmcp-testing}/references/test-browser-build.md +0 -0
- /package/catalog/{testing/setup-testing → frontmcp-testing}/references/test-cli-binary.md +0 -0
- /package/catalog/{testing/setup-testing → frontmcp-testing}/references/test-direct-client.md +0 -0
- /package/catalog/{testing/setup-testing → frontmcp-testing}/references/test-e2e-handler.md +0 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
# Official Adapters
|
|
2
|
+
|
|
3
|
+
Adapters convert external definitions (OpenAPI specs, Lambda functions, etc.) into MCP tools, resources, and prompts automatically.
|
|
4
|
+
|
|
5
|
+
## When to Use This Skill
|
|
6
|
+
|
|
7
|
+
### Must Use
|
|
8
|
+
|
|
9
|
+
- Converting an OpenAPI/Swagger specification into MCP tools automatically
|
|
10
|
+
- Integrating a REST API that provides a public OpenAPI spec (Petstore, GitHub, Jira, Slack)
|
|
11
|
+
- Setting up authentication (API key, bearer token, OAuth) for an adapter-generated API integration
|
|
12
|
+
|
|
13
|
+
### Recommended
|
|
14
|
+
|
|
15
|
+
- Registering multiple external APIs as namespaced tool sets in a single server
|
|
16
|
+
- Enabling spec polling to auto-refresh tool definitions when the upstream API changes
|
|
17
|
+
- Providing an inline OpenAPI spec for APIs without a hosted spec URL
|
|
18
|
+
|
|
19
|
+
### Skip When
|
|
20
|
+
|
|
21
|
+
- The external API has no OpenAPI spec and uses a custom protocol (see `create-adapter`)
|
|
22
|
+
- You need cross-cutting behavior like caching or logging (see `create-plugin` or `official-plugins`)
|
|
23
|
+
- You are building tools manually without an external spec (see `create-tool`)
|
|
24
|
+
|
|
25
|
+
> **Decision:** Use this skill when you have an OpenAPI/Swagger spec and want to automatically generate MCP tools from it using `OpenapiAdapter`.
|
|
26
|
+
|
|
27
|
+
## OpenAPI Adapter
|
|
28
|
+
|
|
29
|
+
The primary official adapter. Converts OpenAPI/Swagger specifications into MCP tools — one tool per operation.
|
|
30
|
+
|
|
31
|
+
### Installation
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
import { OpenapiAdapter } from '@frontmcp/adapters';
|
|
35
|
+
|
|
36
|
+
@App({
|
|
37
|
+
name: 'MyApp',
|
|
38
|
+
adapters: [
|
|
39
|
+
OpenapiAdapter.init({
|
|
40
|
+
name: 'petstore',
|
|
41
|
+
url: 'https://petstore3.swagger.io/api/v3/openapi.json',
|
|
42
|
+
}),
|
|
43
|
+
],
|
|
44
|
+
})
|
|
45
|
+
class MyApp {}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Each OpenAPI operation becomes an MCP tool named `petstore:operationId`.
|
|
49
|
+
|
|
50
|
+
### With Authentication
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
// API Key via static auth
|
|
54
|
+
OpenapiAdapter.init({
|
|
55
|
+
name: 'my-api',
|
|
56
|
+
url: 'https://api.example.com/openapi.json',
|
|
57
|
+
baseUrl: 'https://api.example.com',
|
|
58
|
+
staticAuth: {
|
|
59
|
+
apiKey: process.env.API_KEY!,
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// API Key via additional headers
|
|
64
|
+
OpenapiAdapter.init({
|
|
65
|
+
name: 'my-api',
|
|
66
|
+
url: 'https://api.example.com/openapi.json',
|
|
67
|
+
baseUrl: 'https://api.example.com',
|
|
68
|
+
additionalHeaders: {
|
|
69
|
+
'X-API-Key': process.env.API_KEY!,
|
|
70
|
+
},
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
// Bearer token via static auth
|
|
74
|
+
OpenapiAdapter.init({
|
|
75
|
+
name: 'my-api',
|
|
76
|
+
url: 'https://api.example.com/openapi.json',
|
|
77
|
+
baseUrl: 'https://api.example.com',
|
|
78
|
+
staticAuth: {
|
|
79
|
+
jwt: process.env.API_TOKEN!,
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
// Dynamic auth per tool using securityResolver
|
|
84
|
+
OpenapiAdapter.init({
|
|
85
|
+
name: 'my-api',
|
|
86
|
+
url: 'https://api.example.com/openapi.json',
|
|
87
|
+
baseUrl: 'https://api.example.com',
|
|
88
|
+
securityResolver: (tool, ctx) => {
|
|
89
|
+
return { jwt: ctx.authInfo?.token };
|
|
90
|
+
},
|
|
91
|
+
});
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Spec Polling
|
|
95
|
+
|
|
96
|
+
Automatically refresh the OpenAPI spec at intervals:
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
OpenapiAdapter.init({
|
|
100
|
+
name: 'evolving-api',
|
|
101
|
+
url: 'https://api.example.com/openapi.json',
|
|
102
|
+
polling: {
|
|
103
|
+
intervalMs: 300000, // Re-fetch every 5 minutes
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Inline Spec
|
|
109
|
+
|
|
110
|
+
Provide the OpenAPI spec directly instead of fetching from URL:
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
OpenapiAdapter.init({
|
|
114
|
+
name: 'my-api',
|
|
115
|
+
spec: {
|
|
116
|
+
openapi: '3.0.0',
|
|
117
|
+
info: { title: 'My API', version: '1.0.0' },
|
|
118
|
+
paths: { ... },
|
|
119
|
+
},
|
|
120
|
+
})
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### Multiple Adapters
|
|
124
|
+
|
|
125
|
+
Register adapters from different APIs in the same app:
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
@App({
|
|
129
|
+
name: 'IntegrationHub',
|
|
130
|
+
adapters: [
|
|
131
|
+
OpenapiAdapter.init({ name: 'github', url: 'https://api.github.com/openapi.json' }),
|
|
132
|
+
OpenapiAdapter.init({ name: 'jira', url: 'https://jira.example.com/openapi.json' }),
|
|
133
|
+
OpenapiAdapter.init({ name: 'slack', url: 'https://slack.com/openapi.json' }),
|
|
134
|
+
],
|
|
135
|
+
})
|
|
136
|
+
class IntegrationHub {}
|
|
137
|
+
// Tools: github:createIssue, jira:createTicket, slack:postMessage, etc.
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Adapter vs Plugin
|
|
141
|
+
|
|
142
|
+
| Aspect | Adapter | Plugin |
|
|
143
|
+
| ----------- | ------------------------------------ | ----------------------------------- |
|
|
144
|
+
| Purpose | Generate tools from external sources | Add cross-cutting behavior |
|
|
145
|
+
| Output | Tools, resources, prompts | Lifecycle hooks, context extensions |
|
|
146
|
+
| Examples | OpenAPI → MCP tools | Caching, auth, logging |
|
|
147
|
+
| When to use | Integrating APIs | Adding middleware |
|
|
148
|
+
|
|
149
|
+
## Common Patterns
|
|
150
|
+
|
|
151
|
+
| Pattern | Correct | Incorrect | Why |
|
|
152
|
+
| -------------------- | ---------------------------------------------------------------------------- | --------------------------------------------------- | -------------------------------------------------------------------------------- |
|
|
153
|
+
| Adapter registration | `OpenapiAdapter.init({ name: 'petstore', url: '...' })` in `adapters` array | Placing adapter in `plugins` array | Adapters go in `adapters`, not `plugins`; they serve different purposes |
|
|
154
|
+
| Tool naming | Tools auto-named as `petstore:operationId` using adapter `name` as namespace | Expecting flat names like `listPets` | Adapter name is prepended to prevent collisions across multiple adapters |
|
|
155
|
+
| Auth configuration | `staticAuth: { jwt: process.env.API_TOKEN! }` or `additionalHeaders` | Hardcoding secrets: `staticAuth: { jwt: 'sk-xxx' }` | Always use environment variables for secrets; never commit tokens |
|
|
156
|
+
| Spec source | Use `url` for hosted specs or `spec` for inline definitions | Using both `url` and `spec` simultaneously | Only one source should be provided; `spec` takes precedence and `url` is ignored |
|
|
157
|
+
| Multiple APIs | Register separate `OpenapiAdapter.init()` calls with unique `name` values | Using the same `name` for different adapters | Duplicate names cause tool naming collisions |
|
|
158
|
+
|
|
159
|
+
## Verification Checklist
|
|
160
|
+
|
|
161
|
+
### Configuration
|
|
162
|
+
|
|
163
|
+
- [ ] `@frontmcp/adapters` package is installed
|
|
164
|
+
- [ ] `OpenapiAdapter.init()` is in the `adapters` array of `@App`
|
|
165
|
+
- [ ] Adapter has a unique `name` for tool namespacing
|
|
166
|
+
- [ ] `url` points to a valid, reachable OpenAPI JSON/YAML endpoint (or `spec` is inline)
|
|
167
|
+
|
|
168
|
+
### Runtime
|
|
169
|
+
|
|
170
|
+
- [ ] Generated tools appear in `tools/list` with `<name>:<operationId>` naming
|
|
171
|
+
- [ ] Auth headers are sent correctly on API calls
|
|
172
|
+
- [ ] Spec polling refreshes tool definitions at the configured interval
|
|
173
|
+
- [ ] Invalid spec URL produces a clear startup error
|
|
174
|
+
|
|
175
|
+
### Production
|
|
176
|
+
|
|
177
|
+
- [ ] API tokens and secrets are loaded from environment variables
|
|
178
|
+
- [ ] Polling interval is appropriate for the API's update frequency
|
|
179
|
+
- [ ] Multiple adapter registrations use distinct names
|
|
180
|
+
|
|
181
|
+
## Troubleshooting
|
|
182
|
+
|
|
183
|
+
| Problem | Cause | Solution |
|
|
184
|
+
| ---------------------------------- | ------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
185
|
+
| No tools generated from spec | Spec URL returns non-OpenAPI content or is unreachable | Verify URL returns valid OpenAPI 3.x JSON; check network access |
|
|
186
|
+
| Authentication errors on API calls | Wrong auth config or missing credentials | Configure `staticAuth` for fixed credentials, `securityResolver`/`authProviderMapper` for dynamic auth, or `additionalHeaders` for header-based tokens; verify env vars are set |
|
|
187
|
+
| Duplicate tool name error | Two adapters registered with the same `name` | Give each adapter a unique `name` (e.g., `'github'`, `'jira'`) |
|
|
188
|
+
| Stale tools after API update | Spec polling not configured | Add `polling: { intervalMs: 300000 }` to refresh every 5 minutes |
|
|
189
|
+
| TypeScript error importing adapter | Wrong import path | Import from `@frontmcp/adapters`: `import { OpenapiAdapter } from '@frontmcp/adapters'` |
|
|
190
|
+
|
|
191
|
+
## Reference
|
|
192
|
+
|
|
193
|
+
- [Adapter Overview Documentation](https://docs.agentfront.dev/frontmcp/adapters/overview)
|
|
194
|
+
- Related skills: `create-adapter`, `create-plugin`, `create-tool`
|
|
@@ -1,17 +1,30 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: official-plugins
|
|
3
|
-
description: Install and configure official FrontMCP plugins including CodeCall, Remember, Approval, Cache, Feature Flags, and Dashboard. Use when adding caching, memory, tool approval, feature gating, or CodeCall orchestration.
|
|
4
|
-
tags: [plugins, codecall, remember, approval, cache, feature-flags, dashboard]
|
|
5
|
-
priority: 9
|
|
6
|
-
visibility: both
|
|
7
|
-
license: Apache-2.0
|
|
8
|
-
metadata:
|
|
9
|
-
docs: https://docs.agentfront.dev/frontmcp/plugins/overview
|
|
10
|
-
---
|
|
11
|
-
|
|
12
1
|
# Official FrontMCP Plugins
|
|
13
2
|
|
|
14
|
-
FrontMCP ships 6 official plugins that extend server behavior with cross-cutting concerns: semantic tool discovery, session memory, authorization workflows, result caching, feature gating, and visual monitoring. Install individually or via `@frontmcp/plugins` (meta-package re-exporting cache, codecall,
|
|
3
|
+
FrontMCP ships 6 official plugins that extend server behavior with cross-cutting concerns: semantic tool discovery, session memory, authorization workflows, result caching, feature gating, and visual monitoring. Install individually or via `@frontmcp/plugins` (meta-package re-exporting cache, codecall, and remember).
|
|
4
|
+
|
|
5
|
+
> **Note:** The Dashboard plugin (`@frontmcp/plugin-dashboard`) is currently in **beta** and may not work correctly in all environments. It is not recommended for production use at this time.
|
|
6
|
+
|
|
7
|
+
## When to Use This Skill
|
|
8
|
+
|
|
9
|
+
### Must Use
|
|
10
|
+
|
|
11
|
+
- Installing and configuring any official FrontMCP plugin (CodeCall, Remember, Approval, Cache, Feature Flags)
|
|
12
|
+
- Adding session memory, tool caching, or authorization workflows to an existing server
|
|
13
|
+
- Integrating feature flag services (LaunchDarkly, Split.io, Unleash) to gate tools at runtime
|
|
14
|
+
|
|
15
|
+
### Recommended
|
|
16
|
+
|
|
17
|
+
- Exploring the Dashboard plugin for visual monitoring (beta — not recommended for production)
|
|
18
|
+
- Configuring CodeCall for semantic tool discovery when the server has many tools
|
|
19
|
+
- Combining multiple official plugins in a production deployment
|
|
20
|
+
|
|
21
|
+
### Skip When
|
|
22
|
+
|
|
23
|
+
- You need to build a custom plugin with your own providers and context extensions (see `create-plugin`)
|
|
24
|
+
- You only need lifecycle hooks without installing an official plugin (see `create-plugin-hooks`)
|
|
25
|
+
- You need to generate tools from an OpenAPI spec (see `official-adapters`)
|
|
26
|
+
|
|
27
|
+
> **Decision:** Use this skill when you need to install, configure, or customize one or more of the 5 stable official FrontMCP plugins. The Dashboard plugin is in beta — see its section below for details.
|
|
15
28
|
|
|
16
29
|
All plugins follow the `DynamicPlugin` pattern and are registered via `@FrontMcp({ plugins: [...] })`.
|
|
17
30
|
|
|
@@ -22,9 +35,9 @@ import RememberPlugin from '@frontmcp/plugin-remember';
|
|
|
22
35
|
import { ApprovalPlugin } from '@frontmcp/plugin-approval';
|
|
23
36
|
import CachePlugin from '@frontmcp/plugin-cache';
|
|
24
37
|
import FeatureFlagPlugin from '@frontmcp/plugin-feature-flags';
|
|
25
|
-
import DashboardPlugin from '@frontmcp/plugin-dashboard';
|
|
38
|
+
// import DashboardPlugin from '@frontmcp/plugin-dashboard'; // Beta — not recommended for production
|
|
26
39
|
|
|
27
|
-
@App()
|
|
40
|
+
@App({ name: 'MyApp' })
|
|
28
41
|
class MyApp {}
|
|
29
42
|
|
|
30
43
|
@FrontMcp({
|
|
@@ -36,7 +49,7 @@ class MyApp {}
|
|
|
36
49
|
ApprovalPlugin.init({ mode: 'recheck' }),
|
|
37
50
|
CachePlugin.init({ type: 'memory', defaultTTL: 86400 }),
|
|
38
51
|
FeatureFlagPlugin.init({ adapter: 'static', flags: { 'new-tool': true } }),
|
|
39
|
-
DashboardPlugin.init({ enabled: true }),
|
|
52
|
+
// DashboardPlugin.init({ enabled: true }), // Beta — see Dashboard section below
|
|
40
53
|
],
|
|
41
54
|
tools: [
|
|
42
55
|
/* your tools */
|
|
@@ -79,10 +92,25 @@ class MyServer {}
|
|
|
79
92
|
|
|
80
93
|
### Modes
|
|
81
94
|
|
|
82
|
-
- `codecall_only` -- Hides all tools from `list_tools` except CodeCall meta-tools. All other tools are discovered only via `codecall:search`. Best when the server has a large number of tools and you want the AI to search-then-execute.
|
|
95
|
+
- `codecall_only` -- Hides all tools from `list_tools` except CodeCall meta-tools. All other tools are discovered only via `codecall:search`. Best when the server has a large number of tools and you want the AI to search-then-execute. When `appIds` is set, only tools from those apps are hidden — tools from other apps remain visible.
|
|
83
96
|
- `codecall_opt_in` -- Shows all tools in `list_tools` normally. Tools opt-in to CodeCall execution via metadata. Useful when only some tools benefit from orchestrated execution.
|
|
84
97
|
- `metadata_driven` -- Per-tool `metadata.codecall` controls visibility and CodeCall availability independently. Most granular control.
|
|
85
98
|
|
|
99
|
+
### Multi-App Scoping
|
|
100
|
+
|
|
101
|
+
Use `appIds` to scope CodeCall to specific apps in a multi-app server:
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
// Only hide ecommerce tools — calc tools remain visible in list_tools
|
|
105
|
+
CodeCallPlugin.init({
|
|
106
|
+
mode: 'codecall_only',
|
|
107
|
+
appIds: ['ecommerce'],
|
|
108
|
+
vm: { preset: 'secure' },
|
|
109
|
+
});
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Without `appIds`, `codecall_only` mode hides ALL tools in the server. With `appIds`, only tools from the specified apps are hidden — tools from other apps remain directly callable.
|
|
113
|
+
|
|
86
114
|
### VM Presets
|
|
87
115
|
|
|
88
116
|
The sandboxed VM runs AgentScript (a restricted JavaScript subset). Presets control security boundaries:
|
|
@@ -96,9 +124,9 @@ The sandboxed VM runs AgentScript (a restricted JavaScript subset). Presets cont
|
|
|
96
124
|
|
|
97
125
|
CodeCall contributes 4 tools to your server:
|
|
98
126
|
|
|
99
|
-
- `codecall:search` -- Semantic search over all registered tools using TF-IDF scoring with synonym expansion. Returns ranked tool names, descriptions, and relevance scores.
|
|
100
|
-
- `codecall:describe` -- Returns full input/output JSON schemas for one or more tools. Use after search to understand tool interfaces before execution.
|
|
101
|
-
- `codecall:execute` -- Runs an AgentScript program in the sandboxed VM. The script can call multiple tools, branch on results, and compose outputs.
|
|
127
|
+
- `codecall:search` -- Semantic search over all registered tools using TF-IDF scoring with synonym expansion. Input: `{ queries: string[] }` (array of atomic action phrases, max 10). Decompose complex requests into simple actions (e.g., "delete users and send email" becomes `queries: ["delete user", "send email"]`). Returns ranked tool names, descriptions, and relevance scores.
|
|
128
|
+
- `codecall:describe` -- Returns full input/output JSON schemas for one or more tools. Input: `{ toolNames: string[] }` (tool names from search results). Use after search to understand tool interfaces before execution. If `notFound` array is non-empty in the response, re-search with corrected queries.
|
|
129
|
+
- `codecall:execute` -- Runs an AgentScript program in the sandboxed VM. Input: `{ script: string }` (AgentScript code). Use `callTool(name, args)` to invoke tools within scripts. The script can call multiple tools, branch on results, and compose outputs.
|
|
102
130
|
- `codecall:invoke` -- Direct single-tool invocation (available when `directCalls` is enabled). Bypasses the VM for simple one-shot calls.
|
|
103
131
|
|
|
104
132
|
### Per-Tool CodeCall Metadata
|
|
@@ -430,7 +458,7 @@ A tool is cached if it matches any pattern OR has `cache: true` (or a cache obje
|
|
|
430
458
|
|
|
431
459
|
Send the bypass header to skip caching for a specific request:
|
|
432
460
|
|
|
433
|
-
```
|
|
461
|
+
```text
|
|
434
462
|
x-frontmcp-disable-cache: true
|
|
435
463
|
```
|
|
436
464
|
|
|
@@ -569,7 +597,9 @@ The plugin hooks into listing and execution flows for tools, resources, prompts,
|
|
|
569
597
|
|
|
570
598
|
---
|
|
571
599
|
|
|
572
|
-
## 6. Dashboard Plugin (`@frontmcp/plugin-dashboard`)
|
|
600
|
+
## 6. Dashboard Plugin (`@frontmcp/plugin-dashboard`) — BETA
|
|
601
|
+
|
|
602
|
+
> **Warning:** The Dashboard plugin is currently in **beta** and may not work correctly. It is not recommended for production use. Expect breaking changes and missing features.
|
|
573
603
|
|
|
574
604
|
Visual monitoring web UI for your FrontMCP server. View server structure (tools, resources, prompts, apps, plugins) as an interactive graph.
|
|
575
605
|
|
|
@@ -645,7 +675,7 @@ All official plugins use the static `init()` pattern inherited from `DynamicPlug
|
|
|
645
675
|
ApprovalPlugin.init({ mode: 'recheck' }),
|
|
646
676
|
CachePlugin.init({ type: 'redis', config: { host: 'redis.internal' }, defaultTTL: 86400 }),
|
|
647
677
|
FeatureFlagPlugin.init({ adapter: 'launchdarkly', config: { sdkKey: 'sdk-xxx' } }),
|
|
648
|
-
DashboardPlugin.init({ enabled: true, auth: {
|
|
678
|
+
// DashboardPlugin.init({ enabled: true, auth: { ... } }), // Beta — not recommended for production
|
|
649
679
|
],
|
|
650
680
|
tools: [
|
|
651
681
|
/* ... */
|
|
@@ -654,14 +684,49 @@ All official plugins use the static `init()` pattern inherited from `DynamicPlug
|
|
|
654
684
|
class ProductionServer {}
|
|
655
685
|
```
|
|
656
686
|
|
|
687
|
+
## Common Patterns
|
|
688
|
+
|
|
689
|
+
| Pattern | Correct | Incorrect | Why |
|
|
690
|
+
| ------------------------ | ------------------------------------------------------------------ | ------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
|
|
691
|
+
| Plugin registration | `plugins: [RememberPlugin.init({ type: 'memory' })]` | `plugins: [new RememberPlugin({ type: 'memory' })]` | Official plugins use `DynamicPlugin.init()` static method; direct instantiation bypasses provider wiring |
|
|
692
|
+
| Remember storage in prod | `RememberPlugin.init({ type: 'redis', config: { host: '...' } })` | `RememberPlugin.init({ type: 'memory' })` in production | Memory storage loses data on restart; use Redis or Vercel KV for persistence |
|
|
693
|
+
| Cache TTL units | `defaultTTL: 3600` (seconds) | `defaultTTL: 3600000` (milliseconds) | Cache TTL is in seconds, not milliseconds; 3600000 = 41 days |
|
|
694
|
+
| Feature flag gating | `@Tool({ featureFlag: 'my-flag' })` on the tool decorator | Checking `this.featureFlags.isEnabled()` inside `execute()` and returning early | Decorator-level gating hides the tool from `list_tools`; manual check still exposes it |
|
|
695
|
+
| Dashboard (beta) | Avoid in production — plugin is in beta and may not work correctly | `DashboardPlugin.init({})` in production | Dashboard plugin is unstable; use only for local development experimentation |
|
|
696
|
+
|
|
697
|
+
## Verification Checklist
|
|
698
|
+
|
|
699
|
+
### Installation
|
|
700
|
+
|
|
701
|
+
- [ ] Plugin package is installed (`@frontmcp/plugin-codecall`, `@frontmcp/plugin-remember`, etc.)
|
|
702
|
+
- [ ] Plugin is registered via `.init()` in the `plugins` array of `@FrontMcp`
|
|
703
|
+
- [ ] Required configuration options are provided (storage type, API keys, endpoints)
|
|
704
|
+
|
|
705
|
+
### Runtime
|
|
706
|
+
|
|
707
|
+
- [ ] `this.remember` / `this.approval` / `this.featureFlags` resolves in tool context
|
|
708
|
+
- [ ] Cache plugin returns cached results on repeated identical calls
|
|
709
|
+
- [ ] Feature-flagged tools are hidden from `list_tools` when flag is off
|
|
710
|
+
- [ ] Dashboard is accessible at configured `basePath` (default: `/dashboard`) — beta, may not work
|
|
711
|
+
- [ ] Approval plugin blocks unapproved tools and grants approval correctly
|
|
712
|
+
|
|
713
|
+
### Production
|
|
714
|
+
|
|
715
|
+
- [ ] Redis or external storage is configured for Remember and Cache plugins
|
|
716
|
+
- [ ] Dashboard authentication is enabled with a secret token (if using beta Dashboard plugin)
|
|
717
|
+
- [ ] Feature flag adapter connects to external service (not `'static'`)
|
|
718
|
+
|
|
719
|
+
## Troubleshooting
|
|
720
|
+
|
|
721
|
+
| Problem | Cause | Solution |
|
|
722
|
+
| --------------------------------- | -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
|
|
723
|
+
| `this.remember` is undefined | RememberPlugin not registered or missing `.init()` | Add `RememberPlugin.init({ type: 'memory' })` to `plugins` array |
|
|
724
|
+
| Cache not working for a tool | Tool name does not match any `toolPatterns` glob and `cache` metadata is not set | Add `cache: true` to `@Tool` decorator or add matching pattern to `toolPatterns` |
|
|
725
|
+
| Feature flag always returns false | Using `'static'` adapter with flag not in the `flags` map | Add the flag key to `flags: { 'my-flag': true }` or check adapter connection |
|
|
726
|
+
| Dashboard returns 404 | Plugin is in beta and auto-disabled in production (`NODE_ENV=production`) | Dashboard is unstable — avoid in production. For dev: set `enabled: true` explicitly |
|
|
727
|
+
| Approval webhook times out | Callback URL not reachable from the external approval service | Verify `callbackPath` is publicly accessible and matches the webhook configuration |
|
|
728
|
+
|
|
657
729
|
## Reference
|
|
658
730
|
|
|
659
|
-
- Plugins
|
|
660
|
-
-
|
|
661
|
-
- CodeCall: `@frontmcp/plugin-codecall` — [source](https://github.com/agentfront/frontmcp/tree/main/plugins/plugin-codecall) | [docs](https://docs.agentfront.dev/frontmcp/plugins/codecall/overview)
|
|
662
|
-
- Remember: `@frontmcp/plugin-remember` — [source](https://github.com/agentfront/frontmcp/tree/main/plugins/plugin-remember) | [docs](https://docs.agentfront.dev/frontmcp/plugins/remember-plugin)
|
|
663
|
-
- Approval: `@frontmcp/plugin-approval` — [source](https://github.com/agentfront/frontmcp/tree/main/plugins/plugin-approval)
|
|
664
|
-
- Cache: `@frontmcp/plugin-cache` — [source](https://github.com/agentfront/frontmcp/tree/main/plugins/plugin-cache) | [docs](https://docs.agentfront.dev/frontmcp/plugins/cache-plugin)
|
|
665
|
-
- Feature Flags: `@frontmcp/plugin-feature-flags` — [source](https://github.com/agentfront/frontmcp/tree/main/plugins/plugin-feature-flags) | [docs](https://docs.agentfront.dev/frontmcp/plugins/feature-flags-plugin)
|
|
666
|
-
- Dashboard: `@frontmcp/plugin-dashboard` — [source](https://github.com/agentfront/frontmcp/tree/main/plugins/plugin-dashboard)
|
|
667
|
-
- Meta-package: `@frontmcp/plugins` (re-exports cache, codecall, dashboard, remember)
|
|
731
|
+
- [Plugins Overview Documentation](https://docs.agentfront.dev/frontmcp/plugins/overview)
|
|
732
|
+
- Related skills: `create-plugin`, `create-plugin-hooks`, `create-tool`
|