@automatey-org/mcp 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/node/index.d.ts +11 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +9 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/manager.d.ts +39 -0
- package/dist/node/manager.d.ts.map +1 -0
- package/dist/node/manager.js +160 -0
- package/dist/node/manager.js.map +1 -0
- package/dist/node/types.d.ts +24 -0
- package/dist/node/types.d.ts.map +1 -0
- package/dist/node/types.js +2 -0
- package/dist/node/types.js.map +1 -0
- package/package.json +12 -2
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node-only MCP helpers (`@automatey-org/mcp/node`).
|
|
3
|
+
*
|
|
4
|
+
* A multi-server MCP client manager over stdio + Streamable HTTP. Separate from
|
|
5
|
+
* the browser-safe main entry (`@automatey-org/mcp`) so bundled/web consumers
|
|
6
|
+
* never pull in `undici` / `node:fs`.
|
|
7
|
+
*/
|
|
8
|
+
export { MCPClientManager } from "./manager.js";
|
|
9
|
+
export type { MCPConnection, MCPClientManagerOptions } from "./manager.js";
|
|
10
|
+
export type { MCPServerConfig, MCPTool, MCPLogger } from "./types.js";
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,YAAY,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC3E,YAAY,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node-only MCP helpers (`@automatey-org/mcp/node`).
|
|
3
|
+
*
|
|
4
|
+
* A multi-server MCP client manager over stdio + Streamable HTTP. Separate from
|
|
5
|
+
* the browser-safe main entry (`@automatey-org/mcp`) so bundled/web consumers
|
|
6
|
+
* never pull in `undici` / `node:fs`.
|
|
7
|
+
*/
|
|
8
|
+
export { MCPClientManager } from "./manager.js";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
2
|
+
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
3
|
+
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
4
|
+
import type { MCPLogger, MCPServerConfig, MCPTool } from "./types.js";
|
|
5
|
+
export interface MCPConnection {
|
|
6
|
+
name: string;
|
|
7
|
+
config: MCPServerConfig;
|
|
8
|
+
client: Client;
|
|
9
|
+
transport: StreamableHTTPClientTransport | StdioClientTransport;
|
|
10
|
+
connected: boolean;
|
|
11
|
+
tools: MCPTool[];
|
|
12
|
+
}
|
|
13
|
+
export interface MCPClientManagerOptions {
|
|
14
|
+
/** Client identity advertised during `initialize`. */
|
|
15
|
+
clientName?: string;
|
|
16
|
+
clientVersion?: string;
|
|
17
|
+
/** Optional debug logger. */
|
|
18
|
+
logger?: MCPLogger;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Manages multiple MCP server connections over stdio + Streamable HTTP.
|
|
22
|
+
* Provider-agnostic Node helper shared by the Automatey CLI and Memento CLI.
|
|
23
|
+
*/
|
|
24
|
+
export declare class MCPClientManager {
|
|
25
|
+
private connections;
|
|
26
|
+
private readonly clientName;
|
|
27
|
+
private readonly clientVersion;
|
|
28
|
+
private readonly logger;
|
|
29
|
+
constructor(options?: MCPClientManagerOptions);
|
|
30
|
+
connectServer(name: string, config: MCPServerConfig): Promise<void>;
|
|
31
|
+
disconnectServer(name: string): Promise<void>;
|
|
32
|
+
disconnectAll(): Promise<void>;
|
|
33
|
+
getConnection(name: string): MCPConnection | undefined;
|
|
34
|
+
isConnected(name: string): boolean;
|
|
35
|
+
listConnections(): MCPConnection[];
|
|
36
|
+
getAllTools(): MCPTool[];
|
|
37
|
+
callTool(serverName: string, toolName: string, args: unknown): Promise<unknown>;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/node/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AAEnG,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AA8CtE,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,6BAA6B,GAAG,oBAAoB,CAAC;IAChE,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,sDAAsD;IACtD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,WAAW,CAAyC;IAE5D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IAEpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IAEvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;gBAEvB,OAAO,GAAE,uBAA4B;IAM3C,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAmEnE,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAW7C,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAIpC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAItD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIlC,eAAe,IAAI,aAAa,EAAE;IAIlC,WAAW,IAAI,OAAO,EAAE;IAIlB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;CAiBtF"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
2
|
+
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
3
|
+
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
|
|
4
|
+
import { readFileSync } from "node:fs";
|
|
5
|
+
/**
|
|
6
|
+
* Load a TLS CA certificate for verifying self-signed localhost certs.
|
|
7
|
+
* Set `MEMENTO_CA_CERT` to the path of the CA cert (e.g. memento/certs/cert.pem).
|
|
8
|
+
*/
|
|
9
|
+
function loadCaCert() {
|
|
10
|
+
const certPath = process.env["MEMENTO_CA_CERT"];
|
|
11
|
+
if (!certPath)
|
|
12
|
+
return undefined;
|
|
13
|
+
try {
|
|
14
|
+
return readFileSync(certPath);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Lazily-loaded insecure fetch for loopback / dev servers with self-signed certs.
|
|
22
|
+
* `undici` is imported dynamically so stdio-only code paths never load it, and to
|
|
23
|
+
* avoid a hard requirement of undici@8 (Node >=22) at module load.
|
|
24
|
+
* Prefers CA-cert pinning; falls back to bypassing TLS only for loopback.
|
|
25
|
+
*/
|
|
26
|
+
async function createInsecureFetch() {
|
|
27
|
+
const { Agent, fetch: undiciFetch } = await import("undici");
|
|
28
|
+
const ca = loadCaCert();
|
|
29
|
+
// nosemgrep: javascript.lang.security.audit.node.tls.tls-reject-unauthorized — localhost-only, CA cert not configured (set MEMENTO_CA_CERT)
|
|
30
|
+
const agent = ca
|
|
31
|
+
? new Agent({ connect: { ca } })
|
|
32
|
+
: new Agent({ connect: { rejectUnauthorized: false } }); // nosemgrep
|
|
33
|
+
return (url, init) => undiciFetch(url, {
|
|
34
|
+
...init,
|
|
35
|
+
dispatcher: agent,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/** True for loopback URLs — dev HTTPS on loopback always uses self-signed certs. */
|
|
39
|
+
function isLocalhostUrl(url) {
|
|
40
|
+
try {
|
|
41
|
+
const { hostname } = new URL(url);
|
|
42
|
+
return hostname === "localhost" || hostname === "::1" || hostname.startsWith("127.");
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Manages multiple MCP server connections over stdio + Streamable HTTP.
|
|
50
|
+
* Provider-agnostic Node helper shared by the Automatey CLI and Memento CLI.
|
|
51
|
+
*/
|
|
52
|
+
export class MCPClientManager {
|
|
53
|
+
connections = new Map();
|
|
54
|
+
clientName;
|
|
55
|
+
clientVersion;
|
|
56
|
+
logger;
|
|
57
|
+
constructor(options = {}) {
|
|
58
|
+
this.clientName = options.clientName ?? "automatey-mcp";
|
|
59
|
+
this.clientVersion = options.clientVersion ?? "0.1.0";
|
|
60
|
+
this.logger = options.logger ?? {};
|
|
61
|
+
}
|
|
62
|
+
async connectServer(name, config) {
|
|
63
|
+
if (this.connections.has(name)) {
|
|
64
|
+
throw new Error(`Server "${name}" is already connected`);
|
|
65
|
+
}
|
|
66
|
+
if (config.env && Object.keys(config.env).length > 0) {
|
|
67
|
+
for (const [key, value] of Object.entries(config.env)) {
|
|
68
|
+
if (key !== "NODE_TLS_REJECT_UNAUTHORIZED") {
|
|
69
|
+
process.env[key] = value;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
let transport;
|
|
75
|
+
const useHTTP = !config.command && !!config.url;
|
|
76
|
+
if (useHTTP) {
|
|
77
|
+
const insecure = config.env?.["NODE_TLS_REJECT_UNAUTHORIZED"] === "0" || isLocalhostUrl(config.url);
|
|
78
|
+
transport = new StreamableHTTPClientTransport(new URL(config.url), {
|
|
79
|
+
requestInit: config.headers ? { headers: config.headers } : undefined,
|
|
80
|
+
fetch: insecure ? await createInsecureFetch() : undefined,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
if (!config.command) {
|
|
85
|
+
throw new Error(`Server "${name}" has neither a url nor a command`);
|
|
86
|
+
}
|
|
87
|
+
transport = new StdioClientTransport({
|
|
88
|
+
command: config.command,
|
|
89
|
+
args: config.args,
|
|
90
|
+
env: config.env
|
|
91
|
+
? { ...process.env, ...config.env }
|
|
92
|
+
: undefined,
|
|
93
|
+
cwd: config.cwd,
|
|
94
|
+
stderr: "pipe",
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
const client = new Client({ name: this.clientName, version: this.clientVersion }, { capabilities: {} });
|
|
98
|
+
await client.connect(transport);
|
|
99
|
+
const toolsList = await client.listTools();
|
|
100
|
+
let tools = (toolsList.tools ?? []).map((t) => ({
|
|
101
|
+
name: t.name,
|
|
102
|
+
description: t.description || "",
|
|
103
|
+
inputSchema: t.inputSchema,
|
|
104
|
+
serverName: name,
|
|
105
|
+
}));
|
|
106
|
+
if (config.tools && config.tools.length > 0) {
|
|
107
|
+
const allowSet = new Set(config.tools);
|
|
108
|
+
tools = tools.filter((t) => allowSet.has(t.name));
|
|
109
|
+
}
|
|
110
|
+
this.connections.set(name, { name, config, client, transport, connected: true, tools });
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
throw new Error(`Failed to connect to server "${name}": ${error instanceof Error ? error.message : String(error)}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async disconnectServer(name) {
|
|
117
|
+
const conn = this.connections.get(name);
|
|
118
|
+
if (!conn)
|
|
119
|
+
return;
|
|
120
|
+
try {
|
|
121
|
+
await conn.client.close();
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
// ignore
|
|
125
|
+
}
|
|
126
|
+
this.connections.delete(name);
|
|
127
|
+
}
|
|
128
|
+
async disconnectAll() {
|
|
129
|
+
await Promise.allSettled([...this.connections.keys()].map((n) => this.disconnectServer(n)));
|
|
130
|
+
}
|
|
131
|
+
getConnection(name) {
|
|
132
|
+
return this.connections.get(name);
|
|
133
|
+
}
|
|
134
|
+
isConnected(name) {
|
|
135
|
+
return this.connections.get(name)?.connected === true;
|
|
136
|
+
}
|
|
137
|
+
listConnections() {
|
|
138
|
+
return [...this.connections.values()];
|
|
139
|
+
}
|
|
140
|
+
getAllTools() {
|
|
141
|
+
return [...this.connections.values()].flatMap((c) => c.tools);
|
|
142
|
+
}
|
|
143
|
+
async callTool(serverName, toolName, args) {
|
|
144
|
+
const conn = this.connections.get(serverName);
|
|
145
|
+
if (!conn?.connected)
|
|
146
|
+
throw new Error(`Server "${serverName}" not connected`);
|
|
147
|
+
try {
|
|
148
|
+
const result = await conn.client.callTool({
|
|
149
|
+
name: toolName,
|
|
150
|
+
arguments: args,
|
|
151
|
+
});
|
|
152
|
+
this.logger.debug?.("mcp:toolResult", { server: serverName, tool: toolName });
|
|
153
|
+
return result;
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
throw new Error(`Tool "${toolName}" on "${serverName}" failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/node/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Minimal server config the manager reads. Richer consumer configs are structurally assignable. */
|
|
2
|
+
export interface MCPServerConfig {
|
|
3
|
+
url?: string;
|
|
4
|
+
command?: string;
|
|
5
|
+
args?: string[];
|
|
6
|
+
env?: Record<string, string>;
|
|
7
|
+
/** Working directory for stdio servers. */
|
|
8
|
+
cwd?: string;
|
|
9
|
+
headers?: Record<string, string>;
|
|
10
|
+
/** Optional allowlist of tool names to expose from this server. */
|
|
11
|
+
tools?: string[];
|
|
12
|
+
}
|
|
13
|
+
/** A tool advertised by a connected MCP server, tagged with its origin server. */
|
|
14
|
+
export interface MCPTool {
|
|
15
|
+
name: string;
|
|
16
|
+
description: string;
|
|
17
|
+
inputSchema: unknown;
|
|
18
|
+
serverName: string;
|
|
19
|
+
}
|
|
20
|
+
/** Optional logger sink; defaults to a no-op. */
|
|
21
|
+
export interface MCPLogger {
|
|
22
|
+
debug?(message: string, meta?: unknown): void;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/node/types.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,2CAA2C;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,kFAAkF;AAClF,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,iDAAiD;AACjD,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC/C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/node/types.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@automatey-org/mcp",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Provider-agnostic MCP helpers for the Vercel AI SDK: a Streamable-HTTP MCP client and a buildMcpToolSet() that exposes MCP tools as AI SDK tools with destructive-tool gating and call/result callbacks.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -10,6 +10,10 @@
|
|
|
10
10
|
".": {
|
|
11
11
|
"types": "./dist/index.d.ts",
|
|
12
12
|
"default": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./node": {
|
|
15
|
+
"types": "./dist/node/index.d.ts",
|
|
16
|
+
"default": "./dist/node/index.js"
|
|
13
17
|
}
|
|
14
18
|
},
|
|
15
19
|
"files": ["dist", "README.md"],
|
|
@@ -21,12 +25,18 @@
|
|
|
21
25
|
},
|
|
22
26
|
"peerDependencies": {
|
|
23
27
|
"@modelcontextprotocol/sdk": ">=1.29 <2",
|
|
24
|
-
"ai": ">=7 <8"
|
|
28
|
+
"ai": ">=7 <8",
|
|
29
|
+
"undici": ">=6"
|
|
30
|
+
},
|
|
31
|
+
"peerDependenciesMeta": {
|
|
32
|
+
"undici": { "optional": true }
|
|
25
33
|
},
|
|
26
34
|
"devDependencies": {
|
|
27
35
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
36
|
+
"@types/node": "^22.0.0",
|
|
28
37
|
"ai": "^7.0.11",
|
|
29
38
|
"typescript": "^5.6.0",
|
|
39
|
+
"undici": "^6.0.0",
|
|
30
40
|
"vitest": "^4.1.2"
|
|
31
41
|
},
|
|
32
42
|
"license": "MIT",
|