@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.
Files changed (187) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +274 -0
  3. package/dist/client/api-client.d.ts +76 -0
  4. package/dist/client/api-client.d.ts.map +1 -0
  5. package/dist/client/api-client.js +234 -0
  6. package/dist/client/api-client.js.map +1 -0
  7. package/dist/index.public.d.ts +23 -0
  8. package/dist/index.public.d.ts.map +1 -0
  9. package/dist/index.public.js +79 -0
  10. package/dist/index.public.js.map +1 -0
  11. package/dist/tools/app/account.d.ts +46 -0
  12. package/dist/tools/app/account.d.ts.map +1 -0
  13. package/dist/tools/app/account.js +69 -0
  14. package/dist/tools/app/account.js.map +1 -0
  15. package/dist/tools/app/analytics.d.ts +78 -0
  16. package/dist/tools/app/analytics.d.ts.map +1 -0
  17. package/dist/tools/app/analytics.js +158 -0
  18. package/dist/tools/app/analytics.js.map +1 -0
  19. package/dist/tools/app/api-keys.d.ts +195 -0
  20. package/dist/tools/app/api-keys.d.ts.map +1 -0
  21. package/dist/tools/app/api-keys.js +203 -0
  22. package/dist/tools/app/api-keys.js.map +1 -0
  23. package/dist/tools/app/billing.d.ts +78 -0
  24. package/dist/tools/app/billing.d.ts.map +1 -0
  25. package/dist/tools/app/billing.js +117 -0
  26. package/dist/tools/app/billing.js.map +1 -0
  27. package/dist/tools/app/bots.d.ts +641 -0
  28. package/dist/tools/app/bots.d.ts.map +1 -0
  29. package/dist/tools/app/bots.js +599 -0
  30. package/dist/tools/app/bots.js.map +1 -0
  31. package/dist/tools/app/broadcasts.d.ts +165 -0
  32. package/dist/tools/app/broadcasts.d.ts.map +1 -0
  33. package/dist/tools/app/broadcasts.js +219 -0
  34. package/dist/tools/app/broadcasts.js.map +1 -0
  35. package/dist/tools/app/channels.d.ts +126 -0
  36. package/dist/tools/app/channels.d.ts.map +1 -0
  37. package/dist/tools/app/channels.js +198 -0
  38. package/dist/tools/app/channels.js.map +1 -0
  39. package/dist/tools/app/chats.d.ts +90 -0
  40. package/dist/tools/app/chats.d.ts.map +1 -0
  41. package/dist/tools/app/chats.js +162 -0
  42. package/dist/tools/app/chats.js.map +1 -0
  43. package/dist/tools/app/contacts.d.ts +153 -0
  44. package/dist/tools/app/contacts.d.ts.map +1 -0
  45. package/dist/tools/app/contacts.js +186 -0
  46. package/dist/tools/app/contacts.js.map +1 -0
  47. package/dist/tools/app/coupons.d.ts +37 -0
  48. package/dist/tools/app/coupons.d.ts.map +1 -0
  49. package/dist/tools/app/coupons.js +70 -0
  50. package/dist/tools/app/coupons.js.map +1 -0
  51. package/dist/tools/app/custom-fields.d.ts +301 -0
  52. package/dist/tools/app/custom-fields.d.ts.map +1 -0
  53. package/dist/tools/app/custom-fields.js +265 -0
  54. package/dist/tools/app/custom-fields.js.map +1 -0
  55. package/dist/tools/app/dashboard-widgets.d.ts +121 -0
  56. package/dist/tools/app/dashboard-widgets.d.ts.map +1 -0
  57. package/dist/tools/app/dashboard-widgets.js +163 -0
  58. package/dist/tools/app/dashboard-widgets.js.map +1 -0
  59. package/dist/tools/app/dashboard.d.ts +18 -0
  60. package/dist/tools/app/dashboard.d.ts.map +1 -0
  61. package/dist/tools/app/dashboard.js +29 -0
  62. package/dist/tools/app/dashboard.js.map +1 -0
  63. package/dist/tools/app/ecommerce.d.ts +95 -0
  64. package/dist/tools/app/ecommerce.d.ts.map +1 -0
  65. package/dist/tools/app/ecommerce.js +109 -0
  66. package/dist/tools/app/ecommerce.js.map +1 -0
  67. package/dist/tools/app/events.d.ts +53 -0
  68. package/dist/tools/app/events.d.ts.map +1 -0
  69. package/dist/tools/app/events.js +66 -0
  70. package/dist/tools/app/events.js.map +1 -0
  71. package/dist/tools/app/exports.d.ts +81 -0
  72. package/dist/tools/app/exports.d.ts.map +1 -0
  73. package/dist/tools/app/exports.js +125 -0
  74. package/dist/tools/app/exports.js.map +1 -0
  75. package/dist/tools/app/feeds.d.ts +113 -0
  76. package/dist/tools/app/feeds.d.ts.map +1 -0
  77. package/dist/tools/app/feeds.js +166 -0
  78. package/dist/tools/app/feeds.js.map +1 -0
  79. package/dist/tools/app/flow-edges.d.ts +122 -0
  80. package/dist/tools/app/flow-edges.d.ts.map +1 -0
  81. package/dist/tools/app/flow-edges.js +130 -0
  82. package/dist/tools/app/flow-edges.js.map +1 -0
  83. package/dist/tools/app/flow-nodes.d.ts +122 -0
  84. package/dist/tools/app/flow-nodes.d.ts.map +1 -0
  85. package/dist/tools/app/flow-nodes.js +130 -0
  86. package/dist/tools/app/flow-nodes.js.map +1 -0
  87. package/dist/tools/app/flows.d.ts +136 -0
  88. package/dist/tools/app/flows.d.ts.map +1 -0
  89. package/dist/tools/app/flows.js +141 -0
  90. package/dist/tools/app/flows.js.map +1 -0
  91. package/dist/tools/app/funnels.d.ts +96 -0
  92. package/dist/tools/app/funnels.d.ts.map +1 -0
  93. package/dist/tools/app/funnels.js +127 -0
  94. package/dist/tools/app/funnels.js.map +1 -0
  95. package/dist/tools/app/index.d.ts +51 -0
  96. package/dist/tools/app/index.d.ts.map +1 -0
  97. package/dist/tools/app/index.js +121 -0
  98. package/dist/tools/app/index.js.map +1 -0
  99. package/dist/tools/app/media.d.ts +44 -0
  100. package/dist/tools/app/media.d.ts.map +1 -0
  101. package/dist/tools/app/media.js +183 -0
  102. package/dist/tools/app/media.js.map +1 -0
  103. package/dist/tools/app/message-events.d.ts +69 -0
  104. package/dist/tools/app/message-events.d.ts.map +1 -0
  105. package/dist/tools/app/message-events.js +72 -0
  106. package/dist/tools/app/message-events.js.map +1 -0
  107. package/dist/tools/app/messages.d.ts +380 -0
  108. package/dist/tools/app/messages.d.ts.map +1 -0
  109. package/dist/tools/app/messages.js +345 -0
  110. package/dist/tools/app/messages.js.map +1 -0
  111. package/dist/tools/app/object-folders.d.ts +82 -0
  112. package/dist/tools/app/object-folders.d.ts.map +1 -0
  113. package/dist/tools/app/object-folders.js +123 -0
  114. package/dist/tools/app/object-folders.js.map +1 -0
  115. package/dist/tools/app/plans.d.ts +53 -0
  116. package/dist/tools/app/plans.d.ts.map +1 -0
  117. package/dist/tools/app/plans.js +70 -0
  118. package/dist/tools/app/plans.js.map +1 -0
  119. package/dist/tools/app/polls.d.ts +227 -0
  120. package/dist/tools/app/polls.d.ts.map +1 -0
  121. package/dist/tools/app/polls.js +256 -0
  122. package/dist/tools/app/polls.js.map +1 -0
  123. package/dist/tools/app/qr-codes.d.ts +103 -0
  124. package/dist/tools/app/qr-codes.d.ts.map +1 -0
  125. package/dist/tools/app/qr-codes.js +160 -0
  126. package/dist/tools/app/qr-codes.js.map +1 -0
  127. package/dist/tools/app/segmentations.d.ts +132 -0
  128. package/dist/tools/app/segmentations.d.ts.map +1 -0
  129. package/dist/tools/app/segmentations.js +237 -0
  130. package/dist/tools/app/segmentations.js.map +1 -0
  131. package/dist/tools/app/settings.d.ts +75 -0
  132. package/dist/tools/app/settings.d.ts.map +1 -0
  133. package/dist/tools/app/settings.js +96 -0
  134. package/dist/tools/app/settings.js.map +1 -0
  135. package/dist/tools/app/shortlinks.d.ts +103 -0
  136. package/dist/tools/app/shortlinks.d.ts.map +1 -0
  137. package/dist/tools/app/shortlinks.js +158 -0
  138. package/dist/tools/app/shortlinks.js.map +1 -0
  139. package/dist/tools/app/super-widgets.d.ts +95 -0
  140. package/dist/tools/app/super-widgets.d.ts.map +1 -0
  141. package/dist/tools/app/super-widgets.js +124 -0
  142. package/dist/tools/app/super-widgets.js.map +1 -0
  143. package/dist/tools/app/tags.d.ts +267 -0
  144. package/dist/tools/app/tags.d.ts.map +1 -0
  145. package/dist/tools/app/tags.js +363 -0
  146. package/dist/tools/app/tags.js.map +1 -0
  147. package/dist/tools/app/team-members.d.ts +141 -0
  148. package/dist/tools/app/team-members.d.ts.map +1 -0
  149. package/dist/tools/app/team-members.js +195 -0
  150. package/dist/tools/app/team-members.js.map +1 -0
  151. package/dist/tools/app/templates.d.ts +212 -0
  152. package/dist/tools/app/templates.d.ts.map +1 -0
  153. package/dist/tools/app/templates.js +270 -0
  154. package/dist/tools/app/templates.js.map +1 -0
  155. package/dist/tools/app/tickets.d.ts +277 -0
  156. package/dist/tools/app/tickets.d.ts.map +1 -0
  157. package/dist/tools/app/tickets.js +266 -0
  158. package/dist/tools/app/tickets.js.map +1 -0
  159. package/dist/tools/app/users.d.ts +70 -0
  160. package/dist/tools/app/users.d.ts.map +1 -0
  161. package/dist/tools/app/users.js +72 -0
  162. package/dist/tools/app/users.js.map +1 -0
  163. package/dist/tools/app/webhooks.d.ts +61 -0
  164. package/dist/tools/app/webhooks.d.ts.map +1 -0
  165. package/dist/tools/app/webhooks.js +85 -0
  166. package/dist/tools/app/webhooks.js.map +1 -0
  167. package/dist/tools/app/widgets.d.ts +103 -0
  168. package/dist/tools/app/widgets.d.ts.map +1 -0
  169. package/dist/tools/app/widgets.js +128 -0
  170. package/dist/tools/app/widgets.js.map +1 -0
  171. package/dist/tools/public/health.d.ts +16 -0
  172. package/dist/tools/public/health.d.ts.map +1 -0
  173. package/dist/tools/public/health.js +27 -0
  174. package/dist/tools/public/health.js.map +1 -0
  175. package/dist/tools/public/index.d.ts +15 -0
  176. package/dist/tools/public/index.d.ts.map +1 -0
  177. package/dist/tools/public/index.js +10 -0
  178. package/dist/tools/public/index.js.map +1 -0
  179. package/dist/tools/tool-router.d.ts +21 -0
  180. package/dist/tools/tool-router.d.ts.map +1 -0
  181. package/dist/tools/tool-router.js +118 -0
  182. package/dist/tools/tool-router.js.map +1 -0
  183. package/dist/types/index.d.ts +73 -0
  184. package/dist/types/index.d.ts.map +1 -0
  185. package/dist/types/index.js +5 -0
  186. package/dist/types/index.js.map +1 -0
  187. 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"}