fa-mcp-sdk 0.4.3 → 0.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/bin/fa-mcp.js +1040 -1039
  2. package/cli-template/eslint.config.js +16 -136
  3. package/cli-template/package.json +9 -10
  4. package/cli-template/tsconfig.json +1 -0
  5. package/dist/core/_types_/active-directory-config.d.ts.map +1 -1
  6. package/dist/core/_types_/config.d.ts +1 -1
  7. package/dist/core/_types_/config.d.ts.map +1 -1
  8. package/dist/core/_types_/types.d.ts.map +1 -1
  9. package/dist/core/ad/group-checker.d.ts.map +1 -1
  10. package/dist/core/ad/group-checker.js.map +1 -1
  11. package/dist/core/agent-tester/agent-tester-router.d.ts.map +1 -1
  12. package/dist/core/agent-tester/agent-tester-router.js +8 -8
  13. package/dist/core/agent-tester/agent-tester-router.js.map +1 -1
  14. package/dist/core/agent-tester/check-llm.d.ts.map +1 -1
  15. package/dist/core/agent-tester/check-llm.js +1 -1
  16. package/dist/core/agent-tester/check-llm.js.map +1 -1
  17. package/dist/core/agent-tester/services/TesterAgentService.d.ts.map +1 -1
  18. package/dist/core/agent-tester/services/TesterAgentService.js +53 -53
  19. package/dist/core/agent-tester/services/TesterAgentService.js.map +1 -1
  20. package/dist/core/agent-tester/services/TesterMcpClientService.d.ts.map +1 -1
  21. package/dist/core/agent-tester/services/TesterMcpClientService.js +2 -2
  22. package/dist/core/agent-tester/services/TesterMcpClientService.js.map +1 -1
  23. package/dist/core/auth/admin-auth.d.ts.map +1 -1
  24. package/dist/core/auth/admin-auth.js +3 -3
  25. package/dist/core/auth/admin-auth.js.map +1 -1
  26. package/dist/core/auth/basic.d.ts.map +1 -1
  27. package/dist/core/auth/basic.js.map +1 -1
  28. package/dist/core/auth/jwt.d.ts.map +1 -1
  29. package/dist/core/auth/jwt.js +6 -16
  30. package/dist/core/auth/jwt.js.map +1 -1
  31. package/dist/core/auth/middleware.d.ts.map +1 -1
  32. package/dist/core/auth/middleware.js +3 -2
  33. package/dist/core/auth/middleware.js.map +1 -1
  34. package/dist/core/auth/multi-auth.d.ts +0 -3
  35. package/dist/core/auth/multi-auth.d.ts.map +1 -1
  36. package/dist/core/auth/multi-auth.js +10 -7
  37. package/dist/core/auth/multi-auth.js.map +1 -1
  38. package/dist/core/auth/permanent.d.ts.map +1 -1
  39. package/dist/core/auth/permanent.js +1 -1
  40. package/dist/core/auth/permanent.js.map +1 -1
  41. package/dist/core/auth/token-generator/ntlm/ntlm-auth-options.d.ts.map +1 -1
  42. package/dist/core/auth/token-generator/ntlm/ntlm-auth-options.js +2 -2
  43. package/dist/core/auth/token-generator/ntlm/ntlm-auth-options.js.map +1 -1
  44. package/dist/core/auth/token-generator/ntlm/ntlm-domain-config.d.ts.map +1 -1
  45. package/dist/core/auth/token-generator/ntlm/ntlm-domain-config.js +1 -1
  46. package/dist/core/auth/token-generator/ntlm/ntlm-domain-config.js.map +1 -1
  47. package/dist/core/auth/token-generator/ntlm/ntlm-integration.d.ts.map +1 -1
  48. package/dist/core/auth/token-generator/ntlm/ntlm-integration.js +1 -1
  49. package/dist/core/auth/token-generator/ntlm/ntlm-integration.js.map +1 -1
  50. package/dist/core/auth/token-generator/ntlm/ntlm-templates.d.ts.map +1 -1
  51. package/dist/core/auth/token-generator/ntlm/ntlm-templates.js +222 -221
  52. package/dist/core/auth/token-generator/ntlm/ntlm-templates.js.map +1 -1
  53. package/dist/core/auth/token-generator/server.d.ts.map +1 -1
  54. package/dist/core/auth/token-generator/server.js +8 -8
  55. package/dist/core/auth/token-generator/server.js.map +1 -1
  56. package/dist/core/bootstrap/init-config.d.ts.map +1 -1
  57. package/dist/core/bootstrap/init-config.js +4 -4
  58. package/dist/core/bootstrap/init-config.js.map +1 -1
  59. package/dist/core/bootstrap/startup-info.d.ts.map +1 -1
  60. package/dist/core/bootstrap/startup-info.js +4 -4
  61. package/dist/core/bootstrap/startup-info.js.map +1 -1
  62. package/dist/core/cache/cache.d.ts.map +1 -1
  63. package/dist/core/cache/cache.js +3 -3
  64. package/dist/core/cache/cache.js.map +1 -1
  65. package/dist/core/consul/access-points-updater.d.ts.map +1 -1
  66. package/dist/core/consul/access-points-updater.js +3 -3
  67. package/dist/core/consul/access-points-updater.js.map +1 -1
  68. package/dist/core/consul/deregister.d.ts.map +1 -1
  69. package/dist/core/consul/deregister.js +1 -1
  70. package/dist/core/consul/deregister.js.map +1 -1
  71. package/dist/core/consul/get-consul-api.d.ts.map +1 -1
  72. package/dist/core/consul/get-consul-api.js +3 -3
  73. package/dist/core/consul/get-consul-api.js.map +1 -1
  74. package/dist/core/db/pg-db.d.ts +1 -1
  75. package/dist/core/db/pg-db.d.ts.map +1 -1
  76. package/dist/core/db/pg-db.js +2 -2
  77. package/dist/core/db/pg-db.js.map +1 -1
  78. package/dist/core/debug.js +1 -1
  79. package/dist/core/debug.js.map +1 -1
  80. package/dist/core/init-mcp-server.d.ts.map +1 -1
  81. package/dist/core/init-mcp-server.js +9 -9
  82. package/dist/core/init-mcp-server.js.map +1 -1
  83. package/dist/core/logger.d.ts.map +1 -1
  84. package/dist/core/logger.js +3 -3
  85. package/dist/core/logger.js.map +1 -1
  86. package/dist/core/mcp/create-mcp-server.d.ts.map +1 -1
  87. package/dist/core/mcp/create-mcp-server.js +1 -1
  88. package/dist/core/mcp/create-mcp-server.js.map +1 -1
  89. package/dist/core/mcp/prompts.d.ts.map +1 -1
  90. package/dist/core/mcp/prompts.js +1 -3
  91. package/dist/core/mcp/prompts.js.map +1 -1
  92. package/dist/core/mcp/resources.d.ts.map +1 -1
  93. package/dist/core/mcp/resources.js +8 -10
  94. package/dist/core/mcp/resources.js.map +1 -1
  95. package/dist/core/mcp/server-stdio.d.ts.map +1 -1
  96. package/dist/core/mcp/server-stdio.js.map +1 -1
  97. package/dist/core/utils/formatToolResult.d.ts.map +1 -1
  98. package/dist/core/utils/formatToolResult.js +1 -3
  99. package/dist/core/utils/formatToolResult.js.map +1 -1
  100. package/dist/core/utils/port-checker.d.ts.map +1 -1
  101. package/dist/core/utils/port-checker.js +1 -1
  102. package/dist/core/utils/port-checker.js.map +1 -1
  103. package/dist/core/utils/rate-limit.js +2 -2
  104. package/dist/core/utils/testing/McpSseClient.d.ts.map +1 -1
  105. package/dist/core/utils/testing/McpSseClient.js.map +1 -1
  106. package/dist/core/utils/testing/McpStdioClient.d.ts.map +1 -1
  107. package/dist/core/utils/testing/McpStdioClient.js.map +1 -1
  108. package/dist/core/utils/utils.d.ts.map +1 -1
  109. package/dist/core/utils/utils.js.map +1 -1
  110. package/dist/core/web/admin-router.d.ts.map +1 -1
  111. package/dist/core/web/admin-router.js +4 -4
  112. package/dist/core/web/admin-router.js.map +1 -1
  113. package/dist/core/web/cors.d.ts.map +1 -1
  114. package/dist/core/web/cors.js.map +1 -1
  115. package/dist/core/web/favicon-svg.d.ts.map +1 -1
  116. package/dist/core/web/favicon-svg.js.map +1 -1
  117. package/dist/core/web/home-api.d.ts.map +1 -1
  118. package/dist/core/web/home-api.js +4 -4
  119. package/dist/core/web/home-api.js.map +1 -1
  120. package/dist/core/web/openapi.d.ts.map +1 -1
  121. package/dist/core/web/openapi.js.map +1 -1
  122. package/dist/core/web/server-http.d.ts.map +1 -1
  123. package/dist/core/web/server-http.js +20 -22
  124. package/dist/core/web/server-http.js.map +1 -1
  125. package/dist/core/web/static/agent-tester/script.js +1503 -1513
  126. package/dist/core/web/static/home/script.js +646 -646
  127. package/dist/core/web/static/token-gen/script.js +561 -561
  128. package/dist/core/web/svg-icons.d.ts.map +1 -1
  129. package/dist/core/web/svg-icons.js +1 -1
  130. package/dist/core/web/svg-icons.js.map +1 -1
  131. package/package.json +2 -6
  132. package/scripts/copy-static.js +31 -31
  133. package/scripts/kill-port.js +107 -107
  134. package/scripts/npm/patch_node_modules.js +8 -8
  135. package/scripts/npm/run.js +31 -31
  136. package/scripts/remove-nul.js +53 -53
  137. package/scripts/update-doc.js +18 -18
  138. package/src/template/_types_/custom-config.ts +83 -83
  139. package/src/template/api/router.ts +86 -89
  140. package/src/template/custom-resources.ts +11 -11
  141. package/src/template/prompts/agent-brief.ts +8 -8
  142. package/src/template/prompts/agent-prompt.ts +10 -10
  143. package/src/template/prompts/custom-prompts.ts +12 -12
  144. package/src/template/start.ts +71 -72
  145. package/src/template/tools/handle-tool-call.ts +57 -56
  146. package/src/template/tools/tools.ts +89 -88
  147. package/src/tests/jest-simple-reporter.js +10 -10
  148. package/src/tests/mcp/sse/test-sse-npm-package.js +96 -96
  149. package/src/tests/mcp/test-cases.js +143 -143
  150. package/src/tests/mcp/test-http.js +76 -75
  151. package/src/tests/mcp/test-sse.js +80 -79
  152. package/src/tests/mcp/test-stdio.js +83 -81
  153. package/src/tests/utils.ts +157 -156
