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

如何设计一个既提供绘图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. 完成整个工作流程

相关文章:

  • 计算机组成原理期末题目解析
  • nohz_full 参数对内核软硬锁检测机制的影响分析
  • 大模型笔记6:微调
  • Redis中的zset的底层实现
  • 【Create my OS】5 内核线程
  • 【图片识别改名】如何批量识别大量图片的文字并重命名图片,基于WPF和京东OCR识别接口的实现方案
  • srm管理系统供应商管理在线询价比价管理电子采购(java)
  • redis序列化
  • 嵌入式学习笔记C语言阶段--16函数指针
  • YOLOv3 中的 NMS 详解(基于论文与 Darknet 实现)
  • C#设计模式之AbstractFactory_抽象工厂_对象创建新模式-学习
  • 使用 socat 和 xinetd 将程序绑定到端口运行
  • 安卓9.0系统修改定制化____默认开启 开发者选项中的OEM锁解锁选项 开搞篇 五
  • Milvus/ES 插入方案对比
  • OD 算法题 B卷【最多团队】
  • SeaTunnel与Hive集成
  • Mkdocs 阅读时间统计插件
  • 华为云Flexus+DeepSeek征文 | 基于华为云ModelArts Studio搭建PandaWiki知识库问答系统
  • 极客时间《后端存储实战课》阅读笔记
  • linux 阻塞和非阻塞
  • 临沂企业建站系统/公司快速建站
  • 视频发布到哪些平台可以赚钱/吉林关键词优化的方法
  • 自己做的网站怎么在百度上搜到/搜索引擎关键词的工具
  • 网站的c4d动画是怎么做的/谷歌商店paypal官网下载
  • 手把手教你入侵网站修改数据/html制作网页代码
  • 网站建设需要几十万/深圳全网营销平台排名