@efficy/tribecrm-mcp-server 0.4.0 → 0.4.2

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.
@@ -0,0 +1,578 @@
1
+ import { describe, it, expect, beforeEach, vi, afterEach } from 'vitest';
2
+ import axios from 'axios';
3
+ import { TribeCRMClient } from './client.js';
4
+ // Mock axios
5
+ vi.mock('axios');
6
+ const mockedAxios = vi.mocked(axios, true);
7
+ describe('TribeCRMClient', () => {
8
+ let client;
9
+ let config;
10
+ beforeEach(() => {
11
+ // Reset mocks before each test
12
+ vi.clearAllMocks();
13
+ // Setup test configuration
14
+ config = {
15
+ apiUrl: 'https://api-test.tribecrm.nl',
16
+ authUrl: 'https://auth-test.tribecrm.nl',
17
+ clientId: 'test-client-id',
18
+ clientSecret: 'test-client-secret',
19
+ organizationId: 'test-org-id',
20
+ mode: 'read-write',
21
+ };
22
+ // Mock axios.create to return a mocked instance
23
+ mockedAxios.create = vi.fn().mockReturnValue({
24
+ get: vi.fn(),
25
+ post: vi.fn(),
26
+ delete: vi.fn(),
27
+ defaults: {
28
+ headers: {
29
+ common: {},
30
+ },
31
+ },
32
+ });
33
+ client = new TribeCRMClient(config);
34
+ });
35
+ afterEach(() => {
36
+ vi.restoreAllMocks();
37
+ });
38
+ describe('Authentication', () => {
39
+ it('should authenticate successfully with valid credentials', async () => {
40
+ const mockToken = {
41
+ access_token: 'test-access-token',
42
+ token_type: 'bearer',
43
+ expires_in: 86399,
44
+ scope: 'read write offline',
45
+ };
46
+ // Mock OAuth token request
47
+ mockedAxios.post = vi.fn().mockResolvedValue({
48
+ data: mockToken,
49
+ });
50
+ // Mock getCurrentEmployee to trigger authentication
51
+ const axiosInstance = client.axiosInstance;
52
+ axiosInstance.get = vi.fn().mockResolvedValue({
53
+ data: { ID: 'test-employee-id', Name: 'Test User' },
54
+ });
55
+ const result = await client.getCurrentEmployee();
56
+ expect(mockedAxios.post).toHaveBeenCalledWith('https://auth-test.tribecrm.nl/oauth2/token', expect.any(URLSearchParams), expect.objectContaining({
57
+ headers: {
58
+ 'Content-Type': 'application/x-www-form-urlencoded',
59
+ },
60
+ }));
61
+ expect(result).toEqual({ ID: 'test-employee-id', Name: 'Test User' });
62
+ });
63
+ it('should throw error for user authentication (not yet implemented)', async () => {
64
+ const userConfig = {
65
+ apiUrl: 'https://api-test.tribecrm.nl',
66
+ authUrl: 'https://auth-test.tribecrm.nl',
67
+ clientId: 'test-client-id',
68
+ clientSecret: 'test-client-secret',
69
+ authMethod: 'user',
70
+ };
71
+ const userClient = new TribeCRMClient(userConfig);
72
+ await expect(userClient.getCurrentEmployee())
73
+ .rejects
74
+ .toThrow('User authentication is not yet implemented');
75
+ });
76
+ it('should use app authentication by default', async () => {
77
+ const mockToken = {
78
+ access_token: 'test-token',
79
+ token_type: 'bearer',
80
+ expires_in: 86399,
81
+ scope: 'read write offline',
82
+ };
83
+ mockedAxios.post = vi.fn().mockResolvedValue({
84
+ data: mockToken,
85
+ });
86
+ const axiosInstance = client.axiosInstance;
87
+ axiosInstance.get = vi.fn().mockResolvedValue({
88
+ data: { ID: '123', type: 'Relation_Organization' },
89
+ });
90
+ const result = await client.getEntity('Relation_Organization', '123');
91
+ expect(mockedAxios.post).toHaveBeenCalledWith(expect.stringContaining('/oauth2/token'), expect.any(URLSearchParams), expect.any(Object));
92
+ expect(result).toHaveProperty('ID', '123');
93
+ });
94
+ it('should include organization_id in auth request when provided', async () => {
95
+ const mockToken = {
96
+ access_token: 'test-token',
97
+ token_type: 'bearer',
98
+ expires_in: 86399,
99
+ scope: 'read write offline',
100
+ };
101
+ mockedAxios.post = vi.fn().mockResolvedValue({
102
+ data: mockToken,
103
+ });
104
+ const axiosInstance = client.axiosInstance;
105
+ axiosInstance.get = vi.fn().mockResolvedValue({
106
+ data: { ID: 'test-id' },
107
+ });
108
+ await client.getCurrentEmployee();
109
+ const authCall = mockedAxios.post.mock.calls[0];
110
+ const params = authCall[1];
111
+ expect(params.get('organization_id')).toBe('test-org-id');
112
+ });
113
+ it('should handle authentication failure', async () => {
114
+ mockedAxios.post = vi.fn().mockRejectedValue({
115
+ response: {
116
+ data: {
117
+ error: 'invalid_client',
118
+ error_description: 'Invalid credentials',
119
+ },
120
+ },
121
+ });
122
+ await expect(client.getCurrentEmployee()).rejects.toThrow('Authentication failed: Invalid credentials');
123
+ });
124
+ it('should reuse existing token if not expired', async () => {
125
+ const mockToken = {
126
+ access_token: 'test-token',
127
+ token_type: 'bearer',
128
+ expires_in: 86399,
129
+ scope: 'read write offline',
130
+ };
131
+ mockedAxios.post = vi.fn().mockResolvedValue({
132
+ data: mockToken,
133
+ });
134
+ const axiosInstance = client.axiosInstance;
135
+ axiosInstance.get = vi.fn().mockResolvedValue({
136
+ data: { ID: 'test-id' },
137
+ });
138
+ // First call - should authenticate
139
+ await client.getCurrentEmployee();
140
+ expect(mockedAxios.post).toHaveBeenCalledTimes(1);
141
+ // Second call - should reuse token
142
+ await client.getCurrentEmployee();
143
+ expect(mockedAxios.post).toHaveBeenCalledTimes(1); // Still only 1
144
+ });
145
+ it('should refresh token when expired', async () => {
146
+ const mockToken = {
147
+ access_token: 'test-token',
148
+ token_type: 'bearer',
149
+ expires_in: 0, // Expires immediately
150
+ scope: 'read write offline',
151
+ };
152
+ mockedAxios.post = vi.fn().mockResolvedValue({
153
+ data: mockToken,
154
+ });
155
+ const axiosInstance = client.axiosInstance;
156
+ axiosInstance.get = vi.fn().mockResolvedValue({
157
+ data: { ID: 'test-id' },
158
+ });
159
+ // First call
160
+ await client.getCurrentEmployee();
161
+ expect(mockedAxios.post).toHaveBeenCalledTimes(1);
162
+ // Wait for token to expire
163
+ await new Promise((resolve) => setTimeout(resolve, 100));
164
+ // Second call - should refresh token
165
+ await client.getCurrentEmployee();
166
+ expect(mockedAxios.post).toHaveBeenCalledTimes(2);
167
+ });
168
+ });
169
+ describe('getEntity', () => {
170
+ beforeEach(async () => {
171
+ // Setup authentication
172
+ mockedAxios.post = vi.fn().mockResolvedValue({
173
+ data: {
174
+ access_token: 'test-token',
175
+ token_type: 'bearer',
176
+ expires_in: 86399,
177
+ scope: 'read write offline',
178
+ },
179
+ });
180
+ });
181
+ it('should get entity by ID successfully', async () => {
182
+ const mockEntity = {
183
+ ID: 'entity-123',
184
+ Name: 'Test Organization',
185
+ Type: 'Relation_Organization',
186
+ };
187
+ const axiosInstance = client.axiosInstance;
188
+ axiosInstance.get = vi.fn().mockResolvedValue({
189
+ data: mockEntity,
190
+ });
191
+ const result = await client.getEntity('Relation_Organization', 'entity-123');
192
+ expect(axiosInstance.get).toHaveBeenCalledWith('/v1/odata/Relation_Organization(entity-123)', { params: {} });
193
+ expect(result).toEqual(mockEntity);
194
+ });
195
+ it('should include expand parameter when provided', async () => {
196
+ const axiosInstance = client.axiosInstance;
197
+ axiosInstance.get = vi.fn().mockResolvedValue({
198
+ data: { ID: 'test-id' },
199
+ });
200
+ await client.getEntity('Relation_Organization', 'entity-123', 'Address');
201
+ expect(axiosInstance.get).toHaveBeenCalledWith('/v1/odata/Relation_Organization(entity-123)', { params: { $expand: 'Address' } });
202
+ });
203
+ it('should include select parameter when provided', async () => {
204
+ const axiosInstance = client.axiosInstance;
205
+ axiosInstance.get = vi.fn().mockResolvedValue({
206
+ data: { ID: 'test-id' },
207
+ });
208
+ await client.getEntity('Relation_Organization', 'entity-123', undefined, 'Name,Email');
209
+ expect(axiosInstance.get).toHaveBeenCalledWith('/v1/odata/Relation_Organization(entity-123)', { params: { $select: 'Name,Email' } });
210
+ });
211
+ it('should include both expand and select parameters', async () => {
212
+ const axiosInstance = client.axiosInstance;
213
+ axiosInstance.get = vi.fn().mockResolvedValue({
214
+ data: { ID: 'test-id' },
215
+ });
216
+ await client.getEntity('Relation_Organization', 'entity-123', 'Address', 'Name,Email');
217
+ expect(axiosInstance.get).toHaveBeenCalledWith('/v1/odata/Relation_Organization(entity-123)', { params: { $expand: 'Address', $select: 'Name,Email' } });
218
+ });
219
+ });
220
+ describe('createEntity', () => {
221
+ beforeEach(async () => {
222
+ mockedAxios.post = vi.fn().mockResolvedValue({
223
+ data: {
224
+ access_token: 'test-token',
225
+ token_type: 'bearer',
226
+ expires_in: 86399,
227
+ scope: 'read write offline',
228
+ },
229
+ });
230
+ });
231
+ it('should create entity successfully', async () => {
232
+ const entityData = {
233
+ Name: 'New Organization',
234
+ Email: 'test@example.com',
235
+ };
236
+ const mockCreatedEntity = {
237
+ ID: 'new-entity-id',
238
+ ...entityData,
239
+ };
240
+ const axiosInstance = client.axiosInstance;
241
+ axiosInstance.post = vi.fn().mockResolvedValue({
242
+ data: mockCreatedEntity,
243
+ });
244
+ const result = await client.createEntity('Relation_Organization', entityData);
245
+ expect(axiosInstance.post).toHaveBeenCalledWith('/v1/odata/Relation_Organization', entityData);
246
+ expect(result).toEqual(mockCreatedEntity);
247
+ });
248
+ it('should not include ID in create request', async () => {
249
+ const entityData = {
250
+ Name: 'New Organization',
251
+ };
252
+ const axiosInstance = client.axiosInstance;
253
+ axiosInstance.post = vi.fn().mockResolvedValue({
254
+ data: { ID: 'new-id', ...entityData },
255
+ });
256
+ await client.createEntity('Relation_Organization', entityData);
257
+ const callData = axiosInstance.post.mock.calls[0][1];
258
+ expect(callData).not.toHaveProperty('ID');
259
+ });
260
+ });
261
+ describe('updateEntity', () => {
262
+ beforeEach(async () => {
263
+ mockedAxios.post = vi.fn().mockResolvedValue({
264
+ data: {
265
+ access_token: 'test-token',
266
+ token_type: 'bearer',
267
+ expires_in: 86399,
268
+ scope: 'read write offline',
269
+ },
270
+ });
271
+ });
272
+ it('should update entity successfully', async () => {
273
+ const updateData = {
274
+ Name: 'Updated Organization',
275
+ };
276
+ const mockUpdatedEntity = {
277
+ ID: 'entity-123',
278
+ ...updateData,
279
+ };
280
+ const axiosInstance = client.axiosInstance;
281
+ axiosInstance.post = vi.fn().mockResolvedValue({
282
+ data: mockUpdatedEntity,
283
+ });
284
+ const result = await client.updateEntity('Relation_Organization', 'entity-123', updateData);
285
+ expect(axiosInstance.post).toHaveBeenCalledWith('/v1/odata/Relation_Organization', { ...updateData, ID: 'entity-123' });
286
+ expect(result).toEqual(mockUpdatedEntity);
287
+ });
288
+ it('should include ID in update request payload', async () => {
289
+ const updateData = {
290
+ Name: 'Updated Name',
291
+ };
292
+ const axiosInstance = client.axiosInstance;
293
+ axiosInstance.post = vi.fn().mockResolvedValue({
294
+ data: { ID: 'entity-123', ...updateData },
295
+ });
296
+ await client.updateEntity('Relation_Organization', 'entity-123', updateData);
297
+ const callData = axiosInstance.post.mock.calls[0][1];
298
+ expect(callData).toHaveProperty('ID', 'entity-123');
299
+ });
300
+ });
301
+ describe('deleteEntity', () => {
302
+ beforeEach(async () => {
303
+ mockedAxios.post = vi.fn().mockResolvedValue({
304
+ data: {
305
+ access_token: 'test-token',
306
+ token_type: 'bearer',
307
+ expires_in: 86399,
308
+ scope: 'read write offline',
309
+ },
310
+ });
311
+ });
312
+ it('should delete entity successfully', async () => {
313
+ const axiosInstance = client.axiosInstance;
314
+ axiosInstance.delete = vi.fn().mockResolvedValue({});
315
+ await client.deleteEntity('Relation_Organization', 'entity-123');
316
+ expect(axiosInstance.delete).toHaveBeenCalledWith('/v1/odata/Relation_Organization(entity-123)');
317
+ });
318
+ it('should not return data on successful delete', async () => {
319
+ const axiosInstance = client.axiosInstance;
320
+ axiosInstance.delete = vi.fn().mockResolvedValue({});
321
+ const result = await client.deleteEntity('Relation_Organization', 'entity-123');
322
+ expect(result).toBeUndefined();
323
+ });
324
+ });
325
+ describe('queryEntities', () => {
326
+ beforeEach(async () => {
327
+ mockedAxios.post = vi.fn().mockResolvedValue({
328
+ data: {
329
+ access_token: 'test-token',
330
+ token_type: 'bearer',
331
+ expires_in: 86399,
332
+ scope: 'read write offline',
333
+ },
334
+ });
335
+ });
336
+ it('should query entities with no filters', async () => {
337
+ const mockResults = {
338
+ value: [{ ID: '1', Name: 'Entity 1' }],
339
+ };
340
+ const axiosInstance = client.axiosInstance;
341
+ axiosInstance.get = vi.fn().mockResolvedValue({
342
+ data: mockResults,
343
+ });
344
+ const result = await client.queryEntities('Relation_Organization');
345
+ expect(axiosInstance.get).toHaveBeenCalledWith('/v1/odata/Relation_Organization', {
346
+ params: {},
347
+ });
348
+ expect(result).toEqual(mockResults);
349
+ });
350
+ it('should include filter parameter', async () => {
351
+ const axiosInstance = client.axiosInstance;
352
+ axiosInstance.get = vi.fn().mockResolvedValue({
353
+ data: { value: [] },
354
+ });
355
+ await client.queryEntities('Relation_Organization', {
356
+ filter: "contains(Name, 'test')",
357
+ });
358
+ expect(axiosInstance.get).toHaveBeenCalledWith('/v1/odata/Relation_Organization', {
359
+ params: { $filter: "contains(Name, 'test')" },
360
+ });
361
+ });
362
+ it('should include select parameter', async () => {
363
+ const axiosInstance = client.axiosInstance;
364
+ axiosInstance.get = vi.fn().mockResolvedValue({
365
+ data: { value: [] },
366
+ });
367
+ await client.queryEntities('Relation_Organization', {
368
+ select: 'ID,Name',
369
+ });
370
+ expect(axiosInstance.get).toHaveBeenCalledWith('/v1/odata/Relation_Organization', {
371
+ params: { $select: 'ID,Name' },
372
+ });
373
+ });
374
+ it('should include expand parameter', async () => {
375
+ const axiosInstance = client.axiosInstance;
376
+ axiosInstance.get = vi.fn().mockResolvedValue({
377
+ data: { value: [] },
378
+ });
379
+ await client.queryEntities('Relation_Organization', {
380
+ expand: 'Address',
381
+ });
382
+ expect(axiosInstance.get).toHaveBeenCalledWith('/v1/odata/Relation_Organization', {
383
+ params: { $expand: 'Address' },
384
+ });
385
+ });
386
+ it('should include orderby parameter', async () => {
387
+ const axiosInstance = client.axiosInstance;
388
+ axiosInstance.get = vi.fn().mockResolvedValue({
389
+ data: { value: [] },
390
+ });
391
+ await client.queryEntities('Relation_Organization', {
392
+ orderby: 'Name desc',
393
+ });
394
+ expect(axiosInstance.get).toHaveBeenCalledWith('/v1/odata/Relation_Organization', {
395
+ params: { $orderby: 'Name desc' },
396
+ });
397
+ });
398
+ it('should include pagination parameters (top and skip)', async () => {
399
+ const axiosInstance = client.axiosInstance;
400
+ axiosInstance.get = vi.fn().mockResolvedValue({
401
+ data: { value: [] },
402
+ });
403
+ await client.queryEntities('Relation_Organization', {
404
+ top: 10,
405
+ skip: 20,
406
+ });
407
+ expect(axiosInstance.get).toHaveBeenCalledWith('/v1/odata/Relation_Organization', {
408
+ params: { $top: 10, $skip: 20 },
409
+ });
410
+ });
411
+ it('should include count parameter', async () => {
412
+ const axiosInstance = client.axiosInstance;
413
+ axiosInstance.get = vi.fn().mockResolvedValue({
414
+ data: { value: [], '@odata.count': 42 },
415
+ });
416
+ await client.queryEntities('Relation_Organization', {
417
+ count: true,
418
+ });
419
+ expect(axiosInstance.get).toHaveBeenCalledWith('/v1/odata/Relation_Organization', {
420
+ params: { $count: 'true' },
421
+ });
422
+ });
423
+ it('should include all query parameters together', async () => {
424
+ const axiosInstance = client.axiosInstance;
425
+ axiosInstance.get = vi.fn().mockResolvedValue({
426
+ data: { value: [] },
427
+ });
428
+ await client.queryEntities('Relation_Organization', {
429
+ filter: "contains(Name, 'test')",
430
+ select: 'ID,Name',
431
+ expand: 'Address',
432
+ orderby: 'Name asc',
433
+ top: 10,
434
+ skip: 20,
435
+ count: true,
436
+ });
437
+ expect(axiosInstance.get).toHaveBeenCalledWith('/v1/odata/Relation_Organization', {
438
+ params: {
439
+ $filter: "contains(Name, 'test')",
440
+ $select: 'ID,Name',
441
+ $expand: 'Address',
442
+ $orderby: 'Name asc',
443
+ $top: 10,
444
+ $skip: 20,
445
+ $count: 'true',
446
+ },
447
+ });
448
+ });
449
+ });
450
+ describe('getCurrentEmployee', () => {
451
+ beforeEach(async () => {
452
+ mockedAxios.post = vi.fn().mockResolvedValue({
453
+ data: {
454
+ access_token: 'test-token',
455
+ token_type: 'bearer',
456
+ expires_in: 86399,
457
+ scope: 'read write offline',
458
+ },
459
+ });
460
+ });
461
+ it('should get current employee without expand', async () => {
462
+ const mockEmployee = {
463
+ ID: 'employee-123',
464
+ Name: 'Test Employee',
465
+ };
466
+ const axiosInstance = client.axiosInstance;
467
+ axiosInstance.get = vi.fn().mockResolvedValue({
468
+ data: mockEmployee,
469
+ });
470
+ const result = await client.getCurrentEmployee();
471
+ expect(axiosInstance.get).toHaveBeenCalledWith('/v1/odata/GetCurrentEmployee()', {
472
+ params: {},
473
+ });
474
+ expect(result).toEqual(mockEmployee);
475
+ });
476
+ it('should include expand parameter when provided', async () => {
477
+ const mockEmployee = {
478
+ ID: 'employee-123',
479
+ Person: {
480
+ ID: 'person-123',
481
+ Name: 'Test Person',
482
+ },
483
+ };
484
+ const axiosInstance = client.axiosInstance;
485
+ axiosInstance.get = vi.fn().mockResolvedValue({
486
+ data: mockEmployee,
487
+ });
488
+ const result = await client.getCurrentEmployee('Person');
489
+ expect(axiosInstance.get).toHaveBeenCalledWith('/v1/odata/GetCurrentEmployee()', {
490
+ params: { $expand: 'Person' },
491
+ });
492
+ expect(result).toEqual(mockEmployee);
493
+ });
494
+ });
495
+ describe('listEntityTypes', () => {
496
+ beforeEach(async () => {
497
+ mockedAxios.post = vi.fn().mockResolvedValue({
498
+ data: {
499
+ access_token: 'test-token',
500
+ token_type: 'bearer',
501
+ expires_in: 86399,
502
+ scope: 'read write offline',
503
+ },
504
+ });
505
+ });
506
+ it('should return hardcoded entity types', async () => {
507
+ const result = await client.listEntityTypes();
508
+ expect(result).toBeInstanceOf(Array);
509
+ expect(result.length).toBeGreaterThan(0);
510
+ expect(result).toContainEqual(expect.objectContaining({
511
+ code: 'Relation_Organization',
512
+ name: 'Organizations',
513
+ }));
514
+ expect(result).toContainEqual(expect.objectContaining({
515
+ code: 'Relation_Person',
516
+ name: 'Persons',
517
+ }));
518
+ });
519
+ it('should return entities with required fields', async () => {
520
+ const result = await client.listEntityTypes();
521
+ result.forEach((entityType) => {
522
+ expect(entityType).toHaveProperty('code');
523
+ expect(entityType).toHaveProperty('name');
524
+ expect(entityType).toHaveProperty('fields');
525
+ expect(Array.isArray(entityType.fields)).toBe(true);
526
+ });
527
+ });
528
+ it('should handle metadata fetch errors gracefully', async () => {
529
+ const axiosInstance = client.axiosInstance;
530
+ axiosInstance.get = vi.fn().mockRejectedValue(new Error('Metadata fetch failed'));
531
+ const result = await client.listEntityTypes();
532
+ // Should return empty array on error
533
+ expect(result).toBeInstanceOf(Array);
534
+ expect(result.length).toBe(0);
535
+ });
536
+ });
537
+ describe('Error Handling', () => {
538
+ beforeEach(async () => {
539
+ mockedAxios.post = vi.fn().mockResolvedValue({
540
+ data: {
541
+ access_token: 'test-token',
542
+ token_type: 'bearer',
543
+ expires_in: 86399,
544
+ scope: 'read write offline',
545
+ },
546
+ });
547
+ });
548
+ it('should handle network errors', async () => {
549
+ const axiosInstance = client.axiosInstance;
550
+ axiosInstance.get = vi.fn().mockRejectedValue(new Error('Network error'));
551
+ await expect(client.getEntity('Relation_Organization', 'entity-123')).rejects.toThrow('Network error');
552
+ });
553
+ it('should handle API errors with error messages', async () => {
554
+ const axiosInstance = client.axiosInstance;
555
+ axiosInstance.get = vi.fn().mockRejectedValue({
556
+ response: {
557
+ data: {
558
+ error: {
559
+ message: 'Entity not found',
560
+ },
561
+ },
562
+ },
563
+ });
564
+ await expect(client.getEntity('Relation_Organization', 'entity-123')).rejects.toThrow();
565
+ });
566
+ it('should handle HTTP status errors', async () => {
567
+ const axiosInstance = client.axiosInstance;
568
+ axiosInstance.get = vi.fn().mockRejectedValue({
569
+ response: {
570
+ status: 404,
571
+ statusText: 'Not Found',
572
+ },
573
+ });
574
+ await expect(client.getEntity('Relation_Organization', 'entity-123')).rejects.toThrow();
575
+ });
576
+ });
577
+ });
578
+ //# sourceMappingURL=client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.js","sourceRoot":"","sources":["../src/client.test.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -13,6 +13,13 @@ if (mode !== 'read-only' && mode !== 'read-write') {
13
13
  console.error(`Received: ${process.env.TRIBECRM_MODE}`);
