@agentisend/mcp-server 0.1.2 → 0.1.3
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/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/proxy.d.ts +8 -3
- package/dist/proxy.js +126 -16
- package/dist/proxy.js.map +1 -1
- package/package.json +7 -4
- package/server.json +4 -3
package/dist/cli.js
CHANGED
|
@@ -55,7 +55,7 @@ export async function main(argv = process.argv.slice(2), env = process.env) {
|
|
|
55
55
|
const url = env['AGENTISEND_MCP_URL'] ?? DEFAULT_URL;
|
|
56
56
|
try {
|
|
57
57
|
const upstream = await connectUpstream({ url, apiKey });
|
|
58
|
-
const server = createProxyServer(upstream);
|
|
58
|
+
const server = createProxyServer(upstream, { url, apiKey });
|
|
59
59
|
await server.connect(new StdioServerTransport());
|
|
60
60
|
process.stderr.write(`agentisend-mcp connected to ${url}\n`);
|
|
61
61
|
return 0;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEhF,MAAM,CAAC,MAAM,WAAW,GAAG,gCAAgC,CAAC;AAE5D,MAAM,KAAK,GAAG;;;;;;+CAMiC,WAAW;;;;;;;;;;;;;;+EAcqB,CAAC;AAEhF,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,OAAiB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EACtC,MAAyB,OAAO,CAAC,GAAG;IAEpC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC;QACnC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,cAAc,IAAI,CAAC,CAAC;QAC5C,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACzC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,yEAAyE;QACzE,wEAAwE;QACxE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,2EAA2E;YACzE,uEAAuE;YACvE,mCAAmC,CACtC,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,CAAC,oBAAoB,CAAC,IAAI,WAAW,CAAC;IACrD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/proxy.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
|
17
17
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
18
18
|
import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
|
|
19
19
|
export declare const SERVER_NAME = "agentisend-local";
|
|
20
|
-
export declare const SERVER_VERSION = "0.1.
|
|
20
|
+
export declare const SERVER_VERSION = "0.1.3";
|
|
21
21
|
export interface ProxyOptions {
|
|
22
22
|
/** Where the hosted MCP endpoint lives, e.g. https://api.agentisend.com/mcp */
|
|
23
23
|
url: string;
|
|
@@ -26,7 +26,7 @@ export interface ProxyOptions {
|
|
|
26
26
|
/** Injectable so tests can drive the pair without spawning a process. */
|
|
27
27
|
clientTransportFactory?: (url: URL, apiKey: string) => Transport;
|
|
28
28
|
}
|
|
29
|
-
/**
|
|
29
|
+
/** One upstream connection, reused for every forwarded call until the hosted server ends it. */
|
|
30
30
|
export declare function connectUpstream(options: ProxyOptions): Promise<Client>;
|
|
31
31
|
/**
|
|
32
32
|
* A server that answers every request by asking the hosted one.
|
|
@@ -35,5 +35,10 @@ export declare function connectUpstream(options: ProxyOptions): Promise<Client>;
|
|
|
35
35
|
* value of the hosted error catalogue is its `fix` field, and a proxy that
|
|
36
36
|
* rewrote refusals into its own words would throw that away at exactly the
|
|
37
37
|
* moment the agent needs it.
|
|
38
|
+
*
|
|
39
|
+
* DX-4: it says what the hosted server says at initialize (its
|
|
40
|
+
* `instructions`), passes on `notifications/tools/list_changed`, and, given
|
|
41
|
+
* the options it connected with, opens a fresh upstream connection when the
|
|
42
|
+
* hosted one is gone instead of failing every call until the host restarts.
|
|
38
43
|
*/
|
|
39
|
-
export declare function createProxyServer(
|
|
44
|
+
export declare function createProxyServer(first: Client, options?: ProxyOptions): Server;
|
package/dist/proxy.js
CHANGED
|
@@ -14,12 +14,12 @@
|
|
|
14
14
|
* adds is the transport.
|
|
15
15
|
*/
|
|
16
16
|
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
17
|
-
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
17
|
+
import { StreamableHTTPClientTransport, StreamableHTTPError, } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
18
18
|
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
19
|
-
import { CallToolRequestSchema, GetPromptRequestSchema, ListPromptsRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
19
|
+
import { CallToolRequestSchema, GetPromptRequestSchema, ListPromptsRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, ToolListChangedNotificationSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
20
20
|
export const SERVER_NAME = 'agentisend-local';
|
|
21
|
-
export const SERVER_VERSION = '0.1.
|
|
22
|
-
/**
|
|
21
|
+
export const SERVER_VERSION = '0.1.3';
|
|
22
|
+
/** One upstream connection, reused for every forwarded call until the hosted server ends it. */
|
|
23
23
|
export async function connectUpstream(options) {
|
|
24
24
|
const client = new Client({ name: SERVER_NAME, version: SERVER_VERSION }, { capabilities: {} });
|
|
25
25
|
const url = new URL(options.url);
|
|
@@ -30,6 +30,29 @@ export async function connectUpstream(options) {
|
|
|
30
30
|
await client.connect(transport);
|
|
31
31
|
return client;
|
|
32
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* DX-4: the upstream said this connection is gone. Sessions live in the API
|
|
35
|
+
* process, so a deploy or 30 idle minutes ends them, and the API answers 404
|
|
36
|
+
* (session_expired / session_not_found). A request refused that way ran
|
|
37
|
+
* nothing, so it is safe to open a fresh connection and send it again.
|
|
38
|
+
*/
|
|
39
|
+
function sessionGone(err) {
|
|
40
|
+
return err instanceof StreamableHTTPError && err.code === 404;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The API was not listening (a restart window). The request never left this
|
|
44
|
+
* machine, so replaying it cannot run anything twice. Any other network
|
|
45
|
+
* failure might have reached the server, so it is not replayed.
|
|
46
|
+
*/
|
|
47
|
+
function neverSent(err) {
|
|
48
|
+
let cause = err;
|
|
49
|
+
for (let depth = 0; depth < 4 && cause instanceof Error; depth += 1) {
|
|
50
|
+
if (cause.code === 'ECONNREFUSED')
|
|
51
|
+
return true;
|
|
52
|
+
cause = cause.cause;
|
|
53
|
+
}
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
33
56
|
/**
|
|
34
57
|
* A server that answers every request by asking the hosted one.
|
|
35
58
|
*
|
|
@@ -37,21 +60,108 @@ export async function connectUpstream(options) {
|
|
|
37
60
|
* value of the hosted error catalogue is its `fix` field, and a proxy that
|
|
38
61
|
* rewrote refusals into its own words would throw that away at exactly the
|
|
39
62
|
* moment the agent needs it.
|
|
63
|
+
*
|
|
64
|
+
* DX-4: it says what the hosted server says at initialize (its
|
|
65
|
+
* `instructions`), passes on `notifications/tools/list_changed`, and, given
|
|
66
|
+
* the options it connected with, opens a fresh upstream connection when the
|
|
67
|
+
* hosted one is gone instead of failing every call until the host restarts.
|
|
40
68
|
*/
|
|
41
|
-
export function createProxyServer(
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
server
|
|
51
|
-
|
|
69
|
+
export function createProxyServer(first, options) {
|
|
70
|
+
let upstream = first;
|
|
71
|
+
let reconnecting = null;
|
|
72
|
+
/**
|
|
73
|
+
* `list_more_tools` calls that added tools to the upstream session's list.
|
|
74
|
+
* A fresh session starts at the default list, so they are replayed on it.
|
|
75
|
+
*/
|
|
76
|
+
const moreToolsCalls = new Map();
|
|
77
|
+
const instructions = first.getInstructions();
|
|
78
|
+
const server = new Server({ name: SERVER_NAME, version: SERVER_VERSION }, {
|
|
79
|
+
capabilities: { tools: { listChanged: true }, resources: {}, prompts: {} },
|
|
80
|
+
...(instructions !== undefined ? { instructions } : {}),
|
|
81
|
+
});
|
|
82
|
+
const forwardListChanges = (client) => {
|
|
83
|
+
client.setNotificationHandler(ToolListChangedNotificationSchema, async () => {
|
|
84
|
+
await server.sendToolListChanged();
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
forwardListChanges(first);
|
|
88
|
+
/**
|
|
89
|
+
* Calls still waiting on each connection. A replaced connection is closed
|
|
90
|
+
* only once none are: closing it earlier would cut off a call that may
|
|
91
|
+
* already have run, and that call must not be replayed.
|
|
92
|
+
*/
|
|
93
|
+
const inFlight = new Map();
|
|
94
|
+
const retireIfIdle = (client) => {
|
|
95
|
+
if (client === upstream || (inFlight.get(client) ?? 0) > 0)
|
|
96
|
+
return;
|
|
97
|
+
inFlight.delete(client);
|
|
98
|
+
void client.close().catch(() => undefined);
|
|
99
|
+
};
|
|
100
|
+
/** One reconnect for every call that met the same dead connection. */
|
|
101
|
+
function reconnect(stale, connectOptions) {
|
|
102
|
+
if (upstream !== stale)
|
|
103
|
+
return Promise.resolve(upstream);
|
|
104
|
+
reconnecting ??= (async () => {
|
|
105
|
+
try {
|
|
106
|
+
const fresh = await connectUpstream(connectOptions);
|
|
107
|
+
forwardListChanges(fresh);
|
|
108
|
+
try {
|
|
109
|
+
for (const args of moreToolsCalls.values()) {
|
|
110
|
+
await fresh.callTool({ name: 'list_more_tools', arguments: args });
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
// Not adopted, so nothing else would ever close it.
|
|
115
|
+
void fresh.close().catch(() => undefined);
|
|
116
|
+
throw err;
|
|
117
|
+
}
|
|
118
|
+
upstream = fresh;
|
|
119
|
+
retireIfIdle(stale);
|
|
120
|
+
return fresh;
|
|
121
|
+
}
|
|
122
|
+
finally {
|
|
123
|
+
reconnecting = null;
|
|
124
|
+
}
|
|
125
|
+
})();
|
|
126
|
+
return reconnecting;
|
|
127
|
+
}
|
|
128
|
+
async function on(client, call) {
|
|
129
|
+
inFlight.set(client, (inFlight.get(client) ?? 0) + 1);
|
|
130
|
+
try {
|
|
131
|
+
return await call(client);
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
inFlight.set(client, (inFlight.get(client) ?? 1) - 1);
|
|
135
|
+
retireIfIdle(client);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
async function withUpstream(call) {
|
|
139
|
+
const client = reconnecting !== null ? await reconnecting : upstream;
|
|
140
|
+
try {
|
|
141
|
+
return await on(client, call);
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
if (!options || !(sessionGone(err) || neverSent(err)))
|
|
145
|
+
throw err;
|
|
146
|
+
return on(await reconnect(client, options), call);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => withUpstream((client) => client.listTools()));
|
|
150
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
151
|
+
const args = (request.params.arguments ?? {});
|
|
152
|
+
const result = await withUpstream((client) => client.callTool({ name: request.params.name, arguments: args }));
|
|
153
|
+
if (request.params.name === 'list_more_tools' && result.isError !== true) {
|
|
154
|
+
moreToolsCalls.set(JSON.stringify(args), args);
|
|
155
|
+
}
|
|
156
|
+
return result;
|
|
157
|
+
});
|
|
158
|
+
server.setRequestHandler(ListResourcesRequestSchema, async () => withUpstream((client) => client.listResources()));
|
|
159
|
+
server.setRequestHandler(ReadResourceRequestSchema, async (request) => withUpstream((client) => client.readResource({ uri: request.params.uri })));
|
|
160
|
+
server.setRequestHandler(ListPromptsRequestSchema, async () => withUpstream((client) => client.listPrompts()));
|
|
161
|
+
server.setRequestHandler(GetPromptRequestSchema, async (request) => withUpstream((client) => client.getPrompt({
|
|
52
162
|
name: request.params.name,
|
|
53
163
|
...(request.params.arguments !== undefined ? { arguments: request.params.arguments } : {}),
|
|
54
|
-
}));
|
|
164
|
+
})));
|
|
55
165
|
return server;
|
|
56
166
|
}
|
|
57
167
|
//# sourceMappingURL=proxy.js.map
|
package/dist/proxy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agentisend/mcp-server",
|
|
3
3
|
"mcpName": "io.github.fortuneflick/agentisend",
|
|
4
|
-
"version": "0.1.
|
|
5
|
-
"description": "AgentiSend is a transactional email API for AI agents: send
|
|
4
|
+
"version": "0.1.3",
|
|
5
|
+
"description": "AgentiSend is a transactional email API for AI agents: send receipts, password resets, sign-in codes and alerts from your own verified domain, with a message log, spend budgets, a free preflight and refusals that name the fix. The hosted MCP server at https://api.agentisend.com/mcp exposes 84 tools (44 on tools/list; the rest via list_more_tools) for sending, domain setup, templates, contacts, broadcasts, webhooks and delivery logs. A send is one message or a batch of up to 500 items with per-item results. preflight_email runs every gate a real send runs, sends nothing, and costs nothing. Every refusal returns a code, a message and the fix. A loop guard holds repeated sends for a person. You can cap what each agent spends, and stop all sending with a kill switch. There is no tool for unsolicited mail. Sign in with OAuth 2.1 and dynamic client registration, or use an API key. Starter prompts: \"Send this receipt to the customer.\" \"Preflight this send and tell me what would stop it.\" \"What can I spend today?\"",
|
|
6
|
+
"author": "AgentiSend <hello@agentisend.com>",
|
|
6
7
|
"type": "module",
|
|
7
8
|
"license": "MIT",
|
|
8
9
|
"homepage": "https://agentisend.com/docs",
|
|
@@ -23,7 +24,9 @@
|
|
|
23
24
|
"Claude",
|
|
24
25
|
"Cursor",
|
|
25
26
|
"agent budget",
|
|
26
|
-
"sending domain"
|
|
27
|
+
"sending domain",
|
|
28
|
+
"email deliverability",
|
|
29
|
+
"email for AI agents"
|
|
27
30
|
],
|
|
28
31
|
"engines": {
|
|
29
32
|
"node": ">=20"
|
|
@@ -46,7 +49,7 @@
|
|
|
46
49
|
"server.json"
|
|
47
50
|
],
|
|
48
51
|
"dependencies": {
|
|
49
|
-
"@modelcontextprotocol/sdk": "^1.30.
|
|
52
|
+
"@modelcontextprotocol/sdk": "^1.30.1"
|
|
50
53
|
},
|
|
51
54
|
"devDependencies": {
|
|
52
55
|
"typescript": "^5.6.0",
|
package/server.json
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
|
|
3
3
|
"name": "io.github.fortuneflick/agentisend",
|
|
4
4
|
"title": "AgentiSend",
|
|
5
|
-
"description": "AgentiSend is a transactional email API for AI agents: send
|
|
6
|
-
"version": "0.1.
|
|
5
|
+
"description": "AgentiSend is a transactional email API for AI agents: send receipts, password resets, sign-in codes and alerts from your own verified domain, with a message log, spend budgets, a free preflight and refusals that name the fix. The hosted MCP server at https://api.agentisend.com/mcp exposes 84 tools (44 on tools/list; the rest via list_more_tools) for sending, domain setup, templates, contacts, broadcasts, webhooks and delivery logs. A send is one message or a batch of up to 500 items with per-item results. preflight_email runs every gate a real send runs, sends nothing, and costs nothing. Every refusal returns a code, a message and the fix. A loop guard holds repeated sends for a person. You can cap what each agent spends, and stop all sending with a kill switch. There is no tool for unsolicited mail. Sign in with OAuth 2.1 and dynamic client registration, or use an API key. Starter prompts: \"Send this receipt to the customer.\" \"Preflight this send and tell me what would stop it.\" \"What can I spend today?\"",
|
|
6
|
+
"version": "0.1.3",
|
|
7
|
+
|
|
7
8
|
"websiteUrl": "https://agentisend.com/docs/guides/mcp",
|
|
8
9
|
"repository": {
|
|
9
10
|
"url": "https://github.com/fortuneflick/agentisend",
|
|
@@ -15,7 +16,7 @@
|
|
|
15
16
|
"registryType": "npm",
|
|
16
17
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
17
18
|
"identifier": "@agentisend/mcp-server",
|
|
18
|
-
"version": "0.1.
|
|
19
|
+
"version": "0.1.3",
|
|
19
20
|
"transport": { "type": "stdio" },
|
|
20
21
|
"environmentVariables": [
|
|
21
22
|
{
|