fa-mcp-sdk 0.4.76 → 0.4.77
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,132 +1,132 @@
|
|
|
1
|
-
# FA-MCP-SDK Documentation Index
|
|
2
|
-
|
|
3
|
-
TypeScript framework for building MCP servers.
|
|
4
|
-
|
|
5
|
-
## Quick Start
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npm install fa-mcp-sdk
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
## Documentation Structure
|
|
12
|
-
|
|
13
|
-
| File | Content | Read When |
|
|
14
|
-
|------|---------|-----------|
|
|
15
|
-
| [01-getting-started](01-getting-started.md) | `initMcpServer()`, `McpServerData`, `IPromptData`, `IResourceData`, `AppConfig` | Starting new project |
|
|
16
|
-
| [02-1-tools-and-api](02-1-tools-and-api.md) | Tool definitions, `toolHandler`, outbound webhooks, REST API with tsoa, OpenAPI/Swagger | Creating tools, REST endpoints, webhook callbacks |
|
|
17
|
-
| [02-2-prompts-and-resources](02-2-prompts-and-resources.md) | Standard/custom prompts, resources, `requireAuth` | Configuring prompts/resources |
|
|
18
|
-
| [03-configuration](03-configuration.md) | `appConfig`, YAML config, access points for external services, cache | Server configuration, external services |
|
|
19
|
-
| [04-authentication](04-authentication.md) | JWT, Basic auth, server tokens, `createAuthMW()`, Token Generator, CLI Token Generator, JWT Generation API | Authentication setup |
|
|
20
|
-
| [05-ad-authorization](05-ad-authorization.md) | AD group authorization at HTTP/tool levels | AD group restrictions |
|
|
21
|
-
| [06-utilities](06-utilities.md) | `ServerError`, `normalizeHeaders`, logging, Consul, graceful shutdown | Error handling, utilities |
|
|
22
|
-
| [07-testing-and-operations](07-testing-and-operations.md) | Test clients (STDIO, HTTP, SSE, Streamable HTTP) | Testing, deployment |
|
|
23
|
-
| [08-agent-tester-and-headless-api](08-agent-tester-and-headless-api.md) | Agent Tester, Headless API, structured logging, automated testing, UI `data-testid` reference | Agent-driven tool development, CLI automation, UI E2E tests |
|
|
24
|
-
| [09-database](09-database.md) | PostgreSQL sugar layer (`queryMAIN`, `execMAIN`, `getInsertSqlMAIN`, `getMergeSqlMAIN`, `mergeByBatch`), `pgvector`, secondary DBs | Database access, upserts, batching |
|
|
25
|
-
|
|
26
|
-
## Key Exports
|
|
27
|
-
|
|
28
|
-
```typescript
|
|
29
|
-
// Core
|
|
30
|
-
import { initMcpServer, McpServerData, appConfig, getProjectData, getSafeAppConfig, ROOT_PROJECT_DIR } from 'fa-mcp-sdk';
|
|
31
|
-
|
|
32
|
-
// Auth
|
|
33
|
-
import { createAuthMW, generateToken, getAuthHeadersForTests, TTokenType, generateTokenApp } from 'fa-mcp-sdk';
|
|
34
|
-
|
|
35
|
-
// Tools & Errors
|
|
36
|
-
import { formatToolResult, ToolExecutionError, ServerError, BaseMcpError, ValidationError, getTools } from 'fa-mcp-sdk';
|
|
37
|
-
|
|
38
|
-
// Database & Cache
|
|
39
|
-
import {
|
|
40
|
-
queryMAIN, queryRsMAIN, oneRowMAIN, execMAIN,
|
|
41
|
-
getInsertSqlMAIN, getMergeSqlMAIN, mergeByBatch,
|
|
42
|
-
checkMainDB, getMainDBConnectionStatus,
|
|
43
|
-
IQueryPgArgsCOptional,
|
|
44
|
-
getCache,
|
|
45
|
-
} from 'fa-mcp-sdk';
|
|
46
|
-
|
|
47
|
-
// Utilities
|
|
48
|
-
import { logger, fileLogger, Logger, trim, ppj, toError, toStr, normalizeHeaders } from 'fa-mcp-sdk';
|
|
49
|
-
|
|
50
|
-
// Test Clients
|
|
51
|
-
import { McpHttpClient, McpStdioClient, McpSseClient, McpStreamableHttpClient } from 'fa-mcp-sdk';
|
|
52
|
-
|
|
53
|
-
// AD Groups
|
|
54
|
-
import { initADGroupChecker, IADConfig, IDcConfig } from 'fa-mcp-sdk';
|
|
55
|
-
|
|
56
|
-
// OpenAPI
|
|
57
|
-
import { configureOpenAPI, OpenAPISpecResponse, SwaggerUIConfig } from 'fa-mcp-sdk';
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
## Project Structure
|
|
61
|
-
|
|
62
|
-
```
|
|
63
|
-
my-mcp-server/
|
|
64
|
-
├── config/
|
|
65
|
-
│ ├── default.yaml # Base configuration
|
|
66
|
-
│ ├── development.yaml # Dev overrides
|
|
67
|
-
│ ├── local.yaml # Local secrets (gitignored)
|
|
68
|
-
│ └── production.yaml # Prod overrides
|
|
69
|
-
├── src/
|
|
70
|
-
│ ├── _types_/
|
|
71
|
-
│ │ └── custom-config.ts # Custom config interface
|
|
72
|
-
│ ├── api/
|
|
73
|
-
│ │ └── router.ts # REST endpoints (tsoa)
|
|
74
|
-
│ ├── prompts/
|
|
75
|
-
│ │ ├── agent-brief.ts # Short agent description
|
|
76
|
-
│ │ ├── agent-prompt.ts # Full agent prompt
|
|
77
|
-
│ │ └── custom-prompts.ts # Additional prompts
|
|
78
|
-
│ ├── tools/
|
|
79
|
-
│ │ ├── handle-tool-call.ts # Tool execution
|
|
80
|
-
│ │ └── tools.ts # Tool definitions
|
|
81
|
-
│ ├── custom-resources.ts # Custom MCP resources
|
|
82
|
-
│ └── start.ts # Entry point
|
|
83
|
-
└── tests/
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
## Minimal Example
|
|
87
|
-
|
|
88
|
-
**`src/start.ts`:**
|
|
89
|
-
```typescript
|
|
90
|
-
import { initMcpServer, McpServerData } from 'fa-mcp-sdk';
|
|
91
|
-
import { tools } from './tools/tools.js';
|
|
92
|
-
import { handleToolCall } from './tools/handle-tool-call.js';
|
|
93
|
-
|
|
94
|
-
const serverData: McpServerData = {
|
|
95
|
-
tools,
|
|
96
|
-
toolHandler: handleToolCall,
|
|
97
|
-
agentBrief: 'My MCP Server',
|
|
98
|
-
agentPrompt: 'You are a helpful assistant.',
|
|
99
|
-
};
|
|
100
|
-
|
|
101
|
-
await initMcpServer(serverData);
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
**`src/tools/tools.ts`:**
|
|
105
|
-
```typescript
|
|
106
|
-
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
107
|
-
|
|
108
|
-
export const tools: Tool[] = [{
|
|
109
|
-
name: 'hello',
|
|
110
|
-
description: 'Say hello',
|
|
111
|
-
inputSchema: {
|
|
112
|
-
type: 'object',
|
|
113
|
-
properties: { name: { type: 'string', description: 'Name to greet' } },
|
|
114
|
-
required: ['name']
|
|
115
|
-
}
|
|
116
|
-
}];
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
**`src/tools/handle-tool-call.ts`:**
|
|
120
|
-
```typescript
|
|
121
|
-
import { formatToolResult, ToolExecutionError } from 'fa-mcp-sdk';
|
|
122
|
-
|
|
123
|
-
export const handleToolCall = async (params: { name: string; arguments?: any }): Promise<any> => {
|
|
124
|
-
const { name, arguments: args } = params;
|
|
125
|
-
switch (name) {
|
|
126
|
-
case 'hello':
|
|
127
|
-
return formatToolResult({ message: `Hello, ${args.name}!` });
|
|
128
|
-
default:
|
|
129
|
-
throw new ToolExecutionError(name, `Unknown tool: ${name}`);
|
|
130
|
-
}
|
|
131
|
-
};
|
|
132
|
-
```
|
|
1
|
+
# FA-MCP-SDK Documentation Index
|
|
2
|
+
|
|
3
|
+
TypeScript framework for building MCP servers.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install fa-mcp-sdk
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Documentation Structure
|
|
12
|
+
|
|
13
|
+
| File | Content | Read When |
|
|
14
|
+
|------|---------|-----------|
|
|
15
|
+
| [01-getting-started](01-getting-started.md) | `initMcpServer()`, `McpServerData`, `IPromptData`, `IResourceData`, `AppConfig` | Starting new project |
|
|
16
|
+
| [02-1-tools-and-api](02-1-tools-and-api.md) | Tool definitions, `toolHandler`, outbound webhooks, REST API with tsoa, OpenAPI/Swagger | Creating tools, REST endpoints, webhook callbacks |
|
|
17
|
+
| [02-2-prompts-and-resources](02-2-prompts-and-resources.md) | Standard/custom prompts, resources, `requireAuth` | Configuring prompts/resources |
|
|
18
|
+
| [03-configuration](03-configuration.md) | `appConfig`, YAML config, access points for external services, cache | Server configuration, external services |
|
|
19
|
+
| [04-authentication](04-authentication.md) | JWT, Basic auth, server tokens, `createAuthMW()`, Token Generator, CLI Token Generator, JWT Generation API | Authentication setup |
|
|
20
|
+
| [05-ad-authorization](05-ad-authorization.md) | AD group authorization at HTTP/tool levels | AD group restrictions |
|
|
21
|
+
| [06-utilities](06-utilities.md) | `ServerError`, `normalizeHeaders`, logging, Consul, graceful shutdown | Error handling, utilities |
|
|
22
|
+
| [07-testing-and-operations](07-testing-and-operations.md) | Test clients (STDIO, HTTP, SSE, Streamable HTTP) | Testing, deployment |
|
|
23
|
+
| [08-agent-tester-and-headless-api](08-agent-tester-and-headless-api.md) | Agent Tester, Headless API, structured logging, automated testing, UI `data-testid` reference | Agent-driven tool development, CLI automation, UI E2E tests |
|
|
24
|
+
| [09-database](09-database.md) | PostgreSQL sugar layer (`queryMAIN`, `execMAIN`, `getInsertSqlMAIN`, `getMergeSqlMAIN`, `mergeByBatch`), `pgvector`, secondary DBs | Database access, upserts, batching |
|
|
25
|
+
|
|
26
|
+
## Key Exports
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
// Core
|
|
30
|
+
import { initMcpServer, McpServerData, appConfig, getProjectData, getSafeAppConfig, ROOT_PROJECT_DIR } from 'fa-mcp-sdk';
|
|
31
|
+
|
|
32
|
+
// Auth
|
|
33
|
+
import { createAuthMW, generateToken, getAuthHeadersForTests, TTokenType, generateTokenApp } from 'fa-mcp-sdk';
|
|
34
|
+
|
|
35
|
+
// Tools & Errors
|
|
36
|
+
import { formatToolResult, ToolExecutionError, ServerError, BaseMcpError, ValidationError, getTools } from 'fa-mcp-sdk';
|
|
37
|
+
|
|
38
|
+
// Database & Cache
|
|
39
|
+
import {
|
|
40
|
+
queryMAIN, queryRsMAIN, oneRowMAIN, execMAIN,
|
|
41
|
+
getInsertSqlMAIN, getMergeSqlMAIN, mergeByBatch,
|
|
42
|
+
checkMainDB, getMainDBConnectionStatus,
|
|
43
|
+
IQueryPgArgsCOptional,
|
|
44
|
+
getCache,
|
|
45
|
+
} from 'fa-mcp-sdk';
|
|
46
|
+
|
|
47
|
+
// Utilities
|
|
48
|
+
import { logger, fileLogger, Logger, trim, ppj, toError, toStr, normalizeHeaders } from 'fa-mcp-sdk';
|
|
49
|
+
|
|
50
|
+
// Test Clients
|
|
51
|
+
import { McpHttpClient, McpStdioClient, McpSseClient, McpStreamableHttpClient } from 'fa-mcp-sdk';
|
|
52
|
+
|
|
53
|
+
// AD Groups
|
|
54
|
+
import { initADGroupChecker, IADConfig, IDcConfig } from 'fa-mcp-sdk';
|
|
55
|
+
|
|
56
|
+
// OpenAPI
|
|
57
|
+
import { configureOpenAPI, OpenAPISpecResponse, SwaggerUIConfig } from 'fa-mcp-sdk';
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Project Structure
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
my-mcp-server/
|
|
64
|
+
├── config/
|
|
65
|
+
│ ├── default.yaml # Base configuration
|
|
66
|
+
│ ├── development.yaml # Dev overrides
|
|
67
|
+
│ ├── local.yaml # Local secrets (gitignored)
|
|
68
|
+
│ └── production.yaml # Prod overrides
|
|
69
|
+
├── src/
|
|
70
|
+
│ ├── _types_/
|
|
71
|
+
│ │ └── custom-config.ts # Custom config interface
|
|
72
|
+
│ ├── api/
|
|
73
|
+
│ │ └── router.ts # REST endpoints (tsoa)
|
|
74
|
+
│ ├── prompts/
|
|
75
|
+
│ │ ├── agent-brief.ts # Short agent description
|
|
76
|
+
│ │ ├── agent-prompt.ts # Full agent prompt
|
|
77
|
+
│ │ └── custom-prompts.ts # Additional prompts
|
|
78
|
+
│ ├── tools/
|
|
79
|
+
│ │ ├── handle-tool-call.ts # Tool execution
|
|
80
|
+
│ │ └── tools.ts # Tool definitions
|
|
81
|
+
│ ├── custom-resources.ts # Custom MCP resources
|
|
82
|
+
│ └── start.ts # Entry point
|
|
83
|
+
└── tests/
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Minimal Example
|
|
87
|
+
|
|
88
|
+
**`src/start.ts`:**
|
|
89
|
+
```typescript
|
|
90
|
+
import { initMcpServer, McpServerData } from 'fa-mcp-sdk';
|
|
91
|
+
import { tools } from './tools/tools.js';
|
|
92
|
+
import { handleToolCall } from './tools/handle-tool-call.js';
|
|
93
|
+
|
|
94
|
+
const serverData: McpServerData = {
|
|
95
|
+
tools,
|
|
96
|
+
toolHandler: handleToolCall,
|
|
97
|
+
agentBrief: 'My MCP Server',
|
|
98
|
+
agentPrompt: 'You are a helpful assistant.',
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
await initMcpServer(serverData);
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
**`src/tools/tools.ts`:**
|
|
105
|
+
```typescript
|
|
106
|
+
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
107
|
+
|
|
108
|
+
export const tools: Tool[] = [{
|
|
109
|
+
name: 'hello',
|
|
110
|
+
description: 'Say hello',
|
|
111
|
+
inputSchema: {
|
|
112
|
+
type: 'object',
|
|
113
|
+
properties: { name: { type: 'string', description: 'Name to greet' } },
|
|
114
|
+
required: ['name']
|
|
115
|
+
}
|
|
116
|
+
}];
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**`src/tools/handle-tool-call.ts`:**
|
|
120
|
+
```typescript
|
|
121
|
+
import { formatToolResult, ToolExecutionError } from 'fa-mcp-sdk';
|
|
122
|
+
|
|
123
|
+
export const handleToolCall = async (params: { name: string; arguments?: any }): Promise<any> => {
|
|
124
|
+
const { name, arguments: args } = params;
|
|
125
|
+
switch (name) {
|
|
126
|
+
case 'hello':
|
|
127
|
+
return formatToolResult({ message: `Hello, ${args.name}!` });
|
|
128
|
+
default:
|
|
129
|
+
throw new ToolExecutionError(name, `Unknown tool: ${name}`);
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
```
|
|
@@ -1,146 +1,146 @@
|
|
|
1
|
-
# Getting Started
|
|
2
|
-
|
|
3
|
-
## initMcpServer(data: McpServerData): Promise<void>
|
|
4
|
-
|
|
5
|
-
Primary function for starting your MCP server.
|
|
6
|
-
|
|
7
|
-
```typescript
|
|
8
|
-
import { initMcpServer, McpServerData, CustomAuthValidator } from 'fa-mcp-sdk';
|
|
9
|
-
import { tools } from './tools/tools.js';
|
|
10
|
-
import { handleToolCall } from './tools/handle-tool-call.js';
|
|
11
|
-
|
|
12
|
-
const serverData: McpServerData = {
|
|
13
|
-
tools,
|
|
14
|
-
toolHandler: handleToolCall,
|
|
15
|
-
agentBrief: 'My agent description',
|
|
16
|
-
agentPrompt: 'Full agent instructions',
|
|
17
|
-
customAuthValidator: async (req) => { /* custom auth logic */ },
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
await initMcpServer(serverData);
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## Core Types
|
|
24
|
-
|
|
25
|
-
### McpServerData
|
|
26
|
-
|
|
27
|
-
```typescript
|
|
28
|
-
interface McpServerData {
|
|
29
|
-
tools: Tool[] | (() => Promise<Tool[]>); // Tool definitions
|
|
30
|
-
toolHandler: (params: IToolHandlerParams) => Promise<any>;
|
|
31
|
-
agentBrief: string; // Brief description
|
|
32
|
-
agentPrompt: string; // System prompt
|
|
33
|
-
customPrompts?: IPromptData[]; // Additional prompts
|
|
34
|
-
usedHttpHeaders?: IUsedHttpHeader[] | null; // HTTP headers for auth
|
|
35
|
-
customResources?: IResourceData[] | null; // Custom resources
|
|
36
|
-
customAuthValidator?: CustomAuthValidator; // Runs FIRST: bypass or fallback to standard auth
|
|
37
|
-
tokenGenAuthHandler?: TokenGenAuthHandler; // Token Generator auth
|
|
38
|
-
httpComponents?: { apiRouter?: Router | null }; // Express router
|
|
39
|
-
assets?: { logoSvg?: string };
|
|
40
|
-
getConsulUIAddress?: (serviceId: string) => string;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
interface IToolHandlerParams {
|
|
44
|
-
name: string;
|
|
45
|
-
arguments?: any;
|
|
46
|
-
headers?: Record<string, string>;
|
|
47
|
-
payload?: { user: string; [key: string]: any }; // JWT payload if authenticated
|
|
48
|
-
transport?: 'stdio' | 'sse' | 'http';
|
|
49
|
-
}
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
### IPromptData
|
|
53
|
-
|
|
54
|
-
For custom prompts in `src/prompts/custom-prompts.ts`:
|
|
55
|
-
|
|
56
|
-
```typescript
|
|
57
|
-
interface IPromptData {
|
|
58
|
-
name: string;
|
|
59
|
-
description: string;
|
|
60
|
-
arguments: [];
|
|
61
|
-
content: string | ((request: IGetPromptRequest) => string | Promise<string>);
|
|
62
|
-
requireAuth?: boolean;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// Example:
|
|
66
|
-
export const customPrompts: IPromptData[] = [{
|
|
67
|
-
name: 'custom_prompt',
|
|
68
|
-
description: 'A custom prompt',
|
|
69
|
-
arguments: [],
|
|
70
|
-
content: (request) => `Content with param: ${request.params.arguments?.sample}`,
|
|
71
|
-
}];
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
### IResourceData
|
|
75
|
-
|
|
76
|
-
For custom resources in `src/custom-resources.ts`:
|
|
77
|
-
|
|
78
|
-
```typescript
|
|
79
|
-
interface IResourceData {
|
|
80
|
-
uri: string; // e.g., "custom-resource://data1"
|
|
81
|
-
name: string;
|
|
82
|
-
title?: string;
|
|
83
|
-
description: string;
|
|
84
|
-
mimeType: string; // e.g., "text/plain", "application/json"
|
|
85
|
-
content: string | object | ((uri: string) => string | Promise<string>);
|
|
86
|
-
requireAuth?: boolean;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Example:
|
|
90
|
-
export const customResources: IResourceData[] = [{
|
|
91
|
-
uri: 'custom-resource://resource1',
|
|
92
|
-
name: 'resource1',
|
|
93
|
-
description: 'Dynamic content example',
|
|
94
|
-
mimeType: 'text/plain',
|
|
95
|
-
content: (uri) => `Dynamic content for ${uri}`,
|
|
96
|
-
}];
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
## Configuration API
|
|
100
|
-
|
|
101
|
-
### appConfig
|
|
102
|
-
|
|
103
|
-
Singleton with merged configuration from YAML files and environment variables:
|
|
104
|
-
|
|
105
|
-
```typescript
|
|
106
|
-
import { appConfig, AppConfig } from 'fa-mcp-sdk';
|
|
107
|
-
|
|
108
|
-
const port = appConfig.webServer.port;
|
|
109
|
-
const serviceName = appConfig.name;
|
|
110
|
-
const isAuthEnabled = appConfig.webServer.auth.enabled;
|
|
111
|
-
|
|
112
|
-
// Nested config access
|
|
113
|
-
const dbHost = appConfig.db.postgres.dbs.main.host;
|
|
114
|
-
const rateLimit = appConfig.mcp.rateLimit.maxRequests;
|
|
115
|
-
const dbEnabled = appConfig.isMainDBUsed;
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
| Property | Description |
|
|
119
|
-
|----------|-------------|
|
|
120
|
-
| `name` | Package name from package.json |
|
|
121
|
-
| `shortName` | Name without 'mcp' suffix |
|
|
122
|
-
| `version` | Package version |
|
|
123
|
-
| `webServer` | HTTP server config (host, port, auth) |
|
|
124
|
-
| `mcp` | MCP settings (transportType, rateLimit, tools.answerAs, tools.hideAnnotations) |
|
|
125
|
-
| `logger` | Logging config |
|
|
126
|
-
| `ad` | Active Directory config |
|
|
127
|
-
| `consul` | Service discovery settings |
|
|
128
|
-
| `homePage` | Home page footer settings (help link) |
|
|
129
|
-
|
|
130
|
-
### getProjectData(): McpServerData
|
|
131
|
-
|
|
132
|
-
Returns the data passed to `initMcpServer()`.
|
|
133
|
-
|
|
134
|
-
```typescript
|
|
135
|
-
const projectData = getProjectData();
|
|
136
|
-
console.log(projectData.agentBrief, projectData.tools.length);
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
### getSafeAppConfig(): any
|
|
140
|
-
|
|
141
|
-
Returns config clone with sensitive data masked. Use for logging:
|
|
142
|
-
|
|
143
|
-
```typescript
|
|
144
|
-
const safeConfig = getSafeAppConfig();
|
|
145
|
-
console.log(JSON.stringify(safeConfig, null, 2)); // passwords masked
|
|
146
|
-
```
|
|
1
|
+
# Getting Started
|
|
2
|
+
|
|
3
|
+
## initMcpServer(data: McpServerData): Promise<void>
|
|
4
|
+
|
|
5
|
+
Primary function for starting your MCP server.
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { initMcpServer, McpServerData, CustomAuthValidator } from 'fa-mcp-sdk';
|
|
9
|
+
import { tools } from './tools/tools.js';
|
|
10
|
+
import { handleToolCall } from './tools/handle-tool-call.js';
|
|
11
|
+
|
|
12
|
+
const serverData: McpServerData = {
|
|
13
|
+
tools,
|
|
14
|
+
toolHandler: handleToolCall,
|
|
15
|
+
agentBrief: 'My agent description',
|
|
16
|
+
agentPrompt: 'Full agent instructions',
|
|
17
|
+
customAuthValidator: async (req) => { /* custom auth logic */ },
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
await initMcpServer(serverData);
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Core Types
|
|
24
|
+
|
|
25
|
+
### McpServerData
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
interface McpServerData {
|
|
29
|
+
tools: Tool[] | (() => Promise<Tool[]>); // Tool definitions
|
|
30
|
+
toolHandler: (params: IToolHandlerParams) => Promise<any>;
|
|
31
|
+
agentBrief: string; // Brief description
|
|
32
|
+
agentPrompt: string; // System prompt
|
|
33
|
+
customPrompts?: IPromptData[]; // Additional prompts
|
|
34
|
+
usedHttpHeaders?: IUsedHttpHeader[] | null; // HTTP headers for auth
|
|
35
|
+
customResources?: IResourceData[] | null; // Custom resources
|
|
36
|
+
customAuthValidator?: CustomAuthValidator; // Runs FIRST: bypass or fallback to standard auth
|
|
37
|
+
tokenGenAuthHandler?: TokenGenAuthHandler; // Token Generator auth
|
|
38
|
+
httpComponents?: { apiRouter?: Router | null }; // Express router
|
|
39
|
+
assets?: { logoSvg?: string };
|
|
40
|
+
getConsulUIAddress?: (serviceId: string) => string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
interface IToolHandlerParams {
|
|
44
|
+
name: string;
|
|
45
|
+
arguments?: any;
|
|
46
|
+
headers?: Record<string, string>;
|
|
47
|
+
payload?: { user: string; [key: string]: any }; // JWT payload if authenticated
|
|
48
|
+
transport?: 'stdio' | 'sse' | 'http';
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### IPromptData
|
|
53
|
+
|
|
54
|
+
For custom prompts in `src/prompts/custom-prompts.ts`:
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
interface IPromptData {
|
|
58
|
+
name: string;
|
|
59
|
+
description: string;
|
|
60
|
+
arguments: [];
|
|
61
|
+
content: string | ((request: IGetPromptRequest) => string | Promise<string>);
|
|
62
|
+
requireAuth?: boolean;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Example:
|
|
66
|
+
export const customPrompts: IPromptData[] = [{
|
|
67
|
+
name: 'custom_prompt',
|
|
68
|
+
description: 'A custom prompt',
|
|
69
|
+
arguments: [],
|
|
70
|
+
content: (request) => `Content with param: ${request.params.arguments?.sample}`,
|
|
71
|
+
}];
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### IResourceData
|
|
75
|
+
|
|
76
|
+
For custom resources in `src/custom-resources.ts`:
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
interface IResourceData {
|
|
80
|
+
uri: string; // e.g., "custom-resource://data1"
|
|
81
|
+
name: string;
|
|
82
|
+
title?: string;
|
|
83
|
+
description: string;
|
|
84
|
+
mimeType: string; // e.g., "text/plain", "application/json"
|
|
85
|
+
content: string | object | ((uri: string) => string | Promise<string>);
|
|
86
|
+
requireAuth?: boolean;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Example:
|
|
90
|
+
export const customResources: IResourceData[] = [{
|
|
91
|
+
uri: 'custom-resource://resource1',
|
|
92
|
+
name: 'resource1',
|
|
93
|
+
description: 'Dynamic content example',
|
|
94
|
+
mimeType: 'text/plain',
|
|
95
|
+
content: (uri) => `Dynamic content for ${uri}`,
|
|
96
|
+
}];
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## Configuration API
|
|
100
|
+
|
|
101
|
+
### appConfig
|
|
102
|
+
|
|
103
|
+
Singleton with merged configuration from YAML files and environment variables:
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
import { appConfig, AppConfig } from 'fa-mcp-sdk';
|
|
107
|
+
|
|
108
|
+
const port = appConfig.webServer.port;
|
|
109
|
+
const serviceName = appConfig.name;
|
|
110
|
+
const isAuthEnabled = appConfig.webServer.auth.enabled;
|
|
111
|
+
|
|
112
|
+
// Nested config access
|
|
113
|
+
const dbHost = appConfig.db.postgres.dbs.main.host;
|
|
114
|
+
const rateLimit = appConfig.mcp.rateLimit.maxRequests;
|
|
115
|
+
const dbEnabled = appConfig.isMainDBUsed;
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
| Property | Description |
|
|
119
|
+
|----------|-------------|
|
|
120
|
+
| `name` | Package name from package.json |
|
|
121
|
+
| `shortName` | Name without 'mcp' suffix |
|
|
122
|
+
| `version` | Package version |
|
|
123
|
+
| `webServer` | HTTP server config (host, port, auth) |
|
|
124
|
+
| `mcp` | MCP settings (transportType, rateLimit, tools.answerAs, tools.hideAnnotations) |
|
|
125
|
+
| `logger` | Logging config |
|
|
126
|
+
| `ad` | Active Directory config |
|
|
127
|
+
| `consul` | Service discovery settings |
|
|
128
|
+
| `homePage` | Home page footer settings (help link) |
|
|
129
|
+
|
|
130
|
+
### getProjectData(): McpServerData
|
|
131
|
+
|
|
132
|
+
Returns the data passed to `initMcpServer()`.
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
const projectData = getProjectData();
|
|
136
|
+
console.log(projectData.agentBrief, projectData.tools.length);
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### getSafeAppConfig(): any
|
|
140
|
+
|
|
141
|
+
Returns config clone with sensitive data masked. Use for logging:
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
const safeConfig = getSafeAppConfig();
|
|
145
|
+
console.log(JSON.stringify(safeConfig, null, 2)); // passwords masked
|
|
146
|
+
```
|