@meetbot/mcp 1.1.0 → 1.2.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 +30 -2
- package/dist/__tests__/meetbot-client.test.js +12 -14
- package/dist/__tests__/meetbot-client.test.js.map +1 -1
- package/dist/__tests__/types.test.js +11 -13
- package/dist/__tests__/types.test.js.map +1 -1
- package/dist/cli-http.js +12 -24
- package/dist/cli-http.js.map +1 -1
- package/dist/cli-streamable.d.ts +3 -0
- package/dist/cli-streamable.d.ts.map +1 -0
- package/dist/cli-streamable.js +36 -0
- package/dist/cli-streamable.js.map +1 -0
- package/dist/cli.js +2 -4
- package/dist/cli.js.map +1 -1
- package/dist/in-memory-event-store.d.ts +14 -0
- package/dist/in-memory-event-store.d.ts.map +1 -0
- package/dist/in-memory-event-store.js +33 -0
- package/dist/in-memory-event-store.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -21
- package/dist/index.js.map +1 -1
- package/dist/mcp-server-streamable.d.ts +16 -0
- package/dist/mcp-server-streamable.d.ts.map +1 -0
- package/dist/mcp-server-streamable.js +347 -0
- package/dist/mcp-server-streamable.js.map +1 -0
- package/dist/mcp-server.js +11 -15
- package/dist/mcp-server.js.map +1 -1
- package/dist/meetbot-client.d.ts +1 -1
- package/dist/meetbot-client.d.ts.map +1 -1
- package/dist/meetbot-client.js +9 -16
- package/dist/meetbot-client.js.map +1 -1
- package/dist/schemas.js +50 -53
- package/dist/schemas.js.map +1 -1
- package/dist/types.js +1 -2
- package/dist/types.js.map +1 -1
- package/package.json +12 -7
- package/dist/mcp-server-http.d.ts +0 -26
- package/dist/mcp-server-http.d.ts.map +0 -1
- package/dist/mcp-server-http.js +0 -350
- package/dist/mcp-server-http.js.map +0 -1
package/README.md
CHANGED
|
@@ -11,6 +11,8 @@ A Model Context Protocol (MCP) server for the Meet.bot Booking Page API, enablin
|
|
|
11
11
|
- **Error Handling**: Robust error handling with detailed error messages
|
|
12
12
|
- **Health Checks**: Built-in health monitoring using the /v1/pages endpoint
|
|
13
13
|
- **MCP Protocol Compliance**: Full Model Context Protocol server implementation
|
|
14
|
+
- **Dual Mode Support**: Run locally (stdio) or remotely (HTTP/SSE)
|
|
15
|
+
- **Production Deployed**: Live at https://meetbot-mcp-production.up.railway.app
|
|
14
16
|
- **Production Ready**: Thoroughly tested and validated for production use
|
|
15
17
|
|
|
16
18
|
## Installation
|
|
@@ -143,6 +145,7 @@ The same token is used to authenticate with the Meet.bot API.
|
|
|
143
145
|
|
|
144
146
|
#### Testing the HTTP Server
|
|
145
147
|
|
|
148
|
+
**Local Testing:**
|
|
146
149
|
```bash
|
|
147
150
|
# Health check (should fail without auth)
|
|
148
151
|
curl http://localhost:3000/health
|
|
@@ -157,16 +160,35 @@ curl -N -H "Authorization: Bearer YOUR_TOKEN" http://localhost:3000/sse
|
|
|
157
160
|
./test-http-server.sh YOUR_TOKEN
|
|
158
161
|
```
|
|
159
162
|
|
|
163
|
+
**Production Testing:**
|
|
164
|
+
```bash
|
|
165
|
+
# Test the live Railway deployment
|
|
166
|
+
curl -H "Authorization: Bearer YOUR_TOKEN" \
|
|
167
|
+
https://meetbot-mcp-production.up.railway.app/health
|
|
168
|
+
|
|
169
|
+
# Expected response:
|
|
170
|
+
# {"status":"ok","service":"meetbot-mcp"}
|
|
171
|
+
```
|
|
172
|
+
|
|
160
173
|
#### Deployment
|
|
161
174
|
|
|
162
|
-
The HTTP server can be deployed to:
|
|
175
|
+
The HTTP server can be deployed to various platforms:
|
|
163
176
|
|
|
164
|
-
- **Railway**: `railway up`
|
|
177
|
+
- **Railway**: `railway up` ✅ **Live at https://meetbot-mcp-production.up.railway.app**
|
|
165
178
|
- **Fly.io**: `fly launch && fly deploy`
|
|
166
179
|
- **Google Cloud Run**: Container-based deployment
|
|
167
180
|
- **AWS App Runner**: Container-based deployment
|
|
168
181
|
- **Any VPS**: Run with Node.js directly
|
|
169
182
|
|
|
183
|
+
**Example: Connecting to Production**
|
|
184
|
+
```bash
|
|
185
|
+
# Your MCP client should connect to:
|
|
186
|
+
# https://meetbot-mcp-production.up.railway.app/sse
|
|
187
|
+
|
|
188
|
+
# With Authorization header:
|
|
189
|
+
# Authorization: Bearer <your-meetbot-api-token>
|
|
190
|
+
```
|
|
191
|
+
|
|
170
192
|
Example Dockerfile:
|
|
171
193
|
|
|
172
194
|
```dockerfile
|
|
@@ -416,6 +438,12 @@ MIT License - see [LICENSE](LICENSE) file for details.
|
|
|
416
438
|
|
|
417
439
|
## Changelog
|
|
418
440
|
|
|
441
|
+
### 1.1.1
|
|
442
|
+
- **ES Module Fix**: Fixed ES module compatibility for Railway and other Node.js deployments
|
|
443
|
+
- **Import Extensions**: Added proper `.js` extensions to all relative imports
|
|
444
|
+
- **Live Deployment**: Successfully deployed to Railway at https://meetbot-mcp-production.up.railway.app
|
|
445
|
+
- **Production Validated**: Confirmed working in production environment
|
|
446
|
+
|
|
419
447
|
### 1.1.0
|
|
420
448
|
- **HTTP/SSE Transport**: Added HTTP server with SSE transport for remote deployment
|
|
421
449
|
- **Bearer Token Authentication**: Implemented authentication for HTTP endpoints
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const meetbot_client_1 = require("../meetbot-client");
|
|
1
|
+
import { MeetbotClient } from '../meetbot-client';
|
|
4
2
|
// Mock axios
|
|
5
3
|
jest.mock('axios');
|
|
6
4
|
const mockAxios = require('axios');
|
|
@@ -22,10 +20,10 @@ describe('MeetbotClient', () => {
|
|
|
22
20
|
});
|
|
23
21
|
describe('constructor', () => {
|
|
24
22
|
it('should create client with valid config', () => {
|
|
25
|
-
expect(() => new
|
|
23
|
+
expect(() => new MeetbotClient(mockConfig)).not.toThrow();
|
|
26
24
|
});
|
|
27
25
|
it('should create axios instance with correct baseURL', () => {
|
|
28
|
-
new
|
|
26
|
+
new MeetbotClient(mockConfig);
|
|
29
27
|
expect(mockAxios.create).toHaveBeenCalledWith(expect.objectContaining({
|
|
30
28
|
baseURL: 'https://meet.bot',
|
|
31
29
|
timeout: 30000,
|
|
@@ -34,7 +32,7 @@ describe('MeetbotClient', () => {
|
|
|
34
32
|
});
|
|
35
33
|
describe('getPages', () => {
|
|
36
34
|
beforeEach(() => {
|
|
37
|
-
client = new
|
|
35
|
+
client = new MeetbotClient(mockConfig);
|
|
38
36
|
});
|
|
39
37
|
it('should call correct endpoint', async () => {
|
|
40
38
|
const mockResponse = { data: { email: 'test@example.com', pages: [] } };
|
|
@@ -47,14 +45,14 @@ describe('MeetbotClient', () => {
|
|
|
47
45
|
response: { use: jest.fn() },
|
|
48
46
|
},
|
|
49
47
|
});
|
|
50
|
-
client = new
|
|
48
|
+
client = new MeetbotClient(mockConfig);
|
|
51
49
|
await client.getPages();
|
|
52
50
|
expect(mockGet).toHaveBeenCalledWith('/v1/pages');
|
|
53
51
|
});
|
|
54
52
|
});
|
|
55
53
|
describe('getPageInfo', () => {
|
|
56
54
|
beforeEach(() => {
|
|
57
|
-
client = new
|
|
55
|
+
client = new MeetbotClient(mockConfig);
|
|
58
56
|
});
|
|
59
57
|
it('should validate params before making request', () => {
|
|
60
58
|
const invalidParams = { page: 'not-a-url' };
|
|
@@ -79,7 +77,7 @@ describe('MeetbotClient', () => {
|
|
|
79
77
|
response: { use: jest.fn() },
|
|
80
78
|
},
|
|
81
79
|
});
|
|
82
|
-
client = new
|
|
80
|
+
client = new MeetbotClient(mockConfig);
|
|
83
81
|
const params = { page: 'https://meet.bot/user/30min' };
|
|
84
82
|
await client.getPageInfo(params);
|
|
85
83
|
expect(mockGet).toHaveBeenCalledWith('/v1/info', { params });
|
|
@@ -87,7 +85,7 @@ describe('MeetbotClient', () => {
|
|
|
87
85
|
});
|
|
88
86
|
describe('getSlots', () => {
|
|
89
87
|
beforeEach(() => {
|
|
90
|
-
client = new
|
|
88
|
+
client = new MeetbotClient(mockConfig);
|
|
91
89
|
});
|
|
92
90
|
it('should validate params before making request', () => {
|
|
93
91
|
const invalidParams = { page: 'not-a-url' };
|
|
@@ -110,7 +108,7 @@ describe('MeetbotClient', () => {
|
|
|
110
108
|
response: { use: jest.fn() },
|
|
111
109
|
},
|
|
112
110
|
});
|
|
113
|
-
client = new
|
|
111
|
+
client = new MeetbotClient(mockConfig);
|
|
114
112
|
const params = { page: 'https://meet.bot/user/30min' };
|
|
115
113
|
await client.getSlots(params);
|
|
116
114
|
expect(mockGet).toHaveBeenCalledWith('/v1/slots', { params });
|
|
@@ -118,7 +116,7 @@ describe('MeetbotClient', () => {
|
|
|
118
116
|
});
|
|
119
117
|
describe('bookSlot', () => {
|
|
120
118
|
beforeEach(() => {
|
|
121
|
-
client = new
|
|
119
|
+
client = new MeetbotClient(mockConfig);
|
|
122
120
|
});
|
|
123
121
|
it('should validate request before making API call', () => {
|
|
124
122
|
const invalidRequest = {
|
|
@@ -149,7 +147,7 @@ describe('MeetbotClient', () => {
|
|
|
149
147
|
response: { use: jest.fn() },
|
|
150
148
|
},
|
|
151
149
|
});
|
|
152
|
-
client = new
|
|
150
|
+
client = new MeetbotClient(mockConfig);
|
|
153
151
|
const request = {
|
|
154
152
|
page: 'https://meet.bot/user/30min',
|
|
155
153
|
guest_email: 'guest@example.com',
|
|
@@ -162,7 +160,7 @@ describe('MeetbotClient', () => {
|
|
|
162
160
|
});
|
|
163
161
|
describe('getConfig', () => {
|
|
164
162
|
beforeEach(() => {
|
|
165
|
-
client = new
|
|
163
|
+
client = new MeetbotClient(mockConfig);
|
|
166
164
|
});
|
|
167
165
|
it('should return a copy of the configuration', () => {
|
|
168
166
|
const config = client.getConfig();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meetbot-client.test.js","sourceRoot":"","sources":["../../src/__tests__/meetbot-client.test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"meetbot-client.test.js","sourceRoot":"","sources":["../../src/__tests__/meetbot-client.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const schemas_1 = require("../schemas");
|
|
1
|
+
import { BookSlotSchema, PageInfoSchema, GetSlotsParamsSchema, MeetbotConfigSchema, } from '../schemas';
|
|
4
2
|
describe('Meet.bot API Schemas', () => {
|
|
5
3
|
describe('BookSlotSchema', () => {
|
|
6
4
|
it('should validate a valid BookSlot', () => {
|
|
@@ -13,7 +11,7 @@ describe('Meet.bot API Schemas', () => {
|
|
|
13
11
|
start: '2025-01-15T14:00:00Z',
|
|
14
12
|
ical_uid: 'abc123',
|
|
15
13
|
};
|
|
16
|
-
const result =
|
|
14
|
+
const result = BookSlotSchema.safeParse(validBookSlot);
|
|
17
15
|
expect(result.success).toBe(true);
|
|
18
16
|
});
|
|
19
17
|
it('should reject invalid email', () => {
|
|
@@ -25,7 +23,7 @@ describe('Meet.bot API Schemas', () => {
|
|
|
25
23
|
start: '2025-01-15T14:00:00Z',
|
|
26
24
|
ical_uid: 'abc123',
|
|
27
25
|
};
|
|
28
|
-
const result =
|
|
26
|
+
const result = BookSlotSchema.safeParse(invalidBookSlot);
|
|
29
27
|
expect(result.success).toBe(false);
|
|
30
28
|
});
|
|
31
29
|
});
|
|
@@ -38,7 +36,7 @@ describe('Meet.bot API Schemas', () => {
|
|
|
38
36
|
owner_name: 'John Doe',
|
|
39
37
|
max_days_into_the_future: 30,
|
|
40
38
|
};
|
|
41
|
-
const result =
|
|
39
|
+
const result = PageInfoSchema.safeParse(validPageInfo);
|
|
42
40
|
expect(result.success).toBe(true);
|
|
43
41
|
});
|
|
44
42
|
it('should reject negative duration', () => {
|
|
@@ -49,7 +47,7 @@ describe('Meet.bot API Schemas', () => {
|
|
|
49
47
|
owner_name: 'John Doe',
|
|
50
48
|
max_days_into_the_future: 30,
|
|
51
49
|
};
|
|
52
|
-
const result =
|
|
50
|
+
const result = PageInfoSchema.safeParse(invalidPageInfo);
|
|
53
51
|
expect(result.success).toBe(false);
|
|
54
52
|
});
|
|
55
53
|
});
|
|
@@ -58,7 +56,7 @@ describe('Meet.bot API Schemas', () => {
|
|
|
58
56
|
const validConfig = {
|
|
59
57
|
baseUrl: 'https://api.meet.bot',
|
|
60
58
|
};
|
|
61
|
-
const result =
|
|
59
|
+
const result = MeetbotConfigSchema.safeParse(validConfig);
|
|
62
60
|
expect(result.success).toBe(true);
|
|
63
61
|
});
|
|
64
62
|
it('should validate valid config with all fields', () => {
|
|
@@ -67,14 +65,14 @@ describe('Meet.bot API Schemas', () => {
|
|
|
67
65
|
authToken: 'token123',
|
|
68
66
|
sessionId: 'session123',
|
|
69
67
|
};
|
|
70
|
-
const result =
|
|
68
|
+
const result = MeetbotConfigSchema.safeParse(validConfig);
|
|
71
69
|
expect(result.success).toBe(true);
|
|
72
70
|
});
|
|
73
71
|
it('should accept valid authToken', () => {
|
|
74
72
|
const validConfig = {
|
|
75
73
|
authToken: 'valid-token-123',
|
|
76
74
|
};
|
|
77
|
-
const result =
|
|
75
|
+
const result = MeetbotConfigSchema.safeParse(validConfig);
|
|
78
76
|
expect(result.success).toBe(true);
|
|
79
77
|
});
|
|
80
78
|
});
|
|
@@ -88,14 +86,14 @@ describe('Meet.bot API Schemas', () => {
|
|
|
88
86
|
timezone: 'America/New_York',
|
|
89
87
|
booking_link: true,
|
|
90
88
|
};
|
|
91
|
-
const result =
|
|
89
|
+
const result = GetSlotsParamsSchema.safeParse(validParams);
|
|
92
90
|
expect(result.success).toBe(true);
|
|
93
91
|
});
|
|
94
92
|
it('should validate minimal params', () => {
|
|
95
93
|
const minimalParams = {
|
|
96
94
|
page: 'https://meet.bot/user/30min',
|
|
97
95
|
};
|
|
98
|
-
const result =
|
|
96
|
+
const result = GetSlotsParamsSchema.safeParse(minimalParams);
|
|
99
97
|
expect(result.success).toBe(true);
|
|
100
98
|
});
|
|
101
99
|
it('should reject invalid date format', () => {
|
|
@@ -103,7 +101,7 @@ describe('Meet.bot API Schemas', () => {
|
|
|
103
101
|
page: 'https://meet.bot/user/30min',
|
|
104
102
|
start: '2025/01/01',
|
|
105
103
|
};
|
|
106
|
-
const result =
|
|
104
|
+
const result = GetSlotsParamsSchema.safeParse(invalidParams);
|
|
107
105
|
expect(result.success).toBe(false);
|
|
108
106
|
});
|
|
109
107
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.test.js","sourceRoot":"","sources":["../../src/__tests__/types.test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.test.js","sourceRoot":"","sources":["../../src/__tests__/types.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cli-http.js
CHANGED
|
@@ -1,31 +1,19 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const http_1 = require("http");
|
|
5
|
-
const mcp_server_http_js_1 = require("./mcp-server-http.js");
|
|
2
|
+
import { createServer } from 'http';
|
|
3
|
+
import { MeetbotMCPStreamable } from './mcp-server-streamable.js';
|
|
6
4
|
const PORT = parseInt(process.env['PORT'] || '3000', 10);
|
|
7
5
|
async function main() {
|
|
8
|
-
const mcpServer = new
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
await mcpServer.handleRequest(req, res);
|
|
12
|
-
}
|
|
13
|
-
catch (error) {
|
|
14
|
-
console.error('Request handling error:', error);
|
|
15
|
-
if (!res.headersSent) {
|
|
16
|
-
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
17
|
-
res.end(JSON.stringify({
|
|
18
|
-
error: 'Internal server error',
|
|
19
|
-
message: error instanceof Error ? error.message : 'Unknown error',
|
|
20
|
-
}));
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
});
|
|
6
|
+
const mcpServer = new MeetbotMCPStreamable();
|
|
7
|
+
const app = mcpServer.createApp();
|
|
8
|
+
const httpServer = createServer(app);
|
|
24
9
|
httpServer.listen(PORT, () => {
|
|
25
|
-
console.log(`Meet.bot MCP HTTP server listening on port ${PORT}`);
|
|
26
|
-
console.log(
|
|
27
|
-
console.log(`
|
|
28
|
-
console.log(
|
|
10
|
+
console.log(`Meet.bot MCP Streamable HTTP server listening on port ${PORT}`);
|
|
11
|
+
console.log(`\nEndpoints:`);
|
|
12
|
+
console.log(` POST / → MCP client-to-server messages`);
|
|
13
|
+
console.log(` GET / → MCP server-to-client SSE stream`);
|
|
14
|
+
console.log(` DELETE / → Terminate session`);
|
|
15
|
+
console.log(` GET /health → Health check`);
|
|
16
|
+
console.log(`\nAuthentication: Use configure_meetbot tool with your API token`);
|
|
29
17
|
});
|
|
30
18
|
// Graceful shutdown
|
|
31
19
|
process.on('SIGINT', () => {
|
package/dist/cli-http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-http.js","sourceRoot":"","sources":["../src/cli-http.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli-http.js","sourceRoot":"","sources":["../src/cli-http.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAElE,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;AAEzD,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC;IAElC,MAAM,UAAU,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAErC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;QAC3B,OAAO,CAAC,GAAG,CAAC,yDAAyD,IAAI,EAAE,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,oBAAoB;IACpB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC7C,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE;YACpB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC7C,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE;YACpB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-streamable.d.ts","sourceRoot":"","sources":["../src/cli-streamable.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { MeetbotMCPStreamable } from './mcp-server-streamable.js';
|
|
3
|
+
const PORT = parseInt(process.env['PORT'] || '3000', 10);
|
|
4
|
+
async function main() {
|
|
5
|
+
const mcpServer = new MeetbotMCPStreamable();
|
|
6
|
+
const app = mcpServer.createApp();
|
|
7
|
+
const server = app.listen(PORT, () => {
|
|
8
|
+
console.log(`Meet.bot MCP Streamable HTTP server listening on port ${PORT}`);
|
|
9
|
+
console.log(`\nEndpoints:`);
|
|
10
|
+
console.log(` POST / → MCP client-to-server messages`);
|
|
11
|
+
console.log(` GET / → MCP server-to-client SSE stream`);
|
|
12
|
+
console.log(` DELETE / → Terminate session`);
|
|
13
|
+
console.log(` GET /health → Health check`);
|
|
14
|
+
console.log(`\nAuthentication: Use configure_meetbot tool with your API token`);
|
|
15
|
+
});
|
|
16
|
+
// Graceful shutdown
|
|
17
|
+
process.on('SIGINT', () => {
|
|
18
|
+
console.log('\nShutting down MCP server...');
|
|
19
|
+
server.close(() => {
|
|
20
|
+
console.log('Server closed');
|
|
21
|
+
process.exit(0);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
process.on('SIGTERM', () => {
|
|
25
|
+
console.log('\nShutting down MCP server...');
|
|
26
|
+
server.close(() => {
|
|
27
|
+
console.log('Server closed');
|
|
28
|
+
process.exit(0);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
main().catch((error) => {
|
|
33
|
+
console.error('Failed to start MCP server:', error);
|
|
34
|
+
process.exit(1);
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=cli-streamable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-streamable.js","sourceRoot":"","sources":["../src/cli-streamable.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAElE,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;AAEzD,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC;IAElC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;QACnC,OAAO,CAAC,GAAG,CAAC,yDAAyD,IAAI,EAAE,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,oBAAoB;IACpB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;YAChB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;YAChB,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;IACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
const mcp_server_js_1 = require("./mcp-server.js");
|
|
2
|
+
import { MeetbotMCPServer } from './mcp-server.js';
|
|
5
3
|
/**
|
|
6
4
|
* CLI entry point for the Meet.bot MCP server
|
|
7
5
|
*/
|
|
8
6
|
async function main() {
|
|
9
7
|
try {
|
|
10
|
-
const server = new
|
|
8
|
+
const server = new MeetbotMCPServer();
|
|
11
9
|
await server.run();
|
|
12
10
|
}
|
|
13
11
|
catch (error) {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnD;;GAEG;AACH,KAAK,UAAU,IAAI;IACjB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACtC,MAAM,MAAM,CAAC,GAAG,EAAE,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;QAC7D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,wCAAwC;AACxC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;IACxB,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;IACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;IACzB,OAAO,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;IACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,mBAAmB;AACnB,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { EventStore, StreamId, EventId } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
2
|
+
import type { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Simple in-memory event store for MCP session resumability
|
|
5
|
+
*/
|
|
6
|
+
export declare class InMemoryEventStore implements EventStore {
|
|
7
|
+
private events;
|
|
8
|
+
storeEvent(streamId: StreamId, message: JSONRPCMessage): Promise<EventId>;
|
|
9
|
+
replayEventsAfter(lastEventId: EventId, { send }: {
|
|
10
|
+
send: (eventId: EventId, message: JSONRPCMessage) => Promise<void>;
|
|
11
|
+
}): Promise<StreamId>;
|
|
12
|
+
clearSession(streamId: StreamId): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=in-memory-event-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-event-store.d.ts","sourceRoot":"","sources":["../src/in-memory-event-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,oDAAoD,CAAC;AACxG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE;;GAEG;AACH,qBAAa,kBAAmB,YAAW,UAAU;IACnD,OAAO,CAAC,MAAM,CAA6E;IAErF,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IASzE,iBAAiB,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE;QACtD,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACpE,GAAG,OAAO,CAAC,QAAQ,CAAC;IAgBf,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAGtD"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple in-memory event store for MCP session resumability
|
|
3
|
+
*/
|
|
4
|
+
export class InMemoryEventStore {
|
|
5
|
+
events = new Map();
|
|
6
|
+
async storeEvent(streamId, message) {
|
|
7
|
+
if (!this.events.has(streamId)) {
|
|
8
|
+
this.events.set(streamId, []);
|
|
9
|
+
}
|
|
10
|
+
const eventId = `event_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
11
|
+
this.events.get(streamId).push({ id: eventId, message });
|
|
12
|
+
return eventId;
|
|
13
|
+
}
|
|
14
|
+
async replayEventsAfter(lastEventId, { send }) {
|
|
15
|
+
// Find the stream that contains the lastEventId
|
|
16
|
+
for (const [streamId, events] of this.events.entries()) {
|
|
17
|
+
const eventIndex = events.findIndex(event => event.id === lastEventId);
|
|
18
|
+
if (eventIndex >= 0) {
|
|
19
|
+
// Replay events after the lastEventId
|
|
20
|
+
const eventsToReplay = events.slice(eventIndex + 1);
|
|
21
|
+
for (const event of eventsToReplay) {
|
|
22
|
+
await send(event.id, event.message);
|
|
23
|
+
}
|
|
24
|
+
return streamId;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
throw new Error(`Event ID ${lastEventId} not found`);
|
|
28
|
+
}
|
|
29
|
+
async clearSession(streamId) {
|
|
30
|
+
this.events.delete(streamId);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=in-memory-event-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-event-store.js","sourceRoot":"","sources":["../src/in-memory-event-store.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,OAAO,kBAAkB;IACrB,MAAM,GAAmE,IAAI,GAAG,EAAE,CAAC;IAE3F,KAAK,CAAC,UAAU,CAAC,QAAkB,EAAE,OAAuB;QAC1D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAChC,CAAC;QACD,MAAM,OAAO,GAAG,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QACjF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1D,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,WAAoB,EAAE,EAAE,IAAI,EAEnD;QACC,gDAAgD;QAChD,KAAK,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YACvD,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC;YACvE,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;gBACpB,sCAAsC;gBACtC,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;gBACpD,KAAK,MAAM,KAAK,IAAI,cAAc,EAAE,CAAC;oBACnC,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;gBACtC,CAAC;gBACD,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,YAAY,WAAW,YAAY,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAkB;QACnC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC;CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Model Context Protocol server for Meet.bot Booking Page API
|
|
4
4
|
*/
|
|
5
5
|
export { MeetbotMCPServer } from './mcp-server.js';
|
|
6
|
-
export { MeetbotMCPServerHTTP } from './mcp-server-
|
|
6
|
+
export { MeetbotMCPStreamable as MeetbotMCPServerHTTP } from './mcp-server-streamable.js';
|
|
7
7
|
export { MeetbotClient } from './meetbot-client.js';
|
|
8
8
|
export type { BookSlot, BookSlotRequest, GetSlotsParams, GetInfoParams, PageInfo, Pages, SchedulingPage, Slots, SlotDetails, MeetbotConfig, ApiError, ApiResponse, } from './types.js';
|
|
9
9
|
export { BookSlotSchema, BookSlotRequestSchema, GetSlotsParamsSchema, GetInfoParamsSchema, PageInfoSchema, PagesSchema, SchedulingPageSchema, SlotsSchema, SlotDetailsSchema, MeetbotConfigSchema, ApiErrorSchema, } from './schemas.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,oBAAoB,IAAI,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,YAAY,EACV,QAAQ,EACR,eAAe,EACf,cAAc,EACd,aAAa,EACb,QAAQ,EACR,KAAK,EACL,cAAc,EACd,KAAK,EACL,WAAW,EACX,aAAa,EACb,QAAQ,EACR,WAAW,GACZ,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,oBAAoB,EACpB,WAAW,EACX,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,GACf,MAAM,cAAc,CAAC;AAGtB,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,cAAc,EACd,cAAc,EACd,wBAAwB,EACxB,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,cAAc,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,28 +1,11 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* Meet.bot MCP Package
|
|
4
3
|
* Model Context Protocol server for Meet.bot Booking Page API
|
|
5
4
|
*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.ApiErrorSchema = exports.MeetbotConfigSchema = exports.SlotDetailsSchema = exports.SlotsSchema = exports.SchedulingPageSchema = exports.PagesSchema = exports.PageInfoSchema = exports.GetInfoParamsSchema = exports.GetSlotsParamsSchema = exports.BookSlotRequestSchema = exports.BookSlotSchema = exports.MeetbotClient = exports.MeetbotMCPServerHTTP = exports.MeetbotMCPServer = void 0;
|
|
8
5
|
// Export main classes
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
Object.defineProperty(exports, "MeetbotMCPServerHTTP", { enumerable: true, get: function () { return mcp_server_http_js_1.MeetbotMCPServerHTTP; } });
|
|
13
|
-
var meetbot_client_js_1 = require("./meetbot-client.js");
|
|
14
|
-
Object.defineProperty(exports, "MeetbotClient", { enumerable: true, get: function () { return meetbot_client_js_1.MeetbotClient; } });
|
|
6
|
+
export { MeetbotMCPServer } from './mcp-server.js';
|
|
7
|
+
export { MeetbotMCPStreamable as MeetbotMCPServerHTTP } from './mcp-server-streamable.js';
|
|
8
|
+
export { MeetbotClient } from './meetbot-client.js';
|
|
15
9
|
// Export schemas
|
|
16
|
-
|
|
17
|
-
Object.defineProperty(exports, "BookSlotSchema", { enumerable: true, get: function () { return schemas_js_1.BookSlotSchema; } });
|
|
18
|
-
Object.defineProperty(exports, "BookSlotRequestSchema", { enumerable: true, get: function () { return schemas_js_1.BookSlotRequestSchema; } });
|
|
19
|
-
Object.defineProperty(exports, "GetSlotsParamsSchema", { enumerable: true, get: function () { return schemas_js_1.GetSlotsParamsSchema; } });
|
|
20
|
-
Object.defineProperty(exports, "GetInfoParamsSchema", { enumerable: true, get: function () { return schemas_js_1.GetInfoParamsSchema; } });
|
|
21
|
-
Object.defineProperty(exports, "PageInfoSchema", { enumerable: true, get: function () { return schemas_js_1.PageInfoSchema; } });
|
|
22
|
-
Object.defineProperty(exports, "PagesSchema", { enumerable: true, get: function () { return schemas_js_1.PagesSchema; } });
|
|
23
|
-
Object.defineProperty(exports, "SchedulingPageSchema", { enumerable: true, get: function () { return schemas_js_1.SchedulingPageSchema; } });
|
|
24
|
-
Object.defineProperty(exports, "SlotsSchema", { enumerable: true, get: function () { return schemas_js_1.SlotsSchema; } });
|
|
25
|
-
Object.defineProperty(exports, "SlotDetailsSchema", { enumerable: true, get: function () { return schemas_js_1.SlotDetailsSchema; } });
|
|
26
|
-
Object.defineProperty(exports, "MeetbotConfigSchema", { enumerable: true, get: function () { return schemas_js_1.MeetbotConfigSchema; } });
|
|
27
|
-
Object.defineProperty(exports, "ApiErrorSchema", { enumerable: true, get: function () { return schemas_js_1.ApiErrorSchema; } });
|
|
10
|
+
export { BookSlotSchema, BookSlotRequestSchema, GetSlotsParamsSchema, GetInfoParamsSchema, PageInfoSchema, PagesSchema, SchedulingPageSchema, SlotsSchema, SlotDetailsSchema, MeetbotConfigSchema, ApiErrorSchema, } from './schemas.js';
|
|
28
11
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,sBAAsB;AACtB,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,oBAAoB,IAAI,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAkBpD,iBAAiB;AACjB,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,oBAAoB,EACpB,WAAW,EACX,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,GACf,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
/**
|
|
3
|
+
* Streamable HTTP MCP Server implementation
|
|
4
|
+
*/
|
|
5
|
+
export declare class MeetbotMCPStreamable {
|
|
6
|
+
private server;
|
|
7
|
+
private transports;
|
|
8
|
+
private clients;
|
|
9
|
+
constructor();
|
|
10
|
+
private setupToolHandlers;
|
|
11
|
+
/**
|
|
12
|
+
* Create Express app with MCP endpoints
|
|
13
|
+
*/
|
|
14
|
+
createApp(): express.Application;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=mcp-server-streamable.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server-streamable.d.ts","sourceRoot":"","sources":["../src/mcp-server-streamable.ts"],"names":[],"mappings":"AAAA,OAAO,OAA4C,MAAM,SAAS,CAAC;AASnE;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,UAAU,CAAyD;IAC3E,OAAO,CAAC,OAAO,CAAyC;;IAYxD,OAAO,CAAC,iBAAiB;IAyOzB;;OAEG;IACH,SAAS,IAAI,OAAO,CAAC,WAAW;CA0IjC"}
|