MCP(Model Context Protocol)实战

目录

[MCP(Model Context Protocol)是什么?](#MCP(Model Context Protocol)是什么?)

为什么要用MCP?

MCP的核心架构和工作原理?

MCP的应用场景

[MCP(Model Context Protocol)的核心功能和特性?](#MCP(Model Context Protocol)的核心功能和特性?)

MCP的工作流程?

实战:构建MCP客户端

关键组件说明

MCP开发与实践指南

Python环境搭建

Node.js环境搭建

[MCP Server搭建](#MCP Server搭建)

MCP客户端构建

客户端配置

MCP服务器生态​编辑

MCP的客户端


MCP(Model Context Protocol)是什么?

MCP(Model Context Protocol,模型上下文协议)是什么 MCP(模型上下文协议)是由Anthropic公司于2024年11月底开源发布的一种开放标准协议。

MCP协议旨在实现大型语言模型(LLM)与外部数据源和工具之间的无缝集成,通过提供标准化的接口,使AI应用程序能够安全、可控地与本地或远程资源进行交互。

MCP协议遵循客户端-服务器架构,其核心组成部分包括:

  1. MCP主机(MCP Hosts):发起请求的AI应用程序,如聊天机器人、AI驱动的IDE等。

  2. MCP客户端(MCP Clients):在主机程序内部,与MCP服务器保持1:1的连接。

  3. MCP服务器(MCP Servers):为MCP客户端提供上下文、工具和提示信息。每个MCP服务器都专精于一类工作,如读写浏览器、读写本地文件、操作Git仓库等。

MCP的主要功能包括数据集成、工具集成、模板化交互、安全性、开发者支持、预构建服务器和上下文维护。它通过客户端-服务器架构,支持多个服务连接到任何兼容的客户端,提供标准化的、通用的协议共享资源、工具和提示。MCP能访问本地和远程资源,内置安全机制,保护API密钥不被泄露,是构建互联AI系统的重要工具。

为什么要用MCP?

MCP(Model Context Protocol)是一个由Anthropic提出的开放协议,它旨在简化大型语言模型(LLM)与外部数据源和工具之间的通信。使用MCP的原因主要包括:

  1. 简化开发流程:MCP协议允许开发者通过一个标准化的接口与不同的数据源和服务进行交互,无需为每个数据源编写单独的连接器,从而降低了开发成本和维护负担。

  2. 跨平台支持:MCP提供了一种统一的接入方式,使得开发者能够自由选择不同的大语言模型提供商,不再受限于单一平台。

  3. 数据安全:通过本地服务器与数据源的连接,MCP避免了将敏感数据上传到第三方平台,最大限度地保障了数据隐私。

  4. 增强人工智能能力:MCP通过为AI模型提供对各种数据源的无缝访问,增强了其生成更相关、更准确响应的能力。

  5. 促进安全:MCP的设计充分考虑了安全性,服务器控制自己的资源,无需与AI提供商共享敏感的API密钥,确保数据访问既可控又可审计。

  6. 团队协作:作为一项开源计划,MCP鼓励开发者社区做出贡献,这种协作环境加速了创新并扩大了可用连接器和工具的范围。

  7. 模块化和可扩展性:MCP的架构允许模块化开发,多个MCP服务器可以连接到单个主机,每个服务器处理不同的资源。

  8. 互操作性:通过MCP标准化通信,使不同的AI工具和资源能够无缝协作。

  9. 降低开发成本,加速创新:采用MCP,开发者无需为每个数据源构建定制的集成方案,只需针对MCP协议构建一次即可。

  10. 构建可持续的AI架构:MCP促进了更可持续的AI架构,随着生态系统的成熟,AI系统将在不同工具和数据集之间移动时保持上下文。

MCP的核心架构和工作原理?

MCP的工作原理可以概括为三个步骤:

首先,通过调用聊天完成API,将函数和用户输入传递给MCP服务器;

其次,使用模型的响应来调用API或函数;

最后,再次调用聊天完成API,包括从函数获得的响应,以得到最终响应。

MCP的应用场景

  1. 软件开发:通过将AI模型连接到代码存储库或问题跟踪器来增强代码生成工具,从而提高开发效率和代码质量。

  2. 数据分析:允许AI助手访问和分析来自数据库或云存储的数据集,使得数据分析更加高效和深入。

  3. 企业自动化:将AI与CRM系统或项目管理平台等业务工具相结合,实现企业流程的自动化和优化。

  4. 智能客服系统:在智能客服系统中,MCP协议可以帮助从多个数据源获取用户信息、订单记录和商品数据,实现不同数据源之间的无缝对接,提高开发效率和系统稳定性。

  5. 内容生成平台:在内容生成平台中,MCP协议可以解决数据连接问题,使得开发者可以更高效地处理文本、图片和视频数据,加快开发进度并提升平台性能。

  6. 数据分析系统:在数据分析系统中,MCP协议可以处理来自多个数据源的大规模数据,确保数据的快速传输和处理,提升系统性能和响应速度。

  7. 医疗场景:通过MCP提供患者病史,模型可以更精准地生成诊断建议,同时可以集成实验室检测系统和医学影像分析工具,为医生提供全面的患者信息和诊断支持。

  8. 教育场景:使用MCP集成专业知识或工具,可以设计课程内容、生成多语言学习材料、解答学生问题,扩大AI在教育领域的应用潜力。

  9. 金融场景:在金融领域,MCP可以协作完成市场趋势分析、投资报告生成和多语言客户支持,提高金融服务的质量和效率。

MCP(Model Context Protocol)的核心功能和特性?

数据访问标准化:MCP提供了一个通用的开放协议,允许开发者通过统一的方式连接各种数据源,如Google Drive、Slack、GitHub等,无需为每种数据源单独开发复杂的接口代码。

双向安全连接:MCP支持在AI应用和数据源之间建立双向的、安全的通信通道,确保数据的隐私性和交互的完整性。

上下文感知能力:MCP允许AI助手从数据源中提取更全面的上下文信息,提供更加精准和相关的回答。

模块化与可扩展性:MCP的架构灵活,支持模块化开发,允许开发者扩展MCP,创建更多的数据源支持。

开源与社区支持:MCP是一个完全开源的标准,鼓励开发者社区贡献代码或创建新的连接器,形成健康的开发者生态。

多场景应用支持:MCP适用于多种场景,包括但不限于软件开发、数据分析、企业自动化等。

安全性:内置安全机制,保护数据和API密钥。

开发者支持:提供SDK和文档,支持开发者构建和测试MCP连接器。

预构建服务器:提供预构建的MCP服务器,快速集成流行企业系统。

上下文维护:在不同工具和数据集之间保持上下文,实现更智能的任务处理。

MCP的工作流程?

初始化:主机应用程序启动并初始化客户端,每个客户端与一个服务器建立连接。

功能协商:客户端和服务器之间进行功能协商,确定它们可以相互提供哪些功能和服务。

请求处理:客户端根据用户请求或AI模型的需要,向服务器发送请求。服务器处理这些请求,并可能与本地或远程资源进行交互。

响应返回:服务器将处理结果返回给客户端,客户端再将信息传递回主机应用程序。

MCP通信机制

MCP(Model Context Protocol)的连接机制遵循客户端-服务器架构。在这种架构中,MCP Clients与MCP Servers之间建立一对一的连接。

这种设计允许MCP Hosts(如AI应用程序)通过MCP Clients与一个或多个MCP Servers进行通信,以获取数据和执行任务。

MCP支持两种类型的通信机制:

  1. 标准输入输出(Stdio):适用于本地进程间通信,其中Client启动Server程序作为子进程,消息通讯通过stdin/stdout进行,消息格式为JSON-RPC 2.0。

  2. 服务器发送事件(SSE):用于基于HTTP的通信,允许服务器向客户端推送消息,而客户端到服务器的消息传递则使用HTTP POST,同样采用JSON-RPC 2.0格式进行消息交换。

所有传输都使用JSON-RPC 2.0进行消息交换,这为MCP Clients和MCP Servers之间的通信提供了统一的消息格式。至于连接类型,MCP没有明确指出是长连接还是短连接,但考虑到其基于JSON-RPC 2.0的特性,它更可能支持长连接,以便保持客户端和服务器之间的持久交互状态。

MCP的通信协议可以是TCP或UDP,这取决于具体的实现和部署需求。

例如,如果MCP服务器和客户端在同一台机器上运行,可能会使用UDP。如果它们分布在不同的机器上,或者需要跨越网络边界,那么TCP可能是更好的选择,因为它提供了更可靠的传输保证。然而,MCP的设计允许它适应不同的网络环境和通信需求。

实战:构建MCP客户端

关键组件说明

  1. Host应用:用户交互界面,连接用户、LLM和MCP客户端

  2. MCP Client:负责与MCP服务器通信的客户端组件

  3. MCP Server:处理工具调用请求并连接外部系统的服务端

  4. LLM:大语言模型,负责理解用户意图并决定是否使用工具

  5. 外部系统:提供实际功能的API或数据源

MCP开发与实践指南

Python环境搭建
复制代码
# 安装uv(推荐使用的Python包管理工具)
curl -LsSf https://astral.sh/uv/install.sh | sh

# 创建虚拟环境
uv venv
source .venv/bin/activate  # Linux/macOS系统执行此命令
.venv\Scripts\activate     # Windows系统执行此命令

# 安装MCP依赖
uv add "mcp[cli]" httpx
Node.js环境搭建
复制代码
# 安装MCP SDK
npm install @modelcontextprotocol/sdk

# 创建项目框架
npx @modelcontextprotocol/create-server my-custom-server
cd my-custom-server
MCP Server搭建
复制代码
# weather_server.py
from mcp.server.fastmcp import FastMCP
import httpx
from typing import Optional

# 1. 对FastMCP进行初始化
mcp = FastMCP("weather-server")

# 2. 运用@mcp.tool()定义工具
@mcp.tool()
async def get_forecast(latitude: float, longitude: float, days: Optional[int] = 3) -> str:
    """
    获取指定经纬度位置的天气预报。
    Args:
        latitude: 地点的纬度。
        longitude: 地点的经度。
        days: 预报的天数,默认值为3天。
    Returns:
        包含天气预报信息的字符串。
    """
    # 工具逻辑实现
    async with httpx.AsyncClient() as client:
        try:
            response = await client.get(
                f"https://api.example.com/weather/forecast",
                params={
                    "lat": latitude,
                    "lon": longitude,
                    "days": days
                },
                timeout=10.0
            )
            if response.status_code != 200:
                return f"错误:无法获取天气数据(状态码:{response.status_code})"
            data = response.json()
            # 对数据进行处理并格式化结果
            formatted_forecast = format_weather_data(data)  # 假定此函数已定义
            return formatted_forecast
        except Exception as e:
            return f"发生错误:{str(e)}"

# 3. 启动服务器
if __name__ == "__main__":
    print("正通过stdio启动天气MCP服务器...")
    try:
        mcp.run(transport='stdio')
    except Exception as e:
        print(f"服务器运行失败:{e}")
        import sys
        sys.exit(1)
MCP客户端构建
复制代码
# mcp_client_example.py
import asyncio
import sys
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

async def run_mcp_client():
    # 设置服务器连接参数
    server_params = StdioServerParameters(
        command="python",
        args=["weather_server.py"],
        env=None  # 可传入环境变量
    )
    try:
        # 建立连接
        async with stdio_client(server_params) as (read, write):
            async with ClientSession(read, write) as session:
                # 初始化连接
                await session.initialize()
                # 列出可用工具
                tools_response = await session.list_tools()
                print(f"可用工具:{[tool.name for tool in tools_response.tools]}")
                # 调用工具
                result = await session.call_tool(
                    "get_forecast", 
                    {"latitude": 39.9, "longitude": 116.4, "days": 5}
                )
                # 处理结果
                if hasattr(result, 'content') and result.content:
                    for item in result.content:
                        if item.type == 'text':
                            print(f"天气预报:{item.text}")
                else:
                    print("未返回内容或发生错误")
    except Exception as e:
        print(f"错误:{e}")

if __name__ == "__main__":
    asyncio.run(run_mcp_client())
客户端配置
复制代码
{
  "mcpServers": {
    "weather-service": {
      "transport": {
        "type": "stdio",
        "command": "python",
        "args": ["/path/to/weather_server.py"]
      },
      "env": {
        "API_KEY": "your-weather-api-key"
      }
    },
    "database-query": {
      "transport": {
        "type": "stdio",
        "command": "node",
        "args": ["/path/to/database-server.js"]
      }
    }
  }
}
MCP服务器生态
MCP的客户端

目前多种平台和应用已支持MCP协议:

相关推荐
却道天凉_好个秋2 小时前
OpenCV(四十九):GrabCut
人工智能·opencv·计算机视觉·图像分割·grabcut
dulu~dulu2 小时前
机器学习---过拟合与正则化
人工智能·深度学习·机器学习·dropout·正则化·过拟合
清名2 小时前
AI应用-基于LangChain4j实现AI对话
人工智能·后端
好奇龙猫2 小时前
【人工智能学习-AI-MIT公开课-第6.博弈,极小化极大化,α-β】
人工智能·学习
GodGump2 小时前
Stephen Wolfram 谈 AI 爆发的底层逻辑:计算不可约性与神经符号主义的未来
人工智能
nju_spy2 小时前
NJU-SME 人工智能(四)深度学习(架构+初始化+过拟合+CNN)
人工智能·深度学习·神经网络·反向传播·xavier初始化·cnn卷积神经网络·pytorch实践
静听松涛1332 小时前
在线协作跨职能泳道图制作工具 PC版
大数据·论文阅读·人工智能·信息可视化·架构
名誉寒冰2 小时前
AI大模型-Prompt工程参考学习
人工智能·学习·大模型·prompt
LiFileHub2 小时前
Foreword(前言)
人工智能