mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-24 16:54:43 +00:00
* fix(dashboard): add MCP auth to profile builder * fix(dashboard): preserve MCP rejection error contract * feat(dashboard): refine profile MCP picker
78 lines
2 KiB
TypeScript
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;
|
|
}
|