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

从零开始创建MCP Server实战指南

一、MCP协议核心概念

1.1 什么是MCP?

MCP(Model Context Protocol) 是一个标准化的“沟通规则”,由公司Anthropic提出,专门用于让大语言模型(LLM,比如通义千问、ChatGPT等)与外部工具或服务“对话”。

为什么需要MCP?
  • 想象场景:假设你让一个AI助手帮你订机票,它需要:
    1. 查询航班信息(调用航空公司API)。
    2. 读取你的日历安排(调用日历工具)。
    3. 发送确认邮件(调用邮件系统)。
  • 问题:如果每个工具的接口都不一样,AI需要学习多种“方言”,这会很混乱。
  • MCP的作用:就像USB接口一样,统一了LLM与外部工具的“语言”,让AI能安全、标准化地调用任何工具,无需关心底层实现细节。
直观类比:
  • MCP = USB接口
    • 工具:U盘、鼠标、硬盘等外设。
    • MCP Server:外设本身(提供功能)。
    • MCP Client:电脑(通过USB接口调用外设)。
    • 效果:无论外设如何变化,电脑都能通过USB统一管理。

1.2 核心组件(用测试工程师视角拆解)

1. MCP Server
  • 定义:提供具体功能的“服务端程序”。
  • 作用:像一个工具箱,里面装着各种工具(比如文件读写、数据库查询、API调用等)。
2. MCP Client
  • 定义:LLM的“遥控器”,负责向Server发送指令并接收结果。
  • 作用:像一个翻译官,把LLM的自然语言指令翻译成Server能理解的请求。
3. 工具(Tool)
  • 定义:Server提供的具体功能单元,是MCP的核心价值所在。
简单示例(测试场景模拟)
场景:测试“获取天气”功能
  1. Server端

    • 提供工具get_weather(city),通过调用第三方天气API返回数据。
    • 需要测试:API密钥是否配置正确?网络请求是否超时?返回数据格式是否符合预期?
  2. Client端

    • 当LLM发送指令“获取北京天气”,Client应:
      • 调用get_weather("北京")
      • 将API返回的温度数据(如25°C)转为自然语言反馈给LLM。
  3. 测试用例示例

    • 正常用例:输入“上海”,验证返回温度是否为合理数值。
    • 异常用例
      • 输入“火星” → 验证是否返回“城市不存在”错误。
      • 断开网络 → 验证是否返回“网络连接失败”。
    • 安全用例
      • 尝试调用未授权的工具(如delete_weather_api_key()) → 验证是否被拒绝。


二、环境准备

2.1 基础依赖

  • 可参照MCP实践第一步–磕磕碰碰搭环境,已在本地搭建了一个mcp-client

三、从零实现MCP Server(Python示例)

3.1 第一个MCP Server:获取桌面文件列表

在之前的mcp-client工程中新建一个server1.py的文件。

在这里插入图片描述
文件代码如下:

import asyncio
import logging
import osfrom mcp import stdio_server
from mcp.server import InitializationOptions, NotificationOptions
from mcp.server.fastmcp import FastMCPfrom server import MCP_SERVER_NAMEmcp = FastMCP()
# 配置日志
logging.basicConfig(level=logging.INFO,format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
logger = logging.getLogger(MCP_SERVER_NAME)@mcp.tool()
def get_desktop_files() -> str:"""获取桌面上的文件列表"""desktop_path = os.path.expanduser("~/Desktop")return os.listdir(desktop_path)async def main():# 使用 stdio_server 建立 STDIO 通信async with stdio_server() as (read_stream, write_stream):# 构造初始化选项init_options = InitializationOptions(server_name=MCP_SERVER_NAME,server_version="1.0.0",capabilities=mcp._mcp_server.get_capabilities(notification_options=NotificationOptions(),experimental_capabilities={}))logger.info("通过 STDIO 模式启动 MCP Server ...")# 使用内部的 _mcp_server 运行服务await mcp._mcp_server.run(read_stream, write_stream, init_options)if __name__ == "__main__":asyncio.run(main())

关键点

  • @mcp.tool():标记工具函数,供LLM调用。
  • transport='stdio':通过标准输入输出通信(适合轻量级场景)。

3.2 运行与测试

 uv run .\mcp-client.py .\server.py,.\server1.py

同时连接到两个mcp server:
在这里插入图片描述
在问题中输入:请获取桌面的文件信息,输出结果如下图所示:
在这里插入图片描述

下一步:尝试将MCP Server集成到之前编写的https://blog.csdn.net/weixin_44872675/article/details/147236350?spm=1001.2014.3001.5502AI应用中,例如:

  • 让LLM直接将通过接口文档生成的接口用例,调用mcp server进行请求发送。
http://www.xdnf.cn/news/1200.html

相关文章:

  • 描述城市出行需求模式的复杂网络视角:大规模起点-目的地需求网络的图论分析
  • 牛客算法题目刷——链表总结
  • 软考高级信息系统项目管理师的【干系人参与度评估矩阵】详解
  • 网络流的各种模型+题单
  • 【STM32单片机】#11 I2C通信(软件读写)
  • ClickHouse进行LEFT JOIN 关联查询时, 关联键的数据类型不一致,导致报错 的解决方案详解
  • postgreSQL 如何使用 dblink
  • [创业之路-378]:企业法务 - 企业经营中有哪些触发刑法的风险?如何预防?
  • 超级扩音器手机版:随时随地,大声说话
  • 【漏洞复现】Struts2系列
  • Java核心API-网络编程
  • Relay IR的核心数据结构
  • 小刚说C语言刷题——1031 温度转化
  • LLM 论文精读(一)Scaling Laws for Neural Language Models
  • Centos7安装Jenkins(图文教程)
  • Facebook商城开通全攻略:如何解决所在地区不可使用问题?
  • Java MCP客户端SDK实现
  • Javase 基础入门 —— 02 基本数据类型
  • [Godot] C#2D平台游戏基础移动和进阶跳跃代码
  • 【多目标跟踪】sort源码环境调试
  • 企业战略到数字化落地 —— 第一章 企业战略
  • 【Pandas】pandas DataFrame div
  • Python-27:游戏英雄升级潜力评估
  • spark和Hadoop的对比和联系
  • 【Spring】静态代理、动态代理
  • 在离线 Ubuntu 环境下部署双 Neo4j 实例(Prod Dev)
  • 深入理解依赖、Jar 包与 War 包:Java 开发基石探秘
  • 实验七 ADC0804 数字电压表
  • d2025421
  • 【趣味小游戏】--扫雷游戏