/ 技术 / 21浏览

浅学 MCP 协议

文章目录
  • MCP —— AI 世界的通用连接器
  • MCP 的核心架构
  • MCP 是如何工作的
  • 具体优势
  • 与传统API的区别
  • 实现一个MCP实例
  • 结语
  • MCP —— AI 世界的通用连接器

    MCP 是洋文 “Model Context Protocol” 的缩写,直译就是“模型上下文协议”。是 Anthropic 推出的一种开放标准,它提供了一种标准化的方式,让大型语言模型(LLM)能够与外部工具和数据源无缝通信。

    比如当我们要求Claude或ChatGPT帮你查看近期天气、读取你的文件或发送邮件时,常常得到的回复是:"很抱歉,我无法访问实时信息或你的文件系统。" 这就是当前AI模型面临的主要障碍——无法与外部世界交互,使用起来有很多局限性。

    MCP 协议作用就是在 AI 大模型与数据之间架起一座通信桥梁,无论是本地数据还是网路数据都可以访问的到。MCP就像是AI应用程序的USB-C接口,提供了一个统一标准,让AI应用能够用相同的方式连接各种数据源和工具。MCP 很灵活,提供在不同LLM提供商和供应商之间灵活切换的能力,可以实现不同AI模型与各种数据源和工具之间的无缝连接,构成一个更开放、更灵活、更强大的AI应用生态系统。

    MCP 在线文档:https://modelcontextprotocol.io

    MCP 的核心架构

    模型上下文协议采用客户端-服务器架构 。在这个架构中,宿主(Hosts)是那些发起连接的LLM应用程序。客户端(Clients)在宿主应用程序内与服务器(Servers)保持一对一的连接。“服务器”则负责向这些客户端提供上下文信息、工具以及提示(prompts)。这种明确的角色划分有助于构建模块化且易于维护的AI应用。

    核心组件:

    • MCP主机(Host):用户与AI交互的应用程序,用于发起请求连接。
    • MCP客户端(Client):在主机内部负责与服务器保持一对一连接的模块。
    • MCP服务器(Server):提供标准化接口,管理数据源连接,如连接文件系统、数据库或API等。

    数据源:

    • 本地数据源:计算机本地文件/数据库/服务,可以直接连接。
    • 远程服务:外部API/云服务,使用网络连接。

    MCP 是如何工作的

    MCP的通信机制采用JSON-RPC标准协议,支持多种传输方式:
    本地进程通信:标准输入/输出(Stdio)
    网络通信:HTTP服务器发送事件(SSE)

    具体工作流程:

    1.主机发起请求 → 客户端处理
    2.客户端与服务器建立连接
    3.服务器访问数据源并返回结果
    4.结果通过客户端返回主机

    具体优势

    使用模型上下文协议带来了诸多优势和好处 。最显著的优势之一是它通过用一个标准化的连接方法取代多种自定义集成,从而简化了软件开发过程 。MCP 就像一个插件系统 ,允许通过连接各种数据源和工具来扩展 AI 代理的能力 。

    MCP 使得 AI 系统能够与现有的工具和基础设施进行集成 ,无需告知 AI 应用程序关于项目结构的信息 。MCP 服务器可以使用任何能够输出到标准输出或提供 HTTP 端点的编程语言编写 ,这提供了极大的灵活性 。除此之外还实现了与数据源的实时双向通信 ,确保 AI 可以访问最新的信息。它还支持动态工具发现和上下文处理 ,这意味着 AI 可以根据任务的上下文自动找到并使用相关的工具。

    与传统API的区别

    MCP 支持实时的双向通信 ,这与传统的 API 通常只支持请求-响应模式不同 。MCP 还允许动态地、自动地发现工具 ,而传统的 API 通常需要手动配置工具集成 。

    功能MCP传统API
    集成方法所有工具使用单一协议每个服务需要定制集成
    通信方式实时、双向通常为请求-响应模式
    工具发现动态、自动需要手动配置
    上下文感知内置上下文处理有限或没有上下文支持
    可扩展性即插即用扩展每个新服务需要线性集成工作量

    实现一个MCP实例

    以下是一个简单的MCP实例实现,该实例使用Tavily搜索服务并对接OpenAI格式的AI大模型接口:

    import os
    from openai import OpenAI
    import requests
    
    # 设置API密钥
    TAVILY_API_KEY = os.environ.get("TAVILY_API_KEY")
    OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY")
    
    client = OpenAI(api_key=OPENAI_API_KEY)
    
    # Tavily搜索函数
    def tavily_search(query, max_results=5):
        url = "https://api.tavily.com/search"
        params = {
            "api_key": TAVILY_API_KEY,
            "query": query,
            "max_results": max_results
        }
        response = requests.get(url, params=params)
        return response.json()
    
    class MCPServer:
        def __init__(self):
            self.tools = [
                {
                    "type": "function",
                    "function": {
                        "name": "tavily_search",
                        "description": "使用Tavily搜索引擎进行网络搜索",
                        "parameters": {
                            "type": "object",
                            "properties": {
                                "query": {"type": "string"},
                                "max_results": {"type": "integer", "default": 5}
                            },
                            "required": ["query"]
                        }
                    }
                }
            ]
    
        def process_query(self, user_query):
            messages = [{"role": "user", "content": user_query}]
            
            response = client.chat.completions.create(
                model="gpt-4",
                messages=messages,
                tools=self.tools,
                tool_choice="auto"
            )
    
            if response.choices[0].message.tool_calls:
                tool_call = response.choices[0].message.tool_calls[0]
                if tool_call.function.name == "tavily_search":
                    search_query = eval(tool_call.function.arguments)["query"]
                    search_results = tavily_search(search_query)
                    
                    messages.append({"role": "assistant", "content": f"搜索结果:{search_results}"})
                    
                    final_response = client.chat.completions.create(
                        model="gpt-4",
                        messages=messages
                    )
                    return final_response.choices[0].message.content
            else:
                return response.choices[0].message.content
    
    # 使用示例
    if __name__ == "__main__":
        mcp_server = MCPServer()
        user_query = "最近的人工智能发展有哪些重大突破?"
        result = mcp_server.process_query(user_query)
        print(result)
    

    结语

    模型上下文协议标志着从零散的“集成胶水”向更标准化、更开放的生态系统的转变。MCP 的出现也是源于AI 模型长期以来被困在信息孤岛中的问题的迫切需求 ,使用 MCP 大大简化了 AI 应用程序的开发和集成。目前有越来越多的开发者和组织采用 MCP 标准,但从另一个角度想,未来随着 MCP 协议的广泛使用,许多服务提供商可能会面临不得不提供 mcp 接口供大模型调用的情况。

    这里荒芜寸草不生 后来你来这走了一遭 奇迹般万物生长 这里是我的心

    0

    1. This post has no comment yet

    发表回复

    您的邮箱地址不会被公开。 必填项已用 * 标注