@forestadmin/mcp-server 0.1.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.
@@ -1,385 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- var __importDefault = (this && this.__importDefault) || function (mod) {
36
- return (mod && mod.__esModule) ? mod : { "default": mod };
37
- };
38
- Object.defineProperty(exports, "__esModule", { value: true });
39
- const list_1 = __importDefault(require("./list"));
40
- const activity_logs_creator_1 = __importDefault(require("../utils/activity-logs-creator"));
41
- const agent_caller_1 = __importDefault(require("../utils/agent-caller"));
42
- const schemaFetcher = __importStar(require("../utils/schema-fetcher"));
43
- jest.mock('../utils/agent-caller');
44
- jest.mock('../utils/activity-logs-creator');
45
- jest.mock('../utils/schema-fetcher');
46
- const mockBuildClient = agent_caller_1.default;
47
- const mockCreateActivityLog = activity_logs_creator_1.default;
48
- const mockFetchForestSchema = schemaFetcher.fetchForestSchema;
49
- const mockGetFieldsOfCollection = schemaFetcher.getFieldsOfCollection;
50
- describe('declareListTool', () => {
51
- let mcpServer;
52
- let registeredToolHandler;
53
- let registeredToolConfig;
54
- beforeEach(() => {
55
- jest.clearAllMocks();
56
- // Create a mock MCP server that captures the registered tool
57
- mcpServer = {
58
- registerTool: jest.fn((name, config, handler) => {
59
- registeredToolConfig = config;
60
- registeredToolHandler = handler;
61
- }),
62
- };
63
- mockCreateActivityLog.mockResolvedValue(undefined);
64
- });
65
- describe('tool registration', () => {
66
- it('should register a tool named "list"', () => {
67
- (0, list_1.default)(mcpServer, 'https://api.forestadmin.com');
68
- expect(mcpServer.registerTool).toHaveBeenCalledWith('list', expect.any(Object), expect.any(Function));
69
- });
70
- it('should register tool with correct title and description', () => {
71
- (0, list_1.default)(mcpServer, 'https://api.forestadmin.com');
72
- expect(registeredToolConfig.title).toBe('List records from a collection');
73
- expect(registeredToolConfig.description).toBe('Retrieve a list of records from the specified collection.');
74
- });
75
- it('should define correct input schema', () => {
76
- (0, list_1.default)(mcpServer, 'https://api.forestadmin.com');
77
- expect(registeredToolConfig.inputSchema).toHaveProperty('collectionName');
78
- expect(registeredToolConfig.inputSchema).toHaveProperty('search');
79
- expect(registeredToolConfig.inputSchema).toHaveProperty('filters');
80
- expect(registeredToolConfig.inputSchema).toHaveProperty('sort');
81
- });
82
- it('should use string type for collectionName when no collection names provided', () => {
83
- (0, list_1.default)(mcpServer, 'https://api.forestadmin.com');
84
- const schema = registeredToolConfig.inputSchema;
85
- // String type should not have options property (enum has options)
86
- expect(schema.collectionName.options).toBeUndefined();
87
- // Should accept any string
88
- expect(() => schema.collectionName.parse('any-collection')).not.toThrow();
89
- });
90
- it('should use string type for collectionName when empty array provided', () => {
91
- (0, list_1.default)(mcpServer, 'https://api.forestadmin.com', []);
92
- const schema = registeredToolConfig.inputSchema;
93
- // String type should not have options property
94
- expect(schema.collectionName.options).toBeUndefined();
95
- // Should accept any string
96
- expect(() => schema.collectionName.parse('any-collection')).not.toThrow();
97
- });
98
- it('should use enum type for collectionName when collection names provided', () => {
99
- (0, list_1.default)(mcpServer, 'https://api.forestadmin.com', ['users', 'products', 'orders']);
100
- const schema = registeredToolConfig.inputSchema;
101
- // Enum type should have options property with the collection names
102
- expect(schema.collectionName.options).toEqual(['users', 'products', 'orders']);
103
- // Should accept valid collection names
104
- expect(() => schema.collectionName.parse('users')).not.toThrow();
105
- expect(() => schema.collectionName.parse('products')).not.toThrow();
106
- // Should reject invalid collection names
107
- expect(() => schema.collectionName.parse('invalid-collection')).toThrow();
108
- });
109
- });
110
- describe('tool execution', () => {
111
- const mockExtra = {
112
- authInfo: {
113
- token: 'test-token',
114
- extra: {
115
- forestServerToken: 'forest-token',
116
- renderingId: '123',
117
- },
118
- },
119
- };
120
- beforeEach(() => {
121
- (0, list_1.default)(mcpServer, 'https://api.forestadmin.com');
122
- });
123
- it('should call buildClient with the extra parameter', async () => {
124
- const mockList = jest.fn().mockResolvedValue([{ id: 1, name: 'Item 1' }]);
125
- const mockCollection = jest.fn().mockReturnValue({ list: mockList });
126
- mockBuildClient.mockReturnValue({
127
- rpcClient: { collection: mockCollection },
128
- authData: { userId: 1, renderingId: '123', environmentId: 1, projectId: 1 },
129
- });
130
- await registeredToolHandler({ collectionName: 'users' }, mockExtra);
131
- expect(mockBuildClient).toHaveBeenCalledWith(mockExtra);
132
- });
133
- it('should call rpcClient.collection with the collection name', async () => {
134
- const mockList = jest.fn().mockResolvedValue([]);
135
- const mockCollection = jest.fn().mockReturnValue({ list: mockList });
136
- mockBuildClient.mockReturnValue({
137
- rpcClient: { collection: mockCollection },
138
- authData: { userId: 1, renderingId: '123', environmentId: 1, projectId: 1 },
139
- });
140
- await registeredToolHandler({ collectionName: 'products' }, mockExtra);
141
- expect(mockCollection).toHaveBeenCalledWith('products');
142
- });
143
- it('should return results as JSON text content', async () => {
144
- const mockData = [
145
- { id: 1, name: 'Product 1' },
146
- { id: 2, name: 'Product 2' },
147
- ];
148
- const mockList = jest.fn().mockResolvedValue(mockData);
149
- const mockCollection = jest.fn().mockReturnValue({ list: mockList });
150
- mockBuildClient.mockReturnValue({
151
- rpcClient: { collection: mockCollection },
152
- authData: { userId: 1, renderingId: '123', environmentId: 1, projectId: 1 },
153
- });
154
- const result = await registeredToolHandler({ collectionName: 'products' }, mockExtra);
155
- expect(result).toEqual({
156
- content: [{ type: 'text', text: JSON.stringify(mockData) }],
157
- });
158
- });
159
- describe('activity logging', () => {
160
- beforeEach(() => {
161
- const mockList = jest.fn().mockResolvedValue([]);
162
- const mockCollection = jest.fn().mockReturnValue({ list: mockList });
163
- mockBuildClient.mockReturnValue({
164
- rpcClient: { collection: mockCollection },
165
- authData: { userId: 1, renderingId: '123', environmentId: 1, projectId: 1 },
166
- });
167
- });
168
- it('should create activity log with "index" action type for basic list', async () => {
169
- await registeredToolHandler({ collectionName: 'users' }, mockExtra);
170
- expect(mockCreateActivityLog).toHaveBeenCalledWith('https://api.forestadmin.com', mockExtra, 'index', { collectionName: 'users' });
171
- });
172
- it('should create activity log with "search" action type when search is provided', async () => {
173
- await registeredToolHandler({ collectionName: 'users', search: 'john' }, mockExtra);
174
- expect(mockCreateActivityLog).toHaveBeenCalledWith('https://api.forestadmin.com', mockExtra, 'search', { collectionName: 'users' });
175
- });
176
- it('should create activity log with "filter" action type when filters are provided', async () => {
177
- await registeredToolHandler({
178
- collectionName: 'users',
179
- filters: { field: 'status', operator: 'Equal', value: 'active' },
180
- }, mockExtra);
181
- expect(mockCreateActivityLog).toHaveBeenCalledWith('https://api.forestadmin.com', mockExtra, 'filter', { collectionName: 'users' });
182
- });
183
- it('should prioritize "search" over "filter" when both are provided', async () => {
184
- await registeredToolHandler({
185
- collectionName: 'users',
186
- search: 'john',
187
- filters: { field: 'status', operator: 'Equal', value: 'active' },
188
- }, mockExtra);
189
- expect(mockCreateActivityLog).toHaveBeenCalledWith('https://api.forestadmin.com', mockExtra, 'search', { collectionName: 'users' });
190
- });
191
- });
192
- describe('list parameters', () => {
193
- let mockList;
194
- let mockCollection;
195
- beforeEach(() => {
196
- mockList = jest.fn().mockResolvedValue([]);
197
- mockCollection = jest.fn().mockReturnValue({ list: mockList });
198
- mockBuildClient.mockReturnValue({
199
- rpcClient: { collection: mockCollection },
200
- authData: { userId: 1, renderingId: '123', environmentId: 1, projectId: 1 },
201
- });
202
- });
203
- it('should call list with empty parameters for basic request', async () => {
204
- await registeredToolHandler({ collectionName: 'users' }, mockExtra);
205
- expect(mockList).toHaveBeenCalledWith({});
206
- });
207
- it('should pass search parameter to list', async () => {
208
- await registeredToolHandler({ collectionName: 'users', search: 'test query' }, mockExtra);
209
- expect(mockList).toHaveBeenCalledWith({ search: 'test query' });
210
- });
211
- it('should pass filters wrapped in conditionTree', async () => {
212
- const filters = { field: 'name', operator: 'Equal', value: 'John' };
213
- await registeredToolHandler({ collectionName: 'users', filters }, mockExtra);
214
- expect(mockList).toHaveBeenCalledWith({
215
- filters: { conditionTree: filters },
216
- });
217
- });
218
- it('should pass sort parameter when both field and ascending are provided', async () => {
219
- await registeredToolHandler({
220
- collectionName: 'users',
221
- sort: { field: 'createdAt', ascending: true },
222
- }, mockExtra);
223
- expect(mockList).toHaveBeenCalledWith({
224
- sort: { field: 'createdAt', ascending: true },
225
- });
226
- });
227
- it('should pass sort parameter when ascending is false', async () => {
228
- await registeredToolHandler({
229
- collectionName: 'users',
230
- sort: { field: 'createdAt', ascending: false },
231
- }, mockExtra);
232
- expect(mockList).toHaveBeenCalledWith({
233
- sort: { field: 'createdAt', ascending: false },
234
- });
235
- });
236
- it('should not pass sort when only field is provided', async () => {
237
- await registeredToolHandler({
238
- collectionName: 'users',
239
- sort: { field: 'createdAt' },
240
- }, mockExtra);
241
- expect(mockList).toHaveBeenCalledWith({});
242
- });
243
- it('should pass all parameters together', async () => {
244
- const filters = {
245
- aggregator: 'And',
246
- conditions: [{ field: 'active', operator: 'Equal', value: true }],
247
- };
248
- await registeredToolHandler({
249
- collectionName: 'users',
250
- search: 'john',
251
- filters,
252
- sort: { field: 'name', ascending: true },
253
- }, mockExtra);
254
- expect(mockList).toHaveBeenCalledWith({
255
- search: 'john',
256
- filters: { conditionTree: filters },
257
- sort: { field: 'name', ascending: true },
258
- });
259
- });
260
- });
261
- describe('error handling', () => {
262
- let mockList;
263
- let mockCollection;
264
- beforeEach(() => {
265
- mockList = jest.fn();
266
- mockCollection = jest.fn().mockReturnValue({ list: mockList });
267
- mockBuildClient.mockReturnValue({
268
- rpcClient: { collection: mockCollection },
269
- authData: { userId: 1, renderingId: '123', environmentId: 1, projectId: 1 },
270
- });
271
- });
272
- it('should parse error with nested error.text structure in message', async () => {
273
- // The RPC client throws an Error with message containing JSON: { error: { text: '...' } }
274
- const errorPayload = {
275
- error: {
276
- status: 400,
277
- text: JSON.stringify({
278
- errors: [{ name: 'ValidationError', detail: 'Invalid filters provided' }],
279
- }),
280
- },
281
- };
282
- const agentError = new Error(JSON.stringify(errorPayload));
283
- mockList.mockRejectedValue(agentError);
284
- await expect(registeredToolHandler({ collectionName: 'users' }, mockExtra)).rejects.toThrow('Invalid filters provided');
285
- });
286
- it('should parse error with direct text property in message', async () => {
287
- // The RPC client throws an Error with message containing JSON: { text: '...' }
288
- const errorPayload = {
289
- text: JSON.stringify({
290
- errors: [{ name: 'ValidationError', detail: 'Direct text error' }],
291
- }),
292
- };
293
- const agentError = new Error(JSON.stringify(errorPayload));
294
- mockList.mockRejectedValue(agentError);
295
- await expect(registeredToolHandler({ collectionName: 'users' }, mockExtra)).rejects.toThrow('Direct text error');
296
- });
297
- it('should use message property from parsed JSON when no text field', async () => {
298
- // The RPC client throws an Error with message containing JSON: { message: '...' }
299
- const errorPayload = {
300
- message: 'Error message from JSON payload',
301
- };
302
- const agentError = new Error(JSON.stringify(errorPayload));
303
- mockList.mockRejectedValue(agentError);
304
- await expect(registeredToolHandler({ collectionName: 'users' }, mockExtra)).rejects.toThrow('Error message from JSON payload');
305
- });
306
- it('should fall back to error.message when message is not valid JSON', async () => {
307
- // The RPC client throws an Error with a plain string message (not JSON)
308
- const agentError = new Error('Plain error message');
309
- mockList.mockRejectedValue(agentError);
310
- await expect(registeredToolHandler({ collectionName: 'users' }, mockExtra)).rejects.toThrow('Plain error message');
311
- });
312
- it('should rethrow original error when no parsable error found', async () => {
313
- // An object without a message property
314
- const agentError = { unknownProperty: 'some value' };
315
- mockList.mockRejectedValue(agentError);
316
- await expect(registeredToolHandler({ collectionName: 'users' }, mockExtra)).rejects.toEqual(agentError);
317
- });
318
- it('should provide helpful error message for Invalid sort errors', async () => {
319
- // The RPC client throws an "Invalid sort" error
320
- const errorPayload = {
321
- error: {
322
- status: 400,
323
- text: JSON.stringify({
324
- errors: [{ name: 'ValidationError', detail: 'Invalid sort field: invalidField' }],
325
- }),
326
- },
327
- };
328
- const agentError = new Error(JSON.stringify(errorPayload));
329
- mockList.mockRejectedValue(agentError);
330
- // Mock schema fetcher to return collection fields
331
- const mockFields = [
332
- {
333
- field: 'id',
334
- type: 'Number',
335
- isSortable: true,
336
- enum: null,
337
- reference: null,
338
- isReadOnly: false,
339
- isRequired: true,
340
- isPrimaryKey: true,
341
- },
342
- {
343
- field: 'name',
344
- type: 'String',
345
- isSortable: true,
346
- enum: null,
347
- reference: null,
348
- isReadOnly: false,
349
- isRequired: false,
350
- isPrimaryKey: false,
351
- },
352
- {
353
- field: 'email',
354
- type: 'String',
355
- isSortable: true,
356
- enum: null,
357
- reference: null,
358
- isReadOnly: false,
359
- isRequired: false,
360
- isPrimaryKey: false,
361
- },
362
- {
363
- field: 'computed',
364
- type: 'String',
365
- isSortable: false,
366
- enum: null,
367
- reference: null,
368
- isReadOnly: true,
369
- isRequired: false,
370
- isPrimaryKey: false,
371
- },
372
- ];
373
- const mockSchema = {
374
- collections: [{ name: 'users', fields: mockFields }],
375
- };
376
- mockFetchForestSchema.mockResolvedValue(mockSchema);
377
- mockGetFieldsOfCollection.mockReturnValue(mockFields);
378
- await expect(registeredToolHandler({ collectionName: 'users' }, mockExtra)).rejects.toThrow('The sort field provided is invalid for this collection. Available fields for the collection users are: id, name, email.');
379
- expect(mockFetchForestSchema).toHaveBeenCalledWith('https://api.forestadmin.com');
380
- expect(mockGetFieldsOfCollection).toHaveBeenCalledWith(mockSchema, 'users');
381
- });
382
- });
383
- });
384
- });
385
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rvb2xzL2xpc3QudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUtBLGtEQUFxQztBQUNyQywyRkFBK0Q7QUFDL0QseUVBQWdEO0FBQ2hELHVFQUF5RDtBQUV6RCxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7QUFDbkMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0FBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztBQUVyQyxNQUFNLGVBQWUsR0FBRyxzQkFBc0QsQ0FBQztBQUMvRSxNQUFNLHFCQUFxQixHQUFHLCtCQUFrRSxDQUFDO0FBQ2pHLE1BQU0scUJBQXFCLEdBQUcsYUFBYSxDQUFDLGlCQUUzQyxDQUFDO0FBQ0YsTUFBTSx5QkFBeUIsR0FBRyxhQUFhLENBQUMscUJBRS9DLENBQUM7QUFFRixRQUFRLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFO0lBQy9CLElBQUksU0FBb0IsQ0FBQztJQUN6QixJQUFJLHFCQUE2RSxDQUFDO0lBQ2xGLElBQUksb0JBQWtGLENBQUM7SUFFdkYsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNkLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUVyQiw2REFBNkQ7UUFDN0QsU0FBUyxHQUFHO1lBQ1YsWUFBWSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFO2dCQUM5QyxvQkFBb0IsR0FBRyxNQUFNLENBQUM7Z0JBQzlCLHFCQUFxQixHQUFHLE9BQU8sQ0FBQztZQUNsQyxDQUFDLENBQUM7U0FDcUIsQ0FBQztRQUUxQixxQkFBcUIsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyRCxDQUFDLENB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
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=activity-logs-creator.test.d.ts.map