@sendinel/mcp-server 1.0.3 → 1.0.5
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/build/audit.d.ts +1 -0
- package/build/audit.js +9 -3
- package/build/auth.d.ts +10 -0
- package/build/auth.js +82 -9
- package/build/db.d.ts +12 -0
- package/build/db.js +37 -2
- package/build/index.js +38 -12
- package/build/lib/action-approvals.d.ts +28 -1
- package/build/lib/action-approvals.js +89 -2
- package/build/lib/brand-asset-persist.d.ts +35 -0
- package/build/lib/brand-asset-persist.js +161 -0
- package/build/lib/brand-asset-usage.d.ts +13 -0
- package/build/lib/brand-asset-usage.js +46 -0
- package/build/lib/email-provider.d.ts +19 -0
- package/build/lib/email-provider.js +281 -0
- package/build/lib/ssrf-pinned-fetch.d.ts +16 -0
- package/build/lib/ssrf-pinned-fetch.js +101 -0
- package/build/lib/survey-link-resolver.d.ts +6 -0
- package/build/lib/survey-link-resolver.js +23 -0
- package/build/lib/svg-sanitize.d.ts +2 -0
- package/build/lib/svg-sanitize.js +110 -0
- package/build/lib/webhook-events.d.ts +1 -1
- package/build/scoped-token.d.ts +11 -0
- package/build/scoped-token.js +59 -0
- package/build/server.js +30 -9
- package/build/tools/ab-testing.js +28 -0
- package/build/tools/advisor.js +52 -2
- package/build/tools/ai-work.d.ts +2 -0
- package/build/tools/ai-work.js +460 -0
- package/build/tools/analytics.d.ts +1 -0
- package/build/tools/analytics.js +203 -0
- package/build/tools/approvals.js +15 -1
- package/build/tools/automations.js +288 -65
- package/build/tools/brand-kit.d.ts +2 -0
- package/build/tools/brand-kit.js +277 -0
- package/build/tools/campaigns.js +900 -69
- package/build/tools/compound.js +28 -0
- package/build/tools/contacts.js +338 -17
- package/build/tools/content.js +266 -1
- package/build/tools/data-proposals.js +21 -0
- package/build/tools/data.js +121 -5
- package/build/tools/delivery-ops.js +84 -0
- package/build/tools/drafts.js +64 -1
- package/build/tools/forms.js +42 -9
- package/build/tools/gdpr.js +22 -3
- package/build/tools/newsletters.d.ts +2 -0
- package/build/tools/newsletters.js +583 -0
- package/build/tools/org.js +297 -3
- package/build/tools/segments.js +45 -3
- package/build/tools/short-links.d.ts +2 -0
- package/build/tools/short-links.js +157 -0
- package/build/tools/sites.js +35 -0
- package/build/tools/sms.js +49 -0
- package/build/tools/social-posts.js +81 -5
- package/build/tools/surveys.d.ts +2 -0
- package/build/tools/surveys.js +222 -0
- package/build/tools/templates.js +78 -2
- package/build/tools/warmup.js +28 -0
- package/build/tools/webhooks.js +29 -0
- package/package.json +10 -4
package/build/tools/warmup.js
CHANGED
|
@@ -4,6 +4,13 @@ import { getProjectId } from '../project.js';
|
|
|
4
4
|
const j = (data) => ({ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] });
|
|
5
5
|
export function registerWarmupTools(server) {
|
|
6
6
|
server.registerTool('get_warmup_status', {
|
|
7
|
+
title: 'Get Warmup Status',
|
|
8
|
+
annotations: {
|
|
9
|
+
readOnlyHint: true,
|
|
10
|
+
destructiveHint: false,
|
|
11
|
+
idempotentHint: true,
|
|
12
|
+
openWorldHint: false,
|
|
13
|
+
},
|
|
7
14
|
description: 'Get warmup status for a sending site.',
|
|
8
15
|
inputSchema: { site_id: z.string().uuid() },
|
|
9
16
|
}, async ({ site_id }) => {
|
|
@@ -27,6 +34,13 @@ export function registerWarmupTools(server) {
|
|
|
27
34
|
});
|
|
28
35
|
});
|
|
29
36
|
server.registerTool('update_warmup_schedule', {
|
|
37
|
+
title: 'Update Warmup Schedule',
|
|
38
|
+
annotations: {
|
|
39
|
+
readOnlyHint: false,
|
|
40
|
+
destructiveHint: false,
|
|
41
|
+
idempotentHint: true,
|
|
42
|
+
openWorldHint: false,
|
|
43
|
+
},
|
|
30
44
|
description: 'Update warmup daily limit or phase metadata for a site.',
|
|
31
45
|
inputSchema: { site_id: z.string().uuid(), daily_limit: z.number().int().min(1).optional(), phase: z.string().optional() },
|
|
32
46
|
}, async ({ site_id, daily_limit, phase }) => {
|
|
@@ -37,6 +51,13 @@ export function registerWarmupTools(server) {
|
|
|
37
51
|
return j({ updated: true });
|
|
38
52
|
});
|
|
39
53
|
server.registerTool('pause_warmup', {
|
|
54
|
+
title: 'Pause Warmup',
|
|
55
|
+
annotations: {
|
|
56
|
+
readOnlyHint: false,
|
|
57
|
+
destructiveHint: false,
|
|
58
|
+
idempotentHint: true,
|
|
59
|
+
openWorldHint: false,
|
|
60
|
+
},
|
|
40
61
|
description: 'Pause warmup for a sending site.',
|
|
41
62
|
inputSchema: { site_id: z.string().uuid(), reason: z.string().optional() },
|
|
42
63
|
}, async ({ site_id, reason }) => {
|
|
@@ -46,6 +67,13 @@ export function registerWarmupTools(server) {
|
|
|
46
67
|
return j({ paused: true });
|
|
47
68
|
});
|
|
48
69
|
server.registerTool('resume_warmup', {
|
|
70
|
+
title: 'Resume Warmup',
|
|
71
|
+
annotations: {
|
|
72
|
+
readOnlyHint: false,
|
|
73
|
+
destructiveHint: false,
|
|
74
|
+
idempotentHint: true,
|
|
75
|
+
openWorldHint: false,
|
|
76
|
+
},
|
|
49
77
|
description: 'Resume warmup for a sending site.',
|
|
50
78
|
inputSchema: { site_id: z.string().uuid() },
|
|
51
79
|
}, async ({ site_id }) => {
|
package/build/tools/webhooks.js
CHANGED
|
@@ -21,9 +21,17 @@ const VALID_EVENTS = [
|
|
|
21
21
|
'social.post.published',
|
|
22
22
|
'social.post.failed',
|
|
23
23
|
'social.post.archived',
|
|
24
|
+
'asset_link.viewed',
|
|
24
25
|
];
|
|
25
26
|
export function registerWebhookTools(server) {
|
|
26
27
|
server.registerTool('subscribe_webhook', {
|
|
28
|
+
title: 'Subscribe Webhook',
|
|
29
|
+
annotations: {
|
|
30
|
+
readOnlyHint: false,
|
|
31
|
+
destructiveHint: false,
|
|
32
|
+
idempotentHint: true,
|
|
33
|
+
openWorldHint: true,
|
|
34
|
+
},
|
|
27
35
|
description: `Register a webhook URL to receive push notifications when events occur. Sendinel signs each payload with HMAC-SHA256 so you can verify authenticity. Valid events: ${VALID_EVENTS.join(', ')}`,
|
|
28
36
|
inputSchema: {
|
|
29
37
|
url: z.string().url().describe('HTTPS endpoint that will receive POST requests'),
|
|
@@ -57,6 +65,13 @@ export function registerWebhookTools(server) {
|
|
|
57
65
|
});
|
|
58
66
|
});
|
|
59
67
|
server.registerTool('list_webhook_subscriptions', {
|
|
68
|
+
title: 'List Webhook Subscriptions',
|
|
69
|
+
annotations: {
|
|
70
|
+
readOnlyHint: true,
|
|
71
|
+
destructiveHint: false,
|
|
72
|
+
idempotentHint: true,
|
|
73
|
+
openWorldHint: false,
|
|
74
|
+
},
|
|
60
75
|
description: 'List all webhook subscriptions for this project. Secrets are redacted — only shown on creation.',
|
|
61
76
|
inputSchema: {
|
|
62
77
|
include_inactive: z.boolean().optional().default(false),
|
|
@@ -75,6 +90,13 @@ export function registerWebhookTools(server) {
|
|
|
75
90
|
return j({ subscriptions: data ?? [], count: data?.length ?? 0 });
|
|
76
91
|
});
|
|
77
92
|
server.registerTool('update_webhook_subscription', {
|
|
93
|
+
title: 'Update Webhook Subscription',
|
|
94
|
+
annotations: {
|
|
95
|
+
readOnlyHint: false,
|
|
96
|
+
destructiveHint: false,
|
|
97
|
+
idempotentHint: true,
|
|
98
|
+
openWorldHint: true,
|
|
99
|
+
},
|
|
78
100
|
description: 'Update a webhook subscription — change URL, events, or active status.',
|
|
79
101
|
inputSchema: {
|
|
80
102
|
subscription_id: z.string().uuid(),
|
|
@@ -110,6 +132,13 @@ export function registerWebhookTools(server) {
|
|
|
110
132
|
return j(data);
|
|
111
133
|
});
|
|
112
134
|
server.registerTool('delete_webhook_subscription', {
|
|
135
|
+
title: 'Delete Webhook Subscription',
|
|
136
|
+
annotations: {
|
|
137
|
+
readOnlyHint: false,
|
|
138
|
+
destructiveHint: true,
|
|
139
|
+
idempotentHint: false,
|
|
140
|
+
openWorldHint: false,
|
|
141
|
+
},
|
|
113
142
|
description: 'Permanently delete a webhook subscription. This also deletes all delivery history for this subscription.',
|
|
114
143
|
inputSchema: {
|
|
115
144
|
subscription_id: z.string().uuid(),
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sendinel/mcp-server",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.5",
|
|
4
4
|
"description": "AI-controlled email operations control plane for campaigns, contacts, segments, analytics, and multi-provider sending via MCP.",
|
|
5
|
-
"mcpName": "
|
|
5
|
+
"mcpName": "ai.sendinel/mcp-server",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"bin": {
|
|
8
8
|
"sendinel-mcp": "build/index.js"
|
|
@@ -29,14 +29,20 @@
|
|
|
29
29
|
"@supabase/supabase-js": "^2.98.0",
|
|
30
30
|
"dotenv": "^16.4.7",
|
|
31
31
|
"express": "^5.2.1",
|
|
32
|
+
"fast-xml-parser": "^5.7.3",
|
|
33
|
+
"file-type": "^21.3.2",
|
|
34
|
+
"jose": "^6.2.3",
|
|
35
|
+
"qrcode": "^1.5.4",
|
|
32
36
|
"resend": "^6.9.3",
|
|
33
|
-
"
|
|
37
|
+
"undici": "^7.24.5",
|
|
38
|
+
"zod": "^4.4.3"
|
|
34
39
|
},
|
|
35
40
|
"devDependencies": {
|
|
36
41
|
"@types/express": "^5.0.3",
|
|
37
42
|
"@types/node": "^26.0.1",
|
|
43
|
+
"@types/qrcode": "^1.5.6",
|
|
38
44
|
"tsx": "^4.19.4",
|
|
39
|
-
"typescript": "^
|
|
45
|
+
"typescript": "^6.0.3",
|
|
40
46
|
"vitest": "^4.0.18"
|
|
41
47
|
},
|
|
42
48
|
"publishConfig": {
|