@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 +8 -2
- package/dist/helpers.js +17 -0
- package/dist/streamable.js +19 -19
- package/package.json +1 -1
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
|
-
|
|
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
|
}
|
package/dist/helpers.js
ADDED
|
@@ -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
|
+
}
|
package/dist/streamable.js
CHANGED
|
@@ -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
|
|
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
|
|
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.
|
|
4
|
+
"version": "0.4.0-beta.4",
|
|
5
5
|
"main": "./dist/stdio.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"cnb-mcp-stdio": "dist/stdio.js",
|