hermes-agent/web/src/lib/mcp-server-create.ts
Siddharth Balyan 56ab9951b1
fix(dashboard): add MCP auth to profile builder (#65163)
* fix(dashboard): add MCP auth to profile builder

* fix(dashboard): preserve MCP rejection error contract

* feat(dashboard): refine profile MCP picker
2026-07-16 02:05:04 +05:30

78 lines
2 KiB
TypeScript

import type { McpHttpAuth, McpServerCreate } from "@/lib/api";
export type McpTransport = "http" | "stdio";
export interface McpServerDraft {
name: string;
transport: McpTransport;
url: string;
httpAuth: McpHttpAuth;
bearerToken: string;
command: string;
args: string;
env: string;
}
export function emptyMcpServerDraft(): McpServerDraft {
return {
name: "",
transport: "http",
url: "",
httpAuth: "none",
bearerToken: "",
command: "",
args: "",
env: "",
};
}
function parseArgs(raw: string): string[] {
return raw
.split(/[\s,]+/)
.map((value) => value.trim())
.filter(Boolean);
}
function parseEnv(raw: string): Record<string, string> {
const env: Record<string, string> = {};
for (const rawLine of raw.split("\n")) {
const line = rawLine.trim();
if (!line) continue;
const separator = line.indexOf("=");
if (separator === -1) continue;
const key = line.slice(0, separator).trim();
const value = line.slice(separator + 1).trim();
if (key) env[key] = value;
}
return env;
}
export function buildMcpServerCreate(draft: McpServerDraft): McpServerCreate {
const name = draft.name.trim();
if (!name) throw new Error("Name required");
if (draft.transport === "http") {
const url = draft.url.trim();
if (!url) throw new Error("URL required");
if (draft.httpAuth === "header" && !draft.bearerToken.trim()) {
throw new Error("Bearer token required");
}
const server: McpServerCreate = { name, url };
if (draft.httpAuth !== "none") server.auth = draft.httpAuth;
if (draft.httpAuth === "header") {
server.bearer_token = draft.bearerToken;
}
return server;
}
const command = draft.command.trim();
if (!command) throw new Error("Command required");
const server: McpServerCreate = { name, command };
const args = parseArgs(draft.args);
if (args.length) server.args = args;
const env = parseEnv(draft.env);
if (Object.keys(env).length) server.env = env;
return server;
}