@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 +21 -0
- package/README.md +134 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +15 -0
- package/dist/bin.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +419 -0
- package/dist/index.js.map +1 -0
- package/package.json +61 -0
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 @@
|
|
|
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
|
package/dist/bin.js.map
ADDED
|
@@ -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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
+
}
|