agentdog 1.1.0

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 (291) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +244 -0
  3. package/dist/adapters/adapter-factory.d.ts +21 -0
  4. package/dist/adapters/adapter-factory.d.ts.map +1 -0
  5. package/dist/adapters/adapter-factory.js +157 -0
  6. package/dist/adapters/adapter-factory.js.map +1 -0
  7. package/dist/adapters/http-sse-adapter.d.ts +49 -0
  8. package/dist/adapters/http-sse-adapter.d.ts.map +1 -0
  9. package/dist/adapters/http-sse-adapter.js +485 -0
  10. package/dist/adapters/http-sse-adapter.js.map +1 -0
  11. package/dist/adapters/stdio-adapter.d.ts +69 -0
  12. package/dist/adapters/stdio-adapter.d.ts.map +1 -0
  13. package/dist/adapters/stdio-adapter.js +664 -0
  14. package/dist/adapters/stdio-adapter.js.map +1 -0
  15. package/dist/adapters/streamable-http-adapter.d.ts +38 -0
  16. package/dist/adapters/streamable-http-adapter.d.ts.map +1 -0
  17. package/dist/adapters/streamable-http-adapter.js +321 -0
  18. package/dist/adapters/streamable-http-adapter.js.map +1 -0
  19. package/dist/ai-gateway/anthropic-errors.d.ts +4 -0
  20. package/dist/ai-gateway/anthropic-errors.d.ts.map +1 -0
  21. package/dist/ai-gateway/anthropic-errors.js +17 -0
  22. package/dist/ai-gateway/anthropic-errors.js.map +1 -0
  23. package/dist/ai-gateway/auth.d.ts +3 -0
  24. package/dist/ai-gateway/auth.d.ts.map +1 -0
  25. package/dist/ai-gateway/auth.js +14 -0
  26. package/dist/ai-gateway/auth.js.map +1 -0
  27. package/dist/ai-gateway/auth.test.d.ts +2 -0
  28. package/dist/ai-gateway/auth.test.d.ts.map +1 -0
  29. package/dist/ai-gateway/auth.test.js +57 -0
  30. package/dist/ai-gateway/auth.test.js.map +1 -0
  31. package/dist/ai-gateway/count-tokens.d.ts +5 -0
  32. package/dist/ai-gateway/count-tokens.d.ts.map +1 -0
  33. package/dist/ai-gateway/count-tokens.js +37 -0
  34. package/dist/ai-gateway/count-tokens.js.map +1 -0
  35. package/dist/ai-gateway/count-tokens.test.d.ts +2 -0
  36. package/dist/ai-gateway/count-tokens.test.d.ts.map +1 -0
  37. package/dist/ai-gateway/count-tokens.test.js +19 -0
  38. package/dist/ai-gateway/count-tokens.test.js.map +1 -0
  39. package/dist/ai-gateway/dialects.d.ts +4 -0
  40. package/dist/ai-gateway/dialects.d.ts.map +1 -0
  41. package/dist/ai-gateway/dialects.js +15 -0
  42. package/dist/ai-gateway/dialects.js.map +1 -0
  43. package/dist/ai-gateway/gateway-server.d.ts +15 -0
  44. package/dist/ai-gateway/gateway-server.d.ts.map +1 -0
  45. package/dist/ai-gateway/gateway-server.js +121 -0
  46. package/dist/ai-gateway/gateway-server.js.map +1 -0
  47. package/dist/ai-gateway/integration.test.d.ts +2 -0
  48. package/dist/ai-gateway/integration.test.d.ts.map +1 -0
  49. package/dist/ai-gateway/integration.test.js +205 -0
  50. package/dist/ai-gateway/integration.test.js.map +1 -0
  51. package/dist/ai-gateway/ir/anthropic-in.d.ts +3 -0
  52. package/dist/ai-gateway/ir/anthropic-in.d.ts.map +1 -0
  53. package/dist/ai-gateway/ir/anthropic-in.js +121 -0
  54. package/dist/ai-gateway/ir/anthropic-in.js.map +1 -0
  55. package/dist/ai-gateway/ir/anthropic-in.test.d.ts +2 -0
  56. package/dist/ai-gateway/ir/anthropic-in.test.d.ts.map +1 -0
  57. package/dist/ai-gateway/ir/anthropic-in.test.js +93 -0
  58. package/dist/ai-gateway/ir/anthropic-in.test.js.map +1 -0
  59. package/dist/ai-gateway/ir/anthropic-sse.d.ts +22 -0
  60. package/dist/ai-gateway/ir/anthropic-sse.d.ts.map +1 -0
  61. package/dist/ai-gateway/ir/anthropic-sse.js +200 -0
  62. package/dist/ai-gateway/ir/anthropic-sse.js.map +1 -0
  63. package/dist/ai-gateway/ir/anthropic-sse.test.d.ts +2 -0
  64. package/dist/ai-gateway/ir/anthropic-sse.test.d.ts.map +1 -0
  65. package/dist/ai-gateway/ir/anthropic-sse.test.js +101 -0
  66. package/dist/ai-gateway/ir/anthropic-sse.test.js.map +1 -0
  67. package/dist/ai-gateway/ir/gemini-out.d.ts +20 -0
  68. package/dist/ai-gateway/ir/gemini-out.d.ts.map +1 -0
  69. package/dist/ai-gateway/ir/gemini-out.js +218 -0
  70. package/dist/ai-gateway/ir/gemini-out.js.map +1 -0
  71. package/dist/ai-gateway/ir/gemini-out.test.d.ts +2 -0
  72. package/dist/ai-gateway/ir/gemini-out.test.d.ts.map +1 -0
  73. package/dist/ai-gateway/ir/gemini-out.test.js +125 -0
  74. package/dist/ai-gateway/ir/gemini-out.test.js.map +1 -0
  75. package/dist/ai-gateway/ir/openai-out.d.ts +17 -0
  76. package/dist/ai-gateway/ir/openai-out.d.ts.map +1 -0
  77. package/dist/ai-gateway/ir/openai-out.js +226 -0
  78. package/dist/ai-gateway/ir/openai-out.js.map +1 -0
  79. package/dist/ai-gateway/ir/openai-out.test.d.ts +2 -0
  80. package/dist/ai-gateway/ir/openai-out.test.d.ts.map +1 -0
  81. package/dist/ai-gateway/ir/openai-out.test.js +144 -0
  82. package/dist/ai-gateway/ir/openai-out.test.js.map +1 -0
  83. package/dist/ai-gateway/ir/types.d.ts +77 -0
  84. package/dist/ai-gateway/ir/types.d.ts.map +1 -0
  85. package/dist/ai-gateway/ir/types.js +4 -0
  86. package/dist/ai-gateway/ir/types.js.map +1 -0
  87. package/dist/ai-gateway/ir-channel.d.ts +15 -0
  88. package/dist/ai-gateway/ir-channel.d.ts.map +1 -0
  89. package/dist/ai-gateway/ir-channel.js +120 -0
  90. package/dist/ai-gateway/ir-channel.js.map +1 -0
  91. package/dist/ai-gateway/model-router.d.ts +11 -0
  92. package/dist/ai-gateway/model-router.d.ts.map +1 -0
  93. package/dist/ai-gateway/model-router.js +27 -0
  94. package/dist/ai-gateway/model-router.js.map +1 -0
  95. package/dist/ai-gateway/model-router.test.d.ts +2 -0
  96. package/dist/ai-gateway/model-router.test.d.ts.map +1 -0
  97. package/dist/ai-gateway/model-router.test.js +43 -0
  98. package/dist/ai-gateway/model-router.test.js.map +1 -0
  99. package/dist/ai-gateway/passthrough.d.ts +9 -0
  100. package/dist/ai-gateway/passthrough.d.ts.map +1 -0
  101. package/dist/ai-gateway/passthrough.js +81 -0
  102. package/dist/ai-gateway/passthrough.js.map +1 -0
  103. package/dist/ai-gateway/passthrough.test.d.ts +2 -0
  104. package/dist/ai-gateway/passthrough.test.d.ts.map +1 -0
  105. package/dist/ai-gateway/passthrough.test.js +108 -0
  106. package/dist/ai-gateway/passthrough.test.js.map +1 -0
  107. package/dist/ai-gateway/upstream/model-lister.d.ts +13 -0
  108. package/dist/ai-gateway/upstream/model-lister.d.ts.map +1 -0
  109. package/dist/ai-gateway/upstream/model-lister.js +61 -0
  110. package/dist/ai-gateway/upstream/model-lister.js.map +1 -0
  111. package/dist/ai-gateway/upstream/provider-client.d.ts +20 -0
  112. package/dist/ai-gateway/upstream/provider-client.d.ts.map +1 -0
  113. package/dist/ai-gateway/upstream/provider-client.js +76 -0
  114. package/dist/ai-gateway/upstream/provider-client.js.map +1 -0
  115. package/dist/ai-gateway/upstream/provider-client.test.d.ts +2 -0
  116. package/dist/ai-gateway/upstream/provider-client.test.d.ts.map +1 -0
  117. package/dist/ai-gateway/upstream/provider-client.test.js +69 -0
  118. package/dist/ai-gateway/upstream/provider-client.test.js.map +1 -0
  119. package/dist/cli/cli-main.d.ts +7 -0
  120. package/dist/cli/cli-main.d.ts.map +1 -0
  121. package/dist/cli/cli-main.js +116 -0
  122. package/dist/cli/cli-main.js.map +1 -0
  123. package/dist/cli/cli-router.d.ts +20 -0
  124. package/dist/cli/cli-router.d.ts.map +1 -0
  125. package/dist/cli/cli-router.js +271 -0
  126. package/dist/cli/cli-router.js.map +1 -0
  127. package/dist/cli/cli-utils.d.ts +30 -0
  128. package/dist/cli/cli-utils.d.ts.map +1 -0
  129. package/dist/cli/cli-utils.js +219 -0
  130. package/dist/cli/cli-utils.js.map +1 -0
  131. package/dist/cli/commands/audit-commands.d.ts +30 -0
  132. package/dist/cli/commands/audit-commands.d.ts.map +1 -0
  133. package/dist/cli/commands/audit-commands.js +417 -0
  134. package/dist/cli/commands/audit-commands.js.map +1 -0
  135. package/dist/cli/commands/autostart-command.d.ts +21 -0
  136. package/dist/cli/commands/autostart-command.d.ts.map +1 -0
  137. package/dist/cli/commands/autostart-command.js +243 -0
  138. package/dist/cli/commands/autostart-command.js.map +1 -0
  139. package/dist/cli/commands/autostart-command.test.d.ts +2 -0
  140. package/dist/cli/commands/autostart-command.test.d.ts.map +1 -0
  141. package/dist/cli/commands/autostart-command.test.js +35 -0
  142. package/dist/cli/commands/autostart-command.test.js.map +1 -0
  143. package/dist/cli/commands/config-commands.d.ts +30 -0
  144. package/dist/cli/commands/config-commands.d.ts.map +1 -0
  145. package/dist/cli/commands/config-commands.js +1013 -0
  146. package/dist/cli/commands/config-commands.js.map +1 -0
  147. package/dist/cli/commands/daemon-commands.d.ts +76 -0
  148. package/dist/cli/commands/daemon-commands.d.ts.map +1 -0
  149. package/dist/cli/commands/daemon-commands.js +451 -0
  150. package/dist/cli/commands/daemon-commands.js.map +1 -0
  151. package/dist/cli/commands/detect-commands.d.ts +17 -0
  152. package/dist/cli/commands/detect-commands.d.ts.map +1 -0
  153. package/dist/cli/commands/detect-commands.js +293 -0
  154. package/dist/cli/commands/detect-commands.js.map +1 -0
  155. package/dist/cli/commands/diagnose-commands.d.ts +19 -0
  156. package/dist/cli/commands/diagnose-commands.d.ts.map +1 -0
  157. package/dist/cli/commands/diagnose-commands.js +326 -0
  158. package/dist/cli/commands/diagnose-commands.js.map +1 -0
  159. package/dist/cli/commands/optimize-commands.d.ts +14 -0
  160. package/dist/cli/commands/optimize-commands.d.ts.map +1 -0
  161. package/dist/cli/commands/optimize-commands.js +189 -0
  162. package/dist/cli/commands/optimize-commands.js.map +1 -0
  163. package/dist/cli/commands/proxy-command.d.ts +27 -0
  164. package/dist/cli/commands/proxy-command.d.ts.map +1 -0
  165. package/dist/cli/commands/proxy-command.js +212 -0
  166. package/dist/cli/commands/proxy-command.js.map +1 -0
  167. package/dist/cli/commands/start-command.d.ts +22 -0
  168. package/dist/cli/commands/start-command.d.ts.map +1 -0
  169. package/dist/cli/commands/start-command.js +275 -0
  170. package/dist/cli/commands/start-command.js.map +1 -0
  171. package/dist/config/config-manager.d.ts +125 -0
  172. package/dist/config/config-manager.d.ts.map +1 -0
  173. package/dist/config/config-manager.js +569 -0
  174. package/dist/config/config-manager.js.map +1 -0
  175. package/dist/config/config-manager.test.d.ts +2 -0
  176. package/dist/config/config-manager.test.d.ts.map +1 -0
  177. package/dist/config/config-manager.test.js +209 -0
  178. package/dist/config/config-manager.test.js.map +1 -0
  179. package/dist/core/auto-config-generator.d.ts +55 -0
  180. package/dist/core/auto-config-generator.d.ts.map +1 -0
  181. package/dist/core/auto-config-generator.js +278 -0
  182. package/dist/core/auto-config-generator.js.map +1 -0
  183. package/dist/core/mcpdog-server.d.ts +49 -0
  184. package/dist/core/mcpdog-server.d.ts.map +1 -0
  185. package/dist/core/mcpdog-server.js +552 -0
  186. package/dist/core/mcpdog-server.js.map +1 -0
  187. package/dist/core/protocol-detector.d.ts +56 -0
  188. package/dist/core/protocol-detector.d.ts.map +1 -0
  189. package/dist/core/protocol-detector.js +365 -0
  190. package/dist/core/protocol-detector.js.map +1 -0
  191. package/dist/daemon/daemon-client.d.ts +34 -0
  192. package/dist/daemon/daemon-client.d.ts.map +1 -0
  193. package/dist/daemon/daemon-client.js +130 -0
  194. package/dist/daemon/daemon-client.js.map +1 -0
  195. package/dist/daemon/daemon-client.test.d.ts +2 -0
  196. package/dist/daemon/daemon-client.test.d.ts.map +1 -0
  197. package/dist/daemon/daemon-client.test.js +77 -0
  198. package/dist/daemon/daemon-client.test.js.map +1 -0
  199. package/dist/daemon/daemon-info.d.ts +7 -0
  200. package/dist/daemon/daemon-info.d.ts.map +1 -0
  201. package/dist/daemon/daemon-info.js +34 -0
  202. package/dist/daemon/daemon-info.js.map +1 -0
  203. package/dist/daemon/daemon-info.test.d.ts +2 -0
  204. package/dist/daemon/daemon-info.test.d.ts.map +1 -0
  205. package/dist/daemon/daemon-info.test.js +57 -0
  206. package/dist/daemon/daemon-info.test.js.map +1 -0
  207. package/dist/daemon/daemon-web-server.ai.test.d.ts +2 -0
  208. package/dist/daemon/daemon-web-server.ai.test.d.ts.map +1 -0
  209. package/dist/daemon/daemon-web-server.ai.test.js +119 -0
  210. package/dist/daemon/daemon-web-server.ai.test.js.map +1 -0
  211. package/dist/daemon/daemon-web-server.d.ts +59 -0
  212. package/dist/daemon/daemon-web-server.d.ts.map +1 -0
  213. package/dist/daemon/daemon-web-server.js +1236 -0
  214. package/dist/daemon/daemon-web-server.js.map +1 -0
  215. package/dist/daemon/daemon-web-server.test.d.ts +2 -0
  216. package/dist/daemon/daemon-web-server.test.d.ts.map +1 -0
  217. package/dist/daemon/daemon-web-server.test.js +93 -0
  218. package/dist/daemon/daemon-web-server.test.js.map +1 -0
  219. package/dist/daemon/mcpdog-daemon.d.ts +42 -0
  220. package/dist/daemon/mcpdog-daemon.d.ts.map +1 -0
  221. package/dist/daemon/mcpdog-daemon.js +302 -0
  222. package/dist/daemon/mcpdog-daemon.js.map +1 -0
  223. package/dist/daemon/stdio-proxy.d.ts +17 -0
  224. package/dist/daemon/stdio-proxy.d.ts.map +1 -0
  225. package/dist/daemon/stdio-proxy.js +143 -0
  226. package/dist/daemon/stdio-proxy.js.map +1 -0
  227. package/dist/index.d.ts +14 -0
  228. package/dist/index.d.ts.map +1 -0
  229. package/dist/index.js +198 -0
  230. package/dist/index.js.map +1 -0
  231. package/dist/intent-analyzer.d.ts +27 -0
  232. package/dist/intent-analyzer.d.ts.map +1 -0
  233. package/dist/intent-analyzer.js +140 -0
  234. package/dist/intent-analyzer.js.map +1 -0
  235. package/dist/logging/server-log-manager.d.ts +75 -0
  236. package/dist/logging/server-log-manager.d.ts.map +1 -0
  237. package/dist/logging/server-log-manager.js +185 -0
  238. package/dist/logging/server-log-manager.js.map +1 -0
  239. package/dist/mcp-registry.d.ts +35 -0
  240. package/dist/mcp-registry.d.ts.map +1 -0
  241. package/dist/mcp-registry.js +166 -0
  242. package/dist/mcp-registry.js.map +1 -0
  243. package/dist/middleware/auth.d.ts +5 -0
  244. package/dist/middleware/auth.d.ts.map +1 -0
  245. package/dist/middleware/auth.js +81 -0
  246. package/dist/middleware/auth.js.map +1 -0
  247. package/dist/mock-tool-database.d.ts +41 -0
  248. package/dist/mock-tool-database.d.ts.map +1 -0
  249. package/dist/mock-tool-database.js +461 -0
  250. package/dist/mock-tool-database.js.map +1 -0
  251. package/dist/proxy-server-manager.d.ts +11 -0
  252. package/dist/proxy-server-manager.d.ts.map +1 -0
  253. package/dist/proxy-server-manager.js +144 -0
  254. package/dist/proxy-server-manager.js.map +1 -0
  255. package/dist/router/tool-router.d.ts +61 -0
  256. package/dist/router/tool-router.d.ts.map +1 -0
  257. package/dist/router/tool-router.js +539 -0
  258. package/dist/router/tool-router.js.map +1 -0
  259. package/dist/router/tool-router.test.d.ts +2 -0
  260. package/dist/router/tool-router.test.d.ts.map +1 -0
  261. package/dist/router/tool-router.test.js +113 -0
  262. package/dist/router/tool-router.test.js.map +1 -0
  263. package/dist/streamable-http-server.d.ts +27 -0
  264. package/dist/streamable-http-server.d.ts.map +1 -0
  265. package/dist/streamable-http-server.js +302 -0
  266. package/dist/streamable-http-server.js.map +1 -0
  267. package/dist/tool-finder.d.ts +21 -0
  268. package/dist/tool-finder.d.ts.map +1 -0
  269. package/dist/tool-finder.js +86 -0
  270. package/dist/tool-finder.js.map +1 -0
  271. package/dist/tool-recommender.d.ts +23 -0
  272. package/dist/tool-recommender.d.ts.map +1 -0
  273. package/dist/tool-recommender.js +200 -0
  274. package/dist/tool-recommender.js.map +1 -0
  275. package/dist/types/index.d.ts +145 -0
  276. package/dist/types/index.d.ts.map +1 -0
  277. package/dist/types/index.js +2 -0
  278. package/dist/types/index.js.map +1 -0
  279. package/dist/utils/server-name-validator.d.ts +47 -0
  280. package/dist/utils/server-name-validator.d.ts.map +1 -0
  281. package/dist/utils/server-name-validator.js +156 -0
  282. package/dist/utils/server-name-validator.js.map +1 -0
  283. package/dist/web/web-server.d.ts +44 -0
  284. package/dist/web/web-server.d.ts.map +1 -0
  285. package/dist/web/web-server.js +500 -0
  286. package/dist/web/web-server.js.map +1 -0
  287. package/package.json +68 -0
  288. package/web/dist/assets/index-DMVhVtNU.css +1 -0
  289. package/web/dist/assets/index-VMXIgcOH.js +92 -0
  290. package/web/dist/assets/index-VMXIgcOH.js.map +1 -0
  291. package/web/dist/index.html +14 -0