14
14
  process.exit(1);
15
15
  }
16
+ // Parse and validate authentication method
17
+ const authMethod = (process.env.TRIBECRM_AUTH || 'app');
18
+ if (authMethod !== 'app' && authMethod !== 'user') {
19
+ console.error('Error: TRIBECRM_AUTH must be either "app" or "user"');
20
+ console.error(`Received: ${process.env.TRIBECRM_AUTH}`);
21
+ process.exit(1);
22
+ }
16
23
  // Validate configuration
17
24
  const config = {
18
25
  apiUrl: process.env.TRIBECRM_API_URL || '',
@@ -21,11 +28,12 @@ const config = {
21
28
  clientSecret: process.env.TRIBECRM_CLIENT_SECRET || '',
22
29
  organizationId: process.env.TRIBECRM_ORGANIZATION_ID,
23
30
  mode,
31
+ authMethod,
24
32
  };
25
33
  if (!config.apiUrl || !config.authUrl || !config.clientId || !config.clientSecret) {
26
34
  console.error('Error: Missing required environment variables');
27
35
  console.error('Required: TRIBECRM_API_URL, TRIBECRM_AUTH_URL, TRIBECRM_CLIENT_ID, TRIBECRM_CLIENT_SECRET');
28
- console.error('Optional: TRIBECRM_ORGANIZATION_ID, TRIBECRM_MODE');
36
+ console.error('Optional: TRIBECRM_ORGANIZATION_ID, TRIBECRM_MODE, TRIBECRM_AUTH');
29
37
  process.exit(1);
30
38
  }
31
39
  // Initialize client
@@ -33,7 +41,7 @@ const client = new TribeCRMClient(config);
33
41
  // Initialize MCP server
34
42
  const server = new Server({
35
43
  name: process.env.MCP_SERVER_NAME || 'tribecrm',
36
- version: '0.4.0',
44
+ version: '0.4.1',
37
45
  }, {
38
46
  capabilities: {
39
47
  tools: {},