当前位置: 首页 > web >正文

如何设计一个既提供绘图Tools又提供example_data的MCP服务器:

在这里插入图片描述

架构设计建议

方案1:全部使用Tools(推荐)

const server = new Server({name: "chart-generator",version: "1.0.0"
}, {capabilities: {tools: {}}
});// Tool 1: 获取示例数据
server.setRequestHandler(CallToolRequestSchema, async (request) => {if (request.params.name === "get_example_data") {const dataType = request.params.arguments?.type || "sales";const exampleData = {sales: [{month: "Jan", value: 100},{month: "Feb", value: 150},{month: "Mar", value: 120}],temperature: [{date: "2024-01-01", temp: 20},{date: "2024-01-02", temp: 22},{date: "2024-01-03", temp: 18}]};return {content: [{type: "text",text: JSON.stringify(exampleData[dataType])}]};}// Tool 2: 绘图工具if (request.params.name === "create_chart") {const { data, chartType, title } = request.params.arguments;// 处理数据并生成图表const chartResult = await generateChart(data, chartType, title);return {content: [{type: "text", text: `Chart created successfully: ${chartResult.url}`}]};}
});// 注册工具
server.setRequestHandler(ListToolsRequestSchema, async () => {return {tools: [{name: "get_example_data",description: "获取绘图示例数据",inputSchema: {type: "object",properties: {type: {type: "string",enum: ["sales", "temperature", "population"],description: "示例数据类型"}}}},{name: "create_chart",description: "根据数据创建图表",inputSchema: {type: "object",properties: {data: {type: "array",description: "图表数据"},chartType: {type: "string",enum: ["line", "bar", "pie"],description: "图表类型"},title: {type: "string",description: "图表标题"}},required: ["data", "chartType"]}}]};
});

方案2:混合模式(Resources + Tools)

const server = new Server({name: "chart-generator",version: "1.0.0"
}, {capabilities: {resources: {},tools: {}}
});// Resources: 提供示例数据
server.setRequestHandler(ListResourcesRequestSchema, async () => {return {resources: [{uri: "data://examples/sales",name: "销售数据示例",description: "用于演示图表绘制的销售数据",mimeType: "application/json"},{uri: "data://examples/temperature", name: "温度数据示例",description: "用于演示折线图的温度数据",mimeType: "application/json"}]};
});server.setRequestHandler(ReadResourceRequestSchema, async (request) => {const uri = request.params.uri;const exampleData = {"data://examples/sales": [{month: "Jan", value: 100},{month: "Feb", value: 150},{month: "Mar", value: 120}],"data://examples/temperature": [{date: "2024-01-01", temp: 20},{date: "2024-01-02", temp: 22}, {date: "2024-01-03", temp: 18}]};if (exampleData[uri]) {return {contents: [{uri,mimeType: "application/json",text: JSON.stringify(exampleData[uri], null, 2)}]};}throw new Error("Resource not found");
});// Tools: 绘图功能
server.setRequestHandler(CallToolRequestSchema, async (request) => {if (request.params.name === "create_chart") {const { data, chartType, title } = request.params.arguments;const chartResult = await generateChart(data, chartType, title);return {content: [{type: "text",text: `Chart created: ${chartResult.url}`}]};}
});

大模型的使用流程

方案1流程(推荐)

  1. 大模型可以主动调用 get_example_data 获取示例数据
  2. 大模型拿到数据后,主动调用 create_chart 进行绘图
  3. 整个过程无需人工干预

方案2流程

  1. 用户或客户端需要先选择要使用的Resource(example_data)
  2. 大模型获得数据后,可以主动调用 create_chart Tool

Python实现示例

from mcp.server import Server
from mcp.types import Tool, Resource
import jsonapp = Server("chart-generator")# 示例数据
EXAMPLE_DATA = {"sales": [{"month": "Jan", "value": 100},{"month": "Feb", "value": 150},{"month": "Mar", "value": 120}],"temperature": [{"date": "2024-01-01", "temp": 20},{"date": "2024-01-02", "temp": 22},{"date": "2024-01-03", "temp": 18}]
}@app.list_tools()
async def list_tools():return [Tool(name="get_example_data",description="获取绘图示例数据",inputSchema={"type": "object","properties": {"type": {"type": "string","enum": ["sales", "temperature"],"description": "数据类型"}}}),Tool(name="create_chart", description="创建图表",inputSchema={"type": "object","properties": {"data": {"type": "array"},"chart_type": {"type": "string"},"title": {"type": "string"}},"required": ["data", "chart_type"]})]@app.call_tool()
async def call_tool(name: str, arguments: dict):if name == "get_example_data":data_type = arguments.get("type", "sales")return json.dumps(EXAMPLE_DATA.get(data_type, []))elif name == "create_chart":# 实现图表生成逻辑data = arguments["data"]chart_type = arguments["chart_type"] title = arguments.get("title", "Chart")chart_url = await generate_chart(data, chart_type, title)return f"Chart created: {chart_url}"

建议

推荐使用方案1(全Tools),因为:

  1. 大模型可以完全自主工作
  2. 无需人工选择数据
  3. 工作流程更流畅
  4. 更符合"让大模型自己调用"的需求

这样大模型就可以:

  1. 自动获取示例数据
  2. 自动进行绘图
  3. 完成整个工作流程
http://www.xdnf.cn/news/14437.html

相关文章:

  • vulnerable_docker_containement(hard难度)MSF内网穿透、docker逃逸、wpscan爆破。
  • vscode python debugger 如何调试老版本python
  • 论文略读:Personality Alignment of Large Language Models
  • Git里面Stash Changes和UnStash Changes使用
  • LiteRT-LM边缘平台上高效运行语言模型
  • 【Android】 BindService源码流程
  • 如何在Windows上使用qemu安装ubuntu24.04服务器?
  • 408第一季 - 数据结构 - B树与B+树
  • 数据结构---B树
  • 卷积神经网络中的通道注意力机制
  • [游戏实时地图] 地图数据 | 兴趣点数据 | 虚幻引擎SDK接口
  • 软考 系统架构设计师系列知识点之杂项集萃(89)
  • UFS Layout Guide (UFS 2.x)
  • 第11章:Neo4j实际应用案例
  • 把Cmakelist.txt转化为Qt Pro文件的方法
  • 如何让 AI 接入自己的 API?我开发了一个将 OpenAPI 文档转为 MCP 服务的工具
  • 深入理解Kafka Consumer:从理论到实战
  • 简化您的工作流程:在 Azure 中构建高效的逻辑应用程序
  • 电池预测 | 第32讲 Matlab基于CNN-BiLSTM-Attention的锂电池剩余寿命预测,附锂电池最新文章汇集
  • Zustand:小而美的React状态管理库详解
  • React 实现卡牌翻牌游戏
  • AI医生24小时在线:你的健康新‘算法监护人
  • 项目 : 基于正倒排的boost搜索引擎
  • 基于n8n快速开发股票舆情监控对话系统
  • Servlet完整笔记
  • 通过 BLE 和 Wi-Fi 交换优化基于 ID 的远程无人机通信的延迟
  • Bootstrap 5学习教程,从入门到精通, Bootstrap 5 列表组(List Group)语法知识点及案例(14)
  • 【图像处理入门】8. 数学基础与优化:线性代数、概率与算法调优实战
  • Python----OpenCV(图像的绘制——绘制椭圆,绘制文本,添加文字水印,添加图片水印)
  • Nginx限速配置详解