@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 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":"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"}
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.2";
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
- /** The upstream connection, opened once and reused for every forwarded call. */
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(upstream: Client): Server;
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.2';
22
- /** The upstream connection, opened once and reused for every forwarded call. */
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(upstream) {
42
- const server = new Server({ name: SERVER_NAME, version: SERVER_VERSION }, { capabilities: { tools: {}, resources: {}, prompts: {} } });
43
- server.setRequestHandler(ListToolsRequestSchema, async () => await upstream.listTools());
44
- server.setRequestHandler(CallToolRequestSchema, async (request) => upstream.callTool({
45
- name: request.params.name,
46
- arguments: (request.params.arguments ?? {}),
47
- }));
48
- server.setRequestHandler(ListResourcesRequestSchema, async () => await upstream.listResources());
49
- server.setRequestHandler(ReadResourceRequestSchema, async (request) => upstream.readResource({ uri: request.params.uri }));
50
- server.setRequestHandler(ListPromptsRequestSchema, async () => await upstream.listPrompts());
51
- server.setRequestHandler(GetPromptRequestSchema, async (request) => upstream.getPrompt({
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":"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"}
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.2",
5
- "description": "AgentiSend is a transactional email API for AI agents: send through verified domains, with a budget each sender cannot exceed and a kill switch a person can flip. The hosted MCP server at https://api.agentisend.com/mcp exposes 81 tools (43 on tools/list; the rest via list_more_tools). 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 4xx returns code, message, and fix. There is no tool for unsolicited mail. Auth is a bearer API key or OAuth 2.1 with dynamic client registration. Starter prompts: \"Send this receipt to the customer.\" \"Preflight this send and tell me what would stop it.\" \"What can I spend today?\"",
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.0"
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 through verified domains, with a budget each sender cannot exceed and a kill switch a person can flip. The hosted MCP server at https://api.agentisend.com/mcp exposes 81 tools (43 on tools/list; the rest via list_more_tools). 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 4xx returns code, message, and fix. There is no tool for unsolicited mail. Auth is a bearer API key or OAuth 2.1 with dynamic client registration. 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.2",
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.2",
19
+ "version": "0.1.3",
19
20
  "transport": { "type": "stdio" },
20
21
  "environmentVariables": [
21
22
  {