Files
qiming/qimingclaw/crates/agent-electron-client/src/shared/mcpTemplates.ts

255 lines
5.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* MCP 配置模板
* 预置常用 MCP 服务器配置,方便用户快速添加
*/
export interface McpTemplate {
id: string;
name: string;
description: string;
category: "file" | "network" | "data" | "ai" | "dev" | "other";
icon?: string;
config: {
command: string;
args: string[];
env?: Record<string, string>;
};
// 需要用户填写的参数如路径、token 等)
requiredParams?: {
key: string;
label: string;
placeholder: string;
type: "text" | "path" | "password";
defaultValue?: string;
}[];
}
export const MCP_TEMPLATES: McpTemplate[] = [
{
id: "filesystem",
name: "Filesystem",
description: "读写本地文件系统",
category: "file",
icon: "📁",
config: {
command: "npx",
args: ["-y", "@modelcontextprotocol/server-filesystem", "{path}"],
},
requiredParams: [
{
key: "path",
label: "文件系统路径",
placeholder: "/Users/username/workspace",
type: "path",
defaultValue: "",
},
],
},
{
id: "github",
name: "GitHub",
description: "访问 GitHub 仓库、Issues、PRs",
category: "dev",
icon: "🐙",
config: {
command: "npx",
args: ["-y", "@modelcontextprotocol/server-github"],
env: {
GITHUB_PERSONAL_ACCESS_TOKEN: "{token}",
},
},
requiredParams: [
{
key: "token",
label: "GitHub Personal Access Token",
placeholder: "ghp_xxxxxxxxxxxx",
type: "password",
},
],
},
{
id: "slack",
name: "Slack",
description: "发送 Slack 消息、读取频道",
category: "network",
icon: "💬",
config: {
command: "npx",
args: ["-y", "@modelcontextprotocol/server-slack"],
env: {
SLACK_BOT_TOKEN: "{token}",
},
},
requiredParams: [
{
key: "token",
label: "Slack Bot Token",
placeholder: "xoxb-xxxxxxxxxxxx",
type: "password",
},
],
},
{
id: "sqlite",
name: "SQLite",
description: "查询 SQLite 数据库",
category: "data",
icon: "🗄️",
config: {
command: "uvx",
args: ["mcp-server-sqlite", "--db-path", "{dbPath}"],
},
requiredParams: [
{
key: "dbPath",
label: "数据库文件路径",
placeholder: "/path/to/database.db",
type: "path",
},
],
},
{
id: "fetch",
name: "Fetch",
description: "HTTP 请求工具",
category: "network",
icon: "🌐",
config: {
command: "npx",
args: ["-y", "@modelcontextprotocol/server-fetch"],
},
},
{
id: "postgres",
name: "PostgreSQL",
description: "查询 PostgreSQL 数据库",
category: "data",
icon: "🐘",
config: {
command: "npx",
args: ["-y", "@modelcontextprotocol/server-postgres"],
env: {
POSTGRES_CONNECTION_STRING: "{connectionString}",
},
},
requiredParams: [
{
key: "connectionString",
label: "PostgreSQL 连接字符串",
placeholder: "postgresql://user:password@localhost:5432/dbname",
type: "password",
},
],
},
{
id: "puppeteer",
name: "Puppeteer",
description: "浏览器自动化",
category: "dev",
icon: "🎭",
config: {
command: "npx",
args: ["-y", "@modelcontextprotocol/server-puppeteer"],
},
},
{
id: "brave-search",
name: "Brave Search",
description: "Brave 搜索引擎",
category: "network",
icon: "🔍",
config: {
command: "npx",
args: ["-y", "@modelcontextprotocol/server-brave-search"],
env: {
BRAVE_API_KEY: "{apiKey}",
},
},
requiredParams: [
{
key: "apiKey",
label: "Brave Search API Key",
placeholder: "BSA_xxxxxxxxxxxx",
type: "password",
},
],
},
{
id: "google-maps",
name: "Google Maps",
description: "地图和地理位置服务",
category: "network",
icon: "🗺️",
config: {
command: "npx",
args: ["-y", "@modelcontextprotocol/server-google-maps"],
env: {
GOOGLE_MAPS_API_KEY: "{apiKey}",
},
},
requiredParams: [
{
key: "apiKey",
label: "Google Maps API Key",
placeholder: "AIzaSyxxxxxxxxxx",
type: "password",
},
],
},
{
id: "memory",
name: "Memory",
description: "持久化记忆存储",
category: "ai",
icon: "🧠",
config: {
command: "npx",
args: ["-y", "@modelcontextprotocol/server-memory"],
},
},
];
/**
* 根据分类获取模板
*/
export function getTemplatesByCategory(category?: string): McpTemplate[] {
if (!category) return MCP_TEMPLATES;
return MCP_TEMPLATES.filter((t) => t.category === category);
}
/**
* 根据 ID 获取模板
*/
export function getTemplateById(id: string): McpTemplate | undefined {
return MCP_TEMPLATES.find((t) => t.id === id);
}
/**
* 应用模板参数,生成最终配置
*/
export function applyTemplateParams(
template: McpTemplate,
params: Record<string, string>,
): { command: string; args: string[]; env?: Record<string, string> } {
const config = { ...template.config };
// 替换 args 中的占位符
config.args = config.args.map((arg) =>
arg.replace(/\{(\w+)\}/g, (_, key) => params[key] || ""),
);
// 替换 env 中的占位符
if (config.env) {
const env: Record<string, string> = {};
for (const [key, value] of Object.entries(config.env)) {
env[key] = value.replace(
/\{(\w+)\}/g,
(_, paramKey) => params[paramKey] || "",
);
}
config.env = env;
}
return config;
}