@cnbcool/mcp-server 0.4.0-beta.3 → 0.4.0-beta.4

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/dist/api/group.js CHANGED
@@ -34,7 +34,13 @@ export async function createGroup(params) {
34
34
  Object.assign(acc, { [key]: value });
35
35
  return acc;
36
36
  }, {});
37
- return CnbApiClient.getInstance().request('POST', '/groups', body, {
37
+ const response = await CnbApiClient.getInstance().request('POST', '/groups', body, {
38
38
  header: { 'Content-Type': 'application/json' }
39
- });
39
+ }, 'raw');
40
+ if (response.status === 201) {
41
+ return { message: 'Created' };
42
+ }
43
+ else {
44
+ return { status: response.status, message: response.statusText };
45
+ }
40
46
  }
@@ -0,0 +1,17 @@
1
+ export function getToken(req) {
2
+ let token = req.headers['authorization']?.split(' ')[1];
3
+ if (!token) {
4
+ token = req.query['token'];
5
+ }
6
+ return token;
7
+ }
8
+ export function stopWithWrongTransport(res) {
9
+ res.status(400).json({
10
+ jsonrpc: '2.0',
11
+ error: {
12
+ code: -32000,
13
+ message: 'Bad Request: Session exists but uses a different transport protocol'
14
+ },
15
+ id: null
16
+ });
17
+ }
@@ -7,6 +7,7 @@ import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
7
7
  import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
8
8
  import dotenv from 'dotenv';
9
9
  import { registerTools } from './tools/index.js';
10
+ import { getToken, stopWithWrongTransport } from './helpers.js';
10
11
  // https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-3.html#import-attributes
11
12
  import packageJSON from '../package.json' with { type: 'json' };
12
13
  dotenv.config();
@@ -16,14 +17,6 @@ const transports = {
16
17
  sse: {}
17
18
  };
18
19
  const app = express();
19
- app.use((req, res, next) => {
20
- const token = req.headers['authorization'];
21
- if (!token) {
22
- res.status(401).json({ error: 'Unauthorized' });
23
- return;
24
- }
25
- next();
26
- });
27
20
  app.use(express.json());
28
21
  app.post('/mcp', async (req, res) => {
29
22
  const sessionId = req.headers['mcp-session-id'];
@@ -31,6 +24,10 @@ app.post('/mcp', async (req, res) => {
31
24
  // Reuse existing transport
32
25
  if (sessionId && transports.streamable[sessionId]) {
33
26
  transport = transports.streamable[sessionId];
27
+ if (!(transport instanceof StreamableHTTPServerTransport)) {
28
+ stopWithWrongTransport(res);
29
+ return;
30
+ }
34
31
  await transport.handleRequest(req, res, req.body);
35
32
  return;
36
33
  }
@@ -52,7 +49,7 @@ app.post('/mcp', async (req, res) => {
52
49
  name: 'cnb-mcp-server',
53
50
  version: packageJSON.version
54
51
  });
55
- const token = req.headers['authorization'].split(' ')[1];
52
+ const token = getToken(req);
56
53
  registerTools(mcpServer, token);
57
54
  await mcpServer.connect(transport);
58
55
  await transport.handleRequest(req, res, req.body);
@@ -75,33 +72,36 @@ const handleSessionRequest = async (req, res) => {
75
72
  return;
76
73
  }
77
74
  const transport = transports.streamable[sessionId];
78
- await transport.handleRequest(req, res);
75
+ await transport.handleRequest(req, res, req.body);
79
76
  };
80
77
  app.get('/mcp', handleSessionRequest);
81
78
  app.delete('/mcp', handleSessionRequest);
82
- const mcpServer = new McpServer({
83
- name: 'cnb-mcp-server',
84
- version: packageJSON.version
85
- });
86
79
  app.get('/sse', async (req, res) => {
87
80
  const transport = new SSEServerTransport('/messages', res);
88
81
  transports.sse[transport.sessionId] = transport;
89
82
  res.on('close', () => {
90
83
  delete transports.sse[transport.sessionId];
91
84
  });
92
- const token = req.headers['authorization'].split(' ')[1];
85
+ const mcpServer = new McpServer({
86
+ name: 'cnb-mcp-server',
87
+ version: packageJSON.version
88
+ });
89
+ const token = getToken(req);
93
90
  registerTools(mcpServer, token);
94
91
  await mcpServer.connect(transport);
95
92
  });
96
93
  app.post('/messages', async (req, res) => {
97
94
  const sessionId = req.query.sessionId;
98
95
  const transport = transports.sse[sessionId];
99
- if (transport) {
100
- await transport.handlePostMessage(req, res);
101
- }
102
- else {
96
+ if (!transport) {
103
97
  res.status(400).send('No transport found for sessionId');
98
+ return;
99
+ }
100
+ if (!(transport instanceof SSEServerTransport)) {
101
+ stopWithWrongTransport(res);
102
+ return;
104
103
  }
104
+ await transport.handlePostMessage(req, res, req.body);
105
105
  });
106
106
  const server = app.listen(3000, () => {
107
107
  console.log('MCP Streamable HTTP Server listening on port 3000');
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cnbcool/mcp-server",
3
3
  "description": "CNB MCP Server. A comprehensive MCP server that provides seamless integration to the CNB's API(https://cnb.cool), offering a wide range of tools for repository management, pipelines operations and collaboration features",
4
- "version": "0.4.0-beta.3",
4
+ "version": "0.4.0-beta.4",
5
5
  "main": "./dist/stdio.js",
6
6
  "bin": {
7
7
  "cnb-mcp-stdio": "dist/stdio.js",