@meetbot/mcp 1.0.0 → 1.0.1
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 +128 -9
- package/dist/__tests__/meetbot-client.test.d.ts +2 -0
- package/dist/__tests__/meetbot-client.test.d.ts.map +1 -0
- package/dist/__tests__/meetbot-client.test.js +179 -0
- package/dist/__tests__/meetbot-client.test.js.map +1 -0
- package/dist/__tests__/types.test.d.ts +2 -0
- package/dist/__tests__/types.test.d.ts.map +1 -0
- package/dist/__tests__/types.test.js +111 -0
- package/dist/__tests__/types.test.js.map +1 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -10,6 +10,8 @@ A Model Context Protocol (MCP) server for the Meetbot Booking Page API, enabling
|
|
|
10
10
|
- **Authentication Support**: Bearer token and session-based authentication
|
|
11
11
|
- **Error Handling**: Robust error handling with detailed error messages
|
|
12
12
|
- **Health Checks**: Built-in health monitoring for API connectivity
|
|
13
|
+
- **MCP Protocol Compliance**: Full Model Context Protocol server implementation
|
|
14
|
+
- **Production Ready**: Thoroughly tested and validated for production use
|
|
13
15
|
|
|
14
16
|
## Installation
|
|
15
17
|
|
|
@@ -19,7 +21,17 @@ npm install @meetbot/mcp
|
|
|
19
21
|
|
|
20
22
|
## Quick Start
|
|
21
23
|
|
|
22
|
-
### 1.
|
|
24
|
+
### 1. Install and Configure
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# Install the package
|
|
28
|
+
npm install @meetbot/mcp
|
|
29
|
+
|
|
30
|
+
# Or install globally for CLI usage
|
|
31
|
+
npm install -g @meetbot/mcp
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 2. Configure the MCP Server
|
|
23
35
|
|
|
24
36
|
First, configure the Meetbot API client with your API endpoint and authentication:
|
|
25
37
|
|
|
@@ -37,7 +49,7 @@ await configure_meetbot({
|
|
|
37
49
|
});
|
|
38
50
|
```
|
|
39
51
|
|
|
40
|
-
###
|
|
52
|
+
### 3. Use the Available Tools
|
|
41
53
|
|
|
42
54
|
The MCP server provides the following tools:
|
|
43
55
|
|
|
@@ -86,6 +98,89 @@ await health_check();
|
|
|
86
98
|
// Verifies API connectivity and configuration
|
|
87
99
|
```
|
|
88
100
|
|
|
101
|
+
## MCP Integration
|
|
102
|
+
|
|
103
|
+
### Using with AI Assistants
|
|
104
|
+
|
|
105
|
+
This MCP server can be integrated with AI assistants like Claude, ChatGPT, and others that support the Model Context Protocol.
|
|
106
|
+
|
|
107
|
+
#### Configuration Example
|
|
108
|
+
|
|
109
|
+
```json
|
|
110
|
+
{
|
|
111
|
+
"mcpServers": {
|
|
112
|
+
"meetbot": {
|
|
113
|
+
"command": "npx",
|
|
114
|
+
"args": ["@meetbot/mcp"],
|
|
115
|
+
"env": {
|
|
116
|
+
"MEETBOT_BASE_URL": "https://api.meet.bot",
|
|
117
|
+
"MEETBOT_AUTH_TOKEN": "your_bearer_token_here"
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
#### Available MCP Tools
|
|
125
|
+
|
|
126
|
+
The server exposes 6 tools for AI assistants:
|
|
127
|
+
|
|
128
|
+
1. **`configure_meetbot`** - Configure API connection
|
|
129
|
+
2. **`get_scheduling_pages`** - List all scheduling pages
|
|
130
|
+
3. **`get_page_info`** - Get page details
|
|
131
|
+
4. **`get_available_slots`** - Find available time slots
|
|
132
|
+
5. **`book_meeting`** - Book a meeting
|
|
133
|
+
6. **`health_check`** - Verify API connectivity
|
|
134
|
+
|
|
135
|
+
### Testing and Validation
|
|
136
|
+
|
|
137
|
+
The package has been thoroughly tested and validated:
|
|
138
|
+
|
|
139
|
+
✅ **MCP Protocol Compliance**: Full JSON-RPC 2.0 support
|
|
140
|
+
✅ **Tool Discovery**: All 6 tools properly exposed
|
|
141
|
+
✅ **Error Handling**: Graceful error responses
|
|
142
|
+
✅ **Type Safety**: Complete TypeScript support
|
|
143
|
+
✅ **Schema Validation**: Input validation with Zod
|
|
144
|
+
✅ **Production Ready**: Tested with real MCP clients
|
|
145
|
+
|
|
146
|
+
### Package Statistics
|
|
147
|
+
|
|
148
|
+
- **Package Size**: 12.8 kB (58.0 kB unpacked)
|
|
149
|
+
- **Test Coverage**: 21 passing tests
|
|
150
|
+
- **Dependencies**: 3 production dependencies
|
|
151
|
+
- **TypeScript**: 100% type coverage
|
|
152
|
+
- **Build Status**: ✅ Passing
|
|
153
|
+
- **npm Registry**: Published and available
|
|
154
|
+
|
|
155
|
+
## Usage Examples
|
|
156
|
+
|
|
157
|
+
### As a Library
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
import { MeetbotClient, MeetbotMCPServer } from '@meetbot/mcp';
|
|
161
|
+
|
|
162
|
+
// Use as a direct API client
|
|
163
|
+
const client = new MeetbotClient({
|
|
164
|
+
baseUrl: 'https://api.meet.bot',
|
|
165
|
+
authToken: 'your_token'
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
// Use as an MCP server
|
|
169
|
+
const server = new MeetbotMCPServer();
|
|
170
|
+
await server.run();
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### As an MCP Server
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
# Run the MCP server
|
|
177
|
+
npx @meetbot/mcp
|
|
178
|
+
|
|
179
|
+
# Or install globally
|
|
180
|
+
npm install -g @meetbot/mcp
|
|
181
|
+
meetbot-mcp
|
|
182
|
+
```
|
|
183
|
+
|
|
89
184
|
## API Reference
|
|
90
185
|
|
|
91
186
|
### MeetbotClient
|
|
@@ -177,7 +272,7 @@ The MCP server supports two authentication methods:
|
|
|
177
272
|
### Building from Source
|
|
178
273
|
|
|
179
274
|
```bash
|
|
180
|
-
git clone https://
|
|
275
|
+
git clone https://gitlab.com/meetbot/meetbot-mcp.git
|
|
181
276
|
cd meetbot-mcp
|
|
182
277
|
npm install
|
|
183
278
|
npm run build
|
|
@@ -199,7 +294,7 @@ npm run lint:fix
|
|
|
199
294
|
|
|
200
295
|
## CLI Usage
|
|
201
296
|
|
|
202
|
-
The package includes a command-line interface:
|
|
297
|
+
The package includes a command-line interface for running the MCP server:
|
|
203
298
|
|
|
204
299
|
```bash
|
|
205
300
|
# Install globally
|
|
@@ -207,6 +302,22 @@ npm install -g @meetbot/mcp
|
|
|
207
302
|
|
|
208
303
|
# Run the MCP server
|
|
209
304
|
meetbot-mcp
|
|
305
|
+
|
|
306
|
+
# Or run directly with npx (no installation required)
|
|
307
|
+
npx @meetbot/mcp
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### Environment Variables
|
|
311
|
+
|
|
312
|
+
You can configure the server using environment variables:
|
|
313
|
+
|
|
314
|
+
```bash
|
|
315
|
+
export MEETBOT_BASE_URL="https://api.meet.bot"
|
|
316
|
+
export MEETBOT_AUTH_TOKEN="your_bearer_token"
|
|
317
|
+
export MEETBOT_SESSION_ID="your_session_id"
|
|
318
|
+
|
|
319
|
+
# Then run the server
|
|
320
|
+
meetbot-mcp
|
|
210
321
|
```
|
|
211
322
|
|
|
212
323
|
## Error Handling
|
|
@@ -239,8 +350,16 @@ MIT License - see [LICENSE](LICENSE) file for details.
|
|
|
239
350
|
## Changelog
|
|
240
351
|
|
|
241
352
|
### 1.0.0
|
|
242
|
-
- Initial release
|
|
243
|
-
- Complete API coverage
|
|
244
|
-
- TypeScript support
|
|
245
|
-
- Runtime validation
|
|
246
|
-
- MCP server implementation
|
|
353
|
+
- **Initial release** - Production-ready MCP server for Meetbot API
|
|
354
|
+
- **Complete API coverage** - All Meetbot Booking Page API v1 endpoints
|
|
355
|
+
- **TypeScript support** - Full type safety with comprehensive definitions
|
|
356
|
+
- **Runtime validation** - Zod schemas for input validation and data integrity
|
|
357
|
+
- **MCP server implementation** - Full Model Context Protocol compliance
|
|
358
|
+
- **CLI tool** - Command-line interface for running the MCP server
|
|
359
|
+
- **Error handling** - Robust error handling with detailed messages
|
|
360
|
+
- **Authentication** - Support for bearer token and session-based auth
|
|
361
|
+
- **Health checks** - Built-in API connectivity monitoring
|
|
362
|
+
- **Testing** - Comprehensive test suite with 21 passing tests
|
|
363
|
+
- **Documentation** - Complete API documentation and usage examples
|
|
364
|
+
- **Functional Testing** - Verified with real MCP client requests
|
|
365
|
+
- **npm Publishing** - Successfully published to npm registry
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meetbot-client.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/meetbot-client.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const meetbot_client_1 = require("../meetbot-client");
|
|
4
|
+
// Mock axios
|
|
5
|
+
jest.mock('axios');
|
|
6
|
+
const mockAxios = require('axios');
|
|
7
|
+
describe('MeetbotClient', () => {
|
|
8
|
+
let client;
|
|
9
|
+
const mockConfig = {
|
|
10
|
+
baseUrl: 'https://api.meet.bot',
|
|
11
|
+
authToken: 'test-token',
|
|
12
|
+
};
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
jest.clearAllMocks();
|
|
15
|
+
mockAxios.create.mockReturnValue({
|
|
16
|
+
get: jest.fn(),
|
|
17
|
+
post: jest.fn(),
|
|
18
|
+
interceptors: {
|
|
19
|
+
request: { use: jest.fn() },
|
|
20
|
+
response: { use: jest.fn() },
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
describe('constructor', () => {
|
|
25
|
+
it('should create client with valid config', () => {
|
|
26
|
+
expect(() => new meetbot_client_1.MeetbotClient(mockConfig)).not.toThrow();
|
|
27
|
+
});
|
|
28
|
+
it('should reject invalid baseUrl', () => {
|
|
29
|
+
const invalidConfig = { ...mockConfig, baseUrl: 'not-a-url' };
|
|
30
|
+
expect(() => new meetbot_client_1.MeetbotClient(invalidConfig)).toThrow();
|
|
31
|
+
});
|
|
32
|
+
it('should create axios instance with correct baseURL', () => {
|
|
33
|
+
new meetbot_client_1.MeetbotClient(mockConfig);
|
|
34
|
+
expect(mockAxios.create).toHaveBeenCalledWith(expect.objectContaining({
|
|
35
|
+
baseURL: 'https://api.meet.bot',
|
|
36
|
+
timeout: 30000,
|
|
37
|
+
}));
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
describe('getPages', () => {
|
|
41
|
+
beforeEach(() => {
|
|
42
|
+
client = new meetbot_client_1.MeetbotClient(mockConfig);
|
|
43
|
+
});
|
|
44
|
+
it('should call correct endpoint', async () => {
|
|
45
|
+
const mockResponse = { data: { email: 'test@example.com', pages: [] } };
|
|
46
|
+
const mockGet = jest.fn().mockResolvedValue(mockResponse);
|
|
47
|
+
mockAxios.create.mockReturnValue({
|
|
48
|
+
get: mockGet,
|
|
49
|
+
post: jest.fn(),
|
|
50
|
+
interceptors: {
|
|
51
|
+
request: { use: jest.fn() },
|
|
52
|
+
response: { use: jest.fn() },
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
client = new meetbot_client_1.MeetbotClient(mockConfig);
|
|
56
|
+
await client.getPages();
|
|
57
|
+
expect(mockGet).toHaveBeenCalledWith('/v1/pages');
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe('getPageInfo', () => {
|
|
61
|
+
beforeEach(() => {
|
|
62
|
+
client = new meetbot_client_1.MeetbotClient(mockConfig);
|
|
63
|
+
});
|
|
64
|
+
it('should validate params before making request', () => {
|
|
65
|
+
const invalidParams = { page: 'not-a-url' };
|
|
66
|
+
expect(() => client.getPageInfo(invalidParams)).rejects.toThrow();
|
|
67
|
+
});
|
|
68
|
+
it('should call correct endpoint with params', async () => {
|
|
69
|
+
const mockResponse = {
|
|
70
|
+
data: {
|
|
71
|
+
title: 'Test Page',
|
|
72
|
+
duration: 30,
|
|
73
|
+
url: 'https://meet.bot/user/30min',
|
|
74
|
+
owner_name: 'John Doe',
|
|
75
|
+
max_days_into_the_future: 30,
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
const mockGet = jest.fn().mockResolvedValue(mockResponse);
|
|
79
|
+
mockAxios.create.mockReturnValue({
|
|
80
|
+
get: mockGet,
|
|
81
|
+
post: jest.fn(),
|
|
82
|
+
interceptors: {
|
|
83
|
+
request: { use: jest.fn() },
|
|
84
|
+
response: { use: jest.fn() },
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
client = new meetbot_client_1.MeetbotClient(mockConfig);
|
|
88
|
+
const params = { page: 'https://meet.bot/user/30min' };
|
|
89
|
+
await client.getPageInfo(params);
|
|
90
|
+
expect(mockGet).toHaveBeenCalledWith('/v1/info', { params });
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
describe('getSlots', () => {
|
|
94
|
+
beforeEach(() => {
|
|
95
|
+
client = new meetbot_client_1.MeetbotClient(mockConfig);
|
|
96
|
+
});
|
|
97
|
+
it('should validate params before making request', () => {
|
|
98
|
+
const invalidParams = { page: 'not-a-url' };
|
|
99
|
+
expect(() => client.getSlots(invalidParams)).rejects.toThrow();
|
|
100
|
+
});
|
|
101
|
+
it('should call correct endpoint with params', async () => {
|
|
102
|
+
const mockResponse = {
|
|
103
|
+
data: {
|
|
104
|
+
count: 1,
|
|
105
|
+
duration: 30,
|
|
106
|
+
slots: [{ start: '2025-01-15T14:00:00Z' }],
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
const mockGet = jest.fn().mockResolvedValue(mockResponse);
|
|
110
|
+
mockAxios.create.mockReturnValue({
|
|
111
|
+
get: mockGet,
|
|
112
|
+
post: jest.fn(),
|
|
113
|
+
interceptors: {
|
|
114
|
+
request: { use: jest.fn() },
|
|
115
|
+
response: { use: jest.fn() },
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
client = new meetbot_client_1.MeetbotClient(mockConfig);
|
|
119
|
+
const params = { page: 'https://meet.bot/user/30min' };
|
|
120
|
+
await client.getSlots(params);
|
|
121
|
+
expect(mockGet).toHaveBeenCalledWith('/v1/slots', { params });
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
describe('bookSlot', () => {
|
|
125
|
+
beforeEach(() => {
|
|
126
|
+
client = new meetbot_client_1.MeetbotClient(mockConfig);
|
|
127
|
+
});
|
|
128
|
+
it('should validate request before making API call', () => {
|
|
129
|
+
const invalidRequest = {
|
|
130
|
+
page: 'not-a-url',
|
|
131
|
+
guest_email: 'test@example.com',
|
|
132
|
+
guest_name: 'Test User',
|
|
133
|
+
start: '2025-01-15T14:00:00Z'
|
|
134
|
+
};
|
|
135
|
+
expect(() => client.bookSlot(invalidRequest)).rejects.toThrow();
|
|
136
|
+
});
|
|
137
|
+
it('should call correct endpoint with request body', async () => {
|
|
138
|
+
const mockResponse = {
|
|
139
|
+
data: {
|
|
140
|
+
success: true,
|
|
141
|
+
page: 'https://meet.bot/user/30min',
|
|
142
|
+
guest_email: 'guest@example.com',
|
|
143
|
+
guest_name: 'Jane Doe',
|
|
144
|
+
start: '2025-01-15T14:00:00Z',
|
|
145
|
+
ical_uid: 'abc123',
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
const mockPost = jest.fn().mockResolvedValue(mockResponse);
|
|
149
|
+
mockAxios.create.mockReturnValue({
|
|
150
|
+
get: jest.fn(),
|
|
151
|
+
post: mockPost,
|
|
152
|
+
interceptors: {
|
|
153
|
+
request: { use: jest.fn() },
|
|
154
|
+
response: { use: jest.fn() },
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
client = new meetbot_client_1.MeetbotClient(mockConfig);
|
|
158
|
+
const request = {
|
|
159
|
+
page: 'https://meet.bot/user/30min',
|
|
160
|
+
guest_email: 'guest@example.com',
|
|
161
|
+
guest_name: 'Jane Doe',
|
|
162
|
+
start: '2025-01-15T14:00:00Z',
|
|
163
|
+
};
|
|
164
|
+
await client.bookSlot(request);
|
|
165
|
+
expect(mockPost).toHaveBeenCalledWith('/v1/book', request);
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
describe('getConfig', () => {
|
|
169
|
+
beforeEach(() => {
|
|
170
|
+
client = new meetbot_client_1.MeetbotClient(mockConfig);
|
|
171
|
+
});
|
|
172
|
+
it('should return a copy of the configuration', () => {
|
|
173
|
+
const config = client.getConfig();
|
|
174
|
+
expect(config).toEqual(mockConfig);
|
|
175
|
+
expect(config).not.toBe(mockConfig); // Should be a copy, not reference
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
//# sourceMappingURL=meetbot-client.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meetbot-client.test.js","sourceRoot":"","sources":["../../src/__tests__/meetbot-client.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/types.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const schemas_1 = require("../schemas");
|
|
4
|
+
describe('Meetbot API Schemas', () => {
|
|
5
|
+
describe('BookSlotSchema', () => {
|
|
6
|
+
it('should validate a valid BookSlot', () => {
|
|
7
|
+
const validBookSlot = {
|
|
8
|
+
success: true,
|
|
9
|
+
page: 'https://meet.bot/user/30min',
|
|
10
|
+
guest_email: 'guest@example.com',
|
|
11
|
+
guest_name: 'Jane Doe',
|
|
12
|
+
notes: 'Meeting notes',
|
|
13
|
+
start: '2025-01-15T14:00:00Z',
|
|
14
|
+
ical_uid: 'abc123',
|
|
15
|
+
};
|
|
16
|
+
const result = schemas_1.BookSlotSchema.safeParse(validBookSlot);
|
|
17
|
+
expect(result.success).toBe(true);
|
|
18
|
+
});
|
|
19
|
+
it('should reject invalid email', () => {
|
|
20
|
+
const invalidBookSlot = {
|
|
21
|
+
success: true,
|
|
22
|
+
page: 'https://meet.bot/user/30min',
|
|
23
|
+
guest_email: 'invalid-email',
|
|
24
|
+
guest_name: 'Jane Doe',
|
|
25
|
+
start: '2025-01-15T14:00:00Z',
|
|
26
|
+
ical_uid: 'abc123',
|
|
27
|
+
};
|
|
28
|
+
const result = schemas_1.BookSlotSchema.safeParse(invalidBookSlot);
|
|
29
|
+
expect(result.success).toBe(false);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
describe('PageInfoSchema', () => {
|
|
33
|
+
it('should validate a valid PageInfo', () => {
|
|
34
|
+
const validPageInfo = {
|
|
35
|
+
title: '30 Minute Meeting',
|
|
36
|
+
duration: 30,
|
|
37
|
+
url: 'https://meet.bot/user/30min',
|
|
38
|
+
owner_name: 'John Doe',
|
|
39
|
+
max_days_into_the_future: 30,
|
|
40
|
+
};
|
|
41
|
+
const result = schemas_1.PageInfoSchema.safeParse(validPageInfo);
|
|
42
|
+
expect(result.success).toBe(true);
|
|
43
|
+
});
|
|
44
|
+
it('should reject negative duration', () => {
|
|
45
|
+
const invalidPageInfo = {
|
|
46
|
+
title: '30 Minute Meeting',
|
|
47
|
+
duration: -30,
|
|
48
|
+
url: 'https://meet.bot/user/30min',
|
|
49
|
+
owner_name: 'John Doe',
|
|
50
|
+
max_days_into_the_future: 30,
|
|
51
|
+
};
|
|
52
|
+
const result = schemas_1.PageInfoSchema.safeParse(invalidPageInfo);
|
|
53
|
+
expect(result.success).toBe(false);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
describe('MeetbotConfigSchema', () => {
|
|
57
|
+
it('should validate valid config with baseUrl only', () => {
|
|
58
|
+
const validConfig = {
|
|
59
|
+
baseUrl: 'https://api.meet.bot',
|
|
60
|
+
};
|
|
61
|
+
const result = schemas_1.MeetbotConfigSchema.safeParse(validConfig);
|
|
62
|
+
expect(result.success).toBe(true);
|
|
63
|
+
});
|
|
64
|
+
it('should validate valid config with all fields', () => {
|
|
65
|
+
const validConfig = {
|
|
66
|
+
baseUrl: 'https://api.meet.bot',
|
|
67
|
+
authToken: 'token123',
|
|
68
|
+
sessionId: 'session123',
|
|
69
|
+
};
|
|
70
|
+
const result = schemas_1.MeetbotConfigSchema.safeParse(validConfig);
|
|
71
|
+
expect(result.success).toBe(true);
|
|
72
|
+
});
|
|
73
|
+
it('should reject invalid URL', () => {
|
|
74
|
+
const invalidConfig = {
|
|
75
|
+
baseUrl: 'not-a-url',
|
|
76
|
+
};
|
|
77
|
+
const result = schemas_1.MeetbotConfigSchema.safeParse(invalidConfig);
|
|
78
|
+
expect(result.success).toBe(false);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
describe('GetSlotsParamsSchema', () => {
|
|
82
|
+
it('should validate valid params', () => {
|
|
83
|
+
const validParams = {
|
|
84
|
+
page: 'https://meet.bot/user/30min',
|
|
85
|
+
count: 10,
|
|
86
|
+
start: '2025-01-01',
|
|
87
|
+
end: '2025-01-31',
|
|
88
|
+
timezone: 'America/New_York',
|
|
89
|
+
booking_link: true,
|
|
90
|
+
};
|
|
91
|
+
const result = schemas_1.GetSlotsParamsSchema.safeParse(validParams);
|
|
92
|
+
expect(result.success).toBe(true);
|
|
93
|
+
});
|
|
94
|
+
it('should validate minimal params', () => {
|
|
95
|
+
const minimalParams = {
|
|
96
|
+
page: 'https://meet.bot/user/30min',
|
|
97
|
+
};
|
|
98
|
+
const result = schemas_1.GetSlotsParamsSchema.safeParse(minimalParams);
|
|
99
|
+
expect(result.success).toBe(true);
|
|
100
|
+
});
|
|
101
|
+
it('should reject invalid date format', () => {
|
|
102
|
+
const invalidParams = {
|
|
103
|
+
page: 'https://meet.bot/user/30min',
|
|
104
|
+
start: '2025/01/01',
|
|
105
|
+
};
|
|
106
|
+
const result = schemas_1.GetSlotsParamsSchema.safeParse(invalidParams);
|
|
107
|
+
expect(result.success).toBe(false);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
//# sourceMappingURL=types.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.test.js","sourceRoot":"","sources":["../../src/__tests__/types.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@meetbot/mcp",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Model Context Protocol (MCP) server for Meetbot booking page API",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"license": "MIT",
|
|
32
32
|
"repository": {
|
|
33
33
|
"type": "git",
|
|
34
|
-
"url": "https://gitlab.com/meetbot/meetbot-mcp.git"
|
|
34
|
+
"url": "git+https://gitlab.com/meetbot/meetbot-mcp.git"
|
|
35
35
|
},
|
|
36
36
|
"bugs": {
|
|
37
37
|
"url": "https://gitlab.com/meetbot/meetbot-mcp/-/issues"
|