@@ -0,0 +1,552 @@
1
+ import { EventEmitter } from 'events';
2
+ import { ToolRouter } from '../router/tool-router.js';
3
+ import { AdapterFactory } from '../adapters/adapter-factory.js';
4
+ export class MCPDogServer extends EventEmitter {
5
+ configManager;
6
+ toolRouter;
7
+ clientCapabilities;
8
+ isInitialized = false;
9
+ requestId = 1;
10
+ isStarted = false; // Prevent duplicate starts
11
+ constructor(configManager) {
12
+ super();
13
+ console.error(`[SERVER] Creating MCPDogServer instance (PID: ${process.pid})`);
14
+ this.configManager = configManager;
15
+ this.toolRouter = new ToolRouter(this.configManager);
16
+ this.setupEventHandlers();
17
+ }
18
+ setupEventHandlers() {
19
+ // Config change handling
20
+ this.configManager.on('config-updated', (data) => {
21
+ const changeType = data.context?.changeType;
22
+ const serverName = data.context?.serverName;
23
+ // If it's a server or tool related toggle, skip full reinitialization
24
+ if (changeType === 'server-toggle') {
25
+ console.log(`[SERVER] Skipping adapter reinitialization for server toggle: ${serverName}`);
26
+ }
27
+ else if (changeType === 'tool-toggle' || changeType === 'tool-config-update') {
28
+ console.log(`[SERVER] Skipping adapter reinitialization for tool update on: ${serverName}`);
29
+ }
30
+ else {
31
+ this.handleConfigUpdate().catch((error) => {
32
+ console.error('Error handling config update:', error);
33
+ });
34
+ }
35
+ });
36
+ // Listen for single server toggle status changes
37
+ this.configManager.on('server-toggled', async ({ name, enabled }) => {
38
+ console.error(`[SERVER] Server ${name} toggled to ${enabled}`);
39
+ const serverConfig = this.configManager.getServerConfig(name);
40
+ if (!serverConfig) {
41
+ console.error(`[SERVER] Toggled server ${name} not found in config.`);
42
+ return;
43
+ }
44
+ if (enabled) {
45
+ // Enable server: create and add adapter if not exists; if exists but not connected, try to connect
46
+ let adapter = this.toolRouter.getAdapter(name);
47
+ if (!adapter) {
48
+ try {
49
+ adapter = AdapterFactory.createAdapter(name, serverConfig);
50
+ this.setupAdapterEvents(adapter);
51
+ this.toolRouter.addAdapter(adapter);
52
+ console.error(`[SERVER] Created and added adapter for ${name}`);
53
+ }
54
+ catch (error) {
55
+ console.error(`[SERVER] Failed to create adapter for ${name}:`, error);
56
+ return;
57
+ }
58
+ }
59
+ if (adapter && !adapter.isConnected) {
60
+ try {
61
+ await adapter.connect();
62
+ console.error(`[SERVER] Connected adapter for ${name}`);
63
+ }
64
+ catch (error) {
65
+ console.error(`[SERVER] Failed to connect adapter for ${name}:`, error);
66
+ }
67
+ }
68
+ }
69
+ else {
70
+ // Disable server: remove adapter
71
+ this.toolRouter.removeAdapter(name);
72
+ console.error(`[SERVER] Removed adapter for ${name}`);
73
+ }
74
+ this.notifyToolsChanged().catch(error => {
75
+ console.error('Error notifying tools changed after toggle:', error);
76
+ });
77
+ });
78
+ // Tool router event handling
79
+ this.toolRouter.on('routes-updated', ({ serverName, toolCount }) => {
80
+ console.error(`Tools updated for ${serverName}: ${toolCount} tools`);
81
+ this.notifyToolsChanged().catch(error => {
82
+ console.error('Error notifying tools changed:', error);
83
+ });
84
+ });
85
+ this.toolRouter.on('tool-called', ({ serverName, toolName, args, result, duration }) => {
86
+ console.error(`Tool executed: ${serverName}.${toolName} (${duration}ms)`);
87
+ });
88
+ this.toolRouter.on('error', ({ error, context }) => {
89
+ console.error(`Router error [${context}]:`, error);
90
+ this.emit('error', { error, context });
91
+ });
92
+ }
93
+ async start() {
94
+ if (this.isStarted) {
95
+ console.error(`[SERVER] MCPDog Server already started, ignoring duplicate start() call`);
96
+ return;
97
+ }
98
+ try {
99
+ console.error(`[SERVER] Starting MCPDog Server... (PID: ${process.pid})`);
100
+ this.isStarted = true;
101
+ // Load config
102
+ await this.configManager.loadConfig();
103
+ console.error(`[SERVER] Config loaded in MCPDogServer: ${JSON.stringify(this.configManager.getConfig().servers)}`);
104
+ // Start watching config file changes
105
+ this.configManager.startWatching();
106
+ // Initialize adapters
107
+ await this.initializeAdapters();
108
+ console.error(`[SERVER] MCPDog Server started successfully (PID: ${process.pid})`);
109
+ this.emit('started');
110
+ }
111
+ catch (error) {
112
+ this.isStarted = false; // Reset status, allow retry
113
+ console.error('Failed to start MCPDog Server:', error);
114
+ throw error;
115
+ }
116
+ }
117
+ async stop() {
118
+ try {
119
+ console.error('Stopping MCPDog Server...');
120
+ // Stop config watching
121
+ this.configManager.stopWatching();
122
+ // Disconnect all adapters
123
+ await this.toolRouter.disconnectAll();
124
+ // Cleanup
125
+ this.isInitialized = false;
126
+ this.clientCapabilities = undefined;
127
+ console.error('MCPDog Server stopped');
128
+ this.emit('stopped');
129
+ }
130
+ catch (error) {
131
+ console.error('Error stopping MCPDog Server:', error);
132
+ throw error;
133
+ }
134
+ }
135
+ async initializeAdapters() {
136
+ const config = this.configManager.getConfig();
137
+ const enabledServers = this.configManager.getEnabledServers();
138
+ console.error(`[SERVER] Initializing ${Object.keys(enabledServers).length} enabled servers from config: ${JSON.stringify(enabledServers)}`);
139
+ // First create all adapters (fast operation)
140
+ for (const [serverName, serverConfig] of Object.entries(enabledServers)) {
141
+ try {
142
+ await this.createAndAddAdapter(serverName, serverConfig);
143
+ }
144
+ catch (error) {
145
+ console.error(`Failed to initialize adapter ${serverName}:`, error);
146
+ }
147
+ }
148
+ // Asynchronously connect all adapters, do not wait for completion
149
+ console.error(`[SERVER] Starting asynchronous connection of ${Object.keys(enabledServers).length} servers...`);
150
+ this.connectAdaptersInBackground();
151
+ }
152
+ connectAdaptersInBackground() {
153
+ // Do not use await, let connections happen in the background
154
+ this.toolRouter.connectAll({
155
+ timeout: 5000, // 5 second timeout to avoid long waits for problematic servers
156
+ maxConcurrent: 2 // Limit concurrency to avoid excessive system resource usage
157
+ }).then(() => {
158
+ console.error(`[SERVER] ✅ Background server connection process completed`);
159
+ }).catch(error => {
160
+ console.error(`[SERVER] ❌ Error during background server connection:`, error);
161
+ // Do not throw error, let server continue running
162
+ });
163
+ }
164
+ async createAndAddAdapter(serverName, config) {
165
+ try {
166
+ // Use adapter factory to create adapter
167
+ const adapter = AdapterFactory.createAdapter(serverName, config);
168
+ // Listen for adapter events
169
+ this.setupAdapterEvents(adapter);
170
+ this.toolRouter.addAdapter(adapter);
171
+ console.error(`Added adapter: ${serverName} (${config.transport})`);
172
+ }
173
+ catch (error) {
174
+ console.error(`Failed to create adapter ${serverName}:`, error.message);
175
+ throw error;
176
+ }
177
+ }
178
+ setupAdapterEvents(adapter) {
179
+ // Listen for connection events
180
+ adapter.on('connected', (data) => {
181
+ console.error(`Connected to ${adapter.name}`);
182
+ const eventData = {
183
+ serverName: adapter.name,
184
+ timestamp: new Date().toISOString(),
185
+ ...data
186
+ };
187
+ console.error(`[SERVER] Emitting server-connected event:`, eventData);
188
+ this.emit('server-connected', eventData);
189
+ });
190
+ // Listen for disconnection events
191
+ adapter.on('disconnected', (data) => {
192
+ console.error(`Disconnected from ${adapter.name}`);
193
+ this.emit('server-disconnected', {
194
+ serverName: adapter.name,
195
+ timestamp: new Date().toISOString(),
196
+ ...data
197
+ });
198
+ });
199
+ // Listen for error events
200
+ adapter.on('error', (error) => {
201
+ console.error(`Adapter error for ${adapter.name}:`, error);
202
+ this.emit('server-error', {
203
+ serverName: adapter.name,
204
+ error: error.message,
205
+ timestamp: new Date().toISOString()
206
+ });
207
+ });
208
+ // Listen for log events
209
+ adapter.on('log', (log) => {
210
+ this.emit('server-log', {
211
+ serverName: adapter.name,
212
+ ...log,
213
+ timestamp: new Date().toISOString()
214
+ });
215
+ });
216
+ }
217
+ async reinitializeAdapters() {
218
+ // Stop all existing adapters
219
+ const existingAdapters = this.toolRouter.getAllAdapters();
220
+ for (const adapter of existingAdapters) {
221
+ this.toolRouter.removeAdapter(adapter.name);
222
+ }
223
+ // Reinitialize adapters
224
+ const enabledServers = this.configManager.getEnabledServers();
225
+ for (const [serverName, serverConfig] of Object.entries(enabledServers)) {
226
+ try {
227
+ const adapter = AdapterFactory.createAdapter(serverName, serverConfig);
228
+ this.setupAdapterEvents(adapter);
229
+ this.toolRouter.addAdapter(adapter);
230
+ }
231
+ catch (error) {
232
+ console.error(`Failed to create adapter ${serverName} during reinitialization:`, error);
233
+ }
234
+ }
235
+ this.connectAdaptersInBackground();
236
+ }
237
+ async handleConfigUpdate() {
238
+ // Overall config file update, reinitialize all adapters
239
+ await this.reinitializeAdapters();
240
+ }
241
+ // Config management proxy methods
242
+ async addServer(name, config) {
243
+ const fullConfig = { ...config, name };
244
+ await this.configManager.addServer(name, fullConfig);
245
+ const serverConfig = this.configManager.getServerConfig(name);
246
+ if (serverConfig.enabled) {
247
+ try {
248
+ const adapter = AdapterFactory.createAdapter(name, serverConfig);
249
+ this.setupAdapterEvents(adapter);
250
+ this.toolRouter.addAdapter(adapter);
251
+ await adapter.connect();
252
+ }
253
+ catch (error) {
254
+ console.error(`Failed to add and connect server ${name}:`, error);
255
+ }
256
+ }
257
+ this.notifyToolsChanged().catch((error) => {
258
+ console.error('Error notifying tools changed after addServer:', error);
259
+ });
260
+ }
261
+ async removeServer(name) {
262
+ this.toolRouter.removeAdapter(name);
263
+ await this.configManager.removeServer(name);
264
+ this.notifyToolsChanged().catch((error) => {
265
+ console.error('Error notifying tools changed after removeServer:', error);
266
+ });
267
+ }
268
+ async toggleServer(name, enabled) {
269
+ const serverConfig = this.configManager.getServerConfig(name);
270
+ if (!serverConfig) {
271
+ throw new Error(`Server ${name} not found`);
272
+ }
273
+ const newEnabled = enabled !== undefined ? enabled : !serverConfig.enabled;
274
+ await this.configManager.toggleServer(name, newEnabled);
275
+ // Status change is handled by configManager's server-toggled event, no extra logic needed here
276
+ }
277
+ async updateServerTools(serverName) {
278
+ console.log(`[SERVER] Updating tools for server: ${serverName}`);
279
+ await this.toolRouter.updateServerTools(serverName);
280
+ this.notifyToolsChanged().catch(error => {
281
+ console.error(`Error notifying tools changed after tool update for ${serverName}:`, error);
282
+ });
283
+ }
284
+ // MCP protocol handling methods
285
+ async handleRequest(request, clientId) {
286
+ try {
287
+ // For initialize requests, allow multiple clients to initialize, but do not re-initialize the server
288
+ if (request.method === 'initialize') {
289
+ return await this.handleInitialize(request);
290
+ }
291
+ console.error(`Handling request: ${request.method} (id: ${request.id})`);
292
+ switch (request.method) {
293
+ case 'initialize':
294
+ // This branch will never be executed, as it's handled above
295
+ return await this.handleInitialize(request);
296
+ case 'tools/list':
297
+ return await this.handleToolsList(request);
298
+ case 'tools/call':
299
+ return await this.handleToolCall(request);
300
+ case 'resources/list':
301
+ return await this.handleResourcesList(request);
302
+ case 'prompts/list':
303
+ return await this.handlePromptsList(request);
304
+ default:
305
+ return {
306
+ jsonrpc: '2.0',
307
+ id: request.id,
308
+ error: {
309
+ code: -32601,
310
+ message: `Method not found: ${request.method}`
311
+ }
312
+ };
313
+ }
314
+ }
315
+ catch (error) {
316
+ console.error(`Error handling request ${request.method}:`, error);
317
+ return {
318
+ jsonrpc: '2.0',
319
+ id: request.id,
320
+ error: {
321
+ code: -32000,
322
+ message: `Internal error: ${error.message}`
323
+ }
324
+ };
325
+ }
326
+ }
327
+ async handleInitialize(request) {
328
+ const params = request.params || {};
329
+ // Record current client capabilities, but do not overwrite previous ones (supports multiple clients)
330
+ const clientCapabilities = {
331
+ supportsNotifications: params.capabilities?.notifications !== undefined,
332
+ clientName: params.clientInfo?.name || 'unknown',
333
+ clientVersion: params.clientInfo?.version || 'unknown'
334
+ };
335
+ console.error(`Client connected: ${clientCapabilities.clientName} v${clientCapabilities.clientVersion}`);
336
+ console.error(`Notifications supported: ${clientCapabilities.supportsNotifications}`);
337
+ // If it's the first client, set primary capabilities; otherwise retain existing capabilities
338
+ if (!this.isInitialized) {
339
+ this.clientCapabilities = clientCapabilities;
340
+ this.isInitialized = true;
341
+ }
342
+ return {
343
+ jsonrpc: '2.0',
344
+ id: request.id,
345
+ result: {
346
+ protocolVersion: '2024-11-05',
347
+ capabilities: {
348
+ tools: {},
349
+ logging: {},
350
+ notifications: {
351
+ tools: {
352
+ listChanged: true
353
+ }
354
+ }
355
+ },
356
+ serverInfo: {
357
+ name: 'mcpdog',
358
+ version: '2.0.0'
359
+ }
360
+ }
361
+ };
362
+ }
363
+ async handleToolsList(request) {
364
+ if (!this.isInitialized) {
365
+ return {
366
+ jsonrpc: '2.0',
367
+ id: request.id,
368
+ error: {
369
+ code: -32002,
370
+ message: 'Server not initialized'
371
+ }
372
+ };
373
+ }
374
+ // Smart waiting mechanism: give slower servers more connection time
375
+ const waitTime = this.calculateOptimalWaitTime();
376
+ if (waitTime > 0) {
377
+ console.error(`⏳ Waiting ${waitTime}ms for all servers to connect...`);
378
+ // For health checks, use a shorter wait time
379
+ const maxWaitTime = Math.min(waitTime, 3000); // Wait at most 3 seconds
380
+ await new Promise(resolve => setTimeout(resolve, maxWaitTime));
381
+ }
382
+ // Try multiple times to get a stable tool list
383
+ let tools = await this.toolRouter.getAllTools(true); // Force refresh
384
+ let attempts = 1;
385
+ const maxAttempts = 3;
386
+ // Calculate expected minimum number of tools based on configured servers (at least 5 tools per server)
387
+ const enabledServers = Object.keys(this.configManager.getEnabledServers()).length;
388
+ const expectedMinTools = Math.max(5, enabledServers * 5);
389
+ // If tool count is too low, some servers might not be fully connected, try again
390
+ while (attempts < maxAttempts && tools.length < expectedMinTools && enabledServers > 1) {
391
+ console.error(`🔄 Tools count low (${tools.length}), retrying... (attempt ${attempts + 1})`);
392
+ await new Promise(resolve => setTimeout(resolve, 500));
393
+ tools = await this.toolRouter.getAllTools(true);
394
+ attempts++;
395
+ }
396
+ // Log current tool distribution
397
+ const toolsByServer = this.toolRouter.getToolDistribution();
398
+ console.error(`📊 Current tool distribution:`, toolsByServer);
399
+ console.error(`🔢 Total tools returned: ${tools.length}`);
400
+ return {
401
+ jsonrpc: '2.0',
402
+ id: request.id,
403
+ result: {
404
+ tools
405
+ }
406
+ };
407
+ }
408
+ calculateOptimalWaitTime() {
409
+ const connectedServers = this.toolRouter.getConnectedServerCount();
410
+ const totalServers = this.toolRouter.getTotalServerCount();
411
+ // If all servers are connected, no need to wait
412
+ if (connectedServers >= totalServers) {
413
+ return 0;
414
+ }
415
+ // For health checks, prioritize shorter wait times
416
+ // If most servers are connected (>=50%), respond quickly
417
+ const connectionRatio = connectedServers / totalServers;
418
+ if (connectionRatio >= 0.5) {
419
+ return 1000; // 1 second quick response
420
+ }
421
+ // Even if few servers are connected, prioritize quick response over waiting for all servers
422
+ if (connectedServers > 0) {
423
+ return 2000; // 2 second medium response time
424
+ }
425
+ // Only use longer wait time if no servers are connected
426
+ return Math.min(3000, totalServers * 800); // At most 3 seconds, 800ms per server
427
+ }
428
+ async handleToolCall(request) {
429
+ if (!this.isInitialized) {
430
+ return {
431
+ jsonrpc: '2.0',
432
+ id: request.id,
433
+ error: {
434
+ code: -32002,
435
+ message: 'Server not initialized'
436
+ }
437
+ };
438
+ }
439
+ const params = request.params || {};
440
+ const toolName = params.name;
441
+ const args = params.arguments || {};
442
+ if (!toolName) {
443
+ return {
444
+ jsonrpc: '2.0',
445
+ id: request.id,
446
+ error: {
447
+ code: -32602,
448
+ message: 'Tool name is required'
449
+ }
450
+ };
451
+ }
452
+ const response = await this.toolRouter.callTool(toolName, args);
453
+ // Use original request ID
454
+ return {
455
+ ...response,
456
+ id: request.id
457
+ };
458
+ }
459
+ async notifyToolsChanged() {
460
+ if (!this.isInitialized || !this.clientCapabilities?.supportsNotifications) {
461
+ return;
462
+ }
463
+ const notification = {
464
+ jsonrpc: '2.0',
465
+ method: 'notifications/tools/list_changed'
466
+ };
467
+ this.emit('notification', notification);
468
+ }
469
+ // Status query method
470
+ getStatus() {
471
+ return {
472
+ initialized: this.isInitialized,
473
+ client: this.clientCapabilities,
474
+ config: {
475
+ servers: Object.keys(this.configManager.getConfig().servers).length,
476
+ enabled: Object.keys(this.configManager.getEnabledServers()).length
477
+ },
478
+ routes: this.toolRouter.getRouteStatus()
479
+ };
480
+ }
481
+ getConfigManager() {
482
+ return this.configManager;
483
+ }
484
+ getToolRouter() {
485
+ return this.toolRouter;
486
+ }
487
+ /**
488
+ * Public method to handle config updates
489
+ * This is called by the daemon when config is reloaded
490
+ */
491
+ async handleConfigReload() {
492
+ await this.handleConfigUpdate();
493
+ }
494
+ async handleResourcesList(request) {
495
+ // MCPDog currently does not provide resources, return empty list for Cursor compatibility
496
+ return {
497
+ jsonrpc: '2.0',
498
+ id: request.id,
499
+ result: {
500
+ resources: []
501
+ }
502
+ };
503
+ }
504
+ async handlePromptsList(request) {
505
+ // MCPDog currently does not provide prompt templates, return empty list for Cursor compatibility
506
+ return {
507
+ jsonrpc: '2.0',
508
+ id: request.id,
509
+ result: {
510
+ prompts: []
511
+ }
512
+ };
513
+ }
514
+ async waitForToolsReady() {
515
+ const maxAttempts = 10;
516
+ const delay = 500; // 500ms
517
+ const startTime = Date.now();
518
+ for (let i = 0; i < maxAttempts; i++) {
519
+ const enabledServersCount = Object.keys(this.configManager.getEnabledServers()).length;
520
+ const connectedAdaptersCount = this.toolRouter.getConnectedServerCount();
521
+ const totalTools = (await this.toolRouter.getAllTools()).length;
522
+ // If no enabled servers, return directly
523
+ if (enabledServersCount === 0) {
524
+ console.error(`[SERVER] No enabled servers, skipping wait.`);
525
+ return;
526
+ }
527
+ // If all servers are connected, or enough tools are available
528
+ if (enabledServersCount === connectedAdaptersCount ||
529
+ (connectedAdaptersCount > 0 && totalTools >= connectedAdaptersCount * 2)) {
530
+ console.error(`[SERVER] ${connectedAdaptersCount}/${enabledServersCount} servers connected and ${totalTools} tools loaded.`);
531
+ return;
532
+ }
533
+ console.error(`[SERVER] Waiting for tools to be ready. Connected: ${connectedAdaptersCount}/${enabledServersCount}, Tools: ${totalTools}`);
534
+ await new Promise(resolve => setTimeout(resolve, delay));
535
+ }
536
+ const elapsedTime = Date.now() - startTime;
537
+ const connectedCount = this.toolRouter.getConnectedServerCount();
538
+ const totalCount = Object.keys(this.configManager.getEnabledServers()).length;
539
+ console.error(`[SERVER] Timeout after ${elapsedTime}ms. ${connectedCount}/${totalCount} servers connected.`);
540
+ // Do not throw error, but warn and continue running
541
+ if (connectedCount > 0) {
542
+ console.error(`[SERVER] Proceeding with ${connectedCount} connected servers (some servers may have failed to start).`);
543
+ return;
544
+ }
545
+ else {
546
+ console.error(`[SERVER] Warning: No servers connected, but proceeding anyway.`);
547
+ // Even if no servers are connected, do not throw an error, let the system continue to run
548
+ return;
549
+ }
550
+ }
551
+ }
552
+ //# sourceMappingURL=mcpdog-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpdog-server.js","sourceRoot":"","sources":["../../src/core/mcpdog-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ export interface ProtocolDetectionResult {
2
+ protocol: 'stdio' | 'http-sse' | 'streamable-http' | 'unknown';
3
+ confidence: number;
4
+ reason: string;
5
+ endpoint?: string;
6
+ features?: string[];
7
+ error?: string;
8
+ }
9
+ export interface ProtocolTestResult {
10
+ protocol: string;
11
+ supported: boolean;
12
+ responseTime: number;
13
+ features: string[];
14
+ error?: string;
15
+ }
16
+ export declare class ProtocolDetector {
17
+ private timeout;
18
+ private userAgent;
19
+ constructor(timeout?: number);
20
+ /**
21
+ * 自动检测端点支持的最佳协议
22
+ */
23
+ detectBestProtocol(endpoint: string, options?: {
24
+ timeout?: number;
25
+ headers?: Record<string, string>;
26
+ }): Promise<ProtocolDetectionResult>;
27
+ /**
28
+ * 测试 Streamable HTTP 协议支持
29
+ */
30
+ private testStreamableHttp;
31
+ /**
32
+ * 测试 HTTP+SSE 协议支持
33
+ */
34
+ private testHttpSse;
35
+ /**
36
+ * 测试基础 HTTP 支持(作为后备)
37
+ */
38
+ private testBasicHttp;
39
+ /**
40
+ * 选择最佳协议
41
+ */
42
+ private selectBestProtocol;
43
+ /**
44
+ * 生成检测原因说明
45
+ */
46
+ private generateReasonText;
47
+ /**
48
+ * 为 stdio 协议生成配置建议
49
+ */
50
+ generateStdioSuggestion(command: string): ProtocolDetectionResult;
51
+ /**
52
+ * 批量检测多个端点
53
+ */
54
+ detectMultipleEndpoints(endpoints: string[]): Promise<Map<string, ProtocolDetectionResult>>;
55
+ }
56
+ //# sourceMappingURL=protocol-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol-detector.d.ts","sourceRoot":"","sources":["../../src/core/protocol-detector.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,OAAO,GAAG,UAAU,GAAG,iBAAiB,GAAG,SAAS,CAAC;IAC/D,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,SAAS,CAA2C;gBAEhD,OAAO,CAAC,EAAE,MAAM;IAM5B;;OAEG;IACG,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QACnD,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,GAAG,OAAO,CAAC,uBAAuB,CAAC;IA0BpC;;OAEG;YACW,kBAAkB;IAyFhC;;OAEG;YACW,WAAW;IAiFzB;;OAEG;YACW,aAAa;IA2D3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA8D1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA8B1B;;OAEG;IACH,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,uBAAuB;IASjE;;OAEG;IACG,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;CAwBlG"}