@sendraven/mcp 0.1.0 → 0.2.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/README.md +5 -3
- package/dist/tools/broadcasts.js +26 -3
- package/dist/tools/broadcasts.js.map +1 -1
- package/dist/tools/index.js +2 -0
- package/dist/tools/index.js.map +1 -1
- package/package.json +2 -1
- package/server.json +6 -4
package/README.md
CHANGED
|
@@ -82,7 +82,7 @@ hold. The tools respect all three. See
|
|
|
82
82
|
## Tools
|
|
83
83
|
|
|
84
84
|
<!-- tools:start -->
|
|
85
|
-
|
|
85
|
+
47 tools, generated from the server's registry.
|
|
86
86
|
|
|
87
87
|
| Tool | What it does |
|
|
88
88
|
| --- | --- |
|
|
@@ -96,9 +96,11 @@ hold. The tools respect all three. See
|
|
|
96
96
|
| `list_suppressions` | List addresses we refuse to mail and why (hard_bounce, complaint, unsubscribe, manual). Check here first when someone reports not receiving email. |
|
|
97
97
|
| `add_suppression` | Stop sending to an address. Scope 'marketing' leaves transactional mail working. |
|
|
98
98
|
| `remove_suppression` | Remove a suppression so the address can be mailed again. Be careful with hard bounces — the address was rejected by the receiving server, and re-sending raises the bounce rate that AWS enforces on. |
|
|
99
|
-
| `
|
|
99
|
+
| `get_broadcast` | One campaign, with a 'progress' object while it is sending or paused: how many addresses are still pending, sent, failed, or skipped because the person opted out after the campaign started. This is how you tell a paused campaign that is still making progress from one waiting on quota. |
|
|
100
|
+
| `list_broadcasts` | List campaigns with their status and send progress. A campaign showing 'paused' is not broken: it ran out of the day's sending quota part way and is waiting to continue. Use get_broadcast to see how much is left, and resume_broadcast to continue it now. |
|
|
100
101
|
| `preview_broadcast` | How many contacts a campaign would reach, and whether the reputation gate would allow it. Always run this before sending — it is the only way to see the size of a campaign without starting it. |
|
|
101
|
-
| `
|
|
102
|
+
| `resume_broadcast` | Continue a campaign left 'paused' by the daily sending quota. It mails only the addresses still pending — the audience was frozen when the campaign started and everyone already reached is marked — so calling this twice cannot double-send. Only works on a paused campaign; anything else answers 409. A background worker also resumes paused campaigns on its own once quota frees up, so use this only when waiting is not acceptable. |
|
|
103
|
+
| `send_broadcast` | Send a campaign now, or schedule it with scheduled_at. This mails every contact in the segment and cannot be undone once started — run preview_broadcast first. A campaign bigger than the day's remaining quota is not rejected: it sends what it can and stops as 'paused', then continues later. That is expected, not an error to retry. |
|
|
102
104
|
| `list_threads` | List email conversations. Pass awaiting_reply=true to get only the threads where someone has written to you and you haven't answered — this is the tool to poll when deciding what needs a response. |
|
|
103
105
|
| `get_thread` | Read a conversation as a chronological transcript of outbound and inbound messages. Inbound text already has quoted history and signatures stripped, so read `text`; `raw_text` holds the untrimmed body if the stripped version looks wrong. Check spf_verdict and dkim_verdict before trusting a reply's claimed sender. |
|
|
104
106
|
| `reply_to_message` | Reply to a message, keeping it on the same conversation. Sets the threading headers so the recipient's mail client shows it as part of the existing exchange rather than a new one. Prefer this over send_email whenever you are answering something. |
|
package/dist/tools/broadcasts.js
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.sendBroadcastTool = exports.previewBroadcastTool = exports.listBroadcastsTool = void 0;
|
|
3
|
+
exports.sendBroadcastTool = exports.resumeBroadcastTool = exports.getBroadcastTool = exports.previewBroadcastTool = exports.listBroadcastsTool = void 0;
|
|
4
4
|
const zod_1 = require("zod");
|
|
5
5
|
const client_1 = require("../client");
|
|
6
6
|
exports.listBroadcastsTool = {
|
|
7
7
|
name: "list_broadcasts",
|
|
8
|
-
description: "List campaigns with their status and send progress."
|
|
8
|
+
description: "List campaigns with their status and send progress. A campaign showing 'paused' is not " +
|
|
9
|
+
"broken: it ran out of the day's sending quota part way and is waiting to continue. Use " +
|
|
10
|
+
"get_broadcast to see how much is left, and resume_broadcast to continue it now.",
|
|
9
11
|
schema: {},
|
|
10
12
|
handler: async () => (0, client_1.request)("GET", "/v1/broadcasts"),
|
|
11
13
|
};
|
|
@@ -17,10 +19,31 @@ exports.previewBroadcastTool = {
|
|
|
17
19
|
schema: { id: zod_1.z.string() },
|
|
18
20
|
handler: async (args) => (0, client_1.request)("GET", `/v1/broadcasts/${args.id}/preview`),
|
|
19
21
|
};
|
|
22
|
+
exports.getBroadcastTool = {
|
|
23
|
+
name: "get_broadcast",
|
|
24
|
+
description: "One campaign, with a 'progress' object while it is sending or paused: how many addresses " +
|
|
25
|
+
"are still pending, sent, failed, or skipped because the person opted out after the " +
|
|
26
|
+
"campaign started. This is how you tell a paused campaign that is still making progress " +
|
|
27
|
+
"from one waiting on quota.",
|
|
28
|
+
schema: { id: zod_1.z.string() },
|
|
29
|
+
handler: async (args) => (0, client_1.request)("GET", `/v1/broadcasts/${args.id}`),
|
|
30
|
+
};
|
|
31
|
+
exports.resumeBroadcastTool = {
|
|
32
|
+
name: "resume_broadcast",
|
|
33
|
+
description: "Continue a campaign left 'paused' by the daily sending quota. It mails only the addresses " +
|
|
34
|
+
"still pending — the audience was frozen when the campaign started and everyone already " +
|
|
35
|
+
"reached is marked — so calling this twice cannot double-send. Only works on a paused " +
|
|
36
|
+
"campaign; anything else answers 409. A background worker also resumes paused campaigns on " +
|
|
37
|
+
"its own once quota frees up, so use this only when waiting is not acceptable.",
|
|
38
|
+
schema: { id: zod_1.z.string() },
|
|
39
|
+
handler: async (args) => (0, client_1.request)("POST", `/v1/broadcasts/${args.id}/resume`),
|
|
40
|
+
};
|
|
20
41
|
exports.sendBroadcastTool = {
|
|
21
42
|
name: "send_broadcast",
|
|
22
43
|
description: "Send a campaign now, or schedule it with scheduled_at. This mails every contact in the " +
|
|
23
|
-
"segment and cannot be undone once started — run preview_broadcast first."
|
|
44
|
+
"segment and cannot be undone once started — run preview_broadcast first. A campaign bigger " +
|
|
45
|
+
"than the day's remaining quota is not rejected: it sends what it can and stops as 'paused', " +
|
|
46
|
+
"then continues later. That is expected, not an error to retry.",
|
|
24
47
|
schema: {
|
|
25
48
|
id: zod_1.z.string(),
|
|
26
49
|
scheduled_at: zod_1.z.string().optional().describe("ISO 8601 timestamp; omit to send now"),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"broadcasts.js","sourceRoot":"","sources":["../../src/tools/broadcasts.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AACxB,sCAAoC;AAEvB,QAAA,kBAAkB,GAAG;IAChC,IAAI,EAAE,iBAAiB;IACvB,WAAW,
|
|
1
|
+
{"version":3,"file":"broadcasts.js","sourceRoot":"","sources":["../../src/tools/broadcasts.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AACxB,sCAAoC;AAEvB,QAAA,kBAAkB,GAAG;IAChC,IAAI,EAAE,iBAAiB;IACvB,WAAW,EACT,yFAAyF;QACzF,yFAAyF;QACzF,iFAAiF;IACnF,MAAM,EAAE,EAAE;IACV,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,IAAA,gBAAO,EAAC,KAAK,EAAE,gBAAgB,CAAC;CACtD,CAAC;AAEW,QAAA,oBAAoB,GAAG;IAClC,IAAI,EAAE,mBAAmB;IACzB,WAAW,EACT,4FAA4F;QAC5F,4FAA4F;QAC5F,cAAc;IAChB,MAAM,EAAE,EAAE,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,EAAE;IAC1B,OAAO,EAAE,KAAK,EAAE,IAA6B,EAAE,EAAE,CAC/C,IAAA,gBAAO,EAAC,KAAK,EAAE,kBAAkB,IAAI,CAAC,EAAE,UAAU,CAAC;CACtD,CAAC;AAEW,QAAA,gBAAgB,GAAG;IAC9B,IAAI,EAAE,eAAe;IACrB,WAAW,EACT,2FAA2F;QAC3F,qFAAqF;QACrF,yFAAyF;QACzF,4BAA4B;IAC9B,MAAM,EAAE,EAAE,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,EAAE;IAC1B,OAAO,EAAE,KAAK,EAAE,IAA6B,EAAE,EAAE,CAAC,IAAA,gBAAO,EAAC,KAAK,EAAE,kBAAkB,IAAI,CAAC,EAAE,EAAE,CAAC;CAC9F,CAAC;AAEW,QAAA,mBAAmB,GAAG;IACjC,IAAI,EAAE,kBAAkB;IACxB,WAAW,EACT,4FAA4F;QAC5F,yFAAyF;QACzF,uFAAuF;QACvF,4FAA4F;QAC5F,+EAA+E;IACjF,MAAM,EAAE,EAAE,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE,EAAE;IAC1B,OAAO,EAAE,KAAK,EAAE,IAA6B,EAAE,EAAE,CAC/C,IAAA,gBAAO,EAAC,MAAM,EAAE,kBAAkB,IAAI,CAAC,EAAE,SAAS,CAAC;CACtD,CAAC;AAEW,QAAA,iBAAiB,GAAG;IAC/B,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,yFAAyF;QACzF,6FAA6F;QAC7F,8FAA8F;QAC9F,gEAAgE;IAClE,MAAM,EAAE;QACN,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE;QACd,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;KACrF;IACD,OAAO,EAAE,KAAK,EAAE,IAA6B,EAAE,EAAE;QAC/C,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;QAC7B,OAAO,IAAA,gBAAO,EAAC,MAAM,EAAE,kBAAkB,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC;CACF,CAAC"}
|
package/dist/tools/index.js
CHANGED
|
@@ -32,8 +32,10 @@ exports.TOOLS = [
|
|
|
32
32
|
suppressions_1.listSuppressionsTool,
|
|
33
33
|
suppressions_1.addSuppressionTool,
|
|
34
34
|
suppressions_1.removeSuppressionTool,
|
|
35
|
+
broadcasts_1.getBroadcastTool,
|
|
35
36
|
broadcasts_1.listBroadcastsTool,
|
|
36
37
|
broadcasts_1.previewBroadcastTool,
|
|
38
|
+
broadcasts_1.resumeBroadcastTool,
|
|
37
39
|
broadcasts_1.sendBroadcastTool,
|
|
38
40
|
threads_1.listThreadsTool,
|
|
39
41
|
threads_1.getThreadTool,
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;GAQG;AACH,qCAKkB;AAClB,uCAA6E;AAC7E,iDAIwB;AACxB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;GAQG;AACH,qCAKkB;AAClB,uCAA6E;AAC7E,iDAIwB;AACxB,6CAMsB;AACtB,uCAA+E;AAC/E,2CAAsF;AACtF,2CAAoE;AACpE,+CAA+E;AAC/E,qCAAkF;AAClF,2CAYqB;AACrB,6CAQsB;AAeT,QAAA,KAAK,GAAc;IAC9B,sBAAa;IACb,uBAAc;IACd,qBAAY;IACZ,wBAAe;IACf,yBAAe;IACf,uBAAa;IACb,0BAAgB;IAChB,mCAAoB;IACpB,iCAAkB;IAClB,oCAAqB;IACrB,6BAAgB;IAChB,+BAAkB;IAClB,iCAAoB;IACpB,gCAAmB;IACnB,8BAAiB;IACjB,yBAAe;IACf,uBAAa;IACb,4BAAkB;IAClB,6BAAiB;IACjB,8BAAkB;IAClB,4BAAgB;IAChB,6BAAiB;IACjB,8BAAkB;IAClB,iCAAmB;IACnB,wBAAU;IACV,2BAAa;IACb,uBAAc;IACd,2BAAkB;IAClB,2BAAkB;IAClB,6BAAiB;IACjB,0BAAc;IACd,0BAAc;IACd,6BAAiB;IACjB,4BAAgB;IAChB,wBAAY;IACZ,4BAAgB;IAChB,wBAAW;IACX,8BAAiB;IACjB,8BAAiB;IACjB,kCAAqB;IACrB,oCAAuB;IACvB,4BAAe;IACf,yBAAY;IACZ,2BAAe;IACf,kCAAsB;IACtB,6BAAiB;IACjB,0BAAc;CACf,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sendraven/mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "MCP server for SendRaven: send email, read replies as threads, run campaigns, and decide approvals, with per-key limits for agents.",
|
|
5
|
+
"mcpName": "ai.sendraven/mcp",
|
|
5
6
|
"license": "MIT",
|
|
6
7
|
"author": "Common Ninja Ltd.",
|
|
7
8
|
"homepage": "https://sendraven.ai/mcp",
|
package/server.json
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-09-29/server.schema.json",
|
|
3
3
|
"name": "ai.sendraven/mcp",
|
|
4
|
-
"description": "Email for AI agents: send, read replies as threads, run campaigns,
|
|
4
|
+
"description": "Email for AI agents: send, read replies as threads, run campaigns, with per-key limits.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"url": "https://github.com/CommonNinja/sendraven-mcp-server",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "0.
|
|
9
|
+
"version": "0.2.0",
|
|
10
10
|
"websiteUrl": "https://sendraven.ai/mcp",
|
|
11
11
|
"packages": [
|
|
12
12
|
{
|
|
13
13
|
"registryType": "npm",
|
|
14
14
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
15
15
|
"identifier": "@sendraven/mcp",
|
|
16
|
-
"version": "0.
|
|
17
|
-
"transport": {
|
|
16
|
+
"version": "0.2.0",
|
|
17
|
+
"transport": {
|
|
18
|
+
"type": "stdio"
|
|
19
|
+
},
|
|
18
20
|
"environmentVariables": [
|
|
19
21
|
{
|
|
20
22
|
"name": "SENDRAVEN_API_KEY",
|