Files
MyGoNavi/frontend/src/utils/mcpServerGuidance.ts
2026-06-22 15:12:42 +08:00

176 lines
7.0 KiB
TypeScript

export type MCPFieldState = 'required' | 'optional' | 'fixed';
export interface MCPFieldGuide {
key: string;
titleKey: string;
summaryKey: string;
detailKey: string;
fillKey: string;
avoidKey: string;
fieldState: MCPFieldState;
example?: string;
exampleKey?: string;
}
export interface MCPFillStep {
key: string;
step: string;
titleKey: string;
detailKey: string;
}
export interface MCPTroubleshootingGuide {
key: string;
symptomKey: string;
likelyCauseKey: string;
fixKey: string;
example?: string;
exampleKey?: string;
}
export const MCP_COMMAND_EXAMPLES = [
'npx -y @modelcontextprotocol/server-filesystem --stdio',
'uvx mcp-server-fetch',
'node server.js --stdio',
'python -m your_mcp_server',
'docker run --rm -i mcp/server-fetch:latest',
];
export const MCP_COMMAND_PARSE_EXAMPLE = '$env:GITHUB_TOKEN=...; uvx mcp-server-github --stdio';
export const MCP_SERVER_FILL_STEPS: MCPFillStep[] = [
{ key: 'template', step: '1', titleKey: 'ai_settings.mcp_server.guide.step.template.title', detailKey: 'ai_settings.mcp_server.guide.step.template.detail' },
{ key: 'name', step: '2', titleKey: 'ai_settings.mcp_server.guide.step.name.title', detailKey: 'ai_settings.mcp_server.guide.step.name.detail' },
{ key: 'command', step: '3', titleKey: 'ai_settings.mcp_server.guide.step.command.title', detailKey: 'ai_settings.mcp_server.guide.step.command.detail' },
{ key: 'args', step: '4', titleKey: 'ai_settings.mcp_server.guide.step.args.title', detailKey: 'ai_settings.mcp_server.guide.step.args.detail' },
{ key: 'env-timeout', step: '5', titleKey: 'ai_settings.mcp_server.guide.step.env_timeout.title', detailKey: 'ai_settings.mcp_server.guide.step.env_timeout.detail' },
];
export const MCP_FIELD_GUIDES: MCPFieldGuide[] = [
{
key: 'name',
titleKey: 'ai_settings.mcp_server.guide.field.name.title',
summaryKey: 'ai_settings.mcp_server.guide.field.name.summary',
detailKey: 'ai_settings.mcp_server.guide.field.name.detail',
fillKey: 'ai_settings.mcp_server.guide.field.name.fill',
avoidKey: 'ai_settings.mcp_server.guide.field.name.avoid',
fieldState: 'required',
example: 'Filesystem / Browser / GitHub',
},
{
key: 'enabled',
titleKey: 'ai_settings.mcp_server.guide.field.enabled.title',
summaryKey: 'ai_settings.mcp_server.guide.field.enabled.summary',
detailKey: 'ai_settings.mcp_server.guide.field.enabled.detail',
fillKey: 'ai_settings.mcp_server.guide.field.enabled.fill',
avoidKey: 'ai_settings.mcp_server.guide.field.enabled.avoid',
fieldState: 'optional',
exampleKey: 'ai_settings.mcp_server.guide.field.enabled.example',
},
{
key: 'transport',
titleKey: 'ai_settings.mcp_server.guide.field.transport.title',
summaryKey: 'ai_settings.mcp_server.guide.field.transport.summary',
detailKey: 'ai_settings.mcp_server.guide.field.transport.detail',
fillKey: 'ai_settings.mcp_server.guide.field.transport.fill',
avoidKey: 'ai_settings.mcp_server.guide.field.transport.avoid',
fieldState: 'fixed',
example: 'stdio',
},
{
key: 'command',
titleKey: 'ai_settings.mcp_server.guide.field.command.title',
summaryKey: 'ai_settings.mcp_server.guide.field.command.summary',
detailKey: 'ai_settings.mcp_server.guide.field.command.detail',
fillKey: 'ai_settings.mcp_server.guide.field.command.fill',
avoidKey: 'ai_settings.mcp_server.guide.field.command.avoid',
fieldState: 'required',
example: 'npx / node / uvx / python / docker',
},
{
key: 'args',
titleKey: 'ai_settings.mcp_server.guide.field.args.title',
summaryKey: 'ai_settings.mcp_server.guide.field.args.summary',
detailKey: 'ai_settings.mcp_server.guide.field.args.detail',
fillKey: 'ai_settings.mcp_server.guide.field.args.fill',
avoidKey: 'ai_settings.mcp_server.guide.field.args.avoid',
fieldState: 'optional',
example: '-y / @modelcontextprotocol/server-filesystem / --stdio / server.js / run / --rm / -i / image',
},
{
key: 'env',
titleKey: 'ai_settings.mcp_server.guide.field.env.title',
summaryKey: 'ai_settings.mcp_server.guide.field.env.summary',
detailKey: 'ai_settings.mcp_server.guide.field.env.detail',
fillKey: 'ai_settings.mcp_server.guide.field.env.fill',
avoidKey: 'ai_settings.mcp_server.guide.field.env.avoid',
fieldState: 'optional',
example: 'OPENAI_API_KEY=... / GITHUB_TOKEN=...',
},
{
key: 'timeout',
titleKey: 'ai_settings.mcp_server.guide.field.timeout.title',
summaryKey: 'ai_settings.mcp_server.guide.field.timeout.summary',
detailKey: 'ai_settings.mcp_server.guide.field.timeout.detail',
fillKey: 'ai_settings.mcp_server.guide.field.timeout.fill',
avoidKey: 'ai_settings.mcp_server.guide.field.timeout.avoid',
fieldState: 'optional',
example: '20 / 45 / 60',
},
];
export const MCP_AUTHORING_NOTES = [
'ai_settings.mcp_server.guide.note.command_only',
'ai_settings.mcp_server.guide.note.npx',
'ai_settings.mcp_server.guide.note.docker',
'ai_settings.mcp_server.guide.note.full_command',
'ai_settings.mcp_server.guide.note.env_lines',
'ai_settings.mcp_server.guide.note.secrets',
'ai_settings.mcp_server.guide.note.test_discovery',
];
export const MCP_TROUBLESHOOTING_GUIDES: MCPTroubleshootingGuide[] = [
{
key: 'command-not-found',
symptomKey: 'ai_settings.mcp_server.guide.troubleshooting.command_not_found.symptom',
likelyCauseKey: 'ai_settings.mcp_server.guide.troubleshooting.command_not_found.cause',
fixKey: 'ai_settings.mcp_server.guide.troubleshooting.command_not_found.fix',
example: 'command=npx, args=-y / @modelcontextprotocol/server-filesystem / --stdio',
},
{
key: 'timeout-or-no-tools',
symptomKey: 'ai_settings.mcp_server.guide.troubleshooting.timeout_or_no_tools.symptom',
likelyCauseKey: 'ai_settings.mcp_server.guide.troubleshooting.timeout_or_no_tools.cause',
fixKey: 'ai_settings.mcp_server.guide.troubleshooting.timeout_or_no_tools.fix',
example: 'args=--stdio / docker run --rm -i image, timeout=45',
},
{
key: 'auth-failed',
symptomKey: 'ai_settings.mcp_server.guide.troubleshooting.auth_failed.symptom',
likelyCauseKey: 'ai_settings.mcp_server.guide.troubleshooting.auth_failed.cause',
fixKey: 'ai_settings.mcp_server.guide.troubleshooting.auth_failed.fix',
example: 'GITHUB_TOKEN=... / KEY=VALUE',
},
{
key: 'stdio-only',
symptomKey: 'ai_settings.mcp_server.guide.troubleshooting.stdio_only.symptom',
likelyCauseKey: 'ai_settings.mcp_server.guide.troubleshooting.stdio_only.cause',
fixKey: 'ai_settings.mcp_server.guide.troubleshooting.stdio_only.fix',
example: 'stdio',
},
];
const quoteCommandPart = (value: string): string => {
const text = String(value || '').trim();
if (!text) {
return '';
}
return /[\s"]/u.test(text) ? `"${text.replace(/"/g, '\\"')}"` : text;
};
export const buildMCPLaunchPreview = (command: string, args?: string[]): string =>
[command, ...(Array.isArray(args) ? args : [])]
.map((item) => quoteCommandPart(item))
.filter(Boolean)
.join(' ');