/** * KRA - MCP Tools测试 * 对应 GVA: view/systemTools/autoCode/mcpTest.vue */ import React, { useState, useEffect } from 'react'; import { PageContainer } from '@ant-design/pro-components'; import { Card, Row, Col, Button, Modal, Form, Input, Select, message, Tooltip, Image } from 'antd'; import { PlayCircleOutlined, CopyOutlined } from '@ant-design/icons'; import { mcpList, mcpTest } from '@/services/kratos/autoCode'; interface McpTool { name: string; description: string; inputSchema?: { properties?: Record; required?: string[]; }; } interface McpServerConfig { mcpServers: Record; } const MCPTest: React.FC = () => { const [tools, setTools] = useState([]); const [serverConfig, setServerConfig] = useState(''); const [testModalVisible, setTestModalVisible] = useState(false); const [currentTool, setCurrentTool] = useState(null); const [testResult, setTestResult] = useState(null); const [form] = Form.useForm(); const fetchTools = async () => { const res = await mcpList(); if (res.code === 0 && res.data?.list?.tools) { setTools(res.data.list.tools); setServerConfig(JSON.stringify(res.data.mcpServerConfig, null, 2)); } }; useEffect(() => { fetchTools(); }, []); const copyConfig = () => { navigator.clipboard.writeText(serverConfig); message.success('配置已复制到剪贴板'); }; const openTestModal = (tool: McpTool) => { setCurrentTool(tool); setTestResult(null); form.resetFields(); // 设置默认值 if (tool.inputSchema?.properties) { const initialValues: Record = {}; Object.entries(tool.inputSchema.properties).forEach(([key, prop]) => { if (prop.default !== undefined) { initialValues[key] = prop.default; } else if (prop.type === 'boolean') { initialValues[key] = false; } }); form.setFieldsValue(initialValues); } setTestModalVisible(true); }; const handleTest = async () => { if (!currentTool) return; try { const values = await form.validateFields(); // 处理 object/array 类型的 JSON 解析 if (currentTool.inputSchema?.properties) { Object.entries(currentTool.inputSchema.properties).forEach(([key, prop]) => { if ((prop.type === 'object' || prop.type === 'array') && values[key]) { try { values[key] = JSON.parse(values[key]); } catch (e) { message.error(`参数 ${key} 的JSON格式无效`); throw e; } } }); } const res = await mcpTest({ name: currentTool.name, arguments: values, }); setTestResult(res.data); if (res.code === 0) { message.success('API调用成功'); } } catch (error) { // 验证失败或JSON解析失败 } }; const renderTestResult = () => { if (!testResult) return null; if (typeof testResult === 'string') { return
{testResult}
; } if (testResult.type === 'image' && testResult.content) { return ; } if (testResult.type === 'text' && testResult.content) { return
{testResult.content}
; } return
{JSON.stringify(testResult, null, 2)}
; }; return (