@karashiiro/my-cool-proxy 1.0.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 (204) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +325 -0
  3. package/bin/my-cool-proxy.js +2 -0
  4. package/dist/container/binding-map.d.ts +25 -0
  5. package/dist/container/binding-map.d.ts.map +1 -0
  6. package/dist/container/binding-map.js +2 -0
  7. package/dist/container/binding-map.js.map +1 -0
  8. package/dist/container/decorators.d.ts +5 -0
  9. package/dist/container/decorators.d.ts.map +1 -0
  10. package/dist/container/decorators.js +4 -0
  11. package/dist/container/decorators.js.map +1 -0
  12. package/dist/container/inversify.config.d.ts +6 -0
  13. package/dist/container/inversify.config.d.ts.map +1 -0
  14. package/dist/container/inversify.config.js +85 -0
  15. package/dist/container/inversify.config.js.map +1 -0
  16. package/dist/controllers/mcp-session-controller.d.ts +21 -0
  17. package/dist/controllers/mcp-session-controller.d.ts.map +1 -0
  18. package/dist/controllers/mcp-session-controller.js +100 -0
  19. package/dist/controllers/mcp-session-controller.js.map +1 -0
  20. package/dist/e2e/fixtures/toy-servers/calculator-server.d.ts +5 -0
  21. package/dist/e2e/fixtures/toy-servers/calculator-server.d.ts.map +1 -0
  22. package/dist/e2e/fixtures/toy-servers/calculator-server.js +164 -0
  23. package/dist/e2e/fixtures/toy-servers/calculator-server.js.map +1 -0
  24. package/dist/e2e/fixtures/toy-servers/data-server.d.ts +5 -0
  25. package/dist/e2e/fixtures/toy-servers/data-server.d.ts.map +1 -0
  26. package/dist/e2e/fixtures/toy-servers/data-server.js +198 -0
  27. package/dist/e2e/fixtures/toy-servers/data-server.js.map +1 -0
  28. package/dist/e2e/fixtures/toy-servers/elicitation-server.d.ts +5 -0
  29. package/dist/e2e/fixtures/toy-servers/elicitation-server.d.ts.map +1 -0
  30. package/dist/e2e/fixtures/toy-servers/elicitation-server.js +199 -0
  31. package/dist/e2e/fixtures/toy-servers/elicitation-server.js.map +1 -0
  32. package/dist/e2e/fixtures/toy-servers/index.d.ts +5 -0
  33. package/dist/e2e/fixtures/toy-servers/index.d.ts.map +1 -0
  34. package/dist/e2e/fixtures/toy-servers/index.js +5 -0
  35. package/dist/e2e/fixtures/toy-servers/index.js.map +1 -0
  36. package/dist/e2e/fixtures/toy-servers/sampling-server.d.ts +5 -0
  37. package/dist/e2e/fixtures/toy-servers/sampling-server.d.ts.map +1 -0
  38. package/dist/e2e/fixtures/toy-servers/sampling-server.js +170 -0
  39. package/dist/e2e/fixtures/toy-servers/sampling-server.js.map +1 -0
  40. package/dist/e2e/helpers/client-helpers.d.ts +18 -0
  41. package/dist/e2e/helpers/client-helpers.d.ts.map +1 -0
  42. package/dist/e2e/helpers/client-helpers.js +119 -0
  43. package/dist/e2e/helpers/client-helpers.js.map +1 -0
  44. package/dist/e2e/helpers/http-server-manager.d.ts +10 -0
  45. package/dist/e2e/helpers/http-server-manager.d.ts.map +1 -0
  46. package/dist/e2e/helpers/http-server-manager.js +146 -0
  47. package/dist/e2e/helpers/http-server-manager.js.map +1 -0
  48. package/dist/e2e/helpers/port-manager.d.ts +2 -0
  49. package/dist/e2e/helpers/port-manager.d.ts.map +1 -0
  50. package/dist/e2e/helpers/port-manager.js +27 -0
  51. package/dist/e2e/helpers/port-manager.js.map +1 -0
  52. package/dist/e2e/helpers/test-assertions.d.ts +18 -0
  53. package/dist/e2e/helpers/test-assertions.d.ts.map +1 -0
  54. package/dist/e2e/helpers/test-assertions.js +71 -0
  55. package/dist/e2e/helpers/test-assertions.js.map +1 -0
  56. package/dist/e2e/helpers/test-config-generator.d.ts +14 -0
  57. package/dist/e2e/helpers/test-config-generator.d.ts.map +1 -0
  58. package/dist/e2e/helpers/test-config-generator.js +39 -0
  59. package/dist/e2e/helpers/test-config-generator.js.map +1 -0
  60. package/dist/e2e/helpers/toy-server-manager.d.ts +10 -0
  61. package/dist/e2e/helpers/toy-server-manager.d.ts.map +1 -0
  62. package/dist/e2e/helpers/toy-server-manager.js +58 -0
  63. package/dist/e2e/helpers/toy-server-manager.js.map +1 -0
  64. package/dist/handlers/shutdown-handler.d.ts +8 -0
  65. package/dist/handlers/shutdown-handler.d.ts.map +1 -0
  66. package/dist/handlers/shutdown-handler.js +37 -0
  67. package/dist/handlers/shutdown-handler.js.map +1 -0
  68. package/dist/index.d.ts +2 -0
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +235 -0
  71. package/dist/index.js.map +1 -0
  72. package/dist/lua/runtime-infinite-loop-worker.d.ts +2 -0
  73. package/dist/lua/runtime-infinite-loop-worker.d.ts.map +1 -0
  74. package/dist/lua/runtime-infinite-loop-worker.js +33 -0
  75. package/dist/lua/runtime-infinite-loop-worker.js.map +1 -0
  76. package/dist/lua/runtime.d.ts +11 -0
  77. package/dist/lua/runtime.d.ts.map +1 -0
  78. package/dist/lua/runtime.js +131 -0
  79. package/dist/lua/runtime.js.map +1 -0
  80. package/dist/mcp/client-manager.d.ts +23 -0
  81. package/dist/mcp/client-manager.d.ts.map +1 -0
  82. package/dist/mcp/client-manager.js +201 -0
  83. package/dist/mcp/client-manager.js.map +1 -0
  84. package/dist/mcp/client-session.d.ts +235 -0
  85. package/dist/mcp/client-session.d.ts.map +1 -0
  86. package/dist/mcp/client-session.js +148 -0
  87. package/dist/mcp/client-session.js.map +1 -0
  88. package/dist/mcp/gateway-server.d.ts +26 -0
  89. package/dist/mcp/gateway-server.d.ts.map +1 -0
  90. package/dist/mcp/gateway-server.js +141 -0
  91. package/dist/mcp/gateway-server.js.map +1 -0
  92. package/dist/mcp/mcp-formatter-service.d.ts +15 -0
  93. package/dist/mcp/mcp-formatter-service.d.ts.map +1 -0
  94. package/dist/mcp/mcp-formatter-service.js +151 -0
  95. package/dist/mcp/mcp-formatter-service.js.map +1 -0
  96. package/dist/mcp/prompt-aggregation-service.d.ts +13 -0
  97. package/dist/mcp/prompt-aggregation-service.d.ts.map +1 -0
  98. package/dist/mcp/prompt-aggregation-service.js +104 -0
  99. package/dist/mcp/prompt-aggregation-service.js.map +1 -0
  100. package/dist/mcp/resource-aggregation-service.d.ts +13 -0
  101. package/dist/mcp/resource-aggregation-service.d.ts.map +1 -0
  102. package/dist/mcp/resource-aggregation-service.js +107 -0
  103. package/dist/mcp/resource-aggregation-service.js.map +1 -0
  104. package/dist/mcp/tool-discovery-service.d.ts +20 -0
  105. package/dist/mcp/tool-discovery-service.d.ts.map +1 -0
  106. package/dist/mcp/tool-discovery-service.js +274 -0
  107. package/dist/mcp/tool-discovery-service.js.map +1 -0
  108. package/dist/mcp/transport-manager.d.ts +15 -0
  109. package/dist/mcp/transport-manager.d.ts.map +1 -0
  110. package/dist/mcp/transport-manager.js +105 -0
  111. package/dist/mcp/transport-manager.js.map +1 -0
  112. package/dist/services/cache-service.d.ts +15 -0
  113. package/dist/services/cache-service.d.ts.map +1 -0
  114. package/dist/services/cache-service.js +73 -0
  115. package/dist/services/cache-service.js.map +1 -0
  116. package/dist/services/capability-store.d.ts +12 -0
  117. package/dist/services/capability-store.d.ts.map +1 -0
  118. package/dist/services/capability-store.js +52 -0
  119. package/dist/services/capability-store.js.map +1 -0
  120. package/dist/services/server-info-preloader.d.ts +9 -0
  121. package/dist/services/server-info-preloader.d.ts.map +1 -0
  122. package/dist/services/server-info-preloader.js +125 -0
  123. package/dist/services/server-info-preloader.js.map +1 -0
  124. package/dist/tools/base-tool.d.ts +11 -0
  125. package/dist/tools/base-tool.d.ts.map +1 -0
  126. package/dist/tools/base-tool.js +2 -0
  127. package/dist/tools/base-tool.js.map +1 -0
  128. package/dist/tools/execute-lua-tool.d.ts +17 -0
  129. package/dist/tools/execute-lua-tool.d.ts.map +1 -0
  130. package/dist/tools/execute-lua-tool.js +111 -0
  131. package/dist/tools/execute-lua-tool.js.map +1 -0
  132. package/dist/tools/inspect-tool-response-tool.d.ts +17 -0
  133. package/dist/tools/inspect-tool-response-tool.d.ts.map +1 -0
  134. package/dist/tools/inspect-tool-response-tool.js +58 -0
  135. package/dist/tools/inspect-tool-response-tool.js.map +1 -0
  136. package/dist/tools/list-server-tools-tool.d.ts +15 -0
  137. package/dist/tools/list-server-tools-tool.d.ts.map +1 -0
  138. package/dist/tools/list-server-tools-tool.js +44 -0
  139. package/dist/tools/list-server-tools-tool.js.map +1 -0
  140. package/dist/tools/list-servers-tool.d.ts +12 -0
  141. package/dist/tools/list-servers-tool.d.ts.map +1 -0
  142. package/dist/tools/list-servers-tool.js +39 -0
  143. package/dist/tools/list-servers-tool.js.map +1 -0
  144. package/dist/tools/summary-stats-tool.d.ts +17 -0
  145. package/dist/tools/summary-stats-tool.d.ts.map +1 -0
  146. package/dist/tools/summary-stats-tool.js +91 -0
  147. package/dist/tools/summary-stats-tool.js.map +1 -0
  148. package/dist/tools/tool-details-tool.d.ts +16 -0
  149. package/dist/tools/tool-details-tool.d.ts.map +1 -0
  150. package/dist/tools/tool-details-tool.js +45 -0
  151. package/dist/tools/tool-details-tool.js.map +1 -0
  152. package/dist/tools/tool-registry.d.ts +13 -0
  153. package/dist/tools/tool-registry.d.ts.map +1 -0
  154. package/dist/tools/tool-registry.js +24 -0
  155. package/dist/tools/tool-registry.js.map +1 -0
  156. package/dist/types/index.d.ts +20 -0
  157. package/dist/types/index.d.ts.map +1 -0
  158. package/dist/types/index.js +20 -0
  159. package/dist/types/index.js.map +1 -0
  160. package/dist/types/interfaces.d.ts +118 -0
  161. package/dist/types/interfaces.d.ts.map +1 -0
  162. package/dist/types/interfaces.js +2 -0
  163. package/dist/types/interfaces.js.map +1 -0
  164. package/dist/utils/cli-args.d.ts +6 -0
  165. package/dist/utils/cli-args.d.ts.map +1 -0
  166. package/dist/utils/cli-args.js +7 -0
  167. package/dist/utils/cli-args.js.map +1 -0
  168. package/dist/utils/config-loader.d.ts +4 -0
  169. package/dist/utils/config-loader.d.ts.map +1 -0
  170. package/dist/utils/config-loader.js +82 -0
  171. package/dist/utils/config-loader.js.map +1 -0
  172. package/dist/utils/config-paths.d.ts +10 -0
  173. package/dist/utils/config-paths.d.ts.map +1 -0
  174. package/dist/utils/config-paths.js +34 -0
  175. package/dist/utils/config-paths.js.map +1 -0
  176. package/dist/utils/logger.d.ts +9 -0
  177. package/dist/utils/logger.d.ts.map +1 -0
  178. package/dist/utils/logger.js +46 -0
  179. package/dist/utils/logger.js.map +1 -0
  180. package/dist/utils/logger.test-helper.d.ts +2 -0
  181. package/dist/utils/logger.test-helper.d.ts.map +1 -0
  182. package/dist/utils/logger.test-helper.js +9 -0
  183. package/dist/utils/logger.test-helper.js.map +1 -0
  184. package/dist/utils/lua-identifier.d.ts +2 -0
  185. package/dist/utils/lua-identifier.d.ts.map +1 -0
  186. package/dist/utils/lua-identifier.js +37 -0
  187. package/dist/utils/lua-identifier.js.map +1 -0
  188. package/dist/utils/prompt-name.d.ts +8 -0
  189. package/dist/utils/prompt-name.d.ts.map +1 -0
  190. package/dist/utils/prompt-name.js +25 -0
  191. package/dist/utils/prompt-name.js.map +1 -0
  192. package/dist/utils/resource-uri.d.ts +10 -0
  193. package/dist/utils/resource-uri.d.ts.map +1 -0
  194. package/dist/utils/resource-uri.js +101 -0
  195. package/dist/utils/resource-uri.js.map +1 -0
  196. package/dist/utils/response-size-validator.d.ts +3 -0
  197. package/dist/utils/response-size-validator.d.ts.map +1 -0
  198. package/dist/utils/response-size-validator.js +39 -0
  199. package/dist/utils/response-size-validator.js.map +1 -0
  200. package/dist/utils/schema-formatter.d.ts +3 -0
  201. package/dist/utils/schema-formatter.d.ts.map +1 -0
  202. package/dist/utils/schema-formatter.js +40 -0
  203. package/dist/utils/schema-formatter.js.map +1 -0
  204. package/package.json +67 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Kara
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,325 @@
1
+ # my-cool-proxy
2
+
3
+ MCP gateway server that lets you call multiple MCP servers from Lua scripts.
4
+
5
+ ## Overview
6
+
7
+ This proxy acts as a gateway between AI agents and multiple MCP (Model Context Protocol) servers. Instead of connecting to each MCP server individually, agents connect to this single proxy and gain access to all configured servers through a unified interface.
8
+
9
+ **Progressive Tool Discovery:** Agents start with zero knowledge about what servers or tools are available. They build context progressively:
10
+
11
+ 1. Call `list-servers` - The agent's context now includes names and descriptions of all available MCP servers (e.g., "github", "slack", "database")
12
+ 2. Call `list-server-tools(server_name)` - The agent's context expands to include all tool names and descriptions for that specific server
13
+ 3. Call `tool-details(server_name, tool_name)` - The agent's context now has complete parameter schemas, return types (if available), and usage examples for a specific tool
14
+ 4. Call `execute(lua_script)` - With full context, the agent can write Lua scripts that call the discovered tools
15
+
16
+ Rather than loading all tools and tool descriptions into the context upfront, this defers loading tools until the agent determines those tools are needed.
17
+
18
+ **Tool Chaining with Lua:** Once an agent knows what tools exist, they can compose complex multi-step workflows in a single `execute()` call. The Lua runtime provides access to all discovered servers as globals, with tools callable as async functions.
19
+
20
+ **Sequential tool chaining:**
21
+
22
+ ```lua
23
+ local raw_data = api_server.fetch({ id = 123 }):await()
24
+ local processed = processor.transform({ input = raw_data }):await()
25
+ result(processed)
26
+ ```
27
+
28
+ **Conditional logic:**
29
+
30
+ ```lua
31
+ local status = checker.validate({}):await()
32
+ if status.ok then
33
+ result(processor.run({}):await())
34
+ else
35
+ result(error_handler.notify({ error = status.message }):await())
36
+ end
37
+ ```
38
+
39
+ **Iteration with loops:**
40
+
41
+ ```lua
42
+ local results = {}
43
+ for i = 1, 5 do
44
+ results[i] = worker.process({ index = i }):await()
45
+ end
46
+ result({ total = #results, data = results })
47
+ ```
48
+
49
+ ## Quick Start
50
+
51
+ ### 1. Install
52
+
53
+ ```bash
54
+ pnpm install
55
+ ```
56
+
57
+ ### 2. Configure
58
+
59
+ Create the config directory and copy the example config:
60
+
61
+ ```bash
62
+ # Linux
63
+ mkdir -p ~/.config/my-cool-proxy
64
+ cp config.example.json ~/.config/my-cool-proxy/config.json
65
+
66
+ # macOS
67
+ mkdir -p ~/Library/Preferences/my-cool-proxy
68
+ cp config.example.json ~/Library/Preferences/my-cool-proxy/config.json
69
+
70
+ # Windows (PowerShell)
71
+ mkdir "$env:APPDATA\my-cool-proxy\Config"
72
+ Copy-Item config.example.json "$env:APPDATA\my-cool-proxy\Config\config.json"
73
+ ```
74
+
75
+ Edit `config.json` to add your MCP servers (see [CONFIG.md](./CONFIG.md) for all options):
76
+
77
+ ```json
78
+ {
79
+ "port": 3000,
80
+ "host": "localhost",
81
+ "mcpClients": {
82
+ "my-server": {
83
+ "type": "http",
84
+ "url": "https://example.com/mcp"
85
+ }
86
+ }
87
+ }
88
+ ```
89
+
90
+ > **Tip:** Run `node dist/index.js --config-path` to see exactly where your config should be located.
91
+
92
+ ### 3. Run
93
+
94
+ ```bash
95
+ pnpm dev
96
+ ```
97
+
98
+ ### 4. Connect
99
+
100
+ Add to your MCP client config (e.g., Claude Desktop):
101
+
102
+ ```json
103
+ {
104
+ "mcpServers": {
105
+ "my-cool-proxy": {
106
+ "url": "http://localhost:3000/mcp"
107
+ }
108
+ }
109
+ }
110
+ ```
111
+
112
+ ### 5. Use It
113
+
114
+ The proxy exposes these tools:
115
+
116
+ - `execute` - Run Lua scripts that can call your configured MCP servers
117
+ - `list-servers` - See available servers
118
+ - `list-server-tools` - See tools for a server
119
+ - `tool-details` - Get full tool documentation
120
+
121
+ Example Lua script:
122
+
123
+ ```lua
124
+ -- Call a tool and return the result directly
125
+ result(my_server.some_tool({ arg = "value" }):await())
126
+
127
+ -- Or store in a variable first if you need to process it
128
+ local data = my_server.some_tool({ arg = "value" }):await()
129
+ result({ processed = data.something })
130
+ ```
131
+
132
+ ## MCP Client Transport Types
133
+
134
+ ## Running the Gateway
135
+
136
+ The gateway supports two modes for how it exposes itself to MCP clients.
137
+
138
+ ### HTTP Mode (Default)
139
+
140
+ Run the gateway as an HTTP server that clients connect to remotely:
141
+
142
+ **Configure** - Set `transport: "http"` in config.json (or omit for default):
143
+
144
+ ```json
145
+ {
146
+ "port": 3000,
147
+ "host": "localhost",
148
+ "transport": "http",
149
+ "mcpClients": { ... }
150
+ }
151
+ ```
152
+
153
+ **Run:**
154
+
155
+ ```bash
156
+ pnpm dev
157
+ # or for production:
158
+ pnpm build && node dist/index.js
159
+ ```
160
+
161
+ **Connect from MCP client:**
162
+
163
+ ```json
164
+ {
165
+ "mcpServers": {
166
+ "my-cool-proxy": {
167
+ "url": "http://localhost:3000/mcp"
168
+ }
169
+ }
170
+ }
171
+ ```
172
+
173
+ ### Stdio Mode
174
+
175
+ Run the gateway as a stdio-based MCP server that clients launch directly. This is ideal when:
176
+
177
+ - You want the MCP client (e.g., Claude Desktop) to manage the gateway lifecycle
178
+ - You're running everything locally and don't need a persistent server
179
+ - You prefer simpler deployment without managing an HTTP server
180
+
181
+ **Key differences from HTTP mode:**
182
+
183
+ - Single session only (no multi-client support)
184
+ - All upstream MCP clients initialize at startup (not lazily)
185
+ - Must build before running (`pnpm dev` won't work - stdout is used for MCP protocol)
186
+
187
+ #### 1. Configure
188
+
189
+ Create your config file with `transport: "stdio"`:
190
+
191
+ ```bash
192
+ # Linux
193
+ mkdir -p ~/.config/my-cool-proxy
194
+ # macOS
195
+ mkdir -p ~/Library/Preferences/my-cool-proxy
196
+ # Windows (PowerShell)
197
+ mkdir "$env:APPDATA\my-cool-proxy\Config"
198
+ ```
199
+
200
+ Add your config (port and host are ignored in stdio mode):
201
+
202
+ ```json
203
+ {
204
+ "transport": "stdio",
205
+ "mcpClients": {
206
+ "filesystem": {
207
+ "type": "stdio",
208
+ "command": "npx",
209
+ "args": ["-y", "@modelcontextprotocol/server-everything"]
210
+ }
211
+ }
212
+ }
213
+ ```
214
+
215
+ > **Tip:** Run `node dist/index.js --config-path` to see exactly where your config should be located.
216
+
217
+ #### 2. Build
218
+
219
+ Stdio mode requires a compiled build:
220
+
221
+ ```bash
222
+ pnpm install
223
+ pnpm build
224
+ ```
225
+
226
+ #### 3. Connect from MCP Client
227
+
228
+ Add to your MCP client config (e.g., Claude Desktop's `claude_desktop_config.json`):
229
+
230
+ **macOS/Linux:**
231
+
232
+ ```json
233
+ {
234
+ "mcpServers": {
235
+ "my-cool-proxy": {
236
+ "command": "node",
237
+ "args": ["/absolute/path/to/my-cool-proxy/dist/index.js"]
238
+ }
239
+ }
240
+ }
241
+ ```
242
+
243
+ **Windows:**
244
+
245
+ ```json
246
+ {
247
+ "mcpServers": {
248
+ "my-cool-proxy": {
249
+ "command": "node",
250
+ "args": ["C:\\Users\\yourname\\path\\to\\my-cool-proxy\\dist\\index.js"]
251
+ }
252
+ }
253
+ }
254
+ ```
255
+
256
+ #### 4. Restart Your MCP Client
257
+
258
+ Restart Claude Desktop (or your MCP client) to pick up the new config. The gateway will start automatically when you begin a conversation.
259
+
260
+ #### Troubleshooting Stdio Mode
261
+
262
+ **Gateway not starting?**
263
+
264
+ - Check your MCP client's logs for error messages
265
+ - Verify the path to `dist/index.js` is correct and absolute
266
+ - Ensure you ran `pnpm build` after any code changes
267
+
268
+ **Config not found?**
269
+
270
+ - Run `node dist/index.js --config-path` from the project directory to see expected location
271
+ - Or set `CONFIG_PATH` environment variable to override:
272
+
273
+ ```json
274
+ {
275
+ "mcpServers": {
276
+ "my-cool-proxy": {
277
+ "command": "node",
278
+ "args": ["path/to/my-cool-proxy/dist/index.js"],
279
+ "env": {
280
+ "CONFIG_PATH": "/path/to/your/config.json"
281
+ }
282
+ }
283
+ }
284
+ }
285
+ ```
286
+
287
+ **Upstream servers failing to connect?**
288
+
289
+ - All configured MCP clients must connect successfully at startup in stdio mode
290
+ - Check that commands in your config are correct and dependencies are installed
291
+ - Try running the upstream servers individually first to verify they work
292
+
293
+ ## MCP Client Transport Types
294
+
295
+ **HTTP** - Connect to remote MCP servers:
296
+
297
+ ```json
298
+ {
299
+ "type": "http",
300
+ "url": "https://api.example.com/mcp",
301
+ "headers": {
302
+ "Authorization": "Bearer token"
303
+ }
304
+ }
305
+ ```
306
+
307
+ **Stdio** - Launch local MCP servers:
308
+
309
+ ```json
310
+ {
311
+ "type": "stdio",
312
+ "command": "npx",
313
+ "args": ["-y", "@modelcontextprotocol/server-everything"]
314
+ }
315
+ ```
316
+
317
+ ## Documentation
318
+
319
+ See [CONFIG.md](./CONFIG.md) for full configuration reference.
320
+
321
+ ## Testing
322
+
323
+ ```bash
324
+ pnpm test
325
+ ```
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import "../dist/index.js";
@@ -0,0 +1,25 @@
1
+ import type { ILuaRuntime, IMCPClientManager, ILogger, ServerConfig, IShutdownHandler, ICapabilityStore, IServerInfoPreloader } from "../types/interfaces.js";
2
+ import type { MCPGatewayServer } from "../mcp/gateway-server.js";
3
+ import type { ToolDiscoveryService } from "../mcp/tool-discovery-service.js";
4
+ import type { ResourceAggregationService } from "../mcp/resource-aggregation-service.js";
5
+ import type { PromptAggregationService } from "../mcp/prompt-aggregation-service.js";
6
+ import type { MCPFormatterService } from "../mcp/mcp-formatter-service.js";
7
+ import type { ITool } from "../tools/base-tool.js";
8
+ import type { IToolRegistry } from "../tools/tool-registry.js";
9
+ export interface ContainerBindingMap {
10
+ ServerConfig: ServerConfig;
11
+ Logger: ILogger;
12
+ LuaRuntime: ILuaRuntime;
13
+ MCPClientManager: IMCPClientManager;
14
+ MCPFormatterService: MCPFormatterService;
15
+ ToolDiscoveryService: ToolDiscoveryService;
16
+ ResourceAggregationService: ResourceAggregationService;
17
+ PromptAggregationService: PromptAggregationService;
18
+ MCPGatewayServer: MCPGatewayServer;
19
+ ShutdownHandler: IShutdownHandler;
20
+ Tool: ITool;
21
+ ToolRegistry: IToolRegistry;
22
+ CapabilityStore: ICapabilityStore;
23
+ ServerInfoPreloader: IServerInfoPreloader;
24
+ }
25
+ //# sourceMappingURL=binding-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binding-map.d.ts","sourceRoot":"","sources":["../../src/container/binding-map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAC7E,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wCAAwC,CAAC;AACzF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AACrF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAM/D,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,YAAY,CAAC;IAC3B,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,WAAW,CAAC;IACxB,gBAAgB,EAAE,iBAAiB,CAAC;IACpC,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,0BAA0B,EAAE,0BAA0B,CAAC;IACvD,wBAAwB,EAAE,wBAAwB,CAAC;IACnD,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,eAAe,EAAE,gBAAgB,CAAC;IAClC,IAAI,EAAE,KAAK,CAAC;IACZ,YAAY,EAAE,aAAa,CAAC;IAC5B,eAAe,EAAE,gBAAgB,CAAC;IAClC,mBAAmB,EAAE,oBAAoB,CAAC;CAC3C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=binding-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binding-map.js","sourceRoot":"","sources":["../../src/container/binding-map.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import type { TypedInject, TypedMultiInject } from "@inversifyjs/strongly-typed";
2
+ import type { ContainerBindingMap } from "./binding-map.js";
3
+ export declare const $inject: TypedInject<ContainerBindingMap>;
4
+ export declare const $multiInject: TypedMultiInject<ContainerBindingMap>;
5
+ //# sourceMappingURL=decorators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/container/decorators.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,gBAAgB,EACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAkB5D,eAAO,MAAM,OAAO,kCAA6C,CAAC;AAkBlE,eAAO,MAAM,YAAY,uCAC6B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { inject, multiInject } from "inversify";
2
+ export const $inject = inject;
3
+ export const $multiInject = multiInject;
4
+ //# sourceMappingURL=decorators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/container/decorators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAuBhD,MAAM,CAAC,MAAM,OAAO,GAAG,MAA0C,CAAC;AAkBlE,MAAM,CAAC,MAAM,YAAY,GACvB,WAAoD,CAAC"}
@@ -0,0 +1,6 @@
1
+ import "reflect-metadata";
2
+ import type { TypedContainer } from "@inversifyjs/strongly-typed";
3
+ import type { ContainerBindingMap } from "./binding-map.js";
4
+ import type { ServerConfig } from "../types/interfaces.js";
5
+ export declare function createContainer(config: ServerConfig): TypedContainer<ContainerBindingMap>;
6
+ //# sourceMappingURL=inversify.config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inversify.config.d.ts","sourceRoot":"","sources":["../../src/container/inversify.config.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAElE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAIV,YAAY,EAIb,MAAM,wBAAwB,CAAC;AAsBhC,wBAAgB,eAAe,CAC7B,MAAM,EAAE,YAAY,GACnB,cAAc,CAAC,mBAAmB,CAAC,CAuFrC"}
@@ -0,0 +1,85 @@
1
+ import "reflect-metadata";
2
+ import { Container } from "inversify";
3
+ import { TYPES } from "../types/index.js";
4
+ import { WasmoonRuntime } from "../lua/runtime.js";
5
+ import { MCPClientManager } from "../mcp/client-manager.js";
6
+ import { ConsoleLogger } from "../utils/logger.js";
7
+ import { MCPGatewayServer } from "../mcp/gateway-server.js";
8
+ import { ToolDiscoveryService } from "../mcp/tool-discovery-service.js";
9
+ import { ResourceAggregationService } from "../mcp/resource-aggregation-service.js";
10
+ import { PromptAggregationService } from "../mcp/prompt-aggregation-service.js";
11
+ import { MCPFormatterService } from "../mcp/mcp-formatter-service.js";
12
+ import { ShutdownHandler } from "../handlers/shutdown-handler.js";
13
+ import { CapabilityStore } from "../services/capability-store.js";
14
+ import { ServerInfoPreloader } from "../services/server-info-preloader.js";
15
+ import { ExecuteLuaTool } from "../tools/execute-lua-tool.js";
16
+ import { ListServersTool } from "../tools/list-servers-tool.js";
17
+ import { ListServerToolsTool } from "../tools/list-server-tools-tool.js";
18
+ import { ToolDetailsTool } from "../tools/tool-details-tool.js";
19
+ import { InspectToolResponseTool } from "../tools/inspect-tool-response-tool.js";
20
+ import { SummaryStatsTool } from "../tools/summary-stats-tool.js";
21
+ import { ToolRegistry } from "../tools/tool-registry.js";
22
+ export function createContainer(config) {
23
+ const container = new Container();
24
+ container.bind(TYPES.ServerConfig).toConstantValue(config);
25
+ container.bind(TYPES.Logger).to(ConsoleLogger).inSingletonScope();
26
+ container
27
+ .bind(TYPES.LuaRuntime)
28
+ .to(WasmoonRuntime)
29
+ .inSingletonScope();
30
+ container
31
+ .bind(TYPES.MCPClientManager)
32
+ .to(MCPClientManager)
33
+ .inSingletonScope();
34
+ container
35
+ .bind(TYPES.MCPFormatterService)
36
+ .to(MCPFormatterService)
37
+ .inSingletonScope();
38
+ container
39
+ .bind(TYPES.ToolDiscoveryService)
40
+ .to(ToolDiscoveryService)
41
+ .inSingletonScope();
42
+ container
43
+ .bind(TYPES.ResourceAggregationService)
44
+ .to(ResourceAggregationService)
45
+ .inSingletonScope();
46
+ container
47
+ .bind(TYPES.PromptAggregationService)
48
+ .to(PromptAggregationService)
49
+ .inSingletonScope();
50
+ container.bind(TYPES.Tool).to(ExecuteLuaTool);
51
+ container.bind(TYPES.Tool).to(ListServersTool);
52
+ container.bind(TYPES.Tool).to(ListServerToolsTool);
53
+ container.bind(TYPES.Tool).to(ToolDetailsTool);
54
+ container.bind(TYPES.Tool).to(InspectToolResponseTool);
55
+ container.bind(TYPES.Tool).to(SummaryStatsTool);
56
+ container
57
+ .bind(TYPES.ToolRegistry)
58
+ .toDynamicValue(() => {
59
+ const registry = new ToolRegistry();
60
+ const tools = container.getAll(TYPES.Tool);
61
+ for (const tool of tools) {
62
+ registry.register(tool);
63
+ }
64
+ return registry;
65
+ })
66
+ .inSingletonScope();
67
+ container
68
+ .bind(TYPES.MCPGatewayServer)
69
+ .to(MCPGatewayServer)
70
+ .inSingletonScope();
71
+ container
72
+ .bind(TYPES.ShutdownHandler)
73
+ .to(ShutdownHandler)
74
+ .inSingletonScope();
75
+ container
76
+ .bind(TYPES.CapabilityStore)
77
+ .to(CapabilityStore)
78
+ .inSingletonScope();
79
+ container
80
+ .bind(TYPES.ServerInfoPreloader)
81
+ .to(ServerInfoPreloader)
82
+ .inSingletonScope();
83
+ return container;
84
+ }
85
+ //# sourceMappingURL=inversify.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inversify.config.js","sourceRoot":"","sources":["../../src/container/inversify.config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { IMCPClientManager, ITransportManager, ILogger, ServerConfig, IMCPSessionController } from "../types/interfaces.js";
2
+ import type { IToolRegistry } from "../tools/tool-registry.js";
3
+ import type { ResourceAggregationService } from "../mcp/resource-aggregation-service.js";
4
+ import type { PromptAggregationService } from "../mcp/prompt-aggregation-service.js";
5
+ export declare class MCPSessionController implements IMCPSessionController {
6
+ private clientPool;
7
+ private transportManager;
8
+ private toolRegistry;
9
+ private resourceAggregation;
10
+ private promptAggregation;
11
+ private config;
12
+ private logger;
13
+ private connectingTransports;
14
+ private connectedTransports;
15
+ private gatewayServers;
16
+ constructor(clientPool: IMCPClientManager, transportManager: ITransportManager, toolRegistry: IToolRegistry, resourceAggregation: ResourceAggregationService, promptAggregation: PromptAggregationService, config: ServerConfig, logger: ILogger);
17
+ handleRequest(req: Request): Promise<Response>;
18
+ private initializeClientsForSession;
19
+ private connectGatewayServer;
20
+ }
21
+ //# sourceMappingURL=mcp-session-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-session-controller.d.ts","sourceRoot":"","sources":["../../src/controllers/mcp-session-controller.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,OAAO,EACP,YAAY,EACZ,qBAAqB,EACtB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,wCAAwC,CAAC;AACzF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAiBrF,qBACa,oBAAqB,YAAW,qBAAqB;IAc7B,OAAO,CAAC,UAAU;IAEnD,OAAO,CAAC,gBAAgB;IACK,OAAO,CAAC,YAAY;IAEjD,OAAO,CAAC,mBAAmB;IAE3B,OAAO,CAAC,iBAAiB;IACI,OAAO,CAAC,MAAM;IACpB,OAAO,CAAC,MAAM;IArBvC,OAAO,CAAC,oBAAoB,CAC0B;IAEtD,OAAO,CAAC,mBAAmB,CAC+B;IAE1D,OAAO,CAAC,cAAc,CAGlB;IAEJ,YAC2C,UAAU,EAAE,iBAAiB,EAE9D,gBAAgB,EAAE,iBAAiB,EACN,YAAY,EAAE,aAAa,EAExD,mBAAmB,EAAE,0BAA0B,EAE/C,iBAAiB,EAAE,wBAAwB,EACd,MAAM,EAAE,YAAY,EAC1B,MAAM,EAAE,OAAO,EAC5C;IAaE,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CA+CnD;YASa,2BAA2B;YAoC3B,oBAAoB;CAuBnC"}
@@ -0,0 +1,100 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { injectable } from "inversify";
14
+ import { $inject } from "../container/decorators.js";
15
+ import { TYPES } from "../types/index.js";
16
+ import { MCPGatewayServer } from "../mcp/gateway-server.js";
17
+ let MCPSessionController = class MCPSessionController {
18
+ clientPool;
19
+ transportManager;
20
+ toolRegistry;
21
+ resourceAggregation;
22
+ promptAggregation;
23
+ config;
24
+ logger;
25
+ connectingTransports = new Set();
26
+ connectedTransports = new WeakSet();
27
+ gatewayServers = new WeakMap();
28
+ constructor(clientPool, transportManager, toolRegistry, resourceAggregation, promptAggregation, config, logger) {
29
+ this.clientPool = clientPool;
30
+ this.transportManager = transportManager;
31
+ this.toolRegistry = toolRegistry;
32
+ this.resourceAggregation = resourceAggregation;
33
+ this.promptAggregation = promptAggregation;
34
+ this.config = config;
35
+ this.logger = logger;
36
+ }
37
+ async handleRequest(req) {
38
+ try {
39
+ const sessionId = req.headers.get("mcp-session-id") ?? undefined;
40
+ const transport = this.transportManager.getOrCreateForRequest(sessionId);
41
+ const clientSession = sessionId || "default";
42
+ await this.initializeClientsForSession(clientSession);
43
+ if (!this.connectedTransports.has(transport)) {
44
+ if (!this.connectingTransports.has(transport)) {
45
+ this.connectingTransports.add(transport);
46
+ try {
47
+ await this.connectGatewayServer(transport, clientSession);
48
+ this.connectedTransports.add(transport);
49
+ }
50
+ finally {
51
+ this.connectingTransports.delete(transport);
52
+ }
53
+ }
54
+ else {
55
+ while (this.connectingTransports.has(transport)) {
56
+ await new Promise((resolve) => setTimeout(resolve, 10));
57
+ }
58
+ }
59
+ }
60
+ return await transport.handleRequest(req);
61
+ }
62
+ catch (error) {
63
+ this.logger.error(`Error handling MCP request: ${error}`, error);
64
+ throw error;
65
+ }
66
+ }
67
+ async initializeClientsForSession(sessionId) {
68
+ for (const [name, clientConfig] of Object.entries(this.config.mcpClients)) {
69
+ if (clientConfig.type === "http") {
70
+ await this.clientPool.addHttpClient(name, clientConfig.url, sessionId, clientConfig.headers, clientConfig.allowedTools);
71
+ }
72
+ else if (clientConfig.type === "stdio") {
73
+ await this.clientPool.addStdioClient(name, clientConfig.command, sessionId, clientConfig.args, clientConfig.env, clientConfig.allowedTools);
74
+ }
75
+ else {
76
+ const unknownConfig = clientConfig;
77
+ this.logger.error(`Unsupported client type '${unknownConfig.type}' for '${name}'`);
78
+ }
79
+ }
80
+ }
81
+ async connectGatewayServer(transport, sessionId) {
82
+ this.logger.info(`Creating new gateway server instance for session ${sessionId}`);
83
+ const gatewayServer = new MCPGatewayServer(this.toolRegistry, this.clientPool, this.logger, this.resourceAggregation, this.promptAggregation);
84
+ this.gatewayServers.set(transport, gatewayServer);
85
+ await gatewayServer.getServer().connect(transport);
86
+ }
87
+ };
88
+ MCPSessionController = __decorate([
89
+ injectable(),
90
+ __param(0, $inject(TYPES.MCPClientManager)),
91
+ __param(1, $inject(TYPES.TransportManager)),
92
+ __param(2, $inject(TYPES.ToolRegistry)),
93
+ __param(3, $inject(TYPES.ResourceAggregationService)),
94
+ __param(4, $inject(TYPES.PromptAggregationService)),
95
+ __param(5, $inject(TYPES.ServerConfig)),
96
+ __param(6, $inject(TYPES.Logger)),
97
+ __metadata("design:paramtypes", [Object, Object, Object, Function, Function, Object, Object])
98
+ ], MCPSessionController);
99
+ export { MCPSessionController };
100
+ //# sourceMappingURL=mcp-session-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-session-controller.js","sourceRoot":"","sources":["../../src/controllers/mcp-session-controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function startHttpCalculatorServer(port: number): Promise<{
2
+ close: () => Promise<void>;
3
+ }>;
4
+ export declare function startStdioCalculatorServer(): Promise<never>;
5
+ //# sourceMappingURL=calculator-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculator-server.d.ts","sourceRoot":"","sources":["../../../../src/e2e/fixtures/toy-servers/calculator-server.ts"],"names":[],"mappings":"AA8HA,wBAAsB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACrE,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5B,CAAC,CA+ED;AAMD,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,KAAK,CAAC,CAUjE"}