@@ -1,143 +1,143 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * Shared test cases for the template MCP server (src/template)
5
- * Covers: prompts, resources, tools
6
- *
7
- * Each test case is a function(client) -> Promise<{ name, passed, details? }>
8
- * where client provides methods:
9
- * - listPrompts(), getPrompt(name, args?)
10
- * - listResources(), readResource(uri)
11
- * - listTools(), callTool(name, args?)
12
- */
13
-
14
- const ok = (name, details) => ({ name, passed: true, details });
15
- const fail = (name, details) => ({ name, passed: false, details });
16
-
17
- // Utility: extract system text from prompts/get response
18
- const extractPromptText = (resp) => {
19
- // resp may be raw result or wrapped; support both shapes used by clients
20
- const r = resp?.result || resp;
21
- const msg = r?.messages?.[0];
22
- const text = msg?.content?.text || msg?.content?.[0]?.text || r?.messages?.[0]?.content?.[0]?.text;
23
- return typeof text === 'string' ? text : undefined;
24
- };
25
-
26
- export const TEMPLATE_TESTS = {
27
- prompts: [
28
- async (client) => {
29
- const name = 'List prompts contains agent_brief and agent_prompt';
30
- try {
31
- const list = await client.listPrompts();
32
- const prompts = list?.prompts || list;
33
- const names = Array.isArray(prompts) ? prompts.map(p => p.name) : [];
34
- const okBrief = names.includes('agent_brief');
35
- const okPrompt = names.includes('agent_prompt');
36
- return (okBrief && okPrompt) ? ok(name, { names }) : fail(name, { names });
37
- } catch (e) {
38
- return fail(name, { error: e?.message });
39
- }
40
- },
41
- async (client) => {
42
- const name = 'Get agent_brief returns text';
43
- try {
44
- const resp = await client.getPrompt('agent_brief');
45
- const text = extractPromptText(resp);
46
- return text ? ok(name, { text }) : fail(name, { text });
47
- } catch (e) {
48
- return fail(name, { error: e?.message });
49
- }
50
- },
51
- async (client) => {
52
- const name = 'Get agent_prompt returns text';
53
- try {
54
- const resp = await client.getPrompt('agent_prompt');
55
- const text = extractPromptText(resp);
56
- return text ? ok(name, { text }) : fail(name, { text });
57
- } catch (e) {
58
- return fail(name, { error: e?.message });
59
- }
60
- },
61
- async (client) => {
62
- const name = 'Get custom_prompt returns dynamic text';
63
- try {
64
- const resp = await client.getPrompt('custom_prompt', { sample: '1' });
65
- const text = extractPromptText(resp);
66
- const hasWord = typeof text === 'string' && text.includes('Custom prompt content');
67
- return hasWord ? ok(name, { text }) : fail(name, { text });
68
- } catch (e) {
69
- return fail(name, { error: e?.message });
70
- }
71
- },
72
- ],
73
-
74
- resources: [
75
- async (client) => {
76
- const name = 'List resources contains custom-resource://resource1';
77
- try {
78
- const list = await client.listResources();
79
- const resources = list?.resources || list;
80
- const uris = Array.isArray(resources) ? resources.map(r => r.uri) : [];
81
- const found = uris.includes('custom-resource://resource1');
82
- return found ? ok(name, { uris }) : fail(name, { uris });
83
- } catch (e) {
84
- return fail(name, { error: e?.message });
85
- }
86
- },
87
- async (client) => {
88
- const name = 'Read resource custom-resource://resource1 returns content';
89
- try {
90
- const resp = await client.readResource('custom-resource://resource1');
91
- // Different clients return differently; normalize
92
- const r = resp?.result || resp;
93
- const text = r?.resource?.text || r?.contents?.[0]?.text || r?.text || r?.resource?.content;
94
- const okText = typeof text === 'string' && text.length > 0;
95
- return okText ? ok(name, { text }) : fail(name, { response: r });
96
- } catch (e) {
97
- return fail(name, { error: e?.message });
98
- }
99
- },
100
- ],
101
-
102
- tools: [
103
- async (client) => {
104
- const name = 'List tools contains example_tool and example_search';
105
- try {
106
- const list = await client.listTools();
107
- const tools = list?.tools || list;
108
- const names = Array.isArray(tools) ? tools.map(t => t.name) : [];
109
- const ok1 = names.includes('example_tool');
110
- const ok2 = names.includes('example_search');
111
- return (ok1 && ok2) ? ok(name, { names }) : fail(name, { names });
112
- } catch (e) {
113
- return fail(name, { error: e?.message });
114
- }
115
- },
116
- async (client) => {
117
- const name = 'Call example_tool returns formatted result';
118
- try {
119
- const resp = await client.callTool('example_tool', { query: 'ping' });
120
- const r = resp?.result || resp;
121
- // Both structuredContent and text are acceptable; check message echo
122
- const structured = r?.structuredContent;
123
- const text = r?.content?.[0]?.text;
124
- const hasProcessed = (structured && structured.message?.includes('Processed query'))
125
- || (typeof text === 'string' && text.includes('Processed query'));
126
- return hasProcessed ? ok(name, { response: r }) : fail(name, { response: r });
127
- } catch (e) {
128
- return fail(name, { error: e?.message });
129
- }
130
- },
131
- async (client) => {
132
- const name = 'Call example_tool without query should fail';
133
- try {
134
- await client.callTool('example_tool', {});
135
- return fail(name, { error: 'Expected failure, got success' });
136
- } catch (e) {
137
- return ok(name, { error: e?.message });
138
- }
139
- },
140
- ],
141
- };
142
-
143
- export default TEMPLATE_TESTS;
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Shared test cases for the template MCP server (src/template)
5
+ * Covers: prompts, resources, tools
6
+ *
7
+ * Each test case is a function(client) -> Promise<{ name, passed, details? }>
8
+ * where client provides methods:
9
+ * - listPrompts(), getPrompt(name, args?)
10
+ * - listResources(), readResource(uri)
11
+ * - listTools(), callTool(name, args?)
12
+ */
13
+
14
+ const ok = (name, details) => ({ name, passed: true, details });
15
+ const fail = (name, details) => ({ name, passed: false, details });
16
+
17
+ // Utility: extract system text from prompts/get response
18
+ const extractPromptText = (resp) => {
19
+ // resp may be raw result or wrapped; support both shapes used by clients
20
+ const r = resp?.result || resp;
21
+ const msg = r?.messages?.[0];
22
+ const text = msg?.content?.text || msg?.content?.[0]?.text || r?.messages?.[0]?.content?.[0]?.text;
23
+ return typeof text === 'string' ? text : undefined;
24
+ };
25
+
26
+ export const TEMPLATE_TESTS = {
27
+ prompts: [
28
+ async (client) => {
29
+ const name = 'List prompts contains agent_brief and agent_prompt';
30
+ try {
31
+ const list = await client.listPrompts();
32
+ const prompts = list?.prompts || list;
33
+ const names = Array.isArray(prompts) ? prompts.map(p => p.name) : [];
34
+ const okBrief = names.includes('agent_brief');
35
+ const okPrompt = names.includes('agent_prompt');
36
+ return (okBrief && okPrompt) ? ok(name, { names }) : fail(name, { names });
37
+ } catch (e) {
38
+ return fail(name, { error: e?.message });
39
+ }
40
+ },
41
+ async (client) => {
42
+ const name = 'Get agent_brief returns text';
43
+ try {
44
+ const resp = await client.getPrompt('agent_brief');
45
+ const text = extractPromptText(resp);
46
+ return text ? ok(name, { text }) : fail(name, { text });
47
+ } catch (e) {
48
+ return fail(name, { error: e?.message });
49
+ }
50
+ },
51
+ async (client) => {
52
+ const name = 'Get agent_prompt returns text';
53
+ try {
54
+ const resp = await client.getPrompt('agent_prompt');
55
+ const text = extractPromptText(resp);
56
+ return text ? ok(name, { text }) : fail(name, { text });
57
+ } catch (e) {
58
+ return fail(name, { error: e?.message });
59
+ }
60
+ },
61
+ async (client) => {
62
+ const name = 'Get custom_prompt returns dynamic text';
63
+ try {
64
+ const resp = await client.getPrompt('custom_prompt', { sample: '1' });
65
+ const text = extractPromptText(resp);
66
+ const hasWord = typeof text === 'string' && text.includes('Custom prompt content');
67
+ return hasWord ? ok(name, { text }) : fail(name, { text });
68
+ } catch (e) {
69
+ return fail(name, { error: e?.message });
70
+ }
71
+ },
72
+ ],
73
+
74
+ resources: [
75
+ async (client) => {
76
+ const name = 'List resources contains custom-resource://resource1';
77
+ try {
78
+ const list = await client.listResources();
79
+ const resources = list?.resources || list;
80
+ const uris = Array.isArray(resources) ? resources.map(r => r.uri) : [];
81
+ const found = uris.includes('custom-resource://resource1');
82
+ return found ? ok(name, { uris }) : fail(name, { uris });
83
+ } catch (e) {
84
+ return fail(name, { error: e?.message });
85
+ }
86
+ },
87
+ async (client) => {
88
+ const name = 'Read resource custom-resource://resource1 returns content';
89
+ try {
90
+ const resp = await client.readResource('custom-resource://resource1');
91
+ // Different clients return differently; normalize
92
+ const r = resp?.result || resp;
93
+ const text = r?.resource?.text || r?.contents?.[0]?.text || r?.text || r?.resource?.content;
94
+ const okText = typeof text === 'string' && text.length > 0;
95
+ return okText ? ok(name, { text }) : fail(name, { response: r });
96
+ } catch (e) {
97
+ return fail(name, { error: e?.message });
98
+ }
99
+ },
100
+ ],
101
+
102
+ tools: [
103
+ async (client) => {
104
+ const name = 'List tools contains example_tool and example_search';
105
+ try {
106
+ const list = await client.listTools();
107
+ const tools = list?.tools || list;
108
+ const names = Array.isArray(tools) ? tools.map(t => t.name) : [];
109
+ const ok1 = names.includes('example_tool');
110
+ const ok2 = names.includes('example_search');
111
+ return (ok1 && ok2) ? ok(name, { names }) : fail(name, { names });
112
+ } catch (e) {
113
+ return fail(name, { error: e?.message });
114
+ }
115
+ },
116
+ async (client) => {
117
+ const name = 'Call example_tool returns formatted result';
118
+ try {
119
+ const resp = await client.callTool('example_tool', { query: 'ping' });
120
+ const r = resp?.result || resp;
121
+ // Both structuredContent and text are acceptable; check message echo
122
+ const structured = r?.structuredContent;
123
+ const text = r?.content?.[0]?.text;
124
+ const hasProcessed = (structured && structured.message?.includes('Processed query'))
125
+ || (typeof text === 'string' && text.includes('Processed query'));
126
+ return hasProcessed ? ok(name, { response: r }) : fail(name, { response: r });
127
+ } catch (e) {
128
+ return fail(name, { error: e?.message });
129
+ }
130
+ },
131
+ async (client) => {
132
+ const name = 'Call example_tool without query should fail';
133
+ try {
134
+ await client.callTool('example_tool', {});
135
+ return fail(name, { error: 'Expected failure, got success' });
136
+ } catch (e) {
137
+ return ok(name, { error: e?.message });
138
+ }
139
+ },
140
+ ],
141
+ };
142
+
143
+ export default TEMPLATE_TESTS;
@@ -1,75 +1,76 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * HTTP transport tests for the template MCP server (src/template)
5
- * Uses McpHttpClient (simple POST requests)
6
- */
7
-
8
- import { appConfig, McpHttpClient, getAuthHeadersForTests } from '../../../dist/core/index.js';
9
- import TEMPLATE_TESTS from './test-cases.js';
10
-
11
- const baseUrl = (process.env.TEST_MCP_SERVER_URL || `http://localhost:${appConfig.webServer.port}`).replace(/\/+$/, '');
12
-
13
- async function runTestGroup (title, tests, client) {
14
- console.log(`\n${title}:`);
15
- let passed = 0;
16
- for (const test of tests) {
17
- try {
18
- const res = await test(client);
19
- if (res.passed) {
20
- console.log(` ✅ ${res.name}`);
21
- passed++;
22
- } else {
23
- console.log(` ❌ ${res.name}`);
24
- if (res.details) {
25
- console.log(' ', res.details);
26
- }
27
- }
28
- } catch (e) {
29
- console.log(` ❌ ${(await test).name || 'test'}:`, e.message);
30
- }
31
- }
32
- console.log(` Result: ${passed}/${tests.length} passed`);
33
- return passed;
34
- }
35
-
36
- async function main () {
37
- console.log('🧪 HTTP tests for template MCP server');
38
- console.log('='.repeat(60));
39
-
40
- // Get authentication headers based on config
41
- const headers = getAuthHeadersForTests();
42
- if (Object.keys(headers).length) {
43
- console.log(' Authentication enabled');
44
- } else if (appConfig.webServer?.auth?.enabled) {
45
- console.log('⚠️ Warning: Auth is enabled but no valid credentials found');
46
- }
47
-
48
- const client = new McpHttpClient(baseUrl, { headers });
49
- try {
50
- await client.initialize({
51
- protocolVersion: '2024-11-05',
52
- capabilities: { tools: {} },
53
- clientInfo: { name: 'http-test', version: '1.0.0' },
54
- });
55
-
56
- const p1 = await runTestGroup('Prompts', TEMPLATE_TESTS.prompts, client);
57
- const p2 = await runTestGroup('Resources', TEMPLATE_TESTS.resources, client);
58
- const p3 = await runTestGroup('Tools', TEMPLATE_TESTS.tools, client);
59
-
60
- const total = TEMPLATE_TESTS.prompts.length + TEMPLATE_TESTS.resources.length + TEMPLATE_TESTS.tools.length;
61
- const sum = p1 + p2 + p3;
62
- console.log(`\nSummary: ${sum}/${total} tests passed`);
63
- } finally {
64
- await client.close().catch(() => undefined);
65
- }
66
- }
67
-
68
- main()
69
- .then(() => {
70
- process.exit(0);
71
- })
72
- .catch((e) => {
73
- console.error('Test failed:', e?.message || e);
74
- process.exit(1);
75
- });
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * HTTP transport tests for the template MCP server (src/template)
5
+ * Uses McpHttpClient (simple POST requests)
6
+ */
7
+
8
+ import { appConfig, McpHttpClient, getAuthHeadersForTests } from '../../../dist/core/index.js';
9
+
10
+ import TEMPLATE_TESTS from './test-cases.js';
11
+
12
+ const baseUrl = (process.env.TEST_MCP_SERVER_URL || `http://localhost:${appConfig.webServer.port}`).replace(/\/+$/, '');
13
+
14
+ async function runTestGroup (title, tests, client) {
15
+ console.log(`\n${title}:`);
16
+ let passed = 0;
17
+ for (const test of tests) {
18
+ try {
19
+ const res = await test(client);
20
+ if (res.passed) {
21
+ console.log(` ✅ ${res.name}`);
22
+ passed++;
23
+ } else {
24
+ console.log(` ❌ ${res.name}`);
25
+ if (res.details) {
26
+ console.log(' ', res.details);
27
+ }
28
+ }
29
+ } catch (e) {
30
+ console.log(` ❌ ${(await test).name || 'test'}:`, e.message);
31
+ }
32
+ }
33
+ console.log(` Result: ${passed}/${tests.length} passed`);
34
+ return passed;
35
+ }
36
+
37
+ async function main () {
38
+ console.log('🧪 HTTP tests for template MCP server');
39
+ console.log('='.repeat(60));
40
+
41
+ // Get authentication headers based on config
42
+ const headers = getAuthHeadersForTests();
43
+ if (Object.keys(headers).length) {
44
+ console.log(' Authentication enabled');
45
+ } else if (appConfig.webServer?.auth?.enabled) {
46
+ console.log('⚠️ Warning: Auth is enabled but no valid credentials found');
47
+ }
48
+
49
+ const client = new McpHttpClient(baseUrl, { headers });
50
+ try {
51
+ await client.initialize({
52
+ protocolVersion: '2024-11-05',
53
+ capabilities: { tools: {} },
54
+ clientInfo: { name: 'http-test', version: '1.0.0' },
55
+ });
56
+
57
+ const p1 = await runTestGroup('Prompts', TEMPLATE_TESTS.prompts, client);
58
+ const p2 = await runTestGroup('Resources', TEMPLATE_TESTS.resources, client);
59
+ const p3 = await runTestGroup('Tools', TEMPLATE_TESTS.tools, client);
60
+
61
+ const total = TEMPLATE_TESTS.prompts.length + TEMPLATE_TESTS.resources.length + TEMPLATE_TESTS.tools.length;
62
+ const sum = p1 + p2 + p3;
63
+ console.log(`\nSummary: ${sum}/${total} tests passed`);
64
+ } finally {
65
+ await client.close().catch(() => undefined);
66
+ }
67
+ }
68
+
69
+ main()
70
+ .then(() => {
71
+ process.exit(0);
72
+ })
73
+ .catch((e) => {
74
+ console.error('Test failed:', e?.message || e);
75
+ process.exit(1);
76
+ });
@@ -1,79 +1,80 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * SSE transport tests for the template MCP server (src/template)
5
- * Uses McpSseClient to send requests via HTTP and receive responses via SSE
6
- */
7
-
8
- import { appConfig, McpSseClient, getAuthHeadersForTests } from '../../../dist/core/index.js';
9
- import TEMPLATE_TESTS from './test-cases.js';
10
-
11
- const baseUrl = (process.env.TEST_MCP_SERVER_URL || `http://localhost:${appConfig.webServer.port}`).replace(/\/+$/, '');
12
-
13
- async function runTestGroup (title, tests, client) {
14
- console.log(`\n${title}:`);
15
- let passed = 0;
16
- for (const test of tests) {
17
- try {
18
- const res = await test(client);
19
- if (res.passed) {
20
- console.log(` ✅ ${res.name}`);
21
- passed++;
22
- } else {
23
- console.log(` ❌ ${res.name}`);
24
- if (res.details) {
25
- console.log(' ', res.details);
26
- }
27
- }
28
- } catch (e) {
29
- console.log(` ❌ ${test.name || 'test'}:`, e.message);
30
- }
31
- }
32
- console.log(` Result: ${passed}/${tests.length} passed`);
33
- return passed;
34
- }
35
-
36
- async function main () {
37
- console.log('🧪 SSE tests for template MCP server');
38
- console.log('='.repeat(60));
39
-
40
- // Get authentication headers based on config
41
- const headers = getAuthHeadersForTests();
42
- if (Object.keys(headers).length) {
43
- console.log(' Authentication enabled');
44
- } else if (appConfig.webServer?.auth?.enabled) {
45
- console.log('⚠️ Warning: Auth is enabled but no valid credentials found');
46
- }
47
-
48
- const client = new McpSseClient(baseUrl, headers);
49
- try {
50
- // Health check (optional)
51
- await client.health().catch(() => undefined);
52
-
53
- // Initialize over RPC channel used by SSE client (POST /rpc)
54
- await client.sendRequest('initialize', {
55
- protocolVersion: '2024-11-05',
56
- capabilities: { tools: {} },
57
- clientInfo: { name: 'sse-test', version: '1.0.0' },
58
- }).catch(() => undefined);
59
-
60
- const p1 = await runTestGroup('Prompts', TEMPLATE_TESTS.prompts, client);
61
- const p2 = await runTestGroup('Resources', TEMPLATE_TESTS.resources, client);
62
- const p3 = await runTestGroup('Tools', TEMPLATE_TESTS.tools, client);
63
-
64
- const total = TEMPLATE_TESTS.prompts.length + TEMPLATE_TESTS.resources.length + TEMPLATE_TESTS.tools.length;
65
- const sum = p1 + p2 + p3;
66
- console.log(`\nSummary: ${sum}/${total} tests passed`);
67
- } finally {
68
- await client.close().catch(() => undefined);
69
- }
70
- }
71
-
72
- main()
73
- .then(() => {
74
- process.exit(0);
75
- })
76
- .catch((e) => {
77
- console.error('Test failed:', e?.message || e);
78
- process.exit(1);
79
- });
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * SSE transport tests for the template MCP server (src/template)
5
+ * Uses McpSseClient to send requests via HTTP and receive responses via SSE
6
+ */
7
+
8
+ import { appConfig, McpSseClient, getAuthHeadersForTests } from '../../../dist/core/index.js';
9
+
10
+ import TEMPLATE_TESTS from './test-cases.js';
11
+
12
+ const baseUrl = (process.env.TEST_MCP_SERVER_URL || `http://localhost:${appConfig.webServer.port}`).replace(/\/+$/, '');
13
+
14
+ async function runTestGroup (title, tests, client) {
15
+ console.log(`\n${title}:`);
16
+ let passed = 0;
17
+ for (const test of tests) {
18
+ try {
19
+ const res = await test(client);
20
+ if (res.passed) {
21
+ console.log(` ✅ ${res.name}`);
22
+ passed++;
23
+ } else {
24
+ console.log(` ❌ ${res.name}`);
25
+ if (res.details) {
26
+ console.log(' ', res.details);
27
+ }
28
+ }
29
+ } catch (e) {
30
+ console.log(` ❌ ${test.name || 'test'}:`, e.message);
31
+ }
32
+ }
33
+ console.log(` Result: ${passed}/${tests.length} passed`);
34
+ return passed;
35
+ }
36
+
37
+ async function main () {
38
+ console.log('🧪 SSE tests for template MCP server');
39
+ console.log('='.repeat(60));
40
+
41
+ // Get authentication headers based on config
42
+ const headers = getAuthHeadersForTests();
43
+ if (Object.keys(headers).length) {
44
+ console.log(' Authentication enabled');
45
+ } else if (appConfig.webServer?.auth?.enabled) {
46
+ console.log('⚠️ Warning: Auth is enabled but no valid credentials found');
47
+ }
48
+
49
+ const client = new McpSseClient(baseUrl, headers);
50
+ try {
51
+ // Health check (optional)
52
+ await client.health().catch(() => undefined);
53
+
54
+ // Initialize over RPC channel used by SSE client (POST /rpc)
55
+ await client.sendRequest('initialize', {
56
+ protocolVersion: '2024-11-05',
57
+ capabilities: { tools: {} },
58
+ clientInfo: { name: 'sse-test', version: '1.0.0' },
59
+ }).catch(() => undefined);
60
+
61
+ const p1 = await runTestGroup('Prompts', TEMPLATE_TESTS.prompts, client);
62
+ const p2 = await runTestGroup('Resources', TEMPLATE_TESTS.resources, client);
63
+ const p3 = await runTestGroup('Tools', TEMPLATE_TESTS.tools, client);
64
+
65
+ const total = TEMPLATE_TESTS.prompts.length + TEMPLATE_TESTS.resources.length + TEMPLATE_TESTS.tools.length;
66
+ const sum = p1 + p2 + p3;
67
+ console.log(`\nSummary: ${sum}/${total} tests passed`);
68
+ } finally {
69
+ await client.close().catch(() => undefined);
70
+ }
71
+ }
72
+
73
+ main()
74
+ .then(() => {
75
+ process.exit(0);
76
+ })
77
+ .catch((e) => {
78
+ console.error('Test failed:', e?.message || e);
79
+ process.exit(1);
80
+ });