@fnet/cli 0.119.0 → 0.119.2
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/package.json
CHANGED
|
@@ -72,33 +72,89 @@
|
|
|
72
72
|
// Use stdio transport
|
|
73
73
|
transport = new StdioServerTransport();
|
|
74
74
|
} else if (transportType === 'http') {
|
|
75
|
-
// Use Streamable HTTP transport (
|
|
75
|
+
// Use Streamable HTTP transport (official transport as of MCP 2025-03-26)
|
|
76
76
|
const app = express();
|
|
77
77
|
app.use(express.json());
|
|
78
78
|
|
|
79
79
|
const port = args['cli-port'] || args.cli_port || 3000;
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
});
|
|
80
|
+
const host = args['cli-host'] || args.cli_host || 'localhost';
|
|
81
|
+
const mcpEndpoint = '/mcp';
|
|
83
82
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
});
|
|
83
|
+
// Map to store transports by session ID
|
|
84
|
+
const transports = {};
|
|
87
85
|
|
|
88
86
|
// Handle POST requests for client-to-server communication
|
|
89
|
-
app.post(
|
|
87
|
+
app.post(mcpEndpoint, async (req, res) => {
|
|
88
|
+
// Check for existing session ID
|
|
89
|
+
const sessionId = req.get('Mcp-Session-Id');
|
|
90
|
+
let transport;
|
|
91
|
+
|
|
92
|
+
if (sessionId && transports[sessionId]) {
|
|
93
|
+
// Reuse existing transport
|
|
94
|
+
transport = transports[sessionId];
|
|
95
|
+
} else if (!sessionId && req.body && (req.body.method === 'initialize' ||
|
|
96
|
+
(Array.isArray(req.body) && req.body.some(item => item.method === 'initialize')))) {
|
|
97
|
+
// New initialization request
|
|
98
|
+
transport = new StreamableHTTPServerTransport({
|
|
99
|
+
sessionIdGenerator: () => {
|
|
100
|
+
// Generate cryptographically secure session ID
|
|
101
|
+
return require('crypto').randomBytes(16).toString('hex');
|
|
102
|
+
},
|
|
103
|
+
onsessioninitialized: (sessionId) => {
|
|
104
|
+
// Store the transport by session ID
|
|
105
|
+
transports[sessionId] = transport;
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
// Clean up transport when closed
|
|
110
|
+
transport.onclose = () => {
|
|
111
|
+
if (transport.sessionId) {
|
|
112
|
+
delete transports[transport.sessionId];
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
// Connect to the MCP server
|
|
117
|
+
await server.connect(transport);
|
|
118
|
+
} else {
|
|
119
|
+
// Invalid request
|
|
120
|
+
return res.status(400).json({
|
|
121
|
+
jsonrpc: '2.0',
|
|
122
|
+
error: {
|
|
123
|
+
code: -32000,
|
|
124
|
+
message: 'Bad Request: No valid session ID provided'
|
|
125
|
+
},
|
|
126
|
+
id: null
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Handle the request
|
|
90
131
|
await transport.handleRequest(req, res, req.body);
|
|
91
132
|
});
|
|
92
133
|
|
|
93
|
-
//
|
|
94
|
-
|
|
134
|
+
// Reusable handler for GET and DELETE requests
|
|
135
|
+
const handleSessionRequest = async (req, res) => {
|
|
136
|
+
const sessionId = req.get('Mcp-Session-Id');
|
|
137
|
+
if (!sessionId || !transports[sessionId]) {
|
|
138
|
+
return res.status(400).send('Invalid or missing session ID');
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const transport = transports[sessionId];
|
|
95
142
|
await transport.handleRequest(req, res);
|
|
96
|
-
}
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
// Handle GET requests for server-to-client notifications via SSE
|
|
146
|
+
app.get(mcpEndpoint, handleSessionRequest);
|
|
97
147
|
|
|
98
148
|
// Handle DELETE requests for session termination
|
|
99
|
-
app.delete(
|
|
100
|
-
|
|
149
|
+
app.delete(mcpEndpoint, handleSessionRequest);
|
|
150
|
+
|
|
151
|
+
app.listen(port, host, () => {
|
|
152
|
+
console.log(`MCP server started with Streamable HTTP transport`);
|
|
153
|
+
console.log(`Endpoint: http://${host}:${port}${mcpEndpoint}`);
|
|
154
|
+
console.log(`Listening on ${host}:${port}`);
|
|
101
155
|
});
|
|
156
|
+
|
|
157
|
+
return;
|
|
102
158
|
} else {
|
|
103
159
|
console.error(`Unknown MCP transport type: ${transportType}`);
|
|
104
160
|
console.error(`Supported types: stdio, http`);
|