Skip to content

Commit 6a223ca

Browse files
committed
fix: env setting
Signed-off-by: sunrabbit123 <[email protected]>
1 parent e678e70 commit 6a223ca

File tree

2 files changed

+59
-22
lines changed

2 files changed

+59
-22
lines changed

src/cli.ts

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,44 @@
1-
import type { Client } from "@modelcontextprotocol/sdk/client/index.js";
1+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
22

33
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
44
import { program } from "commander";
55

66
import { createServer } from "./server";
77
import { startSSEServer } from "./sse";
8+
import { connectMcp, McpConnection } from ".";
89

9-
export function buildCli(props: { version: string; name: string; adapter: Client }) {
10+
export function buildCli<T extends string>(props: { version: string; name: string; mcpServers: Record<T, McpConnection>; env: Record<string, T> }) {
1011
return program
1112
.version(props.version)
1213
.name(props.name)
1314
.option("--port <port>", "Port to listen on for SSE transport.")
1415
.action(async (options: unknown) => {
16+
const adapter = new Client({
17+
name: props.name,
18+
version: props.version,
19+
});
20+
await connectMcp({
21+
adapter,
22+
mcpServers: props.mcpServers,
23+
env: props.env,
24+
envMapper: process.env as Record<string, string>,
25+
});
26+
1527
if (typeof options === "object" && options !== null && "port" in options && (typeof options.port === "string" || typeof options.port === "number")) {
1628
console.log(`This server is running on SSE (http://localhost:${options.port}/sse?sessionId=<sessionId>)`);
1729
await startSSEServer({
1830
port: +options.port,
1931
name: props.name,
2032
version: props.version,
21-
adapter: props.adapter,
33+
adapter,
2234
});
2335
}
2436
else {
2537
console.log("This server is running on stdio");
2638
const server = createServer({
2739
name: props.name,
2840
version: props.version,
29-
adapter: props.adapter,
41+
adapter,
3042
});
3143
const transport = new StdioServerTransport();
3244
await server.connect(transport);

src/index.ts

Lines changed: 43 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -25,31 +25,35 @@ interface Props<T extends string> {
2525

2626
export async function bundler<T extends string>(props: Props<T>): Promise<{
2727
run: () => void;
28-
server: Server;
28+
createServer: (envList: Record<string, string>) => Promise<Server>;
2929
}> {
30-
const adapter = new Client({
31-
name: props.name,
32-
version: props.version,
33-
});
34-
await connectMcp({
35-
adapter,
36-
mcpServers: props.mcpServers,
37-
});
38-
39-
const server = createServer({
40-
name: props.name,
41-
version: props.version,
42-
adapter,
43-
});
4430
return {
4531
run: () => {
4632
buildCli({
4733
name: props.name,
4834
version: props.version,
49-
adapter,
35+
mcpServers: props.mcpServers,
36+
env: props.env,
5037
}).parse(process.argv);
5138
},
52-
server,
39+
createServer: async (envList: Record<string, string>) => {
40+
const adapter = new Client({
41+
name: props.name,
42+
version: props.version,
43+
});
44+
await connectMcp({
45+
adapter,
46+
mcpServers: props.mcpServers,
47+
envMapper: props.env,
48+
env: envList,
49+
});
50+
51+
return createServer({
52+
name: props.name,
53+
version: props.version,
54+
adapter,
55+
});
56+
},
5357
};
5458
}
5559

@@ -61,10 +65,14 @@ export async function bundler<T extends string>(props: Props<T>): Promise<{
6165
export async function connectMcp(props: {
6266
adapter: Client;
6367
mcpServers: Record<string, McpConnection>;
68+
envMapper: Record<string, string>;
69+
env: Record<string, string>;
6470
}) {
6571
const transports = await Promise.all(Object.entries(props.mcpServers).map(async ([name, setting]) => {
6672
// InMemory
6773
if (setting instanceof Server) {
74+
const env = extractEnvFromName(name, props.env, props.envMapper);
75+
Object.assign(process.env, env);
6876
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
6977
await setting.connect(serverTransport);
7078
return clientTransport;
@@ -77,7 +85,10 @@ export async function connectMcp(props: {
7785

7886
// Stdio
7987
if ("command" in setting) {
80-
return new StdioClientTransport(setting);
88+
return new StdioClientTransport({
89+
...setting,
90+
env: extractEnvFromName(name, props.env, props.envMapper),
91+
});
8192
}
8293

8394
setting satisfies never;
@@ -88,3 +99,17 @@ export async function connectMcp(props: {
8899
await props.adapter.connect(transport);
89100
}
90101
}
102+
103+
/**
104+
* Extracts the environment variables from the name.
105+
*
106+
* @param name - The name of the MCP server.
107+
* @param env - The environment variables. { ENV_KEY: "ENV_TARGET" }
108+
* ENV_TARGET is the target environment variable name, so example: "slack", "notion", "github", etc.
109+
* @param envMapper - The environment variable mapper. { ENV_KEY: "ENV_VALUE" }
110+
* ENV_VALUE is the value of the environment variable, so example: "gh_12309wqje123", "nt_12309wqje123", etc.
111+
* @returns The environment variables.
112+
*/
113+
const extractEnvFromName = (name: string, env: Record<string, string>, envMapper: Record<string, string>) => {
114+
return Object.fromEntries(Object.entries(env).filter(([, value]) => value === name).map(([key]) => [key, envMapper[key]]));
115+
}

0 commit comments

Comments
 (0)