@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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fnet/cli",
3
- "version": "0.119.0",
3
+ "version": "0.119.2",
4
4
  "files": [
5
5
  "dist",
6
6
  "template"
@@ -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 (modern 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 httpServer = app.listen(port, () => {
81
- console.log(`MCP server started with Streamable HTTP transport on port ${port}`);
82
- });
80
+ const host = args['cli-host'] || args.cli_host || 'localhost';
81
+ const mcpEndpoint = '/mcp';
83
82
 
84
- transport = new StreamableHTTPServerTransport({
85
- sessionIdGenerator: () => Math.random().toString(36).substring(2, 15),
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('/mcp', async (req, res) => {
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
- // Handle GET requests for server-to-client notifications via SSE
94
- app.get('/mcp', async (req, res) => {
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('/mcp', async (req, res) => {
100
- await transport.handleRequest(req, res);
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`);