@honkio/mcp 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 +334 -0
- package/dist/client.d.ts +165 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +192 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts.d.ts +3 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +111 -0
- package/dist/prompts.js.map +1 -0
- package/dist/resources.d.ts +4 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +96 -0
- package/dist/resources.js.map +1 -0
- package/dist/tools.d.ts +4 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +518 -0
- package/dist/tools.js.map +1 -0
- package/package.json +39 -0
package/dist/tools.js
ADDED
|
@@ -0,0 +1,518 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { HonkioError } from './client.js';
|
|
3
|
+
const DNCL_EXEMPTIONS = [
|
|
4
|
+
'existing_business_relationship',
|
|
5
|
+
'registered_charity',
|
|
6
|
+
'political',
|
|
7
|
+
'survey',
|
|
8
|
+
'newspaper_subscription',
|
|
9
|
+
'personal',
|
|
10
|
+
];
|
|
11
|
+
const WEBHOOK_EVENTS = [
|
|
12
|
+
'message.queued',
|
|
13
|
+
'message.sending',
|
|
14
|
+
'message.sent',
|
|
15
|
+
'message.delivered',
|
|
16
|
+
'message.failed',
|
|
17
|
+
'message.undelivered',
|
|
18
|
+
'message.received',
|
|
19
|
+
'opt_out.recorded',
|
|
20
|
+
'opt_out.reinstated',
|
|
21
|
+
];
|
|
22
|
+
function ok(data) {
|
|
23
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
24
|
+
}
|
|
25
|
+
function formatError(err) {
|
|
26
|
+
if (err instanceof HonkioError) {
|
|
27
|
+
return {
|
|
28
|
+
content: [{ type: 'text', text: `Error [${err.code}]: ${err.message}` }],
|
|
29
|
+
isError: true,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
content: [{ type: 'text', text: `Error: ${err instanceof Error ? err.message : String(err)}` }],
|
|
34
|
+
isError: true,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export function registerTools(server, client) {
|
|
38
|
+
/**
|
|
39
|
+
* Account-scoped tools take an account_id, but an API key does not carry one
|
|
40
|
+
* and nothing used to return it, so an agent could not call them without the
|
|
41
|
+
* user pasting an id from the dashboard. Omitting it now resolves the caller
|
|
42
|
+
* from the key. Cached because it cannot change for the life of the process —
|
|
43
|
+
* the key is fixed at startup.
|
|
44
|
+
*/
|
|
45
|
+
let cachedAccountId;
|
|
46
|
+
const resolveAccountId = async (provided) => {
|
|
47
|
+
if (provided)
|
|
48
|
+
return provided;
|
|
49
|
+
if (cachedAccountId)
|
|
50
|
+
return cachedAccountId;
|
|
51
|
+
const me = await client.getCurrentAccount();
|
|
52
|
+
cachedAccountId = me.account.id;
|
|
53
|
+
return cachedAccountId;
|
|
54
|
+
};
|
|
55
|
+
const ACCOUNT_ID_ARG = z
|
|
56
|
+
.string()
|
|
57
|
+
.optional()
|
|
58
|
+
.describe('Your account ID. Omit it and it is resolved from your API key.');
|
|
59
|
+
// ── Messages ──────────────────────────────────────────────
|
|
60
|
+
server.tool('send_sms', 'Send an SMS message from one of your provisioned Canadian numbers. Automatically checks CASL consent (CRTC DNCL checking is coming soon and not yet enforced) unless overridden. Use test-mode keys (mk_test_...) to send without real delivery or charges.', {
|
|
61
|
+
from: z.string().describe('Sending phone number in E.164 format (e.g. +14165551234). Must be a number provisioned on your account.'),
|
|
62
|
+
to: z.string().describe('Recipient phone number in E.164 format. Must be a Canadian number.'),
|
|
63
|
+
body: z.string().max(1600).describe('Message body text. Maximum 1600 characters.'),
|
|
64
|
+
skip_consent_check: z.boolean().optional().describe('Skip the CASL consent gate. Use only when you have consent recorded outside HonkIO.'),
|
|
65
|
+
dncl_exemptions: z.array(z.enum(DNCL_EXEMPTIONS)).optional().describe('DNCL exemption reasons. Required if the recipient is on the CRTC Do Not Call List.'),
|
|
66
|
+
}, async (input) => {
|
|
67
|
+
try {
|
|
68
|
+
const result = await client.sendMessage(input);
|
|
69
|
+
return ok(result);
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
return formatError(err);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
server.tool('list_messages', 'List SMS messages for your account with optional filters. Returns paginated results.', {
|
|
76
|
+
from: z.string().optional().describe('Filter by sending phone number (E.164).'),
|
|
77
|
+
to: z.string().optional().describe('Filter by recipient phone number (E.164).'),
|
|
78
|
+
status: z.enum(['QUEUED', 'SENDING', 'SENT', 'DELIVERED', 'FAILED', 'UNDELIVERED', 'RECEIVED']).optional().describe('Filter by message status.'),
|
|
79
|
+
direction: z.enum(['OUTBOUND', 'INBOUND']).optional().describe('Filter by message direction.'),
|
|
80
|
+
page: z.number().int().min(1).optional().describe('Page number (default: 1).'),
|
|
81
|
+
limit: z.number().int().min(1).max(100).optional().describe('Results per page (default: 20, max: 100).'),
|
|
82
|
+
date_from: z.string().optional().describe('Filter messages from this date (YYYY-MM-DD).'),
|
|
83
|
+
date_to: z.string().optional().describe('Filter messages to this date (YYYY-MM-DD).'),
|
|
84
|
+
}, async (input) => {
|
|
85
|
+
try {
|
|
86
|
+
const result = await client.listMessages(input);
|
|
87
|
+
return ok(result);
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
return formatError(err);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
server.tool('get_message', 'Get full details of a single SMS message by its ID, including delivery events.', {
|
|
94
|
+
id: z.string().describe('Message ID.'),
|
|
95
|
+
}, async ({ id }) => {
|
|
96
|
+
try {
|
|
97
|
+
const result = await client.getMessage(id);
|
|
98
|
+
return ok(result);
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
return formatError(err);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
// ── Phone Numbers ─────────────────────────────────────────
|
|
105
|
+
server.tool('search_phone_numbers', 'Search available Canadian phone numbers you can provision. Filter by area code to find numbers in a specific province.', {
|
|
106
|
+
area_code: z.string().regex(/^\d{3}$/).optional().describe('Canadian area code to filter by (e.g. "416" for Toronto, "514" for Montreal, "604" for Vancouver).'),
|
|
107
|
+
limit: z.number().int().min(1).max(50).optional().describe('Number of results to return (default: 10, max: 50).'),
|
|
108
|
+
}, async (input) => {
|
|
109
|
+
try {
|
|
110
|
+
const result = await client.searchPhoneNumbers(input);
|
|
111
|
+
return ok(result);
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
return formatError(err);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
server.tool('provision_phone_number', 'Provision (purchase) a Canadian phone number to your account. Get the phone_number value from search_phone_numbers first.', {
|
|
118
|
+
phone_number: z.string().describe('E.164 phone number to provision (e.g. +14165551234). Must be from the search_phone_numbers results.'),
|
|
119
|
+
}, async ({ phone_number }) => {
|
|
120
|
+
try {
|
|
121
|
+
const result = await client.provisionPhoneNumber(phone_number);
|
|
122
|
+
return ok(result);
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
return formatError(err);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
server.tool('list_phone_numbers', "List all phone numbers provisioned on your account.", {}, async () => {
|
|
129
|
+
try {
|
|
130
|
+
const result = await client.listPhoneNumbers();
|
|
131
|
+
return ok(result);
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
return formatError(err);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
server.tool('get_phone_number', 'Get details for a specific provisioned phone number.', {
|
|
138
|
+
id: z.string().describe('Phone number record ID.'),
|
|
139
|
+
}, async ({ id }) => {
|
|
140
|
+
try {
|
|
141
|
+
const result = await client.getPhoneNumber(id);
|
|
142
|
+
return ok(result);
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
return formatError(err);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
server.tool('release_phone_number', 'Release (cancel) a provisioned phone number. This will stop monthly billing for the number. This action cannot be undone.', {
|
|
149
|
+
id: z.string().describe('Phone number record ID to release.'),
|
|
150
|
+
}, async ({ id }) => {
|
|
151
|
+
try {
|
|
152
|
+
await client.releasePhoneNumber(id);
|
|
153
|
+
return ok({ status: 'released', id });
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
return formatError(err);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
// ── Compliance: CASL Consents ─────────────────────────────
|
|
160
|
+
server.tool('record_consent', 'Record CASL consent for a phone number before sending commercial messages. Express consent requires source_description. Implied consent requires relationship_type and is valid for 2 years from last_transaction_date.', {
|
|
161
|
+
phone_number: z.string().describe('E.164 phone number of the subscriber granting consent.'),
|
|
162
|
+
consent_type: z.enum(['express', 'implied']).describe('Type of CASL consent. "express" = subscriber explicitly opted in. "implied" = business relationship exists.'),
|
|
163
|
+
source_description: z.string().optional().describe('[Required for express] How/where the subscriber gave consent (e.g. "Website signup form at honkio.ca/signup on 2024-01-15").'),
|
|
164
|
+
source_ip: z.string().optional().describe('[Optional, express] IP address of the subscriber at time of consent.'),
|
|
165
|
+
source_url: z.string().optional().describe('[Optional, express] URL where consent was captured.'),
|
|
166
|
+
relationship_type: z.string().optional().describe('[Required for implied] Business relationship type (e.g. "purchase", "inquiry", "membership").'),
|
|
167
|
+
last_transaction_date: z.string().optional().describe('[Optional, implied] Date of last transaction (YYYY-MM-DD). Implied consent expires 2 years after this date.'),
|
|
168
|
+
}, async (input) => {
|
|
169
|
+
try {
|
|
170
|
+
const result = await client.recordConsent(input);
|
|
171
|
+
return ok(result);
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
return formatError(err);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
server.tool('list_consents', 'List CASL consent records for your account, optionally filtered by phone number or status.', {
|
|
178
|
+
phone_number: z.string().optional().describe('Filter consents for a specific phone number (E.164).'),
|
|
179
|
+
status: z.enum(['ACTIVE', 'EXPIRED', 'REVOKED']).optional().describe('Filter by consent status.'),
|
|
180
|
+
page: z.number().int().min(1).optional().describe('Page number (default: 1).'),
|
|
181
|
+
limit: z.number().int().min(1).max(100).optional().describe('Results per page (default: 20).'),
|
|
182
|
+
}, async (input) => {
|
|
183
|
+
try {
|
|
184
|
+
const result = await client.listConsents(input);
|
|
185
|
+
return ok(result);
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
return formatError(err);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
server.tool('check_consent', 'Check whether a phone number has valid CASL consent before sending a message.', {
|
|
192
|
+
phone_number: z.string().describe('E.164 phone number to check consent for.'),
|
|
193
|
+
}, async ({ phone_number }) => {
|
|
194
|
+
try {
|
|
195
|
+
const result = await client.checkConsent(phone_number);
|
|
196
|
+
return ok(result);
|
|
197
|
+
}
|
|
198
|
+
catch (err) {
|
|
199
|
+
return formatError(err);
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
server.tool('revoke_consent', 'Revoke CASL consent for a phone number. Future messages to this number will be blocked unless new consent is recorded.', {
|
|
203
|
+
phone_number: z.string().describe('E.164 phone number to revoke consent for.'),
|
|
204
|
+
}, async ({ phone_number }) => {
|
|
205
|
+
try {
|
|
206
|
+
await client.revokeConsent(phone_number);
|
|
207
|
+
return ok({ status: 'revoked', phone_number });
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
return formatError(err);
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
// ── Compliance: Opt-Outs ──────────────────────────────────
|
|
214
|
+
server.tool('record_opt_out', 'Manually record an opt-out for a subscriber. Use this when a subscriber contacts you directly to opt out rather than replying STOP to a message.', {
|
|
215
|
+
phone_number: z.string().describe('E.164 phone number of the subscriber opting out.'),
|
|
216
|
+
from_number: z.string().describe('E.164 number the subscriber is opting out from (your sending number).'),
|
|
217
|
+
}, async (input) => {
|
|
218
|
+
try {
|
|
219
|
+
const result = await client.recordOptOut(input);
|
|
220
|
+
return ok(result);
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
return formatError(err);
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
server.tool('list_opt_outs', 'List opt-out records for your account.', {
|
|
227
|
+
phone_number: z.string().optional().describe('Filter opt-outs for a specific subscriber number (E.164).'),
|
|
228
|
+
from_number: z.string().optional().describe('Filter opt-outs from a specific sending number (E.164).'),
|
|
229
|
+
page: z.number().int().min(1).optional().describe('Page number (default: 1).'),
|
|
230
|
+
limit: z.number().int().min(1).max(100).optional().describe('Results per page (default: 20).'),
|
|
231
|
+
}, async (input) => {
|
|
232
|
+
try {
|
|
233
|
+
const result = await client.listOptOuts(input);
|
|
234
|
+
return ok(result);
|
|
235
|
+
}
|
|
236
|
+
catch (err) {
|
|
237
|
+
return formatError(err);
|
|
238
|
+
}
|
|
239
|
+
});
|
|
240
|
+
// ── Compliance: DNCL ─────────────────────────────────────
|
|
241
|
+
server.tool('check_dncl', "Coming soon: check if a Canadian phone number is on the CRTC Do Not Call List. CRTC DNCL checking is not available yet — this endpoint currently returns 501 (DNCL_COMING_SOON).", {
|
|
242
|
+
phone_number: z.string().describe('Canadian phone number to check in E.164 format.'),
|
|
243
|
+
}, async ({ phone_number }) => {
|
|
244
|
+
try {
|
|
245
|
+
const result = await client.checkDncl(phone_number);
|
|
246
|
+
return ok(result);
|
|
247
|
+
}
|
|
248
|
+
catch (err) {
|
|
249
|
+
return formatError(err);
|
|
250
|
+
}
|
|
251
|
+
});
|
|
252
|
+
server.tool('batch_check_dncl', 'Coming soon: check up to 100 Canadian phone numbers against the CRTC Do Not Call List in a single request. CRTC DNCL checking is not available yet — this endpoint currently returns 501 (DNCL_COMING_SOON).', {
|
|
253
|
+
phone_numbers: z.array(z.string()).min(1).max(100).describe('Array of Canadian phone numbers in E.164 format.'),
|
|
254
|
+
}, async ({ phone_numbers }) => {
|
|
255
|
+
try {
|
|
256
|
+
const result = await client.batchCheckDncl(phone_numbers);
|
|
257
|
+
return ok(result);
|
|
258
|
+
}
|
|
259
|
+
catch (err) {
|
|
260
|
+
return formatError(err);
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
// ── Compliance: Erasure ───────────────────────────────────
|
|
264
|
+
server.tool('request_erasure', 'Execute a PIPEDA/Quebec Law 25 right-to-erasure request for a phone number. Purges message bodies, consent records, and opt-out records for the specified number. Creates an immutable audit log entry.', {
|
|
265
|
+
phone_number: z.string().describe('E.164 phone number to erase data for.'),
|
|
266
|
+
reason: z.string().optional().describe('Reason for the erasure request (recorded in the audit log).'),
|
|
267
|
+
}, async (input) => {
|
|
268
|
+
try {
|
|
269
|
+
const result = await client.requestErasure(input);
|
|
270
|
+
return ok(result);
|
|
271
|
+
}
|
|
272
|
+
catch (err) {
|
|
273
|
+
return formatError(err);
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
// ── Webhooks ──────────────────────────────────────────────
|
|
277
|
+
server.tool('create_webhook', 'Register a webhook endpoint to receive HonkIO event notifications. The signing_secret in the response is shown once — store it to verify X-HonkIO-Signature on incoming requests.', {
|
|
278
|
+
url: z.string().url().describe('HTTPS URL to deliver events to.'),
|
|
279
|
+
events: z.array(z.enum(WEBHOOK_EVENTS)).min(1).describe('Event types to subscribe to.'),
|
|
280
|
+
}, async (input) => {
|
|
281
|
+
try {
|
|
282
|
+
const result = await client.createWebhook(input);
|
|
283
|
+
return ok(result);
|
|
284
|
+
}
|
|
285
|
+
catch (err) {
|
|
286
|
+
return formatError(err);
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
server.tool('list_webhooks', 'List all registered webhook endpoints for your account.', {}, async () => {
|
|
290
|
+
try {
|
|
291
|
+
const result = await client.listWebhooks();
|
|
292
|
+
return ok(result);
|
|
293
|
+
}
|
|
294
|
+
catch (err) {
|
|
295
|
+
return formatError(err);
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
server.tool('update_webhook', 'Update a webhook endpoint URL, event subscriptions, or active status.', {
|
|
299
|
+
id: z.string().describe('Webhook ID to update.'),
|
|
300
|
+
url: z.string().url().optional().describe('New HTTPS URL.'),
|
|
301
|
+
events: z.array(z.enum(WEBHOOK_EVENTS)).optional().describe('New event subscriptions (replaces existing).'),
|
|
302
|
+
active: z.boolean().optional().describe('Enable or disable the webhook.'),
|
|
303
|
+
}, async ({ id, ...updates }) => {
|
|
304
|
+
try {
|
|
305
|
+
const result = await client.updateWebhook(id, updates);
|
|
306
|
+
return ok(result);
|
|
307
|
+
}
|
|
308
|
+
catch (err) {
|
|
309
|
+
return formatError(err);
|
|
310
|
+
}
|
|
311
|
+
});
|
|
312
|
+
server.tool('delete_webhook', 'Delete a registered webhook endpoint.', {
|
|
313
|
+
id: z.string().describe('Webhook ID to delete.'),
|
|
314
|
+
}, async ({ id }) => {
|
|
315
|
+
try {
|
|
316
|
+
await client.deleteWebhook(id);
|
|
317
|
+
return ok({ status: 'deleted', id });
|
|
318
|
+
}
|
|
319
|
+
catch (err) {
|
|
320
|
+
return formatError(err);
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
server.tool('list_webhook_deliveries', 'List recent delivery attempts for a webhook (success/failure, HTTP status, duration, timestamp). Use this to debug why customer events are not arriving or why a webhook was auto-disabled.', {
|
|
324
|
+
webhook_id: z.string().describe('Webhook ID.'),
|
|
325
|
+
limit: z.number().int().min(1).max(200).optional().describe('Max attempts to return (default 50).'),
|
|
326
|
+
}, async ({ webhook_id, limit }) => {
|
|
327
|
+
try {
|
|
328
|
+
const result = await client.listWebhookDeliveries(webhook_id, limit ? { limit } : undefined);
|
|
329
|
+
return ok(result);
|
|
330
|
+
}
|
|
331
|
+
catch (err) {
|
|
332
|
+
return formatError(err);
|
|
333
|
+
}
|
|
334
|
+
});
|
|
335
|
+
server.tool('reactivate_webhook', 'Re-enable a webhook that was auto-disabled by repeated delivery failures. The destination URL is re-validated (SSRF check) before reactivation.', {
|
|
336
|
+
webhook_id: z.string().describe('Webhook ID to reactivate.'),
|
|
337
|
+
}, async ({ webhook_id }) => {
|
|
338
|
+
try {
|
|
339
|
+
const result = await client.reactivateWebhook(webhook_id);
|
|
340
|
+
return ok(result);
|
|
341
|
+
}
|
|
342
|
+
catch (err) {
|
|
343
|
+
return formatError(err);
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
server.tool('list_webhook_dead_letters', 'List events that exhausted all retry attempts (dead-letter queue). These are events that failed delivery and were never received by your endpoint. Use replay_webhook_dead_letter to retry after fixing the issue.', {
|
|
347
|
+
webhook_id: z.string().describe('Webhook ID.'),
|
|
348
|
+
limit: z.number().int().min(1).max(200).optional().describe('Max rows (default 50).'),
|
|
349
|
+
include_replayed: z.boolean().optional().describe('Include events that have been successfully replayed (default false).'),
|
|
350
|
+
}, async ({ webhook_id, ...query }) => {
|
|
351
|
+
try {
|
|
352
|
+
const result = await client.listWebhookDeadLetters(webhook_id, query);
|
|
353
|
+
return ok(result);
|
|
354
|
+
}
|
|
355
|
+
catch (err) {
|
|
356
|
+
return formatError(err);
|
|
357
|
+
}
|
|
358
|
+
});
|
|
359
|
+
server.tool('replay_webhook_dead_letter', 'Resend a dead-lettered event against the original webhook URL. The event is re-signed with the current timestamp; on success the dead-letter row is marked as replayed.', {
|
|
360
|
+
dead_letter_id: z.string().describe('Dead-letter row ID (from list_webhook_dead_letters).'),
|
|
361
|
+
}, async ({ dead_letter_id }) => {
|
|
362
|
+
try {
|
|
363
|
+
const result = await client.replayWebhookDeadLetter(dead_letter_id);
|
|
364
|
+
return ok(result);
|
|
365
|
+
}
|
|
366
|
+
catch (err) {
|
|
367
|
+
return formatError(err);
|
|
368
|
+
}
|
|
369
|
+
});
|
|
370
|
+
server.tool('discard_webhook_dead_letter', 'Permanently discard a dead-lettered event without replaying it. Use when the event is no longer relevant (e.g. the underlying message has expired).', {
|
|
371
|
+
dead_letter_id: z.string().describe('Dead-letter row ID.'),
|
|
372
|
+
}, async ({ dead_letter_id }) => {
|
|
373
|
+
try {
|
|
374
|
+
await client.discardWebhookDeadLetter(dead_letter_id);
|
|
375
|
+
return ok({ status: 'discarded', dead_letter_id });
|
|
376
|
+
}
|
|
377
|
+
catch (err) {
|
|
378
|
+
return formatError(err);
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
// ── Verify (OTP) ──────────────────────────────────────────
|
|
382
|
+
server.tool('start_verification', 'Send a phone-number verification code (OTP) via SMS. The recipient receives a 4/6/8-digit numeric code. Charges your account the message cost plus the verification upcharge.', {
|
|
383
|
+
from: z.string().describe('Your HonkIO number (E.164, must be active on your account).'),
|
|
384
|
+
to: z.string().describe('The phone number to verify (E.164, Canadian numbers only).'),
|
|
385
|
+
code_length: z.union([z.literal(4), z.literal(6), z.literal(8)]).optional().describe('OTP digit length (default 6).'),
|
|
386
|
+
ttl_minutes: z.number().int().min(1).max(60).optional().describe('Minutes until the code expires (default 10).'),
|
|
387
|
+
app_name: z.string().max(64).optional().describe('Brand name shown in the SMS body (default HonkIO).'),
|
|
388
|
+
}, async (input) => {
|
|
389
|
+
try {
|
|
390
|
+
const result = await client.startVerification(input);
|
|
391
|
+
return ok(result);
|
|
392
|
+
}
|
|
393
|
+
catch (err) {
|
|
394
|
+
return formatError(err);
|
|
395
|
+
}
|
|
396
|
+
});
|
|
397
|
+
server.tool('check_verification', 'Submit the OTP a user entered to complete verification. Returns the verification status (verified, invalid_code, expired, max_attempts).', {
|
|
398
|
+
verification_id: z.string().describe('Verification ID returned from start_verification.'),
|
|
399
|
+
code: z.string().regex(/^\d{4,8}$/).describe('The 4/6/8-digit code the user submitted.'),
|
|
400
|
+
}, async ({ verification_id, code }) => {
|
|
401
|
+
try {
|
|
402
|
+
const result = await client.checkVerification(verification_id, code);
|
|
403
|
+
return ok(result);
|
|
404
|
+
}
|
|
405
|
+
catch (err) {
|
|
406
|
+
return formatError(err);
|
|
407
|
+
}
|
|
408
|
+
});
|
|
409
|
+
server.tool('get_verification', 'Look up the current state of a verification (status, attempts, expiry).', {
|
|
410
|
+
verification_id: z.string().describe('Verification ID.'),
|
|
411
|
+
}, async ({ verification_id }) => {
|
|
412
|
+
try {
|
|
413
|
+
const result = await client.getVerification(verification_id);
|
|
414
|
+
return ok(result);
|
|
415
|
+
}
|
|
416
|
+
catch (err) {
|
|
417
|
+
return formatError(err);
|
|
418
|
+
}
|
|
419
|
+
});
|
|
420
|
+
server.tool('list_verifications', 'List recent verifications for your account, optionally filtered by phone number or status.', {
|
|
421
|
+
phone_number: z.string().optional().describe('Filter to verifications for this E.164 number.'),
|
|
422
|
+
status: z.enum(['pending', 'verified', 'expired', 'max_attempts']).optional().describe('Filter by status.'),
|
|
423
|
+
page: z.number().int().min(1).optional(),
|
|
424
|
+
limit: z.number().int().min(1).max(200).optional(),
|
|
425
|
+
}, async (input) => {
|
|
426
|
+
try {
|
|
427
|
+
const result = await client.listVerifications(input);
|
|
428
|
+
return ok(result);
|
|
429
|
+
}
|
|
430
|
+
catch (err) {
|
|
431
|
+
return formatError(err);
|
|
432
|
+
}
|
|
433
|
+
});
|
|
434
|
+
// ── Account ───────────────────────────────────────────────
|
|
435
|
+
server.tool('whoami', 'Identify the HonkIO account the configured API key belongs to. Returns the account ID, name, credit balance and status. Call this first when you need an account ID, or to confirm which account and mode (live or test) the key is for.', {}, async () => {
|
|
436
|
+
try {
|
|
437
|
+
const result = await client.getCurrentAccount();
|
|
438
|
+
return ok(result);
|
|
439
|
+
}
|
|
440
|
+
catch (err) {
|
|
441
|
+
return formatError(err);
|
|
442
|
+
}
|
|
443
|
+
});
|
|
444
|
+
server.tool('get_account', 'Get details for your HonkIO account including name, credit balance, status, and active API keys.', {
|
|
445
|
+
account_id: ACCOUNT_ID_ARG,
|
|
446
|
+
}, async ({ account_id }) => {
|
|
447
|
+
try {
|
|
448
|
+
const result = await client.getAccount(await resolveAccountId(account_id));
|
|
449
|
+
return ok(result);
|
|
450
|
+
}
|
|
451
|
+
catch (err) {
|
|
452
|
+
return formatError(err);
|
|
453
|
+
}
|
|
454
|
+
});
|
|
455
|
+
server.tool('update_account', 'Update your HonkIO account name.', {
|
|
456
|
+
account_id: ACCOUNT_ID_ARG,
|
|
457
|
+
name: z.string().min(1).max(200).describe('New account name.'),
|
|
458
|
+
}, async ({ account_id, name }) => {
|
|
459
|
+
try {
|
|
460
|
+
const result = await client.updateAccount(await resolveAccountId(account_id), { name });
|
|
461
|
+
return ok(result);
|
|
462
|
+
}
|
|
463
|
+
catch (err) {
|
|
464
|
+
return formatError(err);
|
|
465
|
+
}
|
|
466
|
+
});
|
|
467
|
+
server.tool('get_usage', 'Get usage statistics for your account including message counts and spending. Defaults to the current calendar month.', {
|
|
468
|
+
account_id: ACCOUNT_ID_ARG,
|
|
469
|
+
from: z.string().optional().describe('Start date (YYYY-MM-DD). Defaults to start of current month.'),
|
|
470
|
+
to: z.string().optional().describe('End date (YYYY-MM-DD). Defaults to today.'),
|
|
471
|
+
}, async ({ account_id, from, to }) => {
|
|
472
|
+
try {
|
|
473
|
+
const result = await client.getUsage(await resolveAccountId(account_id), { from, to });
|
|
474
|
+
return ok(result);
|
|
475
|
+
}
|
|
476
|
+
catch (err) {
|
|
477
|
+
return formatError(err);
|
|
478
|
+
}
|
|
479
|
+
});
|
|
480
|
+
server.tool('create_api_key', 'Issue a new API key for your account. The raw key is shown once — store it securely.', {
|
|
481
|
+
account_id: ACCOUNT_ID_ARG,
|
|
482
|
+
mode: z.enum(['live', 'test']).optional().describe('Key mode: "live" (real SMS, charges apply) or "test" (sandbox, no charges). Default: "live".'),
|
|
483
|
+
label: z.string().max(100).optional().describe('Human-readable label to identify this key (e.g. "Production server", "CI pipeline").'),
|
|
484
|
+
}, async ({ account_id, mode, label }) => {
|
|
485
|
+
try {
|
|
486
|
+
const result = await client.createApiKey(await resolveAccountId(account_id), { mode, label });
|
|
487
|
+
return ok(result);
|
|
488
|
+
}
|
|
489
|
+
catch (err) {
|
|
490
|
+
return formatError(err);
|
|
491
|
+
}
|
|
492
|
+
});
|
|
493
|
+
server.tool('revoke_api_key', 'Revoke an API key, immediately blocking all requests using that key. This cannot be undone.', {
|
|
494
|
+
account_id: ACCOUNT_ID_ARG,
|
|
495
|
+
key_id: z.string().describe('The API key record ID to revoke (from get_account api_keys list).'),
|
|
496
|
+
}, async ({ account_id, key_id }) => {
|
|
497
|
+
try {
|
|
498
|
+
await client.revokeApiKey(await resolveAccountId(account_id), key_id);
|
|
499
|
+
return ok({ status: 'revoked', key_id });
|
|
500
|
+
}
|
|
501
|
+
catch (err) {
|
|
502
|
+
return formatError(err);
|
|
503
|
+
}
|
|
504
|
+
});
|
|
505
|
+
server.tool('rotate_api_key', 'Atomically issue a replacement API key inheriting the same permissions/label/mode as the source key, and revoke the source key in the same transaction. Returns the new raw key ONCE.', {
|
|
506
|
+
account_id: ACCOUNT_ID_ARG,
|
|
507
|
+
key_id: z.string().describe('The API key record ID to rotate.'),
|
|
508
|
+
}, async ({ account_id, key_id }) => {
|
|
509
|
+
try {
|
|
510
|
+
const result = await client.rotateApiKey(await resolveAccountId(account_id), key_id);
|
|
511
|
+
return ok(result);
|
|
512
|
+
}
|
|
513
|
+
catch (err) {
|
|
514
|
+
return formatError(err);
|
|
515
|
+
}
|
|
516
|
+
});
|
|
517
|
+
}
|
|
518
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@honkio/mcp",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "HonkIO MCP server — lets AI coding agents send SMS, manage Canadian phone numbers, and handle CASL/DNCL compliance",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"honkio-mcp": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"scripts": {
|
|
11
|
+
"build": "tsc",
|
|
12
|
+
"// prepublishOnly": "dist/ is gitignored, so the tarball comes entirely from the local build — rebuild rather than risk publishing a stale or missing dist/",
|
|
13
|
+
"prepublishOnly": "npm run build",
|
|
14
|
+
"dev": "tsx src/index.ts",
|
|
15
|
+
"start": "node dist/index.js",
|
|
16
|
+
"typecheck": "tsc --noEmit"
|
|
17
|
+
},
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@modelcontextprotocol/sdk": "^1.28.0",
|
|
20
|
+
"zod": "^3.25.67"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@types/node": "^22.0.0",
|
|
24
|
+
"tsx": "^4.21.0",
|
|
25
|
+
"typescript": "^5.9.3"
|
|
26
|
+
},
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=20"
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist/"
|
|
32
|
+
],
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "git+https://github.com/jeffcaldwellca/honkio.git"
|
|
36
|
+
},
|
|
37
|
+
"homepage": "https://honkio.ca",
|
|
38
|
+
"license": "MIT"
|
|
39
|
+
}
|