fa-mcp-sdk 0.4.76 → 0.4.79
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 +319 -314
- package/bin/fa-mcp.js +85 -68
- package/cli-template/.claude/agents/javascript-pro.md +276 -276
- package/cli-template/.claude/settings.json +50 -50
- package/cli-template/.claude/skills/upgrade-guide/SKILL.md +2 -1
- package/cli-template/.oxfmtrc.json +41 -0
- package/cli-template/.oxlintrc.json +120 -0
- package/cli-template/CLAUDE.md +358 -355
- package/cli-template/FA-MCP-SDK-DOC/00-FA-MCP-SDK-index.md +132 -132
- package/cli-template/FA-MCP-SDK-DOC/01-getting-started.md +146 -146
- package/cli-template/FA-MCP-SDK-DOC/02-1-tools-and-api.md +431 -431
- package/cli-template/FA-MCP-SDK-DOC/02-2-prompts-and-resources.md +201 -201
- package/cli-template/FA-MCP-SDK-DOC/03-configuration.md +384 -384
- package/cli-template/FA-MCP-SDK-DOC/04-authentication.md +412 -412
- package/cli-template/FA-MCP-SDK-DOC/05-ad-authorization.md +196 -196
- package/cli-template/FA-MCP-SDK-DOC/06-utilities.md +163 -163
- package/cli-template/FA-MCP-SDK-DOC/07-testing-and-operations.md +127 -127
- package/cli-template/jest.config.js +27 -30
- package/cli-template/package.json +10 -5
- package/cli-template/prompt-example-new-MCP.md +101 -101
- package/cli-template/readme-docs/SKILLS.md +1 -1
- package/cli-template/tsconfig.json +58 -58
- package/cli-template/update.cjs +41 -38
- package/config/custom-environment-variables.yaml +63 -63
- package/config/development.yaml +4 -4
- package/config/production.yaml +4 -4
- package/config/test.yaml +26 -26
- package/dist/core/_types_/TNtlm.d.ts.map +1 -1
- package/dist/core/_types_/active-directory-config.d.ts.map +1 -1
- package/dist/core/_types_/config.d.ts.map +1 -1
- package/dist/core/_types_/types.d.ts.map +1 -1
- package/dist/core/ad/group-checker.d.ts.map +1 -1
- package/dist/core/ad/group-checker.js.map +1 -1
- package/dist/core/agent-tester/agent-tester-router.d.ts.map +1 -1
- package/dist/core/agent-tester/agent-tester-router.js +6 -6
- package/dist/core/agent-tester/agent-tester-router.js.map +1 -1
- package/dist/core/agent-tester/check-llm.d.ts.map +1 -1
- package/dist/core/agent-tester/check-llm.js.map +1 -1
- package/dist/core/agent-tester/services/SummaryMemory.d.ts.map +1 -1
- package/dist/core/agent-tester/services/SummaryMemory.js +3 -9
- package/dist/core/agent-tester/services/SummaryMemory.js.map +1 -1
- package/dist/core/agent-tester/services/TesterAgentService.d.ts.map +1 -1
- package/dist/core/agent-tester/services/TesterAgentService.js +25 -27
- package/dist/core/agent-tester/services/TesterAgentService.js.map +1 -1
- package/dist/core/agent-tester/services/TesterMcpClientService.d.ts.map +1 -1
- package/dist/core/agent-tester/services/TesterMcpClientService.js +26 -25
- package/dist/core/agent-tester/services/TesterMcpClientService.js.map +1 -1
- package/dist/core/auth/admin-auth.d.ts.map +1 -1
- package/dist/core/auth/admin-auth.js +5 -5
- package/dist/core/auth/admin-auth.js.map +1 -1
- package/dist/core/auth/agent-tester-auth.d.ts.map +1 -1
- package/dist/core/auth/agent-tester-auth.js +1 -6
- package/dist/core/auth/agent-tester-auth.js.map +1 -1
- package/dist/core/auth/basic.d.ts.map +1 -1
- package/dist/core/auth/basic.js.map +1 -1
- package/dist/core/auth/ip-check.d.ts.map +1 -1
- package/dist/core/auth/ip-check.js +1 -1
- package/dist/core/auth/ip-check.js.map +1 -1
- package/dist/core/auth/jwt.d.ts.map +1 -1
- package/dist/core/auth/jwt.js +1 -1
- package/dist/core/auth/jwt.js.map +1 -1
- package/dist/core/auth/middleware.d.ts.map +1 -1
- package/dist/core/auth/middleware.js +9 -6
- package/dist/core/auth/middleware.js.map +1 -1
- package/dist/core/auth/multi-auth.d.ts.map +1 -1
- package/dist/core/auth/multi-auth.js +6 -6
- package/dist/core/auth/multi-auth.js.map +1 -1
- package/dist/core/auth/revocation.d.ts.map +1 -1
- package/dist/core/auth/revocation.js +2 -6
- package/dist/core/auth/revocation.js.map +1 -1
- package/dist/core/auth/token-generator/ntlm/ntlm-auth-options.d.ts.map +1 -1
- package/dist/core/auth/token-generator/ntlm/ntlm-auth-options.js +2 -2
- package/dist/core/auth/token-generator/ntlm/ntlm-auth-options.js.map +1 -1
- package/dist/core/auth/token-generator/ntlm/ntlm-domain-config.js +1 -1
- package/dist/core/auth/token-generator/ntlm/ntlm-domain-config.js.map +1 -1
- package/dist/core/auth/token-generator/ntlm/ntlm-integration.d.ts.map +1 -1
- package/dist/core/auth/token-generator/ntlm/ntlm-integration.js +4 -2
- package/dist/core/auth/token-generator/ntlm/ntlm-integration.js.map +1 -1
- package/dist/core/auth/token-generator/server.d.ts.map +1 -1
- package/dist/core/auth/token-generator/server.js.map +1 -1
- package/dist/core/bootstrap/init-config.d.ts.map +1 -1
- package/dist/core/bootstrap/init-config.js +2 -2
- package/dist/core/bootstrap/init-config.js.map +1 -1
- package/dist/core/bootstrap/startup-info.d.ts.map +1 -1
- package/dist/core/bootstrap/startup-info.js +3 -7
- package/dist/core/bootstrap/startup-info.js.map +1 -1
- package/dist/core/cache/cache.d.ts.map +1 -1
- package/dist/core/cache/cache.js +2 -2
- package/dist/core/cache/cache.js.map +1 -1
- package/dist/core/consul/deregister.d.ts.map +1 -1
- package/dist/core/consul/deregister.js.map +1 -1
- package/dist/core/consul/get-consul-api.d.ts.map +1 -1
- package/dist/core/consul/get-consul-api.js +1 -2
- package/dist/core/consul/get-consul-api.js.map +1 -1
- package/dist/core/db/pg-db.d.ts.map +1 -1
- package/dist/core/db/pg-db.js +3 -3
- package/dist/core/db/pg-db.js.map +1 -1
- package/dist/core/debug.d.ts.map +1 -1
- package/dist/core/debug.js.map +1 -1
- package/dist/core/errors/BaseMcpError.d.ts.map +1 -1
- package/dist/core/errors/BaseMcpError.js.map +1 -1
- package/dist/core/errors/ValidationError.d.ts.map +1 -1
- package/dist/core/errors/ValidationError.js.map +1 -1
- package/dist/core/errors/errors.d.ts.map +1 -1
- package/dist/core/errors/errors.js +1 -1
- package/dist/core/errors/errors.js.map +1 -1
- package/dist/core/index.d.ts +6 -6
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +5 -5
- package/dist/core/index.js.map +1 -1
- package/dist/core/init-mcp-server.d.ts.map +1 -1
- package/dist/core/init-mcp-server.js.map +1 -1
- package/dist/core/logger.d.ts.map +1 -1
- package/dist/core/logger.js +1 -1
- package/dist/core/logger.js.map +1 -1
- package/dist/core/mcp/create-mcp-server.d.ts.map +1 -1
- package/dist/core/mcp/create-mcp-server.js +1 -1
- package/dist/core/mcp/create-mcp-server.js.map +1 -1
- package/dist/core/mcp/prompts.d.ts.map +1 -1
- package/dist/core/mcp/prompts.js.map +1 -1
- package/dist/core/mcp/readme-assembler.d.ts.map +1 -1
- package/dist/core/mcp/readme-assembler.js +3 -1
- package/dist/core/mcp/readme-assembler.js.map +1 -1
- package/dist/core/mcp/resources.d.ts.map +1 -1
- package/dist/core/mcp/resources.js.map +1 -1
- package/dist/core/mcp/server-stdio.d.ts.map +1 -1
- package/dist/core/utils/formatToolResult.d.ts.map +1 -1
- package/dist/core/utils/formatToolResult.js.map +1 -1
- package/dist/core/utils/port-checker.d.ts.map +1 -1
- package/dist/core/utils/port-checker.js.map +1 -1
- package/dist/core/utils/rate-limit.d.ts.map +1 -1
- package/dist/core/utils/rate-limit.js +2 -8
- package/dist/core/utils/rate-limit.js.map +1 -1
- package/dist/core/utils/testing/BaseMcpClient.d.ts.map +1 -1
- package/dist/core/utils/testing/BaseMcpClient.js.map +1 -1
- package/dist/core/utils/testing/McpHttpClient.d.ts.map +1 -1
- package/dist/core/utils/testing/McpHttpClient.js +2 -2
- package/dist/core/utils/testing/McpHttpClient.js.map +1 -1
- package/dist/core/utils/testing/McpSseClient.d.ts.map +1 -1
- package/dist/core/utils/testing/McpSseClient.js +3 -8
- package/dist/core/utils/testing/McpSseClient.js.map +1 -1
- package/dist/core/utils/testing/McpStdioClient.d.ts.map +1 -1
- package/dist/core/utils/testing/McpStdioClient.js.map +1 -1
- package/dist/core/utils/testing/McpStreamableHttpClient.d.ts.map +1 -1
- package/dist/core/utils/testing/McpStreamableHttpClient.js +7 -8
- package/dist/core/utils/testing/McpStreamableHttpClient.js.map +1 -1
- package/dist/core/utils/utils.d.ts.map +1 -1
- package/dist/core/utils/utils.js +3 -5
- package/dist/core/utils/utils.js.map +1 -1
- package/dist/core/web/admin-router.d.ts.map +1 -1
- package/dist/core/web/admin-router.js +3 -3
- package/dist/core/web/admin-router.js.map +1 -1
- package/dist/core/web/cors.d.ts.map +1 -1
- package/dist/core/web/cors.js.map +1 -1
- package/dist/core/web/favicon-svg.d.ts.map +1 -1
- package/dist/core/web/favicon-svg.js +1 -5
- package/dist/core/web/favicon-svg.js.map +1 -1
- package/dist/core/web/home-api.d.ts.map +1 -1
- package/dist/core/web/home-api.js +7 -8
- package/dist/core/web/home-api.js.map +1 -1
- package/dist/core/web/openapi.d.ts.map +1 -1
- package/dist/core/web/openapi.js +1 -3
- package/dist/core/web/openapi.js.map +1 -1
- package/dist/core/web/server-http.d.ts.map +1 -1
- package/dist/core/web/server-http.js +4 -4
- package/dist/core/web/server-http.js.map +1 -1
- package/dist/core/web/static/agent-tester/index.html +323 -323
- package/dist/core/web/static/agent-tester/script.js +311 -200
- package/dist/core/web/static/agent-tester/styles.css +1840 -1840
- package/dist/core/web/static/home/index.html +220 -220
- package/dist/core/web/static/home/script.js +72 -43
- package/dist/core/web/static/styles.css +927 -927
- package/dist/core/web/static/token-gen/index.html +136 -136
- package/dist/core/web/static/token-gen/script.js +58 -56
- package/dist/core/web/svg-icons.d.ts.map +1 -1
- package/dist/core/web/svg-icons.js +1 -5
- package/dist/core/web/svg-icons.js.map +1 -1
- package/package.json +10 -5
- package/{cli-template/.claude/hooks/eslint-fix.cjs → scripts/cc-hook-oxlint-oxfmt-fix.cjs} +109 -100
- package/scripts/generate-jwt.js +5 -9
- package/scripts/kill-port.js +5 -2
- package/scripts/npm/run.js +1 -2
- package/scripts/remove-nul.js +1 -1
- package/scripts/update-sdk.js +36 -14
- package/src/template/api/router.ts +3 -3
- package/src/template/prompts/agent-brief.ts +0 -1
- package/src/template/start.ts +3 -8
- package/src/template/tools/handle-tool-call.ts +3 -3
- package/src/template/tools/tools.ts +3 -7
- package/src/tests/jest-simple-reporter.js +1 -1
- package/src/tests/mcp/sse/mcp-sse-client-handling.md +111 -111
- package/src/tests/mcp/sse/test-sse-npm-package.js +2 -3
- package/src/tests/mcp/test-cases.js +6 -7
- package/src/tests/mcp/test-http.js +2 -2
- package/src/tests/mcp/test-sse.js +9 -7
- package/src/tests/mcp/test-stdio.js +12 -8
- package/src/tests/utils.ts +4 -3
- package/cli-template/eslint.config.js +0 -27
|
@@ -1,201 +1,201 @@
|
|
|
1
|
-
# Prompts and Resources
|
|
2
|
-
|
|
3
|
-
## Prompts
|
|
4
|
-
|
|
5
|
-
### Standard Prompts
|
|
6
|
-
|
|
7
|
-
#### Agent Brief (`src/prompts/agent-brief.ts`)
|
|
8
|
-
|
|
9
|
-
**Level 1**: Short description for agent selection. LLM doesn't see tools at this level.
|
|
10
|
-
|
|
11
|
-
```typescript
|
|
12
|
-
export const AGENT_BRIEF = 'Database management agent for PostgreSQL operations';
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
#### Agent Prompt (`src/prompts/agent-prompt.ts`)
|
|
16
|
-
|
|
17
|
-
**Level 2**: Full instructions shown after agent selection. LLM sees tools list.
|
|
18
|
-
|
|
19
|
-
```typescript
|
|
20
|
-
export const AGENT_PROMPT = `You are a database management assistant.
|
|
21
|
-
- Check table existence before operations
|
|
22
|
-
- Use transactions for multi-step operations
|
|
23
|
-
- Return results in JSON format`;
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
### Custom Prompts
|
|
27
|
-
|
|
28
|
-
Add in `src/prompts/custom-prompts.ts`:
|
|
29
|
-
|
|
30
|
-
```typescript
|
|
31
|
-
import { IPromptData, IGetPromptRequest } from 'fa-mcp-sdk';
|
|
32
|
-
|
|
33
|
-
export const customPrompts: IPromptData[] = [
|
|
34
|
-
{ name: 'greeting', description: 'Greeting message', arguments: [],
|
|
35
|
-
content: 'Hello! How can I help?' },
|
|
36
|
-
|
|
37
|
-
{ name: 'context_prompt', description: 'Context-aware', arguments: [],
|
|
38
|
-
content: (req: IGetPromptRequest) => `Context: ${JSON.stringify(req.params.arguments)}` },
|
|
39
|
-
|
|
40
|
-
{ name: 'admin_only', description: 'Admin instructions', arguments: [],
|
|
41
|
-
content: 'Admin-only content', requireAuth: true },
|
|
42
|
-
];
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
Pass to server:
|
|
46
|
-
```typescript
|
|
47
|
-
const serverData: McpServerData = { ..., customPrompts };
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
### ITransportContext
|
|
51
|
-
|
|
52
|
-
Universal type for dynamic tools/prompts/resources functions:
|
|
53
|
-
|
|
54
|
-
```typescript
|
|
55
|
-
interface ITransportContext {
|
|
56
|
-
transport: 'stdio' | 'sse' | 'http';
|
|
57
|
-
headers?: Record<string, string>; // HTTP headers (HTTP/SSE only)
|
|
58
|
-
payload?: { user: string; [key: string]: any }; // Auth payload (if authenticated HTTP/SSE only)
|
|
59
|
-
}
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
Use for transport-based credential routing:
|
|
63
|
-
```typescript
|
|
64
|
-
function getApiKey(ctx: ITransportContext): string {
|
|
65
|
-
if (ctx.transport === 'stdio') return process.env.API_KEY || '';
|
|
66
|
-
return ctx.headers?.['x-api-key'] || '';
|
|
67
|
-
}
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
### Dynamic Prompts (Function)
|
|
71
|
-
|
|
72
|
-
For dynamic prompt lists based on transport type, headers, or user:
|
|
73
|
-
|
|
74
|
-
```typescript
|
|
75
|
-
import { IPromptData, ITransportContext } from 'fa-mcp-sdk';
|
|
76
|
-
|
|
77
|
-
export const customPrompts = async (ctx: ITransportContext): Promise<IPromptData[]> => {
|
|
78
|
-
const { transport, headers, payload } = ctx;
|
|
79
|
-
|
|
80
|
-
const prompts: IPromptData[] = [
|
|
81
|
-
{ name: 'greeting', description: 'Greeting message', arguments: [],
|
|
82
|
-
content: 'Hello! How can I help?' },
|
|
83
|
-
];
|
|
84
|
-
|
|
85
|
-
// Add user-specific prompts
|
|
86
|
-
if (payload?.user) {
|
|
87
|
-
prompts.push({
|
|
88
|
-
name: 'user_context',
|
|
89
|
-
description: `Context for ${payload.user}`,
|
|
90
|
-
arguments: [],
|
|
91
|
-
content: `You are assisting user: ${payload.user}`,
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// Add transport-specific prompts
|
|
96
|
-
if (transport === 'http') {
|
|
97
|
-
prompts.push({
|
|
98
|
-
name: 'http_mode',
|
|
99
|
-
description: 'HTTP-specific instructions',
|
|
100
|
-
arguments: [],
|
|
101
|
-
content: 'Respond in JSON format for HTTP clients',
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
return prompts;
|
|
106
|
-
};
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
## Resources
|
|
110
|
-
|
|
111
|
-
### Standard Resources
|
|
112
|
-
|
|
113
|
-
| URI | Description |
|
|
114
|
-
|-----|-------------|
|
|
115
|
-
| `project://id` | Service identifier (`appConfig.name`) |
|
|
116
|
-
| `project://name` | Display name (`appConfig.productName`) |
|
|
117
|
-
| `doc://readme` | README.md content |
|
|
118
|
-
| `use://http-headers` | Used HTTP headers (from `usedHttpHeaders`) |
|
|
119
|
-
|
|
120
|
-
### Custom Resources
|
|
121
|
-
|
|
122
|
-
Add in `src/custom-resources.ts`:
|
|
123
|
-
|
|
124
|
-
```typescript
|
|
125
|
-
import { IResourceData } from 'fa-mcp-sdk';
|
|
126
|
-
|
|
127
|
-
export const customResources: IResourceData[] = [
|
|
128
|
-
{ uri: 'custom://config', name: 'Config', description: 'Server config',
|
|
129
|
-
mimeType: 'text/plain', content: 'Version: 1.0.0' },
|
|
130
|
-
|
|
131
|
-
{ uri: 'custom://schema', name: 'API Schema', description: 'API schema',
|
|
132
|
-
mimeType: 'application/json',
|
|
133
|
-
content: { version: '1.0', endpoints: ['/api/users'] } },
|
|
134
|
-
|
|
135
|
-
{ uri: 'custom://status', name: 'Status', description: 'Live status',
|
|
136
|
-
mimeType: 'application/json',
|
|
137
|
-
content: async (uri) => JSON.stringify(await getStatus()) },
|
|
138
|
-
|
|
139
|
-
{ uri: 'custom://secrets', name: 'Secrets', description: 'Protected',
|
|
140
|
-
mimeType: 'application/json', content: {}, requireAuth: true },
|
|
141
|
-
];
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
Pass to server:
|
|
145
|
-
```typescript
|
|
146
|
-
const serverData: McpServerData = { ..., customResources };
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
### Dynamic Resources (Function)
|
|
150
|
-
|
|
151
|
-
For dynamic resource lists based on transport type, headers, or user:
|
|
152
|
-
|
|
153
|
-
```typescript
|
|
154
|
-
import { IResourceData, ITransportContext } from 'fa-mcp-sdk';
|
|
155
|
-
|
|
156
|
-
export const customResources = async (ctx: ITransportContext): Promise<IResourceData[]> => {
|
|
157
|
-
const { transport, headers, payload } = ctx;
|
|
158
|
-
|
|
159
|
-
const resources: IResourceData[] = [
|
|
160
|
-
{ uri: 'custom://config', name: 'Config', description: 'Server config',
|
|
161
|
-
mimeType: 'text/plain', content: 'Version: 1.0.0' },
|
|
162
|
-
];
|
|
163
|
-
|
|
164
|
-
// Add user-specific resources
|
|
165
|
-
if (payload?.user) {
|
|
166
|
-
resources.push({
|
|
167
|
-
uri: `user://${payload.user}/preferences`,
|
|
168
|
-
name: 'User Preferences',
|
|
169
|
-
description: `Preferences for ${payload.user}`,
|
|
170
|
-
mimeType: 'application/json',
|
|
171
|
-
content: await getUserPreferences(payload.user),
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
return resources;
|
|
176
|
-
};
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
### Used HTTP Headers
|
|
180
|
-
|
|
181
|
-
Define required client headers:
|
|
182
|
-
|
|
183
|
-
```typescript
|
|
184
|
-
const serverData: McpServerData = {
|
|
185
|
-
...,
|
|
186
|
-
usedHttpHeaders: [
|
|
187
|
-
{ name: 'Authorization', description: 'JWT token in Bearer format' },
|
|
188
|
-
{ name: 'X-Request-ID', description: 'Request tracking ID', isOptional: true },
|
|
189
|
-
],
|
|
190
|
-
};
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
Exposed via `use://http-headers` resource.
|
|
194
|
-
|
|
195
|
-
## requireAuth
|
|
196
|
-
|
|
197
|
-
Both prompts and resources support `requireAuth: true`:
|
|
198
|
-
|
|
199
|
-
- Requires valid authentication to access
|
|
200
|
-
- Unauthenticated requests get error
|
|
201
|
-
- Works with any configured auth method (JWT, Basic, etc.)
|
|
1
|
+
# Prompts and Resources
|
|
2
|
+
|
|
3
|
+
## Prompts
|
|
4
|
+
|
|
5
|
+
### Standard Prompts
|
|
6
|
+
|
|
7
|
+
#### Agent Brief (`src/prompts/agent-brief.ts`)
|
|
8
|
+
|
|
9
|
+
**Level 1**: Short description for agent selection. LLM doesn't see tools at this level.
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
export const AGENT_BRIEF = 'Database management agent for PostgreSQL operations';
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
#### Agent Prompt (`src/prompts/agent-prompt.ts`)
|
|
16
|
+
|
|
17
|
+
**Level 2**: Full instructions shown after agent selection. LLM sees tools list.
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
export const AGENT_PROMPT = `You are a database management assistant.
|
|
21
|
+
- Check table existence before operations
|
|
22
|
+
- Use transactions for multi-step operations
|
|
23
|
+
- Return results in JSON format`;
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Custom Prompts
|
|
27
|
+
|
|
28
|
+
Add in `src/prompts/custom-prompts.ts`:
|
|
29
|
+
|
|
30
|
+
```typescript
|
|
31
|
+
import { IPromptData, IGetPromptRequest } from 'fa-mcp-sdk';
|
|
32
|
+
|
|
33
|
+
export const customPrompts: IPromptData[] = [
|
|
34
|
+
{ name: 'greeting', description: 'Greeting message', arguments: [],
|
|
35
|
+
content: 'Hello! How can I help?' },
|
|
36
|
+
|
|
37
|
+
{ name: 'context_prompt', description: 'Context-aware', arguments: [],
|
|
38
|
+
content: (req: IGetPromptRequest) => `Context: ${JSON.stringify(req.params.arguments)}` },
|
|
39
|
+
|
|
40
|
+
{ name: 'admin_only', description: 'Admin instructions', arguments: [],
|
|
41
|
+
content: 'Admin-only content', requireAuth: true },
|
|
42
|
+
];
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Pass to server:
|
|
46
|
+
```typescript
|
|
47
|
+
const serverData: McpServerData = { ..., customPrompts };
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### ITransportContext
|
|
51
|
+
|
|
52
|
+
Universal type for dynamic tools/prompts/resources functions:
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
interface ITransportContext {
|
|
56
|
+
transport: 'stdio' | 'sse' | 'http';
|
|
57
|
+
headers?: Record<string, string>; // HTTP headers (HTTP/SSE only)
|
|
58
|
+
payload?: { user: string; [key: string]: any }; // Auth payload (if authenticated HTTP/SSE only)
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Use for transport-based credential routing:
|
|
63
|
+
```typescript
|
|
64
|
+
function getApiKey(ctx: ITransportContext): string {
|
|
65
|
+
if (ctx.transport === 'stdio') return process.env.API_KEY || '';
|
|
66
|
+
return ctx.headers?.['x-api-key'] || '';
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Dynamic Prompts (Function)
|
|
71
|
+
|
|
72
|
+
For dynamic prompt lists based on transport type, headers, or user:
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
import { IPromptData, ITransportContext } from 'fa-mcp-sdk';
|
|
76
|
+
|
|
77
|
+
export const customPrompts = async (ctx: ITransportContext): Promise<IPromptData[]> => {
|
|
78
|
+
const { transport, headers, payload } = ctx;
|
|
79
|
+
|
|
80
|
+
const prompts: IPromptData[] = [
|
|
81
|
+
{ name: 'greeting', description: 'Greeting message', arguments: [],
|
|
82
|
+
content: 'Hello! How can I help?' },
|
|
83
|
+
];
|
|
84
|
+
|
|
85
|
+
// Add user-specific prompts
|
|
86
|
+
if (payload?.user) {
|
|
87
|
+
prompts.push({
|
|
88
|
+
name: 'user_context',
|
|
89
|
+
description: `Context for ${payload.user}`,
|
|
90
|
+
arguments: [],
|
|
91
|
+
content: `You are assisting user: ${payload.user}`,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Add transport-specific prompts
|
|
96
|
+
if (transport === 'http') {
|
|
97
|
+
prompts.push({
|
|
98
|
+
name: 'http_mode',
|
|
99
|
+
description: 'HTTP-specific instructions',
|
|
100
|
+
arguments: [],
|
|
101
|
+
content: 'Respond in JSON format for HTTP clients',
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
return prompts;
|
|
106
|
+
};
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Resources
|
|
110
|
+
|
|
111
|
+
### Standard Resources
|
|
112
|
+
|
|
113
|
+
| URI | Description |
|
|
114
|
+
|-----|-------------|
|
|
115
|
+
| `project://id` | Service identifier (`appConfig.name`) |
|
|
116
|
+
| `project://name` | Display name (`appConfig.productName`) |
|
|
117
|
+
| `doc://readme` | README.md content |
|
|
118
|
+
| `use://http-headers` | Used HTTP headers (from `usedHttpHeaders`) |
|
|
119
|
+
|
|
120
|
+
### Custom Resources
|
|
121
|
+
|
|
122
|
+
Add in `src/custom-resources.ts`:
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
import { IResourceData } from 'fa-mcp-sdk';
|
|
126
|
+
|
|
127
|
+
export const customResources: IResourceData[] = [
|
|
128
|
+
{ uri: 'custom://config', name: 'Config', description: 'Server config',
|
|
129
|
+
mimeType: 'text/plain', content: 'Version: 1.0.0' },
|
|
130
|
+
|
|
131
|
+
{ uri: 'custom://schema', name: 'API Schema', description: 'API schema',
|
|
132
|
+
mimeType: 'application/json',
|
|
133
|
+
content: { version: '1.0', endpoints: ['/api/users'] } },
|
|
134
|
+
|
|
135
|
+
{ uri: 'custom://status', name: 'Status', description: 'Live status',
|
|
136
|
+
mimeType: 'application/json',
|
|
137
|
+
content: async (uri) => JSON.stringify(await getStatus()) },
|
|
138
|
+
|
|
139
|
+
{ uri: 'custom://secrets', name: 'Secrets', description: 'Protected',
|
|
140
|
+
mimeType: 'application/json', content: {}, requireAuth: true },
|
|
141
|
+
];
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Pass to server:
|
|
145
|
+
```typescript
|
|
146
|
+
const serverData: McpServerData = { ..., customResources };
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### Dynamic Resources (Function)
|
|
150
|
+
|
|
151
|
+
For dynamic resource lists based on transport type, headers, or user:
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
import { IResourceData, ITransportContext } from 'fa-mcp-sdk';
|
|
155
|
+
|
|
156
|
+
export const customResources = async (ctx: ITransportContext): Promise<IResourceData[]> => {
|
|
157
|
+
const { transport, headers, payload } = ctx;
|
|
158
|
+
|
|
159
|
+
const resources: IResourceData[] = [
|
|
160
|
+
{ uri: 'custom://config', name: 'Config', description: 'Server config',
|
|
161
|
+
mimeType: 'text/plain', content: 'Version: 1.0.0' },
|
|
162
|
+
];
|
|
163
|
+
|
|
164
|
+
// Add user-specific resources
|
|
165
|
+
if (payload?.user) {
|
|
166
|
+
resources.push({
|
|
167
|
+
uri: `user://${payload.user}/preferences`,
|
|
168
|
+
name: 'User Preferences',
|
|
169
|
+
description: `Preferences for ${payload.user}`,
|
|
170
|
+
mimeType: 'application/json',
|
|
171
|
+
content: await getUserPreferences(payload.user),
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return resources;
|
|
176
|
+
};
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Used HTTP Headers
|
|
180
|
+
|
|
181
|
+
Define required client headers:
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
const serverData: McpServerData = {
|
|
185
|
+
...,
|
|
186
|
+
usedHttpHeaders: [
|
|
187
|
+
{ name: 'Authorization', description: 'JWT token in Bearer format' },
|
|
188
|
+
{ name: 'X-Request-ID', description: 'Request tracking ID', isOptional: true },
|
|
189
|
+
],
|
|
190
|
+
};
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Exposed via `use://http-headers` resource.
|
|
194
|
+
|
|
195
|
+
## requireAuth
|
|
196
|
+
|
|
197
|
+
Both prompts and resources support `requireAuth: true`:
|
|
198
|
+
|
|
199
|
+
- Requires valid authentication to access
|
|
200
|
+
- Unauthenticated requests get error
|
|
201
|
+
- Works with any configured auth method (JWT, Basic, etc.)
|