@instantkom/mcp-server 1.0.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 +274 -0
- package/dist/client/api-client.d.ts +76 -0
- package/dist/client/api-client.d.ts.map +1 -0
- package/dist/client/api-client.js +234 -0
- package/dist/client/api-client.js.map +1 -0
- package/dist/index.public.d.ts +23 -0
- package/dist/index.public.d.ts.map +1 -0
- package/dist/index.public.js +79 -0
- package/dist/index.public.js.map +1 -0
- package/dist/tools/app/account.d.ts +46 -0
- package/dist/tools/app/account.d.ts.map +1 -0
- package/dist/tools/app/account.js +69 -0
- package/dist/tools/app/account.js.map +1 -0
- package/dist/tools/app/analytics.d.ts +78 -0
- package/dist/tools/app/analytics.d.ts.map +1 -0
- package/dist/tools/app/analytics.js +158 -0
- package/dist/tools/app/analytics.js.map +1 -0
- package/dist/tools/app/api-keys.d.ts +195 -0
- package/dist/tools/app/api-keys.d.ts.map +1 -0
- package/dist/tools/app/api-keys.js +203 -0
- package/dist/tools/app/api-keys.js.map +1 -0
- package/dist/tools/app/billing.d.ts +78 -0
- package/dist/tools/app/billing.d.ts.map +1 -0
- package/dist/tools/app/billing.js +117 -0
- package/dist/tools/app/billing.js.map +1 -0
- package/dist/tools/app/bots.d.ts +641 -0
- package/dist/tools/app/bots.d.ts.map +1 -0
- package/dist/tools/app/bots.js +599 -0
- package/dist/tools/app/bots.js.map +1 -0
- package/dist/tools/app/broadcasts.d.ts +165 -0
- package/dist/tools/app/broadcasts.d.ts.map +1 -0
- package/dist/tools/app/broadcasts.js +219 -0
- package/dist/tools/app/broadcasts.js.map +1 -0
- package/dist/tools/app/channels.d.ts +126 -0
- package/dist/tools/app/channels.d.ts.map +1 -0
- package/dist/tools/app/channels.js +198 -0
- package/dist/tools/app/channels.js.map +1 -0
- package/dist/tools/app/chats.d.ts +90 -0
- package/dist/tools/app/chats.d.ts.map +1 -0
- package/dist/tools/app/chats.js +162 -0
- package/dist/tools/app/chats.js.map +1 -0
- package/dist/tools/app/contacts.d.ts +153 -0
- package/dist/tools/app/contacts.d.ts.map +1 -0
- package/dist/tools/app/contacts.js +186 -0
- package/dist/tools/app/contacts.js.map +1 -0
- package/dist/tools/app/coupons.d.ts +37 -0
- package/dist/tools/app/coupons.d.ts.map +1 -0
- package/dist/tools/app/coupons.js +70 -0
- package/dist/tools/app/coupons.js.map +1 -0
- package/dist/tools/app/custom-fields.d.ts +301 -0
- package/dist/tools/app/custom-fields.d.ts.map +1 -0
- package/dist/tools/app/custom-fields.js +265 -0
- package/dist/tools/app/custom-fields.js.map +1 -0
- package/dist/tools/app/dashboard-widgets.d.ts +121 -0
- package/dist/tools/app/dashboard-widgets.d.ts.map +1 -0
- package/dist/tools/app/dashboard-widgets.js +163 -0
- package/dist/tools/app/dashboard-widgets.js.map +1 -0
- package/dist/tools/app/dashboard.d.ts +18 -0
- package/dist/tools/app/dashboard.d.ts.map +1 -0
- package/dist/tools/app/dashboard.js +29 -0
- package/dist/tools/app/dashboard.js.map +1 -0
- package/dist/tools/app/ecommerce.d.ts +95 -0
- package/dist/tools/app/ecommerce.d.ts.map +1 -0
- package/dist/tools/app/ecommerce.js +109 -0
- package/dist/tools/app/ecommerce.js.map +1 -0
- package/dist/tools/app/events.d.ts +53 -0
- package/dist/tools/app/events.d.ts.map +1 -0
- package/dist/tools/app/events.js +66 -0
- package/dist/tools/app/events.js.map +1 -0
- package/dist/tools/app/exports.d.ts +81 -0
- package/dist/tools/app/exports.d.ts.map +1 -0
- package/dist/tools/app/exports.js +125 -0
- package/dist/tools/app/exports.js.map +1 -0
- package/dist/tools/app/feeds.d.ts +113 -0
- package/dist/tools/app/feeds.d.ts.map +1 -0
- package/dist/tools/app/feeds.js +166 -0
- package/dist/tools/app/feeds.js.map +1 -0
- package/dist/tools/app/flow-edges.d.ts +122 -0
- package/dist/tools/app/flow-edges.d.ts.map +1 -0
- package/dist/tools/app/flow-edges.js +130 -0
- package/dist/tools/app/flow-edges.js.map +1 -0
- package/dist/tools/app/flow-nodes.d.ts +122 -0
- package/dist/tools/app/flow-nodes.d.ts.map +1 -0
- package/dist/tools/app/flow-nodes.js +130 -0
- package/dist/tools/app/flow-nodes.js.map +1 -0
- package/dist/tools/app/flows.d.ts +136 -0
- package/dist/tools/app/flows.d.ts.map +1 -0
- package/dist/tools/app/flows.js +141 -0
- package/dist/tools/app/flows.js.map +1 -0
- package/dist/tools/app/funnels.d.ts +96 -0
- package/dist/tools/app/funnels.d.ts.map +1 -0
- package/dist/tools/app/funnels.js +127 -0
- package/dist/tools/app/funnels.js.map +1 -0
- package/dist/tools/app/index.d.ts +51 -0
- package/dist/tools/app/index.d.ts.map +1 -0
- package/dist/tools/app/index.js +121 -0
- package/dist/tools/app/index.js.map +1 -0
- package/dist/tools/app/media.d.ts +44 -0
- package/dist/tools/app/media.d.ts.map +1 -0
- package/dist/tools/app/media.js +183 -0
- package/dist/tools/app/media.js.map +1 -0
- package/dist/tools/app/message-events.d.ts +69 -0
- package/dist/tools/app/message-events.d.ts.map +1 -0
- package/dist/tools/app/message-events.js +72 -0
- package/dist/tools/app/message-events.js.map +1 -0
- package/dist/tools/app/messages.d.ts +380 -0
- package/dist/tools/app/messages.d.ts.map +1 -0
- package/dist/tools/app/messages.js +345 -0
- package/dist/tools/app/messages.js.map +1 -0
- package/dist/tools/app/object-folders.d.ts +82 -0
- package/dist/tools/app/object-folders.d.ts.map +1 -0
- package/dist/tools/app/object-folders.js +123 -0
- package/dist/tools/app/object-folders.js.map +1 -0
- package/dist/tools/app/plans.d.ts +53 -0
- package/dist/tools/app/plans.d.ts.map +1 -0
- package/dist/tools/app/plans.js +70 -0
- package/dist/tools/app/plans.js.map +1 -0
- package/dist/tools/app/polls.d.ts +227 -0
- package/dist/tools/app/polls.d.ts.map +1 -0
- package/dist/tools/app/polls.js +256 -0
- package/dist/tools/app/polls.js.map +1 -0
- package/dist/tools/app/qr-codes.d.ts +103 -0
- package/dist/tools/app/qr-codes.d.ts.map +1 -0
- package/dist/tools/app/qr-codes.js +160 -0
- package/dist/tools/app/qr-codes.js.map +1 -0
- package/dist/tools/app/segmentations.d.ts +132 -0
- package/dist/tools/app/segmentations.d.ts.map +1 -0
- package/dist/tools/app/segmentations.js +237 -0
- package/dist/tools/app/segmentations.js.map +1 -0
- package/dist/tools/app/settings.d.ts +75 -0
- package/dist/tools/app/settings.d.ts.map +1 -0
- package/dist/tools/app/settings.js +96 -0
- package/dist/tools/app/settings.js.map +1 -0
- package/dist/tools/app/shortlinks.d.ts +103 -0
- package/dist/tools/app/shortlinks.d.ts.map +1 -0
- package/dist/tools/app/shortlinks.js +158 -0
- package/dist/tools/app/shortlinks.js.map +1 -0
- package/dist/tools/app/super-widgets.d.ts +95 -0
- package/dist/tools/app/super-widgets.d.ts.map +1 -0
- package/dist/tools/app/super-widgets.js +124 -0
- package/dist/tools/app/super-widgets.js.map +1 -0
- package/dist/tools/app/tags.d.ts +267 -0
- package/dist/tools/app/tags.d.ts.map +1 -0
- package/dist/tools/app/tags.js +363 -0
- package/dist/tools/app/tags.js.map +1 -0
- package/dist/tools/app/team-members.d.ts +141 -0
- package/dist/tools/app/team-members.d.ts.map +1 -0
- package/dist/tools/app/team-members.js +195 -0
- package/dist/tools/app/team-members.js.map +1 -0
- package/dist/tools/app/templates.d.ts +212 -0
- package/dist/tools/app/templates.d.ts.map +1 -0
- package/dist/tools/app/templates.js +270 -0
- package/dist/tools/app/templates.js.map +1 -0
- package/dist/tools/app/tickets.d.ts +277 -0
- package/dist/tools/app/tickets.d.ts.map +1 -0
- package/dist/tools/app/tickets.js +266 -0
- package/dist/tools/app/tickets.js.map +1 -0
- package/dist/tools/app/users.d.ts +70 -0
- package/dist/tools/app/users.d.ts.map +1 -0
- package/dist/tools/app/users.js +72 -0
- package/dist/tools/app/users.js.map +1 -0
- package/dist/tools/app/webhooks.d.ts +61 -0
- package/dist/tools/app/webhooks.d.ts.map +1 -0
- package/dist/tools/app/webhooks.js +85 -0
- package/dist/tools/app/webhooks.js.map +1 -0
- package/dist/tools/app/widgets.d.ts +103 -0
- package/dist/tools/app/widgets.d.ts.map +1 -0
- package/dist/tools/app/widgets.js +128 -0
- package/dist/tools/app/widgets.js.map +1 -0
- package/dist/tools/public/health.d.ts +16 -0
- package/dist/tools/public/health.d.ts.map +1 -0
- package/dist/tools/public/health.js +27 -0
- package/dist/tools/public/health.js.map +1 -0
- package/dist/tools/public/index.d.ts +15 -0
- package/dist/tools/public/index.d.ts.map +1 -0
- package/dist/tools/public/index.js +10 -0
- package/dist/tools/public/index.js.map +1 -0
- package/dist/tools/tool-router.d.ts +21 -0
- package/dist/tools/tool-router.d.ts.map +1 -0
- package/dist/tools/tool-router.js +118 -0
- package/dist/tools/tool-router.js.map +1 -0
- package/dist/types/index.d.ts +73 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +89 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 instantKOM, Inh. Simon Theophil
|
|
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,274 @@
|
|
|
1
|
+
# instantKOM MCP Server
|
|
2
|
+
|
|
3
|
+
Model Context Protocol (MCP) Server for the instantKOM REST API. This server enables AI assistants like Claude to interact directly with the instantKOM API through standardized MCP tools.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Multi-Tenant Support**: Configure different access levels for internal use and customers
|
|
8
|
+
- **Scoped Access**: Public, App, and Admin level tools based on tenant configuration
|
|
9
|
+
- **230+ Tools**: Full CRUD coverage for Channels, Contacts, Messages, Newsletters, Bots, Flows, Analytics and more
|
|
10
|
+
- **Type-Safe**: Built with TypeScript for robust type checking
|
|
11
|
+
- **Flexible Authentication**: Bearer token authentication with configurable API keys
|
|
12
|
+
|
|
13
|
+
## Distribution
|
|
14
|
+
|
|
15
|
+
- **Public package** (recommended for customers): `npx -y @instantkom/mcp-server` -- ships only public app tools (no admin/internal)
|
|
16
|
+
- **Public repo**: https://github.com/instantKOM/mcp-server (mirror of `services/mcp-server/` from this monorepo)
|
|
17
|
+
- **Internal**: this folder; includes admin tools and tenant config
|
|
18
|
+
|
|
19
|
+
## Quick Start
|
|
20
|
+
|
|
21
|
+
### Installation
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
cd services/mcp-server
|
|
25
|
+
npm install
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Configuration
|
|
29
|
+
|
|
30
|
+
1. Copy the example environment file:
|
|
31
|
+
```bash
|
|
32
|
+
cp .env.example .env
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
2. Edit `.env` to select your tenant:
|
|
36
|
+
```env
|
|
37
|
+
TENANT_ID=internal
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
3. (Optional) Configure tenants in `src/config/tenants.json`
|
|
41
|
+
|
|
42
|
+
### Development
|
|
43
|
+
|
|
44
|
+
Run the server in development mode:
|
|
45
|
+
```bash
|
|
46
|
+
npm run dev
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Build and Run
|
|
50
|
+
|
|
51
|
+
Build the TypeScript code:
|
|
52
|
+
```bash
|
|
53
|
+
npm run build
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Run the compiled server:
|
|
57
|
+
```bash
|
|
58
|
+
npm start
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Usage with Claude Code / Claude Desktop
|
|
62
|
+
|
|
63
|
+
### Public package (customers)
|
|
64
|
+
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"mcpServers": {
|
|
68
|
+
"instantkom": {
|
|
69
|
+
"command": "npx",
|
|
70
|
+
"args": ["-y", "@instantkom/mcp-server"],
|
|
71
|
+
"env": {
|
|
72
|
+
"INSTANTKOM_API_KEY": "ik_live_..."
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Local internal build (developers)
|
|
80
|
+
|
|
81
|
+
```json
|
|
82
|
+
{
|
|
83
|
+
"mcpServers": {
|
|
84
|
+
"instantkom": {
|
|
85
|
+
"command": "node",
|
|
86
|
+
"args": [
|
|
87
|
+
"/path/to/instantkom/services/mcp-server/dist/index.js"
|
|
88
|
+
],
|
|
89
|
+
"env": {
|
|
90
|
+
"TENANT_ID": "internal"
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
For development with tsx (auto-reload):
|
|
98
|
+
```json
|
|
99
|
+
{
|
|
100
|
+
"mcpServers": {
|
|
101
|
+
"instantkom": {
|
|
102
|
+
"command": "npx",
|
|
103
|
+
"args": [
|
|
104
|
+
"tsx",
|
|
105
|
+
"/path/to/instantkom/services/mcp-server/src/index.ts"
|
|
106
|
+
],
|
|
107
|
+
"env": {
|
|
108
|
+
"TENANT_ID": "internal"
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
After updating the configuration, restart Claude Code to load the MCP server.
|
|
116
|
+
|
|
117
|
+
## Available Tools (overview)
|
|
118
|
+
|
|
119
|
+
The server ships **230+ tools** covering all instantKOM resource types. The full list with parameters is documented at https://api.instantkom.app/api-docs (each REST endpoint has a corresponding MCP tool).
|
|
120
|
+
|
|
121
|
+
### Public scope (no auth required)
|
|
122
|
+
- `get_health`
|
|
123
|
+
|
|
124
|
+
### App scope (app + admin tenants)
|
|
125
|
+
|
|
126
|
+
| Category | Examples | Approx. count |
|
|
127
|
+
|----------|----------|---------------|
|
|
128
|
+
| Channels | `list_channels`, `get_channel`, `create_channel`, `update_channel`, `delete_channel` | 7 |
|
|
129
|
+
| Contacts | `list_contacts`, `get_contact`, `create_contact`, ... | 5 |
|
|
130
|
+
| Messages | `list_messages`, `send_message`, `get_message`, ... | 10 |
|
|
131
|
+
| Broadcasts (Newsletters) | `list_broadcasts`, `create_broadcast`, `send_broadcast`, ... | 6 |
|
|
132
|
+
| Bots & Flows | bot CRUD, flow nodes, flow edges | 38 |
|
|
133
|
+
| Templates & Tags | template + tag CRUD, tag assignment | 21 |
|
|
134
|
+
| Analytics | dashboard, broadcasts, contacts, messages KPIs | 5 |
|
|
135
|
+
| Segmentation & QR | segmentation CRUD, QR codes, shortlinks | 13 |
|
|
136
|
+
| Tickets, Webhooks, Polls, Events, Media, Custom Fields, Object Folders, ... | full CRUD | 100+ |
|
|
137
|
+
|
|
138
|
+
### Admin scope (internal tenants only)
|
|
139
|
+
Includes platform-level analytics, user/team/billing operations, and feature flag management. Not part of the public package.
|
|
140
|
+
|
|
141
|
+
## Multi-Tenant Configuration
|
|
142
|
+
|
|
143
|
+
Edit `src/config/tenants.json` to configure different tenants:
|
|
144
|
+
|
|
145
|
+
```json
|
|
146
|
+
{
|
|
147
|
+
"tenants": [
|
|
148
|
+
{
|
|
149
|
+
"id": "internal",
|
|
150
|
+
"name": "instantKOM Internal",
|
|
151
|
+
"apiUrl": "http://localhost:3002",
|
|
152
|
+
"apiKey": "your-api-key",
|
|
153
|
+
"scope": "admin"
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"id": "customer-readonly",
|
|
157
|
+
"name": "Customer Read-Only",
|
|
158
|
+
"apiUrl": "https://api.instantkom.app",
|
|
159
|
+
"apiKey": "customer-api-key",
|
|
160
|
+
"scope": "app",
|
|
161
|
+
"enabledTools": ["list_*", "get_*"]
|
|
162
|
+
}
|
|
163
|
+
]
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Tenant Configuration Options
|
|
168
|
+
|
|
169
|
+
- `id`: Unique identifier (used in TENANT_ID env var)
|
|
170
|
+
- `name`: Display name
|
|
171
|
+
- `apiUrl`: REST API base URL
|
|
172
|
+
- `apiKey`: Bearer token for authentication
|
|
173
|
+
- `scope`: Access level (`public`, `app`, `admin`)
|
|
174
|
+
- `enabledTools` (optional): Whitelist specific tools (supports wildcards)
|
|
175
|
+
|
|
176
|
+
## Environment Variables
|
|
177
|
+
|
|
178
|
+
- `TENANT_ID`: Tenant identifier (default: `internal`)
|
|
179
|
+
- `API_URL`: Override tenant's API URL
|
|
180
|
+
- `API_KEY`: Override tenant's API key
|
|
181
|
+
- `LOG_LEVEL`: Logging level (error, warn, info, debug)
|
|
182
|
+
|
|
183
|
+
## Architecture
|
|
184
|
+
|
|
185
|
+
```
|
|
186
|
+
services/mcp-server/
|
|
187
|
+
├── src/
|
|
188
|
+
│ ├── index.ts # MCP Server entry point
|
|
189
|
+
│ ├── config/
|
|
190
|
+
│ │ ├── config.ts # Configuration loader
|
|
191
|
+
│ │ └── tenants.json # Tenant configurations
|
|
192
|
+
│ ├── client/
|
|
193
|
+
│ │ └── api-client.ts # HTTP client for REST API
|
|
194
|
+
│ ├── types/
|
|
195
|
+
│ │ └── index.ts # TypeScript type definitions
|
|
196
|
+
│ └── tools/
|
|
197
|
+
│ ├── public/ # Public tools (health)
|
|
198
|
+
│ ├── app/ # App-level tools (channels, contacts, etc.)
|
|
199
|
+
│ └── admin/ # Admin-level tools (analytics)
|
|
200
|
+
├── package.json
|
|
201
|
+
├── tsconfig.json
|
|
202
|
+
└── README.md
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## Development
|
|
206
|
+
|
|
207
|
+
### Adding New Tools
|
|
208
|
+
|
|
209
|
+
1. Create a new file in the appropriate directory (`tools/public/`, `tools/app/`, or `tools/admin/`)
|
|
210
|
+
2. Export tool definitions and handler functions
|
|
211
|
+
3. Import and register in `src/index.ts`
|
|
212
|
+
4. Add types to `src/types/index.ts` if needed
|
|
213
|
+
|
|
214
|
+
Example:
|
|
215
|
+
```typescript
|
|
216
|
+
// tools/app/example.ts
|
|
217
|
+
export async function exampleTool(apiClient: ApiClient, args: any): Promise<any> {
|
|
218
|
+
const response = await apiClient.get('/v1/example');
|
|
219
|
+
return {
|
|
220
|
+
content: [{ type: 'text', text: JSON.stringify(response.data, null, 2) }],
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
export const exampleTools = [
|
|
225
|
+
{
|
|
226
|
+
name: 'example_tool',
|
|
227
|
+
description: 'Example tool description',
|
|
228
|
+
inputSchema: {
|
|
229
|
+
type: 'object',
|
|
230
|
+
properties: { /* ... */ },
|
|
231
|
+
required: [],
|
|
232
|
+
},
|
|
233
|
+
},
|
|
234
|
+
];
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Testing
|
|
238
|
+
|
|
239
|
+
The MCP server can be tested by:
|
|
240
|
+
1. Using Claude Code with the server configured
|
|
241
|
+
2. Testing API endpoints with the manual test script in `services/api/manual-tests/`
|
|
242
|
+
3. Checking logs in stderr (the server uses stdio for MCP communication)
|
|
243
|
+
|
|
244
|
+
## Security
|
|
245
|
+
|
|
246
|
+
- API keys are passed as Bearer tokens
|
|
247
|
+
- Tenant configurations support scope-based access control
|
|
248
|
+
- Tool-level permissions via `enabledTools` whitelist
|
|
249
|
+
- All API communication over HTTPS in production
|
|
250
|
+
|
|
251
|
+
## Troubleshooting
|
|
252
|
+
|
|
253
|
+
**Server won't start:**
|
|
254
|
+
- Check that the tenant ID exists in `tenants.json`
|
|
255
|
+
- Verify API key is correctly configured
|
|
256
|
+
- Ensure Node.js version is 18 or higher
|
|
257
|
+
|
|
258
|
+
**Tools not appearing:**
|
|
259
|
+
- Check tenant scope (`public` < `app` < `admin`)
|
|
260
|
+
- Verify `enabledTools` whitelist if configured
|
|
261
|
+
- Restart Claude Code after configuration changes
|
|
262
|
+
|
|
263
|
+
**API errors:**
|
|
264
|
+
- Verify API URL is correct and accessible
|
|
265
|
+
- Check API key is valid
|
|
266
|
+
- Review stderr logs for detailed error messages
|
|
267
|
+
|
|
268
|
+
## License
|
|
269
|
+
|
|
270
|
+
MIT
|
|
271
|
+
|
|
272
|
+
## Support
|
|
273
|
+
|
|
274
|
+
For issues and questions, please refer to the main instantKOM repository.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Client for instantKOM REST API
|
|
3
|
+
* Handles authentication and request/response transformation
|
|
4
|
+
*/
|
|
5
|
+
import type { TenantConfig } from '../types/index.js';
|
|
6
|
+
export declare class ApiClient {
|
|
7
|
+
private baseUrl;
|
|
8
|
+
private apiKey;
|
|
9
|
+
private tenantId;
|
|
10
|
+
private scope;
|
|
11
|
+
private username?;
|
|
12
|
+
private password?;
|
|
13
|
+
private jwtAccessToken?;
|
|
14
|
+
private jwtRefreshToken?;
|
|
15
|
+
private jwtExpiresAt?;
|
|
16
|
+
constructor(tenant: TenantConfig);
|
|
17
|
+
/**
|
|
18
|
+
* Login and cache JWT tokens. Throws if 2FA is required or login fails.
|
|
19
|
+
*/
|
|
20
|
+
private loginJwt;
|
|
21
|
+
/**
|
|
22
|
+
* Refresh the JWT access token using the stored refresh token.
|
|
23
|
+
* Returns false if refresh fails (caller should re-login).
|
|
24
|
+
*/
|
|
25
|
+
private refreshJwt;
|
|
26
|
+
/**
|
|
27
|
+
* Returns a valid JWT access token, refreshing or re-logging in as needed.
|
|
28
|
+
*/
|
|
29
|
+
private ensureJwtToken;
|
|
30
|
+
/**
|
|
31
|
+
* Make an authenticated request to the API.
|
|
32
|
+
* Returns parsed response data directly. Throws on HTTP errors.
|
|
33
|
+
*/
|
|
34
|
+
private request;
|
|
35
|
+
/**
|
|
36
|
+
* Invalidate cached JWT tokens. Next request will trigger a fresh login.
|
|
37
|
+
*/
|
|
38
|
+
resetAuth(): void;
|
|
39
|
+
/**
|
|
40
|
+
* GET request
|
|
41
|
+
*/
|
|
42
|
+
get<T>(path: string, queryParams?: Record<string, any>): Promise<T>;
|
|
43
|
+
/**
|
|
44
|
+
* GET request for binary responses.
|
|
45
|
+
*/
|
|
46
|
+
getBinary(path: string, queryParams?: Record<string, any>): Promise<{
|
|
47
|
+
buffer: Buffer;
|
|
48
|
+
contentType: string | null;
|
|
49
|
+
contentDisposition: string | null;
|
|
50
|
+
}>;
|
|
51
|
+
/**
|
|
52
|
+
* POST request
|
|
53
|
+
*/
|
|
54
|
+
post<T>(path: string, body?: any): Promise<T>;
|
|
55
|
+
/**
|
|
56
|
+
* PUT request
|
|
57
|
+
*/
|
|
58
|
+
put<T>(path: string, body?: any): Promise<T>;
|
|
59
|
+
/**
|
|
60
|
+
* PATCH request
|
|
61
|
+
*/
|
|
62
|
+
patch<T>(path: string, body?: any): Promise<T>;
|
|
63
|
+
/**
|
|
64
|
+
* DELETE request
|
|
65
|
+
*/
|
|
66
|
+
delete<T>(path: string, body?: any): Promise<T>;
|
|
67
|
+
/**
|
|
68
|
+
* Get the base URL
|
|
69
|
+
*/
|
|
70
|
+
getBaseUrl(): string;
|
|
71
|
+
/**
|
|
72
|
+
* Get the tenant ID
|
|
73
|
+
*/
|
|
74
|
+
getTenantId(): string;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=api-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/client/api-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,qBAAa,SAAS;IACpB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,CAAS;IAG1B,OAAO,CAAC,cAAc,CAAC,CAAS;IAChC,OAAO,CAAC,eAAe,CAAC,CAAS;IACjC,OAAO,CAAC,YAAY,CAAC,CAAS;gBAElB,MAAM,EAAE,YAAY;IAWhC;;OAEG;YACW,QAAQ;IAoBtB;;;OAGG;YACW,UAAU;IAoBxB;;OAEG;YACW,cAAc;IAa5B;;;OAGG;YACW,OAAO;IA4DrB;;OAEG;IACH,SAAS,IAAI,IAAI;IAOjB;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIzE;;OAEG;IACG,SAAS,CACb,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAChC,OAAO,CAAC;QACT,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;KACnC,CAAC;IA4CF;;OAEG;IACG,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IAInD;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IAIlD;;OAEG;IACG,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IAIpD;;OAEG;IACG,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC;IAIrD;;OAEG;IACH,UAAU,IAAI,MAAM;IAIpB;;OAEG;IACH,WAAW,IAAI,MAAM;CAGtB"}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Client for instantKOM REST API
|
|
3
|
+
* Handles authentication and request/response transformation
|
|
4
|
+
*/
|
|
5
|
+
import fetch from 'node-fetch';
|
|
6
|
+
export class ApiClient {
|
|
7
|
+
baseUrl;
|
|
8
|
+
apiKey;
|
|
9
|
+
tenantId;
|
|
10
|
+
scope;
|
|
11
|
+
username;
|
|
12
|
+
password;
|
|
13
|
+
// JWT token cache
|
|
14
|
+
jwtAccessToken;
|
|
15
|
+
jwtRefreshToken;
|
|
16
|
+
jwtExpiresAt; // ms timestamp
|
|
17
|
+
constructor(tenant) {
|
|
18
|
+
this.baseUrl = tenant.apiUrl;
|
|
19
|
+
this.apiKey = tenant.apiKey;
|
|
20
|
+
this.tenantId = tenant.id;
|
|
21
|
+
this.scope = tenant.scope;
|
|
22
|
+
// App-scope tenants use the Public API (/v1/*) which only accepts API keys.
|
|
23
|
+
// Only admin-scope tenants use JWT authentication.
|
|
24
|
+
this.username = tenant.scope === 'admin' ? tenant.username : undefined;
|
|
25
|
+
this.password = tenant.scope === 'admin' ? tenant.password : undefined;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Login and cache JWT tokens. Throws if 2FA is required or login fails.
|
|
29
|
+
*/
|
|
30
|
+
async loginJwt() {
|
|
31
|
+
const url = new URL('/auth/login', this.baseUrl);
|
|
32
|
+
const response = await fetch(url.toString(), {
|
|
33
|
+
method: 'POST',
|
|
34
|
+
headers: { 'Content-Type': 'application/json', 'User-Agent': 'instantKOM-MCP-Server/1.0.0' },
|
|
35
|
+
body: JSON.stringify({ username: this.username, password: this.password }),
|
|
36
|
+
});
|
|
37
|
+
const data = await response.json();
|
|
38
|
+
if (!response.ok) {
|
|
39
|
+
throw new Error(`JWT login failed (${response.status}): ${data?.message || response.statusText}`);
|
|
40
|
+
}
|
|
41
|
+
if (data.requiresTwoFactor) {
|
|
42
|
+
throw new Error('JWT login requires 2FA — use a service account without 2FA enabled');
|
|
43
|
+
}
|
|
44
|
+
this.jwtAccessToken = data.accessToken;
|
|
45
|
+
this.jwtRefreshToken = data.refreshToken;
|
|
46
|
+
this.jwtExpiresAt = Date.now() + (data.expiresIn ?? 900) * 1000;
|
|
47
|
+
console.error(`[API] JWT login successful (tenant: ${this.tenantId}), expires in ${data.expiresIn}s`);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Refresh the JWT access token using the stored refresh token.
|
|
51
|
+
* Returns false if refresh fails (caller should re-login).
|
|
52
|
+
*/
|
|
53
|
+
async refreshJwt() {
|
|
54
|
+
try {
|
|
55
|
+
const url = new URL('/auth/refresh', this.baseUrl);
|
|
56
|
+
const response = await fetch(url.toString(), {
|
|
57
|
+
method: 'POST',
|
|
58
|
+
headers: { 'Content-Type': 'application/json', 'User-Agent': 'instantKOM-MCP-Server/1.0.0' },
|
|
59
|
+
body: JSON.stringify({ refreshToken: this.jwtRefreshToken }),
|
|
60
|
+
});
|
|
61
|
+
if (!response.ok)
|
|
62
|
+
return false;
|
|
63
|
+
const data = await response.json();
|
|
64
|
+
this.jwtAccessToken = data.accessToken;
|
|
65
|
+
if (data.refreshToken)
|
|
66
|
+
this.jwtRefreshToken = data.refreshToken;
|
|
67
|
+
this.jwtExpiresAt = Date.now() + (data.expiresIn ?? 900) * 1000;
|
|
68
|
+
console.error('[API] JWT token refreshed');
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Returns a valid JWT access token, refreshing or re-logging in as needed.
|
|
77
|
+
*/
|
|
78
|
+
async ensureJwtToken() {
|
|
79
|
+
const buffer = 60_000; // 1 min safety margin before expiry
|
|
80
|
+
if (this.jwtAccessToken && this.jwtExpiresAt && Date.now() < this.jwtExpiresAt - buffer) {
|
|
81
|
+
return this.jwtAccessToken;
|
|
82
|
+
}
|
|
83
|
+
if (this.jwtRefreshToken) {
|
|
84
|
+
const refreshed = await this.refreshJwt();
|
|
85
|
+
if (refreshed)
|
|
86
|
+
return this.jwtAccessToken;
|
|
87
|
+
}
|
|
88
|
+
await this.loginJwt();
|
|
89
|
+
return this.jwtAccessToken;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Make an authenticated request to the API.
|
|
93
|
+
* Returns parsed response data directly. Throws on HTTP errors.
|
|
94
|
+
*/
|
|
95
|
+
async request(method, path, body, queryParams) {
|
|
96
|
+
// Build URL with query parameters
|
|
97
|
+
const url = new URL(path.startsWith('/') ? path : `/${path}`, this.baseUrl);
|
|
98
|
+
if (queryParams) {
|
|
99
|
+
Object.entries(queryParams).forEach(([key, value]) => {
|
|
100
|
+
if (value !== undefined && value !== null) {
|
|
101
|
+
url.searchParams.append(key, String(value));
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
// Resolve auth: JWT (if credentials configured) or API key
|
|
106
|
+
const token = this.username && this.password
|
|
107
|
+
? await this.ensureJwtToken()
|
|
108
|
+
: this.apiKey;
|
|
109
|
+
// Prepare request options
|
|
110
|
+
const options = {
|
|
111
|
+
method,
|
|
112
|
+
headers: {
|
|
113
|
+
'Content-Type': 'application/json',
|
|
114
|
+
'Authorization': `Bearer ${token}`,
|
|
115
|
+
'User-Agent': 'instantKOM-MCP-Server/1.0.0',
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
if (body && (method === 'POST' || method === 'PUT' || method === 'PATCH' || method === 'DELETE')) {
|
|
119
|
+
options.body = JSON.stringify(body);
|
|
120
|
+
}
|
|
121
|
+
console.error(`[API] ${method} ${url.pathname}${url.search}`);
|
|
122
|
+
// Make the request
|
|
123
|
+
const response = await fetch(url.toString(), options);
|
|
124
|
+
const responseText = await response.text();
|
|
125
|
+
// Try to parse JSON response
|
|
126
|
+
let data;
|
|
127
|
+
try {
|
|
128
|
+
data = responseText ? JSON.parse(responseText) : null;
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
data = responseText;
|
|
132
|
+
}
|
|
133
|
+
// Handle error responses
|
|
134
|
+
if (!response.ok) {
|
|
135
|
+
const message = data?.message || response.statusText;
|
|
136
|
+
console.error(`[API] Error ${response.status}: ${responseText}`);
|
|
137
|
+
throw new Error(`HTTP ${response.status}: ${message}`);
|
|
138
|
+
}
|
|
139
|
+
return data;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Invalidate cached JWT tokens. Next request will trigger a fresh login.
|
|
143
|
+
*/
|
|
144
|
+
resetAuth() {
|
|
145
|
+
this.jwtAccessToken = undefined;
|
|
146
|
+
this.jwtRefreshToken = undefined;
|
|
147
|
+
this.jwtExpiresAt = undefined;
|
|
148
|
+
console.error(`[API] Auth cache cleared (tenant: ${this.tenantId})`);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* GET request
|
|
152
|
+
*/
|
|
153
|
+
async get(path, queryParams) {
|
|
154
|
+
return this.request('GET', path, undefined, queryParams);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* GET request for binary responses.
|
|
158
|
+
*/
|
|
159
|
+
async getBinary(path, queryParams) {
|
|
160
|
+
const url = new URL(path.startsWith('/') ? path : `/${path}`, this.baseUrl);
|
|
161
|
+
if (queryParams) {
|
|
162
|
+
Object.entries(queryParams).forEach(([key, value]) => {
|
|
163
|
+
if (value !== undefined && value !== null) {
|
|
164
|
+
url.searchParams.append(key, String(value));
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
const token = this.username && this.password
|
|
169
|
+
? await this.ensureJwtToken()
|
|
170
|
+
: this.apiKey;
|
|
171
|
+
const response = await fetch(url.toString(), {
|
|
172
|
+
method: 'GET',
|
|
173
|
+
headers: {
|
|
174
|
+
'Authorization': `Bearer ${token}`,
|
|
175
|
+
'User-Agent': 'instantKOM-MCP-Server/1.0.0',
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
if (!response.ok) {
|
|
179
|
+
const responseText = await response.text();
|
|
180
|
+
let data;
|
|
181
|
+
try {
|
|
182
|
+
data = responseText ? JSON.parse(responseText) : null;
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
data = responseText;
|
|
186
|
+
}
|
|
187
|
+
const message = data?.message || response.statusText;
|
|
188
|
+
throw new Error(`HTTP ${response.status}: ${message}`);
|
|
189
|
+
}
|
|
190
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
191
|
+
return {
|
|
192
|
+
buffer: Buffer.from(arrayBuffer),
|
|
193
|
+
contentType: response.headers.get('content-type'),
|
|
194
|
+
contentDisposition: response.headers.get('content-disposition'),
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* POST request
|
|
199
|
+
*/
|
|
200
|
+
async post(path, body) {
|
|
201
|
+
return this.request('POST', path, body);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* PUT request
|
|
205
|
+
*/
|
|
206
|
+
async put(path, body) {
|
|
207
|
+
return this.request('PUT', path, body);
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* PATCH request
|
|
211
|
+
*/
|
|
212
|
+
async patch(path, body) {
|
|
213
|
+
return this.request('PATCH', path, body);
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* DELETE request
|
|
217
|
+
*/
|
|
218
|
+
async delete(path, body) {
|
|
219
|
+
return this.request('DELETE', path, body);
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Get the base URL
|
|
223
|
+
*/
|
|
224
|
+
getBaseUrl() {
|
|
225
|
+
return this.baseUrl;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Get the tenant ID
|
|
229
|
+
*/
|
|
230
|
+
getTenantId() {
|
|
231
|
+
return this.tenantId;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
//# sourceMappingURL=api-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/client/api-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* instantKOM MCP Server - Public Entry Point
|
|
4
|
+
*
|
|
5
|
+
* Simplified standalone server for customers.
|
|
6
|
+
* Reads INSTANTKOM_API_KEY from environment — no tenants.json required.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* npx @instantkom/mcp-server
|
|
10
|
+
*
|
|
11
|
+
* Config in Claude Code (.mcp.json):
|
|
12
|
+
* {
|
|
13
|
+
* "mcpServers": {
|
|
14
|
+
* "instantkom": {
|
|
15
|
+
* "command": "npx",
|
|
16
|
+
* "args": ["-y", "@instantkom/mcp-server"],
|
|
17
|
+
* "env": { "INSTANTKOM_API_KEY": "ik_live_..." }
|
|
18
|
+
* }
|
|
19
|
+
* }
|
|
20
|
+
* }
|
|
21
|
+
*/
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=index.public.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.public.d.ts","sourceRoot":"","sources":["../src/index.public.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;GAmBG"}
|