@agentisend/mcp-server 0.1.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 ADDED
@@ -0,0 +1,32 @@
1
+ <img src="https://agentisend.com/brand/lockup-horizontal-light.png#gh-light-mode-only" alt="AgentiSend" width="200" />
2
+ <img src="https://agentisend.com/brand/lockup-horizontal-dark.png#gh-dark-mode-only" alt="AgentiSend" width="200" />
3
+
4
+ # @agentisend/mcp-server
5
+
6
+ AgentiSend's MCP server, over stdio — for clients that launch a command and
7
+ talk over pipes rather than speaking HTTP MCP.
8
+
9
+ ```json
10
+ {
11
+ "mcpServers": {
12
+ "agentisend": {
13
+ "command": "npx",
14
+ "args": ["-y", "@agentisend/mcp-server"],
15
+ "env": { "AGENTISEND_API_KEY": "as_..." }
16
+ }
17
+ }
18
+ }
19
+ ```
20
+
21
+ | Variable | Required | Meaning |
22
+ |---|---|---|
23
+ | `AGENTISEND_API_KEY` | yes | Your API key. Read from the environment only — never passed as an argument, because process arguments are visible to every other process on the machine. |
24
+ | `AGENTISEND_MCP_URL` | no | Defaults to `https://api.agentisend.com/mcp`. |
25
+
26
+ It is a proxy, not a second implementation: every tool, resource and prompt is
27
+ forwarded to the hosted server with your key, so what you get here is exactly
28
+ what an HTTP client gets — the same catalogue, the same budget, the same stops,
29
+ and refusals with their `fix` field intact.
30
+
31
+ `--help` prints the config above. `--version` prints the version. Both work
32
+ without a key.
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export declare const DEFAULT_URL = "https://api.agentisend.com/mcp";
3
+ export declare function main(argv?: string[], env?: NodeJS.ProcessEnv): Promise<number>;
package/dist/cli.js ADDED
@@ -0,0 +1,105 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * The launcher an MCP client runs: `npx -y @agentisend/mcp-server`.
4
+ *
5
+ * Everything it needs comes from the environment, because that is what MCP
6
+ * client configs can set. Nothing is read from a file and no credential is
7
+ * ever accepted as an argument — process arguments are visible to every other
8
+ * process on the machine.
9
+ */
10
+ import { realpathSync } from 'node:fs';
11
+ import { resolve } from 'node:path';
12
+ import { fileURLToPath } from 'node:url';
13
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
14
+ import { connectUpstream, createProxyServer, SERVER_VERSION } from './proxy.js';
15
+ export const DEFAULT_URL = 'https://api.agentisend.com/mcp';
16
+ const USAGE = `agentisend-mcp — AgentiSend's MCP server, over stdio.
17
+
18
+ Run it from an MCP client config; it speaks on stdin/stdout and logs to stderr.
19
+
20
+ Environment:
21
+ AGENTISEND_API_KEY Required. Your API key (as_…).
22
+ AGENTISEND_MCP_URL Optional. Defaults to ${DEFAULT_URL}.
23
+
24
+ Example client config:
25
+ {
26
+ "mcpServers": {
27
+ "agentisend": {
28
+ "command": "npx",
29
+ "args": ["-y", "@agentisend/mcp-server"],
30
+ "env": { "AGENTISEND_API_KEY": "as_…" }
31
+ }
32
+ }
33
+ }
34
+
35
+ Every tool, resource and prompt comes from the hosted server, so what you get
36
+ here is exactly what an HTTP client gets — including the budget and the stops.`;
37
+ export async function main(argv = process.argv.slice(2), env = process.env) {
38
+ if (argv.includes('--help') || argv.includes('-h')) {
39
+ process.stdout.write(`${USAGE}\n`);
40
+ return 0;
41
+ }
42
+ if (argv.includes('--version') || argv.includes('-v')) {
43
+ process.stdout.write(`${SERVER_VERSION}\n`);
44
+ return 0;
45
+ }
46
+ const apiKey = env['AGENTISEND_API_KEY'];
47
+ if (!apiKey) {
48
+ // stderr, not stdout: stdout is the protocol channel and a stray line on
49
+ // it is a parse error in the client rather than a message anyone reads.
50
+ process.stderr.write('AGENTISEND_API_KEY is not set, so there is nothing to authenticate with. ' +
51
+ 'Set it in your MCP client config (env), then start the client again. ' +
52
+ 'Run with --help for an example.\n');
53
+ return 1;
54
+ }
55
+ const url = env['AGENTISEND_MCP_URL'] ?? DEFAULT_URL;
56
+ try {
57
+ const upstream = await connectUpstream({ url, apiKey });
58
+ const server = createProxyServer(upstream);
59
+ await server.connect(new StdioServerTransport());
60
+ process.stderr.write(`agentisend-mcp connected to ${url}\n`);
61
+ return 0;
62
+ }
63
+ catch (err) {
64
+ const detail = err instanceof Error ? err.message : String(err);
65
+ process.stderr.write(`Could not reach the AgentiSend MCP server at ${url}: ${detail}\n` +
66
+ 'Check AGENTISEND_MCP_URL and that the key is valid, then start the client again.\n');
67
+ return 1;
68
+ }
69
+ }
70
+ /**
71
+ * True only when this file is the process entrypoint. `import.meta.url` alone
72
+ * is not enough — anything that imports this module for its exports would run
73
+ * the command as a side effect of the import — and a plain path comparison is
74
+ * not enough either: an installed `bin` is a symlink, so argv[1] is the link
75
+ * and the module URL is its target. Both sides are resolved through the real
76
+ * path before they are compared.
77
+ */
78
+ function invokedDirectly() {
79
+ const entry = process.argv[1];
80
+ if (entry === undefined)
81
+ return false;
82
+ try {
83
+ const real = (path) => {
84
+ try {
85
+ return realpathSync(path);
86
+ }
87
+ catch {
88
+ return resolve(path);
89
+ }
90
+ };
91
+ return real(entry) === real(fileURLToPath(import.meta.url));
92
+ }
93
+ catch {
94
+ return false;
95
+ }
96
+ }
97
+ if (invokedDirectly()) {
98
+ const code = await main();
99
+ // A successful start keeps the process alive on the stdio transport; only a
100
+ // failure or a one-shot flag exits here.
101
+ if (code !== 0 || process.argv.slice(2).some((arg) => arg.startsWith('-'))) {
102
+ process.exit(code);
103
+ }
104
+ }
105
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { connectUpstream, createProxyServer, SERVER_NAME, SERVER_VERSION } from './proxy.js';
2
+ export { DEFAULT_URL, main } from './cli.js';
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { connectUpstream, createProxyServer, SERVER_NAME, SERVER_VERSION } from './proxy.js';
2
+ export { DEFAULT_URL, main } from './cli.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * M5.28 — the local stdio server.
3
+ *
4
+ * Plenty of MCP clients still only speak stdio: they launch a command and talk
5
+ * to it over pipes. AgentiSend's server is HTTP, so those clients could not
6
+ * reach it at all — which for a product whose whole pitch is "agents are
7
+ * first-class" is the wrong door to leave locked.
8
+ *
9
+ * It is a PROXY, deliberately, not a second implementation. Every tool,
10
+ * resource and prompt is forwarded to the hosted server with the caller's own
11
+ * API key, so the local surface is the hosted surface by construction rather
12
+ * than by discipline: there is no catalogue here to drift, no gate to
13
+ * re-enforce, and no budget kept in two places. The one thing this process
14
+ * adds is the transport.
15
+ */
16
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
17
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
18
+ import type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';
19
+ export declare const SERVER_NAME = "agentisend-local";
20
+ export declare const SERVER_VERSION = "0.1.0";
21
+ export interface ProxyOptions {
22
+ /** Where the hosted MCP endpoint lives, e.g. https://api.agentisend.com/mcp */
23
+ url: string;
24
+ /** The caller's own credential. Never logged, never echoed back. */
25
+ apiKey: string;
26
+ /** Injectable so tests can drive the pair without spawning a process. */
27
+ clientTransportFactory?: (url: URL, apiKey: string) => Transport;
28
+ }
29
+ /** The upstream connection, opened once and reused for every forwarded call. */
30
+ export declare function connectUpstream(options: ProxyOptions): Promise<Client>;
31
+ /**
32
+ * A server that answers every request by asking the hosted one.
33
+ *
34
+ * Errors are forwarded as they arrive rather than being reshaped: the whole
35
+ * value of the hosted error catalogue is its `fix` field, and a proxy that
36
+ * rewrote refusals into its own words would throw that away at exactly the
37
+ * moment the agent needs it.
38
+ */
39
+ export declare function createProxyServer(upstream: Client): Server;
package/dist/proxy.js ADDED
@@ -0,0 +1,57 @@
1
+ /**
2
+ * M5.28 — the local stdio server.
3
+ *
4
+ * Plenty of MCP clients still only speak stdio: they launch a command and talk
5
+ * to it over pipes. AgentiSend's server is HTTP, so those clients could not
6
+ * reach it at all — which for a product whose whole pitch is "agents are
7
+ * first-class" is the wrong door to leave locked.
8
+ *
9
+ * It is a PROXY, deliberately, not a second implementation. Every tool,
10
+ * resource and prompt is forwarded to the hosted server with the caller's own
11
+ * API key, so the local surface is the hosted surface by construction rather
12
+ * than by discipline: there is no catalogue here to drift, no gate to
13
+ * re-enforce, and no budget kept in two places. The one thing this process
14
+ * adds is the transport.
15
+ */
16
+ import { Client } from '@modelcontextprotocol/sdk/client/index.js';
17
+ import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
18
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
19
+ import { CallToolRequestSchema, GetPromptRequestSchema, ListPromptsRequestSchema, ListResourcesRequestSchema, ListToolsRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
20
+ export const SERVER_NAME = 'agentisend-local';
21
+ export const SERVER_VERSION = '0.1.0';
22
+ /** The upstream connection, opened once and reused for every forwarded call. */
23
+ export async function connectUpstream(options) {
24
+ const client = new Client({ name: SERVER_NAME, version: SERVER_VERSION }, { capabilities: {} });
25
+ const url = new URL(options.url);
26
+ const transport = options.clientTransportFactory?.(url, options.apiKey) ??
27
+ new StreamableHTTPClientTransport(url, {
28
+ requestInit: { headers: { authorization: `Bearer ${options.apiKey}` } },
29
+ });
30
+ await client.connect(transport);
31
+ return client;
32
+ }
33
+ /**
34
+ * A server that answers every request by asking the hosted one.
35
+ *
36
+ * Errors are forwarded as they arrive rather than being reshaped: the whole
37
+ * value of the hosted error catalogue is its `fix` field, and a proxy that
38
+ * rewrote refusals into its own words would throw that away at exactly the
39
+ * moment the agent needs it.
40
+ */
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({
52
+ name: request.params.name,
53
+ ...(request.params.arguments !== undefined ? { arguments: request.params.arguments } : {}),
54
+ }));
55
+ return server;
56
+ }
57
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@agentisend/mcp-server",
3
+ "version": "0.1.0",
4
+ "description": "Run AgentiSend's MCP server locally over stdio, for clients that cannot speak HTTP MCP.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "bin": {
8
+ "agentisend-mcp": "dist/cli.js"
9
+ },
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md",
19
+ "server.json"
20
+ ],
21
+ "engines": {
22
+ "node": ">=20"
23
+ },
24
+ "scripts": {
25
+ "build": "tsc -p tsconfig.build.json",
26
+ "typecheck": "tsc --noEmit",
27
+ "test": "vitest run",
28
+ "prepublishOnly": "pnpm run build"
29
+ },
30
+ "dependencies": {
31
+ "@modelcontextprotocol/sdk": "^1.30.0"
32
+ },
33
+ "devDependencies": {
34
+ "typescript": "^5.6.0",
35
+ "vitest": "^3.0.0"
36
+ }
37
+ }
package/server.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
+ "name": "com.agentisend/mcp-server",
4
+ "title": "AgentiSend",
5
+ "description": "Run AgentiSend's MCP server locally over stdio, for clients that cannot speak HTTP MCP.",
6
+ "version": "0.1.0",
7
+ "websiteUrl": "https://agentisend.com/docs/guides/mcp",
8
+ "repository": {
9
+ "url": "https://github.com/fortuneflick/agentisend",
10
+ "source": "github",
11
+ "subfolder": "packages/mcp-server"
12
+ },
13
+ "packages": [
14
+ {
15
+ "registryType": "npm",
16
+ "registryBaseUrl": "https://registry.npmjs.org",
17
+ "identifier": "@agentisend/mcp-server",
18
+ "version": "0.1.0",
19
+ "transport": { "type": "stdio" },
20
+ "environmentVariables": [
21
+ {
22
+ "name": "AGENTISEND_API_KEY",
23
+ "description": "Your AgentiSend API key. Read from the environment only, never passed as an argument, because process arguments are visible to every other process on the machine.",
24
+ "isRequired": true,
25
+ "isSecret": true,
26
+ "format": "string"
27
+ },
28
+ {
29
+ "name": "AGENTISEND_MCP_URL",
30
+ "description": "The hosted endpoint this launcher proxies to. Defaults to https://api.agentisend.com/mcp.",
31
+ "isRequired": false,
32
+ "isSecret": false,
33
+ "default": "https://api.agentisend.com/mcp",
34
+ "format": "string"
35
+ }
36
+ ]
37
+ }
38
+ ],
39
+ "remotes": [
40
+ {
41
+ "type": "streamable-http",
42
+ "url": "https://api.agentisend.com/mcp",
43
+ "headers": [
44
+ {
45
+ "name": "Authorization",
46
+ "description": "Bearer <your API key>. OAuth 2.1 reaches the same tools with the same ceilings.",
47
+ "isRequired": true,
48
+ "isSecret": true,
49
+ "format": "string"
50
+ }
51
+ ]
52
+ }
53
+ ]
54
+ }