@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.
- package/README.md +68 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +9 -1
- package/dist/client.js.map +1 -1
- package/dist/client.test.d.ts +2 -0
- package/dist/client.test.d.ts.map +1 -0
- package/dist/client.test.js +578 -0
- package/dist/client.test.js.map +1 -0
- package/dist/index.js +10 -2
- package/dist/index.js.map +1 -1
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +414 -0
- package/dist/index.test.js.map +1 -0
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.test.d.ts +2 -0
- package/dist/types.test.d.ts.map +1 -0
- package/dist/types.test.js +298 -0
- package/dist/types.test.js.map +1 -0
- package/package.json +12 -5
package/README.md
CHANGED
|
@@ -30,6 +30,25 @@ Model Context Protocol (MCP) server for TribeCRM API integration. This server en
|
|
|
30
30
|
|
|
31
31
|
> ⚠️ **Breaking Change in v0.4.0**: The server now defaults to read-only mode for security. If you need write access, set `TRIBECRM_MODE=read-write` in your configuration.
|
|
32
32
|
|
|
33
|
+
## 🔐 Authentication Methods
|
|
34
|
+
|
|
35
|
+
### App Authentication (Default)
|
|
36
|
+
The server uses **OAuth2 Client Credentials flow** for service account authentication. This is the default and recommended method for AI assistants and automated systems.
|
|
37
|
+
|
|
38
|
+
**Use case**: AI assistants, automation, backend services
|
|
39
|
+
|
|
40
|
+
**Configuration**:
|
|
41
|
+
```bash
|
|
42
|
+
TRIBECRM_AUTH=app # Default - can be omitted
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### User Authentication (Coming Soon)
|
|
46
|
+
**OAuth2 Authorization Code flow** for user-specific authentication is planned for future implementation. This will allow the MCP server to act on behalf of a specific user rather than a service account.
|
|
47
|
+
|
|
48
|
+
**Use case**: Personal AI assistants, user-specific operations
|
|
49
|
+
|
|
50
|
+
**Status**: Placeholder only - not yet implemented. If configured, the server will return an error message.
|
|
51
|
+
|
|
33
52
|
## 📋 Prerequisites
|
|
34
53
|
|
|
35
54
|
- Node.js 18 or higher
|
|
@@ -73,7 +92,8 @@ Add to your Claude Desktop config file:
|
|
|
73
92
|
"TRIBECRM_CLIENT_ID": "your_client_id",
|
|
74
93
|
"TRIBECRM_CLIENT_SECRET": "your_client_secret",
|
|
75
94
|
"TRIBECRM_ORGANIZATION_ID": "your_org_id",
|
|
76
|
-
"TRIBECRM_MODE": "read-only"
|
|
95
|
+
"TRIBECRM_MODE": "read-only",
|
|
96
|
+
"TRIBECRM_AUTH": "app"
|
|
77
97
|
}
|
|
78
98
|
}
|
|
79
99
|
}
|
|
@@ -96,7 +116,8 @@ Add to your Claude Desktop config file:
|
|
|
96
116
|
"TRIBECRM_CLIENT_ID": "your_client_id",
|
|
97
117
|
"TRIBECRM_CLIENT_SECRET": "your_client_secret",
|
|
98
118
|
"TRIBECRM_ORGANIZATION_ID": "your_org_id",
|
|
99
|
-
"TRIBECRM_MODE": "read-only"
|
|
119
|
+
"TRIBECRM_MODE": "read-only",
|
|
120
|
+
"TRIBECRM_AUTH": "app"
|
|
100
121
|
}
|
|
101
122
|
}
|
|
102
123
|
}
|
|
@@ -121,6 +142,9 @@ Add to your Claude Desktop config file:
|
|
|
121
142
|
- `TRIBECRM_MODE` (optional): Server operation mode - `read-only` (default) or `read-write`
|
|
122
143
|
- `read-only`: Only allows queries and data retrieval (get, query operations). Write tools are hidden.
|
|
123
144
|
- `read-write`: Allows full access including create, update, and delete operations.
|
|
145
|
+
- `TRIBECRM_AUTH` (optional): Authentication method - `app` (default) or `user`
|
|
146
|
+
- `app`: OAuth2 Client Credentials flow for service account authentication
|
|
147
|
+
- `user`: OAuth2 Authorization Code flow (not yet implemented - reserved for future use)
|
|
124
148
|
|
|
125
149
|
## 📚 Available Tools
|
|
126
150
|
|
|
@@ -276,6 +300,48 @@ The server uses OAuth2 Client Credentials flow:
|
|
|
276
300
|
3. Automatically refreshes token before expiry
|
|
277
301
|
4. Includes token in all API requests
|
|
278
302
|
|
|
303
|
+
## 🧪 Testing
|
|
304
|
+
|
|
305
|
+
The project has comprehensive unit tests with >95% code coverage.
|
|
306
|
+
|
|
307
|
+
### Running Tests
|
|
308
|
+
|
|
309
|
+
```bash
|
|
310
|
+
# Run all tests
|
|
311
|
+
npm test
|
|
312
|
+
|
|
313
|
+
# Run tests in watch mode
|
|
314
|
+
npm run test:watch
|
|
315
|
+
|
|
316
|
+
# Run tests with coverage report
|
|
317
|
+
npm run test:coverage
|
|
318
|
+
|
|
319
|
+
# Run tests with UI
|
|
320
|
+
npm run test:ui
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
### Test Coverage
|
|
324
|
+
|
|
325
|
+
| File | Coverage | Details |
|
|
326
|
+
|------|----------|---------|
|
|
327
|
+
| client.ts | 100% | All API client methods tested |
|
|
328
|
+
| types.ts | - | Type definitions (no runtime coverage needed) |
|
|
329
|
+
| index.ts | - | Server initialization (tested separately) |
|
|
330
|
+
|
|
331
|
+
**Coverage Standards**:
|
|
332
|
+
- Lines: 95%+
|
|
333
|
+
- Functions: 95%+
|
|
334
|
+
- Branches: 95%+
|
|
335
|
+
- Statements: 95%+
|
|
336
|
+
|
|
337
|
+
### Writing Tests
|
|
338
|
+
|
|
339
|
+
Tests are written using [Vitest](https://vitest.dev/) and follow these conventions:
|
|
340
|
+
- Test files: `*.test.ts` in `src/` directory
|
|
341
|
+
- Comprehensive mocking of external dependencies (axios)
|
|
342
|
+
- Clear test descriptions using describe/it blocks
|
|
343
|
+
- Both positive and negative test cases
|
|
344
|
+
|
|
279
345
|
## 🛠️ Development
|
|
280
346
|
|
|
281
347
|
### Project Structure
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAa,MAAM,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAEpG,qBAAa,cAAc;IACzB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,WAAW,CAAa;gBAEpB,MAAM,EAAE,cAAc;YAUpB,mBAAmB;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAa,MAAM,EAAE,UAAU,EAA2B,MAAM,YAAY,CAAC;AAEpG,qBAAa,cAAc;IACzB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,WAAW,CAAa;gBAEpB,MAAM,EAAE,cAAc;YAUpB,mBAAmB;IAyCjC;;;;;;OAMG;IACG,SAAS,CACb,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC;IAUlB;;;;OAIG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAMlF;;;;;OAKG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAOpG;;;;OAIG;IACG,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvE;;;;OAIG;IACG,aAAa,CACjB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB,GACA,OAAO,CAAC,GAAG,CAAC;IAgBf;;OAEG;IACG,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IASvD;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;CAoB/C"}
|
package/dist/client.js
CHANGED
|
@@ -15,9 +15,17 @@ export class TribeCRMClient {
|
|
|
15
15
|
}
|
|
16
16
|
async ensureAuthenticated() {
|
|
17
17
|
const now = Date.now();
|
|
18
|
+
// Check if token is still valid
|
|
18
19
|
if (this.token && this.tokenExpiry > now + 60000) {
|
|
19
|
-
return;
|
|
20
|
+
return; // Token still valid (60+ seconds remaining)
|
|
20
21
|
}
|
|
22
|
+
// Branch based on authentication method
|
|
23
|
+
if (this.config.authMethod === 'user') {
|
|
24
|
+
// Placeholder for user authentication flow
|
|
25
|
+
// TODO: Implement user OAuth flow (authorization code flow)
|
|
26
|
+
throw new Error('User authentication is not yet implemented. Please use authMethod: "app" (default).');
|
|
27
|
+
}
|
|
28
|
+
// Default: App authentication (OAuth2 Client Credentials)
|
|
21
29
|
try {
|
|
22
30
|
const response = await axios.post(`${this.config.authUrl}/oauth2/token`, new URLSearchParams({
|
|
23
31
|
grant_type: 'client_credentials',
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAG7C,MAAM,OAAO,cAAc;IACjB,aAAa,CAAgB;IAC7B,MAAM,CAAiB;IACvB,KAAK,GAAqB,IAAI,CAAC;IAC/B,WAAW,GAAW,CAAC,CAAC;IAEhC,YAAY,MAAsB;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC;YAChC,OAAO,EAAE,MAAM,CAAC,MAAM;YACtB,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;aACnC;SACF,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,mBAAmB;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.test.d.ts","sourceRoot":"","sources":["../src/client.test.ts"],"names":[],"mappings":""}
|