@1mcp/agent 0.8.0 → 0.9.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.
- package/README.md +12 -12
- package/build/constants.d.ts +2 -1
- package/build/constants.d.ts.map +1 -1
- package/build/constants.js +2 -1
- package/build/constants.js.map +1 -1
- package/build/index.js +34 -23
- package/build/index.js.map +1 -1
- package/build/middleware/loggingMiddleware.d.ts.map +1 -1
- package/build/middleware/loggingMiddleware.js +18 -2
- package/build/middleware/loggingMiddleware.js.map +1 -1
- package/build/server/errorHandler.d.ts +3 -0
- package/build/server/errorHandler.d.ts.map +1 -0
- package/build/server/errorHandler.js +12 -0
- package/build/server/errorHandler.js.map +1 -0
- package/build/server/expressServer.d.ts +2 -1
- package/build/server/expressServer.d.ts.map +1 -1
- package/build/server/expressServer.js +94 -24
- package/build/server/expressServer.js.map +1 -1
- package/build/server/tagsExtractor.d.ts +7 -0
- package/build/server/tagsExtractor.d.ts.map +1 -0
- package/build/server/tagsExtractor.js +25 -0
- package/build/server/tagsExtractor.js.map +1 -0
- package/package.json +4 -2
package/README.md
CHANGED
|
@@ -59,10 +59,10 @@ npx -y @1mcp/agent --help
|
|
|
59
59
|
```
|
|
60
60
|
|
|
61
61
|
Available options:
|
|
62
|
-
- `--transport, -t`: Choose transport type ("stdio" or "
|
|
62
|
+
- `--transport, -t`: Choose transport type ("stdio" or "http", default: "http")
|
|
63
63
|
- `--config, -c`: Use a specific config file
|
|
64
|
-
- `--port, -P`: Change
|
|
65
|
-
- `--host, -H`: Change
|
|
64
|
+
- `--port, -P`: Change HTTP port (default: 3050)
|
|
65
|
+
- `--host, -H`: Change HTTP host (default: localhost)
|
|
66
66
|
- `--tags, -g`: Filter servers by tags (see Tags section below)
|
|
67
67
|
- `--help, -h`: Show help
|
|
68
68
|
|
|
@@ -85,7 +85,7 @@ You can also run 1MCP using Docker:
|
|
|
85
85
|
# Pull the latest image
|
|
86
86
|
docker pull ghcr.io/1mcp-app/agent:latest
|
|
87
87
|
|
|
88
|
-
# Run with
|
|
88
|
+
# Run with HTTP transport (default)
|
|
89
89
|
docker run -p 3050:3050 ghcr.io/1mcp-app/agent
|
|
90
90
|
|
|
91
91
|
# Run with a custom config file
|
|
@@ -103,9 +103,9 @@ Available image tags:
|
|
|
103
103
|
### Environment Variables
|
|
104
104
|
|
|
105
105
|
You can configure 1MCP using environment variables prefixed with `ONE_MCP_`:
|
|
106
|
-
- `ONE_MCP_TRANSPORT`: Transport type ("stdio" or "
|
|
107
|
-
- `ONE_MCP_PORT`:
|
|
108
|
-
- `ONE_MCP_HOST`:
|
|
106
|
+
- `ONE_MCP_TRANSPORT`: Transport type ("stdio" or "http", default: "http")
|
|
107
|
+
- `ONE_MCP_PORT`: HTTP port (default: 3050)
|
|
108
|
+
- `ONE_MCP_HOST`: HTTP host (default: "localhost")
|
|
109
109
|
- `ONE_MCP_CONFIG`: Path to config file
|
|
110
110
|
- `ONE_MCP_TAGS`: Comma-separated list of tags to filter servers
|
|
111
111
|
|
|
@@ -227,12 +227,12 @@ graph TB
|
|
|
227
227
|
S3[Server 3]
|
|
228
228
|
end
|
|
229
229
|
|
|
230
|
-
A1 -->|
|
|
231
|
-
A2 -->|
|
|
232
|
-
A3 -->|
|
|
233
|
-
A4 -->|
|
|
230
|
+
A1 -->|http| MCP
|
|
231
|
+
A2 -->|http| MCP
|
|
232
|
+
A3 -->|http| MCP
|
|
233
|
+
A4 -->|http| MCP
|
|
234
234
|
|
|
235
|
-
MCP --> |
|
|
235
|
+
MCP --> |http| S1
|
|
236
236
|
MCP --> |stdio| S2
|
|
237
237
|
MCP --> |stdio| S3
|
|
238
238
|
```
|
package/build/constants.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export declare const PORT = 3050;
|
|
|
6
6
|
export declare const HOST = "127.0.0.1";
|
|
7
7
|
export declare const SSE_ENDPOINT = "/sse";
|
|
8
8
|
export declare const MESSAGES_ENDPOINT = "/messages";
|
|
9
|
+
export declare const STREAMABLE_HTTP_ENDPOINT = "/mcp";
|
|
9
10
|
export declare const ERROR_CODES: {
|
|
10
11
|
INTERNAL_SERVER_ERROR: number;
|
|
11
12
|
TRANSPORT_NOT_FOUND: number;
|
|
@@ -20,7 +21,7 @@ export declare const ERROR_CODES: {
|
|
|
20
21
|
};
|
|
21
22
|
export declare const MCP_CONFIG_FILE = "mcp.json";
|
|
22
23
|
export declare const MCP_SERVER_NAME = "1mcp";
|
|
23
|
-
export declare const MCP_SERVER_VERSION = "0.
|
|
24
|
+
export declare const MCP_SERVER_VERSION = "0.9.0";
|
|
24
25
|
export declare const MCP_URI_SEPARATOR = "_1mcp_";
|
|
25
26
|
export declare const CONFIG_DIR_NAME = "1mcp";
|
|
26
27
|
export declare const DEFAULT_CONFIG: {
|
package/build/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAG5F,eAAO,MAAM,IAAI,OAAO,CAAC;AACzB,eAAO,MAAM,IAAI,cAAc,CAAC;AAGhC,eAAO,MAAM,YAAY,SAAS,CAAC;AACnC,eAAO,MAAM,iBAAiB,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAG5F,eAAO,MAAM,IAAI,OAAO,CAAC;AACzB,eAAO,MAAM,IAAI,cAAc,CAAC;AAGhC,eAAO,MAAM,YAAY,SAAS,CAAC;AACnC,eAAO,MAAM,iBAAiB,cAAc,CAAC;AAC7C,eAAO,MAAM,wBAAwB,SAAS,CAAC;AAG/C,eAAO,MAAM,WAAW;;;;;;;;;;;CAWvB,CAAC;AAGF,eAAO,MAAM,eAAe,aAAa,CAAC;AAC1C,eAAO,MAAM,eAAe,SAAS,CAAC;AACtC,eAAO,MAAM,kBAAkB,UAAU,CAAC;AAE1C,eAAO,MAAM,iBAAiB,WAAW,CAAC;AAG1C,eAAO,MAAM,eAAe,SAAS,CAAC;AACtC,eAAO,MAAM,cAAc;;CAE1B,CAAC;AAEF;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAY3C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAGD,eAAO,MAAM,gBAAgB;;;CAG5B,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,kBAWrC,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,kBAOrC,CAAC"}
|
package/build/constants.js
CHANGED
|
@@ -7,6 +7,7 @@ export const HOST = '127.0.0.1';
|
|
|
7
7
|
// API endpoints
|
|
8
8
|
export const SSE_ENDPOINT = '/sse';
|
|
9
9
|
export const MESSAGES_ENDPOINT = '/messages';
|
|
10
|
+
export const STREAMABLE_HTTP_ENDPOINT = '/mcp';
|
|
10
11
|
// Error codes
|
|
11
12
|
export const ERROR_CODES = {
|
|
12
13
|
INTERNAL_SERVER_ERROR: -32000,
|
|
@@ -23,7 +24,7 @@ export const ERROR_CODES = {
|
|
|
23
24
|
// MCP constants
|
|
24
25
|
export const MCP_CONFIG_FILE = 'mcp.json';
|
|
25
26
|
export const MCP_SERVER_NAME = '1mcp';
|
|
26
|
-
export const MCP_SERVER_VERSION = '0.
|
|
27
|
+
export const MCP_SERVER_VERSION = '0.9.0';
|
|
27
28
|
export const MCP_URI_SEPARATOR = '_1mcp_';
|
|
28
29
|
// Global config paths
|
|
29
30
|
export const CONFIG_DIR_NAME = '1mcp';
|
package/build/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,uBAAuB;AACvB,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC;AACzB,MAAM,CAAC,MAAM,IAAI,GAAG,WAAW,CAAC;AAEhC,gBAAgB;AAChB,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC;AACnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,uBAAuB;AACvB,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC;AACzB,MAAM,CAAC,MAAM,IAAI,GAAG,WAAW,CAAC;AAEhC,gBAAgB;AAChB,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC;AACnC,MAAM,CAAC,MAAM,iBAAiB,GAAG,WAAW,CAAC;AAC7C,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAE/C,cAAc;AACd,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,qBAAqB,EAAE,CAAC,KAAK;IAC7B,mBAAmB,EAAE,CAAC,KAAK;IAC3B,cAAc,EAAE,CAAC,KAAK;IACtB,uBAAuB,EAAE,CAAC,KAAK;IAC/B,kBAAkB,EAAE,CAAC,KAAK;IAC1B,cAAc,EAAE,CAAC,KAAK;IACtB,gBAAgB,EAAE,CAAC,KAAK;IACxB,iBAAiB,EAAE,CAAC,KAAK;IACzB,aAAa,EAAE,CAAC,KAAK;IACrB,wBAAwB,EAAE,CAAC,KAAK;CACjC,CAAC;AAEF,gBAAgB;AAChB,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAC;AAC1C,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC;AACtC,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAE1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC;AAE1C,sBAAsB;AACtB,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC;AACtC,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,UAAU,EAAE,EAAE;CACf,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IAC5D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,SAAS,GACb,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC3D,CAAC,CAAC,GAAG,OAAO,YAAY,eAAe,EAAE;QACzC,CAAC,CAAC,GAAG,OAAO,oBAAoB,eAAe,EAAE,CAAC;IAEtD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,GAAG,kBAAkB,EAAE,IAAI,eAAe,EAAE,CAAC;AACtD,CAAC;AAED,4BAA4B;AAC5B,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,YAAY,EAAE,CAAC;IACf,gBAAgB,EAAE,IAAI;CACvB,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAuB;IACzD,OAAO,EAAE,EAAE;IACX,SAAS,EAAE;QACT,WAAW,EAAE,KAAK;KACnB;IACD,KAAK,EAAE;QACL,WAAW,EAAE,KAAK;KACnB;IACD,OAAO,EAAE;QACP,WAAW,EAAE,KAAK;KACnB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,uBAAuB,GAAuB;IACzD,KAAK,EAAE;QACL,WAAW,EAAE,KAAK;KACnB;IACD,QAAQ,EAAE;QACR,WAAW,EAAE,KAAK;KACnB;CACF,CAAC"}
|
package/build/index.js
CHANGED
|
@@ -15,20 +15,20 @@ const argv = yargs(hideBin(process.argv))
|
|
|
15
15
|
.options({
|
|
16
16
|
transport: {
|
|
17
17
|
alias: 't',
|
|
18
|
-
describe: 'Transport type to use (stdio or
|
|
18
|
+
describe: 'Transport type to use (stdio or http)',
|
|
19
19
|
type: 'string',
|
|
20
|
-
choices: ['stdio', 'sse'],
|
|
21
|
-
default: '
|
|
20
|
+
choices: ['stdio', 'http', 'sse'],
|
|
21
|
+
default: 'http',
|
|
22
22
|
},
|
|
23
23
|
port: {
|
|
24
24
|
alias: 'P',
|
|
25
|
-
describe: '
|
|
25
|
+
describe: 'HTTP port to listen on, applicable when transport is http',
|
|
26
26
|
type: 'number',
|
|
27
27
|
default: PORT,
|
|
28
28
|
},
|
|
29
29
|
host: {
|
|
30
30
|
alias: 'H',
|
|
31
|
-
describe: '
|
|
31
|
+
describe: 'HTTP host to listen on, applicable when transport is http',
|
|
32
32
|
type: 'string',
|
|
33
33
|
default: HOST,
|
|
34
34
|
},
|
|
@@ -79,7 +79,7 @@ function setupGracefulShutdown(serverManager) {
|
|
|
79
79
|
*/
|
|
80
80
|
async function main() {
|
|
81
81
|
try {
|
|
82
|
-
if (argv.transport
|
|
82
|
+
if (argv.transport !== 'stdio') {
|
|
83
83
|
enableConsoleTransport();
|
|
84
84
|
}
|
|
85
85
|
ConfigManager.getInstance(argv.config);
|
|
@@ -87,25 +87,36 @@ async function main() {
|
|
|
87
87
|
const serverManager = await setupServer();
|
|
88
88
|
// Set up graceful shutdown handling
|
|
89
89
|
setupGracefulShutdown(serverManager);
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
90
|
+
switch (argv.transport) {
|
|
91
|
+
case 'stdio': {
|
|
92
|
+
// Use stdio transport
|
|
93
|
+
const transport = new StdioServerTransport();
|
|
94
|
+
// Parse and validate tags from CLI if provided
|
|
95
|
+
let tags;
|
|
96
|
+
if (argv.tags) {
|
|
97
|
+
tags = argv.tags.split(',').filter((tag) => tag.trim().length > 0);
|
|
98
|
+
if (tags.length === 0) {
|
|
99
|
+
logger.warn('No valid tags provided, ignoring tags parameter');
|
|
100
|
+
tags = undefined;
|
|
101
|
+
}
|
|
100
102
|
}
|
|
103
|
+
await serverManager.connectTransport(transport, 'stdio', tags);
|
|
104
|
+
logger.info('Server started with stdio transport');
|
|
105
|
+
break;
|
|
101
106
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
107
|
+
case 'sse': {
|
|
108
|
+
logger.warning('sse option is deprecated, use http instead');
|
|
109
|
+
}
|
|
110
|
+
// eslint-disable-next-line no-fallthrough
|
|
111
|
+
case 'http': {
|
|
112
|
+
// Use HTTP/SSE transport
|
|
113
|
+
const expressServer = new ExpressServer(serverManager);
|
|
114
|
+
expressServer.start(argv.port, argv.host);
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
default:
|
|
118
|
+
logger.error(`Invalid transport: ${argv.transport}`);
|
|
119
|
+
process.exit(1);
|
|
109
120
|
}
|
|
110
121
|
}
|
|
111
122
|
catch (error) {
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,MAAM,EAAE,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,mBAAmB,MAAM,mCAAmC,CAAC;AAEpE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE5C,+BAA+B;AAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KACtC,KAAK,CAAC,qBAAqB,CAAC;KAC5B,GAAG,CAAC,SAAS,CAAC,CAAC,0DAA0D;KACzE,OAAO,CAAC;IACP,SAAS,EAAE;QACT,KAAK,EAAE,GAAG;QACV,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loggingMiddleware.d.ts","sourceRoot":"","sources":["../../src/middleware/loggingMiddleware.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"loggingMiddleware.d.ts","sourceRoot":"","sources":["../../src/middleware/loggingMiddleware.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAiJnE;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAiC7D"}
|
|
@@ -60,8 +60,18 @@ function wrapRequestHandler(originalHandler, method) {
|
|
|
60
60
|
// Log request
|
|
61
61
|
logRequest(requestId, method, request.params);
|
|
62
62
|
try {
|
|
63
|
-
// Execute original handler
|
|
64
|
-
const result = await originalHandler(request,
|
|
63
|
+
// Execute original handler with the original extra object
|
|
64
|
+
const result = await originalHandler(request, {
|
|
65
|
+
...extra,
|
|
66
|
+
sendNotification: async (notification) => {
|
|
67
|
+
logger.info('Sending notification', { requestId, notification });
|
|
68
|
+
return extra.sendNotification(notification);
|
|
69
|
+
},
|
|
70
|
+
sendRequest: async (request, resultSchema, options) => {
|
|
71
|
+
logger.info('Sending request', { requestId, request });
|
|
72
|
+
return extra.sendRequest(request, resultSchema, options);
|
|
73
|
+
},
|
|
74
|
+
});
|
|
65
75
|
// Log response
|
|
66
76
|
const duration = Date.now() - startTime;
|
|
67
77
|
logResponse(requestId, result, duration);
|
|
@@ -109,6 +119,12 @@ export function enhanceServerWithLogging(server) {
|
|
|
109
119
|
// Override notification sending
|
|
110
120
|
server.notification = (notification) => {
|
|
111
121
|
logNotification(notification.method, notification.params);
|
|
122
|
+
// Check for SSE connection before sending
|
|
123
|
+
const transport = server.transport;
|
|
124
|
+
if (transport && typeof transport.send === 'function' && '_sseResponse' in transport && !transport._sseResponse) {
|
|
125
|
+
logger.warn('Attempted to send notification on disconnected SSE transport');
|
|
126
|
+
return Promise.resolve();
|
|
127
|
+
}
|
|
112
128
|
return originalNotification(notification);
|
|
113
129
|
};
|
|
114
130
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loggingMiddleware.js","sourceRoot":"","sources":["../../src/middleware/loggingMiddleware.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"loggingMiddleware.js","sourceRoot":"","sources":["../../src/middleware/loggingMiddleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorHandler.d.ts","sourceRoot":"","sources":["../../src/server/errorHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAI1D,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,QAQhG"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import logger from '../logger/logger.js';
|
|
2
|
+
import { ERROR_CODES } from '../constants.js';
|
|
3
|
+
export default function errorHandler(err, req, res, _next) {
|
|
4
|
+
logger.error('Express error:', err);
|
|
5
|
+
res.status(500).json({
|
|
6
|
+
error: {
|
|
7
|
+
code: ERROR_CODES.INTERNAL_SERVER_ERROR,
|
|
8
|
+
message: 'Internal server error',
|
|
9
|
+
},
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=errorHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorHandler.js","sourceRoot":"","sources":["../../src/server/errorHandler.ts"],"names":[],"mappings":"AACA,OAAO,MAAM,MAAM,qBAAqB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,GAAU,EAAE,GAAY,EAAE,GAAa,EAAE,KAAmB;IAC/F,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;IACpC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,KAAK,EAAE;YACL,IAAI,EAAE,WAAW,CAAC,qBAAqB;YACvC,OAAO,EAAE,uBAAuB;SACjC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -4,7 +4,8 @@ export declare class ExpressServer {
|
|
|
4
4
|
private serverManager;
|
|
5
5
|
constructor(serverManager: ServerManager);
|
|
6
6
|
private setupMiddleware;
|
|
7
|
-
private
|
|
7
|
+
private setupStreamableHttpRoutes;
|
|
8
|
+
private setupSseRoutes;
|
|
8
9
|
start(port: number, host: string): void;
|
|
9
10
|
}
|
|
10
11
|
//# sourceMappingURL=expressServer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expressServer.d.ts","sourceRoot":"","sources":["../../src/server/expressServer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"expressServer.d.ts","sourceRoot":"","sources":["../../src/server/expressServer.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAMpD,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,aAAa,CAAgB;gBAEzB,aAAa,EAAE,aAAa;IAQxC,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,yBAAyB;IAsFjC,OAAO,CAAC,cAAc;IA2Df,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;CAK/C"}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
1
2
|
import express from 'express';
|
|
3
|
+
import bodyParser from 'body-parser';
|
|
4
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
2
5
|
import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
|
|
3
6
|
import logger from '../logger/logger.js';
|
|
4
|
-
import { SSE_ENDPOINT, MESSAGES_ENDPOINT, ERROR_CODES } from '../constants.js';
|
|
7
|
+
import { SSE_ENDPOINT, MESSAGES_ENDPOINT, ERROR_CODES, STREAMABLE_HTTP_ENDPOINT } from '../constants.js';
|
|
8
|
+
import tagsExtractor from './tagsExtractor.js';
|
|
9
|
+
import errorHandler from './errorHandler.js';
|
|
5
10
|
export class ExpressServer {
|
|
6
11
|
app;
|
|
7
12
|
serverManager;
|
|
@@ -9,40 +14,105 @@ export class ExpressServer {
|
|
|
9
14
|
this.app = express();
|
|
10
15
|
this.serverManager = serverManager;
|
|
11
16
|
this.setupMiddleware();
|
|
12
|
-
this.
|
|
17
|
+
this.setupStreamableHttpRoutes();
|
|
18
|
+
this.setupSseRoutes();
|
|
13
19
|
}
|
|
14
20
|
setupMiddleware() {
|
|
21
|
+
this.app.use(bodyParser.json());
|
|
15
22
|
// Add error handling middleware
|
|
16
|
-
this.app.use(
|
|
17
|
-
logger.error('Express error:', err);
|
|
18
|
-
res.status(500).json({
|
|
19
|
-
error: {
|
|
20
|
-
code: ERROR_CODES.INTERNAL_SERVER_ERROR,
|
|
21
|
-
message: 'Internal server error',
|
|
22
|
-
},
|
|
23
|
-
});
|
|
24
|
-
});
|
|
23
|
+
this.app.use(errorHandler);
|
|
25
24
|
}
|
|
26
|
-
|
|
27
|
-
this.app.
|
|
25
|
+
setupStreamableHttpRoutes() {
|
|
26
|
+
this.app.post(STREAMABLE_HTTP_ENDPOINT, tagsExtractor, async (req, res) => {
|
|
28
27
|
try {
|
|
29
|
-
logger.info('
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
28
|
+
logger.info('[POST] streamable-http', { query: req.query, body: req.body, headers: req.headers });
|
|
29
|
+
let transport;
|
|
30
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
31
|
+
if (!sessionId) {
|
|
32
|
+
const id = randomUUID();
|
|
33
|
+
transport = new StreamableHTTPServerTransport({
|
|
34
|
+
sessionIdGenerator: () => id,
|
|
35
|
+
});
|
|
36
|
+
// Use tags from middleware
|
|
37
|
+
const tags = res.locals.tags;
|
|
38
|
+
await this.serverManager.connectTransport(transport, id, tags);
|
|
39
|
+
transport.onclose = () => {
|
|
40
|
+
this.serverManager.disconnectTransport(id);
|
|
41
|
+
logger.info('transport closed', transport.sessionId);
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
const existingTransport = this.serverManager.getTransport(sessionId);
|
|
46
|
+
if (existingTransport instanceof StreamableHTTPServerTransport) {
|
|
47
|
+
transport = existingTransport;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
36
50
|
res.status(400).json({
|
|
37
51
|
error: {
|
|
38
52
|
code: ERROR_CODES.INVALID_PARAMS,
|
|
39
|
-
message: '
|
|
53
|
+
message: 'Session already exists but uses a different transport protocol',
|
|
40
54
|
},
|
|
41
55
|
});
|
|
42
56
|
return;
|
|
43
57
|
}
|
|
44
|
-
tags = tagsStr.split(',').filter((tag) => tag.trim().length > 0);
|
|
45
58
|
}
|
|
59
|
+
await transport.handleRequest(req, res, req.body);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
logger.error('Streamable HTTP error:', error);
|
|
63
|
+
res.status(500).end();
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
this.app.get(STREAMABLE_HTTP_ENDPOINT, async (req, res) => {
|
|
67
|
+
try {
|
|
68
|
+
logger.info('[GET] streamable-http', { query: req.query, headers: req.headers });
|
|
69
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
70
|
+
if (!sessionId) {
|
|
71
|
+
res.status(400).json({
|
|
72
|
+
error: {
|
|
73
|
+
code: ERROR_CODES.INVALID_PARAMS,
|
|
74
|
+
message: 'Invalid params: sessionId is required',
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
const transport = this.serverManager.getTransport(sessionId);
|
|
80
|
+
await transport.handleRequest(req, res, req.body);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
logger.error('Streamable HTTP error:', error);
|
|
84
|
+
res.status(500).end();
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
this.app.delete(STREAMABLE_HTTP_ENDPOINT, async (req, res) => {
|
|
88
|
+
try {
|
|
89
|
+
logger.info('[DELETE] streamable-http', { query: req.query, headers: req.headers });
|
|
90
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
91
|
+
if (!sessionId) {
|
|
92
|
+
res.status(400).json({
|
|
93
|
+
error: {
|
|
94
|
+
code: ERROR_CODES.INVALID_PARAMS,
|
|
95
|
+
message: 'Invalid params: sessionId is required',
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const transport = this.serverManager.getTransport(sessionId);
|
|
101
|
+
await transport.handleRequest(req, res);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
logger.error('Streamable HTTP error:', error);
|
|
105
|
+
res.status(500).end();
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
setupSseRoutes() {
|
|
110
|
+
this.app.get(SSE_ENDPOINT, tagsExtractor, async (req, res) => {
|
|
111
|
+
try {
|
|
112
|
+
logger.info('[GET] sse', { query: req.query, headers: req.headers });
|
|
113
|
+
const transport = new SSEServerTransport(MESSAGES_ENDPOINT, res);
|
|
114
|
+
// Use tags from middleware
|
|
115
|
+
const tags = res.locals.tags;
|
|
46
116
|
// Connect the transport using the server manager
|
|
47
117
|
await this.serverManager.connectTransport(transport, transport.sessionId, tags);
|
|
48
118
|
transport.onclose = () => {
|
|
@@ -70,7 +140,7 @@ export class ExpressServer {
|
|
|
70
140
|
logger.info('message', { body: req.body, sessionId });
|
|
71
141
|
const transport = this.serverManager.getTransport(sessionId);
|
|
72
142
|
if (transport instanceof SSEServerTransport) {
|
|
73
|
-
await transport.handlePostMessage(req, res);
|
|
143
|
+
await transport.handlePostMessage(req, res, req.body);
|
|
74
144
|
return;
|
|
75
145
|
}
|
|
76
146
|
res.status(404).json({
|
|
@@ -93,7 +163,7 @@ export class ExpressServer {
|
|
|
93
163
|
}
|
|
94
164
|
start(port, host) {
|
|
95
165
|
this.app.listen(port, host, () => {
|
|
96
|
-
logger.info(`Server is running on port ${port} with HTTP/SSE transport`);
|
|
166
|
+
logger.info(`Server is running on port ${port} with HTTP/SSE and Streamable HTTP transport`);
|
|
97
167
|
});
|
|
98
168
|
}
|
|
99
169
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expressServer.js","sourceRoot":"","sources":["../../src/server/expressServer.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAE7E,OAAO,MAAM,MAAM,qBAAqB,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"expressServer.js","sourceRoot":"","sources":["../../src/server/expressServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Request, Response, NextFunction } from 'express';
|
|
2
|
+
/**
|
|
3
|
+
* Middleware to extract and validate 'tags' from query parameters.
|
|
4
|
+
* Attaches tags as res.locals.tags (string[] | undefined).
|
|
5
|
+
*/
|
|
6
|
+
export default function tagsExtractor(req: Request, res: Response, next: NextFunction): void;
|
|
7
|
+
//# sourceMappingURL=tagsExtractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tagsExtractor.d.ts","sourceRoot":"","sources":["../../src/server/tagsExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG1D;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,QAkBpF"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ERROR_CODES } from '../constants.js';
|
|
2
|
+
/**
|
|
3
|
+
* Middleware to extract and validate 'tags' from query parameters.
|
|
4
|
+
* Attaches tags as res.locals.tags (string[] | undefined).
|
|
5
|
+
*/
|
|
6
|
+
export default function tagsExtractor(req, res, next) {
|
|
7
|
+
let tags;
|
|
8
|
+
if (req.query.tags) {
|
|
9
|
+
const tagsStr = req.query.tags;
|
|
10
|
+
if (typeof tagsStr !== 'string') {
|
|
11
|
+
res.status(400).json({
|
|
12
|
+
error: {
|
|
13
|
+
code: ERROR_CODES.INVALID_PARAMS,
|
|
14
|
+
message: 'Invalid params: tags must be a string',
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
tags = tagsStr.split(',').filter((tag) => tag.trim().length > 0);
|
|
20
|
+
}
|
|
21
|
+
// Attach tags to res.locals for downstream handlers
|
|
22
|
+
res.locals.tags = tags;
|
|
23
|
+
next();
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=tagsExtractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tagsExtractor.js","sourceRoot":"","sources":["../../src/server/tagsExtractor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C;;;GAGG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IACnF,IAAI,IAA0B,CAAC;IAC/B,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,IAAc,CAAC;QACzC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,KAAK,EAAE;oBACL,IAAI,EAAE,WAAW,CAAC,cAAc;oBAChC,OAAO,EAAE,uCAAuC;iBACjD;aACF,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QACD,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACnE,CAAC;IACD,oDAAoD;IACpD,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,CAAC;AACT,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@1mcp/agent",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "One MCP server to aggregate them all - A unified Model Context Protocol server implementation",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"mcp",
|
|
@@ -48,7 +48,8 @@
|
|
|
48
48
|
]
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
51
|
+
"@modelcontextprotocol/sdk": "^1.10.1",
|
|
52
|
+
"body-parser": "^2.2.0",
|
|
52
53
|
"express": "^5.1.0",
|
|
53
54
|
"uuid": "^11.1.0",
|
|
54
55
|
"winston": "^3.17.0",
|
|
@@ -60,6 +61,7 @@
|
|
|
60
61
|
"devDependencies": {
|
|
61
62
|
"@eslint/js": "^9.22.0",
|
|
62
63
|
"@testing-library/jest-dom": "^6.6.3",
|
|
64
|
+
"@types/body-parser": "^1.19.5",
|
|
63
65
|
"@types/express": "^5.0.0",
|
|
64
66
|
"@types/node": "^22.13.10",
|
|
65
67
|
"@types/uuid": "^10.0.0",
|