@honecrm/mcp-server 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Hone CRM
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,134 @@
1
+ # @honecrm/mcp-server
2
+
3
+ MCP (Model Context Protocol) server for [Hone CRM](https://honecrm.com). Enables AI agents and LLM clients (Claude, GPT, etc.) to interact with your CRM data through a standardized tool interface.
4
+
5
+ ## Quick start
6
+
7
+ Run directly with npx — no install required:
8
+
9
+ ```bash
10
+ HONECRM_API_KEY=hone_xxxx npx @honecrm/mcp-server
11
+ ```
12
+
13
+ Or install globally:
14
+
15
+ ```bash
16
+ npm install -g @honecrm/mcp-server
17
+ HONECRM_API_KEY=hone_xxxx honecrm-mcp
18
+ ```
19
+
20
+ ## Client configuration
21
+
22
+ ### Claude Desktop
23
+
24
+ Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):
25
+
26
+ ```json
27
+ {
28
+ "mcpServers": {
29
+ "honecrm": {
30
+ "command": "npx",
31
+ "args": ["@honecrm/mcp-server"],
32
+ "env": {
33
+ "HONECRM_API_KEY": "hone_xxxx"
34
+ }
35
+ }
36
+ }
37
+ }
38
+ ```
39
+
40
+ ### Claude Code
41
+
42
+ ```bash
43
+ claude mcp add honecrm -- npx @honecrm/mcp-server
44
+ ```
45
+
46
+ Then set the environment variable in your shell or `.env`:
47
+
48
+ ```bash
49
+ export HONECRM_API_KEY=hone_xxxx
50
+ ```
51
+
52
+ ### Cursor
53
+
54
+ Add to `.cursor/mcp.json` in your project root:
55
+
56
+ ```json
57
+ {
58
+ "mcpServers": {
59
+ "honecrm": {
60
+ "command": "npx",
61
+ "args": ["@honecrm/mcp-server"],
62
+ "env": {
63
+ "HONECRM_API_KEY": "hone_xxxx"
64
+ }
65
+ }
66
+ }
67
+ }
68
+ ```
69
+
70
+ ## Environment variables
71
+
72
+ | Variable | Required | Default | Description |
73
+ |----------|----------|---------|-------------|
74
+ | `HONECRM_API_KEY` | Yes | — | Your Hone CRM API key |
75
+ | `HONECRM_BASE_URL` | No | `https://api.honecrm.com/v1` | API base URL |
76
+
77
+ ## Available tools
78
+
79
+ ### Deals
80
+
81
+ | Tool | Description |
82
+ |------|-------------|
83
+ | `list_deals` | List deals with optional filters (stage, status, search, teamId) |
84
+ | `get_deal` | Get a single deal by ID |
85
+ | `create_deal` | Create a new deal with name, value, contact, and stage |
86
+ | `update_deal` | Update an existing deal's fields |
87
+ | `delete_deal` | Delete a deal by ID |
88
+
89
+ ### Contacts
90
+
91
+ | Tool | Description |
92
+ |------|-------------|
93
+ | `list_contacts` | List contacts with optional filters (search, companyId, teamId) |
94
+ | `get_contact` | Get a single contact by ID |
95
+ | `create_contact` | Create a new contact with name, email, and optional fields |
96
+
97
+ ### Companies
98
+
99
+ | Tool | Description |
100
+ |------|-------------|
101
+ | `list_companies` | List companies with optional filters (search, industry, domain) |
102
+ | `get_company` | Get a single company by ID |
103
+ | `create_company` | Create a new company with name and optional fields |
104
+
105
+ ### Search
106
+
107
+ | Tool | Description |
108
+ |------|-------------|
109
+ | `search` | Full-text search across deals, contacts, companies, and notes |
110
+
111
+ ## Protocol
112
+
113
+ - **Transport**: JSON-RPC over stdio
114
+ - **Protocol version**: `2024-11-05`
115
+ - **Authentication**: API key via environment variable (passed to Hone CRM REST API)
116
+
117
+ ## How it works
118
+
119
+ The MCP server acts as a bridge between LLM clients and the Hone CRM API:
120
+
121
+ ```
122
+ LLM Client ←→ MCP Server (stdio) ←→ Hone CRM REST API
123
+ (Claude) @honecrm/mcp-server api.honecrm.com
124
+ ```
125
+
126
+ All data access goes through the `@honecrm/sdk` HTTP client — the MCP server never accesses the database directly. API key scopes and rate limits are enforced server-side.
127
+
128
+ ## Requirements
129
+
130
+ - Node.js >= 18
131
+
132
+ ## License
133
+
134
+ MIT
package/dist/bin.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":""}
package/dist/bin.js ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ /**
5
+ * CLI entry point for the Hone CRM MCP server.
6
+ *
7
+ * Usage:
8
+ * HONECRM_API_KEY=hone_xxx honecrm-mcp
9
+ *
10
+ * Optional env vars:
11
+ * HONECRM_BASE_URL - API base URL (default: https://api.honecrm.com/v1)
12
+ */
13
+ const index_1 = require("./index");
14
+ (0, index_1.startServer)();
15
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";;;AACA;;;;;;;;GAQG;AACH,mCAAsC;AAEtC,IAAA,mBAAW,GAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Hone CRM MCP Server
3
+ *
4
+ * Exposes CRM operations as MCP tools, routing all calls through the
5
+ * HTTP SDK rather than direct database access.
6
+ */
7
+ export declare function startServer(): void;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA4SH,wBAAgB,WAAW,IAAI,IAAI,CA8HlC"}
package/dist/index.js ADDED
@@ -0,0 +1,419 @@
1
+ "use strict";
2
+ /**
3
+ * Hone CRM MCP Server
4
+ *
5
+ * Exposes CRM operations as MCP tools, routing all calls through the
6
+ * HTTP SDK rather than direct database access.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.startServer = startServer;
43
+ const sdk_1 = require("@honecrm/sdk");
44
+ const readline = __importStar(require("readline"));
45
+ // ---------------------------------------------------------------------------
46
+ // Tool definitions
47
+ // ---------------------------------------------------------------------------
48
+ function successResult(data) {
49
+ return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
50
+ }
51
+ function errorResult(message) {
52
+ return { content: [{ type: 'text', text: message }], isError: true };
53
+ }
54
+ function buildTools() {
55
+ return [
56
+ // -- Deals ---------------------------------------------------------------
57
+ {
58
+ definition: {
59
+ name: 'list_deals',
60
+ description: 'List deals with optional filters. Returns paginated results.',
61
+ inputSchema: {
62
+ type: 'object',
63
+ properties: {
64
+ stage: { type: 'string', enum: ['lead', 'qualified', 'proposal', 'negotiation', 'closed_won', 'closed_lost'] },
65
+ status: { type: 'string', enum: ['active', 'stalled', 'on_hold', 'archived'] },
66
+ search: { type: 'string' },
67
+ teamId: { type: 'string' },
68
+ limit: { type: 'number', description: 'Max results (default 25, max 100)' },
69
+ nextToken: { type: 'string' },
70
+ },
71
+ },
72
+ },
73
+ handler: async (client, input) => {
74
+ const data = await client.deals.list(input);
75
+ return successResult(data);
76
+ },
77
+ },
78
+ {
79
+ definition: {
80
+ name: 'get_deal',
81
+ description: 'Get a single deal by ID.',
82
+ inputSchema: {
83
+ type: 'object',
84
+ properties: { dealId: { type: 'string', description: 'Deal ID' } },
85
+ required: ['dealId'],
86
+ },
87
+ },
88
+ handler: async (client, input) => {
89
+ const data = await client.deals.get(input.dealId);
90
+ return successResult(data);
91
+ },
92
+ },
93
+ {
94
+ definition: {
95
+ name: 'create_deal',
96
+ description: 'Create a new deal.',
97
+ inputSchema: {
98
+ type: 'object',
99
+ properties: {
100
+ name: { type: 'string' },
101
+ value: { type: 'number' },
102
+ contact: {
103
+ type: 'object',
104
+ properties: {
105
+ name: { type: 'string' },
106
+ email: { type: 'string' },
107
+ phone: { type: 'string' },
108
+ company: { type: 'string' },
109
+ },
110
+ required: ['name', 'email'],
111
+ },
112
+ stage: { type: 'string', enum: ['lead', 'qualified', 'proposal', 'negotiation', 'closed_won', 'closed_lost'] },
113
+ notes: { type: 'string' },
114
+ teamId: { type: 'string' },
115
+ },
116
+ required: ['name', 'value', 'contact'],
117
+ },
118
+ },
119
+ handler: async (client, input) => {
120
+ const data = await client.deals.create(input);
121
+ return successResult(data);
122
+ },
123
+ },
124
+ {
125
+ definition: {
126
+ name: 'update_deal',
127
+ description: 'Update an existing deal.',
128
+ inputSchema: {
129
+ type: 'object',
130
+ properties: {
131
+ dealId: { type: 'string' },
132
+ name: { type: 'string' },
133
+ value: { type: 'number' },
134
+ stage: { type: 'string' },
135
+ status: { type: 'string' },
136
+ notes: { type: 'string' },
137
+ },
138
+ required: ['dealId'],
139
+ },
140
+ },
141
+ handler: async (client, input) => {
142
+ const { dealId, ...updates } = input;
143
+ const data = await client.deals.update(dealId, updates);
144
+ return successResult(data);
145
+ },
146
+ },
147
+ {
148
+ definition: {
149
+ name: 'delete_deal',
150
+ description: 'Delete a deal.',
151
+ inputSchema: {
152
+ type: 'object',
153
+ properties: { dealId: { type: 'string' } },
154
+ required: ['dealId'],
155
+ },
156
+ },
157
+ handler: async (client, input) => {
158
+ const data = await client.deals.delete(input.dealId);
159
+ return successResult(data);
160
+ },
161
+ },
162
+ // -- Contacts ------------------------------------------------------------
163
+ {
164
+ definition: {
165
+ name: 'list_contacts',
166
+ description: 'List contacts with optional filters.',
167
+ inputSchema: {
168
+ type: 'object',
169
+ properties: {
170
+ search: { type: 'string' },
171
+ companyId: { type: 'string' },
172
+ teamId: { type: 'string' },
173
+ limit: { type: 'number' },
174
+ nextToken: { type: 'string' },
175
+ },
176
+ },
177
+ },
178
+ handler: async (client, input) => {
179
+ const data = await client.contacts.list(input);
180
+ return successResult(data);
181
+ },
182
+ },
183
+ {
184
+ definition: {
185
+ name: 'get_contact',
186
+ description: 'Get a single contact by ID.',
187
+ inputSchema: {
188
+ type: 'object',
189
+ properties: { contactId: { type: 'string' } },
190
+ required: ['contactId'],
191
+ },
192
+ },
193
+ handler: async (client, input) => {
194
+ const data = await client.contacts.get(input.contactId);
195
+ return successResult(data);
196
+ },
197
+ },
198
+ {
199
+ definition: {
200
+ name: 'create_contact',
201
+ description: 'Create a new contact.',
202
+ inputSchema: {
203
+ type: 'object',
204
+ properties: {
205
+ name: { type: 'string' },
206
+ email: { type: 'string' },
207
+ phone: { type: 'string' },
208
+ title: { type: 'string' },
209
+ companyId: { type: 'string' },
210
+ companyName: { type: 'string' },
211
+ },
212
+ required: ['name', 'email'],
213
+ },
214
+ },
215
+ handler: async (client, input) => {
216
+ const data = await client.contacts.create(input);
217
+ return successResult(data);
218
+ },
219
+ },
220
+ // -- Companies -----------------------------------------------------------
221
+ {
222
+ definition: {
223
+ name: 'list_companies',
224
+ description: 'List companies with optional filters.',
225
+ inputSchema: {
226
+ type: 'object',
227
+ properties: {
228
+ search: { type: 'string' },
229
+ industry: { type: 'string' },
230
+ domain: { type: 'string' },
231
+ teamId: { type: 'string' },
232
+ limit: { type: 'number' },
233
+ nextToken: { type: 'string' },
234
+ },
235
+ },
236
+ },
237
+ handler: async (client, input) => {
238
+ const data = await client.companies.list(input);
239
+ return successResult(data);
240
+ },
241
+ },
242
+ {
243
+ definition: {
244
+ name: 'get_company',
245
+ description: 'Get a single company by ID.',
246
+ inputSchema: {
247
+ type: 'object',
248
+ properties: { companyId: { type: 'string' } },
249
+ required: ['companyId'],
250
+ },
251
+ },
252
+ handler: async (client, input) => {
253
+ const data = await client.companies.get(input.companyId);
254
+ return successResult(data);
255
+ },
256
+ },
257
+ {
258
+ definition: {
259
+ name: 'create_company',
260
+ description: 'Create a new company.',
261
+ inputSchema: {
262
+ type: 'object',
263
+ properties: {
264
+ name: { type: 'string' },
265
+ domain: { type: 'string' },
266
+ industry: { type: 'string' },
267
+ website: { type: 'string' },
268
+ description: { type: 'string' },
269
+ },
270
+ required: ['name'],
271
+ },
272
+ },
273
+ handler: async (client, input) => {
274
+ const data = await client.companies.create(input);
275
+ return successResult(data);
276
+ },
277
+ },
278
+ // -- Search --------------------------------------------------------------
279
+ {
280
+ definition: {
281
+ name: 'search',
282
+ description: 'Search across deals, contacts, and companies.',
283
+ inputSchema: {
284
+ type: 'object',
285
+ properties: {
286
+ q: { type: 'string', description: 'Search query' },
287
+ types: {
288
+ type: 'array',
289
+ items: { type: 'string', enum: ['deal', 'contact', 'company', 'note'] },
290
+ description: 'Entity types to search',
291
+ },
292
+ limit: { type: 'number' },
293
+ },
294
+ required: ['q'],
295
+ },
296
+ },
297
+ handler: async (client, input) => {
298
+ const q = input.q;
299
+ const limit = input.limit;
300
+ const data = await client.search.query(q, { limit });
301
+ return successResult(data);
302
+ },
303
+ },
304
+ ];
305
+ }
306
+ // ---------------------------------------------------------------------------
307
+ // Server
308
+ // ---------------------------------------------------------------------------
309
+ function startServer() {
310
+ const apiKey = process.env.HONECRM_API_KEY;
311
+ if (!apiKey) {
312
+ console.error('HONECRM_API_KEY environment variable is required');
313
+ process.exit(1);
314
+ }
315
+ const baseUrl = process.env.HONECRM_BASE_URL || 'https://api.honecrm.com/v1';
316
+ const client = new sdk_1.HoneCRM({ apiKey, baseUrl });
317
+ const tools = buildTools();
318
+ const toolMap = new Map();
319
+ for (const tool of tools) {
320
+ toolMap.set(tool.definition.name, tool);
321
+ }
322
+ console.error(`[MCP] Hone CRM MCP Server starting with ${tools.length} tools...`);
323
+ const rl = readline.createInterface({
324
+ input: process.stdin,
325
+ output: process.stdout,
326
+ terminal: false,
327
+ });
328
+ const sendResponse = (response) => {
329
+ process.stdout.write(JSON.stringify(response) + '\n');
330
+ };
331
+ rl.on('line', async (line) => {
332
+ try {
333
+ const message = JSON.parse(line);
334
+ switch (message.method) {
335
+ case 'initialize': {
336
+ sendResponse({
337
+ jsonrpc: '2.0',
338
+ id: message.id,
339
+ result: {
340
+ protocolVersion: '2024-11-05',
341
+ capabilities: { tools: {} },
342
+ serverInfo: {
343
+ name: 'honecrm-mcp',
344
+ version: '0.1.0',
345
+ },
346
+ },
347
+ });
348
+ break;
349
+ }
350
+ case 'notifications/initialized': {
351
+ // Acknowledgement, nothing to respond
352
+ break;
353
+ }
354
+ case 'tools/list': {
355
+ sendResponse({
356
+ jsonrpc: '2.0',
357
+ id: message.id,
358
+ result: {
359
+ tools: tools.map((t) => ({
360
+ name: t.definition.name,
361
+ description: t.definition.description,
362
+ inputSchema: t.definition.inputSchema,
363
+ })),
364
+ },
365
+ });
366
+ break;
367
+ }
368
+ case 'tools/call': {
369
+ const params = message.params;
370
+ const tool = toolMap.get(params.name);
371
+ if (!tool) {
372
+ sendResponse({
373
+ jsonrpc: '2.0',
374
+ id: message.id,
375
+ result: errorResult(`Unknown tool: ${params.name}`),
376
+ });
377
+ break;
378
+ }
379
+ try {
380
+ const result = await tool.handler(client, params.arguments ?? {});
381
+ sendResponse({
382
+ jsonrpc: '2.0',
383
+ id: message.id,
384
+ result,
385
+ });
386
+ }
387
+ catch (error) {
388
+ const errMsg = error instanceof Error ? error.message : 'Unknown error';
389
+ console.error(`[MCP] Tool error for ${params.name}:`, error);
390
+ sendResponse({
391
+ jsonrpc: '2.0',
392
+ id: message.id,
393
+ result: errorResult(`Error executing ${params.name}: ${errMsg}`),
394
+ });
395
+ }
396
+ break;
397
+ }
398
+ default: {
399
+ sendResponse({
400
+ jsonrpc: '2.0',
401
+ id: message.id,
402
+ error: {
403
+ code: -32601,
404
+ message: `Method not found: ${message.method}`,
405
+ },
406
+ });
407
+ }
408
+ }
409
+ }
410
+ catch (error) {
411
+ console.error('[MCP] Error processing message:', error);
412
+ }
413
+ });
414
+ rl.on('close', () => {
415
+ console.error('[MCP] Server shutting down.');
416
+ process.exit(0);
417
+ });
418
+ }
419
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@honecrm/mcp-server",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for Hone CRM - enables AI agents to interact with your CRM",
5
+ "bin": {
6
+ "honecrm-mcp": "dist/bin.js"
7
+ },
8
+ "main": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md",
19
+ "LICENSE"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsc",
23
+ "start": "node dist/bin.js",
24
+ "clean": "rm -rf dist",
25
+ "test": "jest",
26
+ "prepublishOnly": "npm run clean && npm run build"
27
+ },
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "git+https://github.com/robstettler/nextstep.git",
34
+ "directory": "packages/mcp-server"
35
+ },
36
+ "homepage": "https://honecrm.com/docs",
37
+ "keywords": [
38
+ "honecrm",
39
+ "mcp",
40
+ "crm",
41
+ "ai",
42
+ "model-context-protocol",
43
+ "claude",
44
+ "llm",
45
+ "tools"
46
+ ],
47
+ "license": "MIT",
48
+ "dependencies": {
49
+ "@honecrm/sdk": "^0.1.0"
50
+ },
51
+ "devDependencies": {
52
+ "@types/jest": "^29.5.12",
53
+ "@types/node": "^20.11.0",
54
+ "jest": "^29.7.0",
55
+ "ts-jest": "^29.1.2",
56
+ "typescript": "^5.3.3"
57
+ },
58
+ "engines": {
59
+ "node": ">=18.0.0"
60
+ }
61
+ }