MCP出现的意义是什么?让 AI 智能体更模块化

AI 智能体现在能做的事情真的很厉害,可以思考、规划,还能执行各种复杂任务,而且代码量并不大。这让开发者看到了一个机会:把那些庞大复杂的代码库和 API 拆解成更实用的模块。

不过要让这些智能变成现实世界里真正能用的东西,还需要模块化、标准化和强大的接口支持。模型上下文协议(Model Context Protocol,简称 MCP) 就是为了解决这个问题而出现的。

什么样的智能体才算是好智能体?

一开始构建智能体挺简单的:给大型语言模型写一些专门的指令来执行任务,再可选地提供一些函数工具,让它能调用外部 API。

但真正优秀的智能体应该具备这些特点:

  • 模块化:每个任务都是独立定义且可重用的
  • 可组合:智能体可以智能地委派任务或协同工作
  • 接地:通过工具与现实世界数据交互
  • 可编排:行动序列可根据输入和上下文进行路由
  • 可维护:逻辑和工具可以独立演进

比如说,有人之前构建了一个处理文档的应用,这个多智能体流水线可以:

  • 读取文档(PDF/图片)
  • 提取原始文本
  • 对内容进行摘要
  • 提取元数据
  • 存储数据
  • 回答用户关于存储数据的问题

听起来很不错,但最初的设计方式其实有不少限制。

MCP 的客户端-宿主-服务器架构是怎么工作的

MCP 的核心遵循客户端-宿主-服务器模型,既抽象了工具的集成方式,又保留了灵活性和控制力。

  • 宿主(Host) 是整个操作的大脑,通常是像 Claude、ChatGPT 这样的 AI 接口,或者自己的编排器应用。它负责启动 MCP 客户端、执行安全和权限策略,并决定何时调用外部工具。

  • 客户端(Client) 充当宿主和单个服务器之间的桥梁。一旦启动,它会处理所有通信,格式化结构化请求,将其传递给相应的服务器,并将结果返回给宿主。这里不需要写很多定制代码,因为客户端 SDK 处理了大部分复杂性。

  • 服务器(Server) 是真正实现功能的地方,也是开发者需要构建的部分。比如 OCR 微服务,它公开了特定的能力。OCR 服务器可能提供一个名为 extract_text 的工具,检索服务器则可以提供 query_documentssemantic_lookup 等工具。

服务器可以公开三种能力:

  • Prompts(提示词):预定义的模板或指令,用于指导模型
  • Resources(资源):结构化的上下文数据,如 PDF 文档、数据库记录或向量嵌入
  • Tools(工具):可调用的函数,让模型能够采取行动

可以把 MCP 看作连接智能体与外部能力的结缔组织,它通过标准化、可内省和可互操作的接口实现连接。

乍一看,它可能跟传统 API 差不多,但有个关键区别:API 是直接暴露功能供使用,而 MCP 允许智能体通过 JSON Schema 动态地发现、描述和调用工具。

比如说,Firestore 服务器可以轻松替换为 MongoDB 版本,而无需更改编排器代码。或者可以将 OCR 服务器接入到另一个项目中,只要它符合 MCP 清单的要求,就能正常运行。

用 OpenAI Agents 和函数工具构建的传统方式

使用像 OpenAI 的 Agents SDK 或 LangChain 这样的框架时,可以将工具定义为 Python 函数,然后将它们传递给智能体。

这是一个用于 OCR 的工具示例:

@tool
def extract_text(file_bytes: bytes) -> str:image = vision.Image(content=file_bytes)response = client.document_text_detection(image=image)return response.full_text_annotation.text

然后将它包装成一个智能体:

extract_text_agent = Agent(instructions="Extract text using OCR.",tools=[extract_text],model="gpt-4o-mini"
)

用编排器将这些智能体链式连接起来:

orchestrator = Agent(instructions="""1. Use the OCR tool to extract text2. Summarize the text3. Extract metadata4. Store everything""",tools=[extract_text_agent.as_tool("ocr"),summarizer_agent.as_tool("summarize"),metadata_agent.as_tool("extract_metadata"),firestore_agent.as_tool("store")])

这种做法是可行的,但它紧密耦合了代码、智能体和服务。如果想要:

  • 将 OCR 服务从 GCP 换到 Azure
  • 从 Firestore 迁移到 PostgreSQL
  • 添加缓存层

这都意味着需要修改核心的智能体逻辑和编排器指令,增加了额外的工作量,并限制了系统的扩展能力。

MCP 登场:解决模块化问题

模型上下文协议(MCP) 是 Anthropic 提出的一项标准,用于通过结构化的 JSON 接口向 LLM 公开工具。它实现了:

  • 可发现性:模型通过清单内省工具能力
  • 解耦:工具是服务器,而不是内联函数
  • 标准化:输入和输出使用类型化 Schema
  • 可替换性:通过指向新的清单来替换工具
  • 兼容性:与 GPT、Claude、LLaMA 及其他 LLM 宿主兼容

把 MCP 想象成工具与 AI 运行时之间的契约。现在构建的是带有清单的 REST 服务器,而不是函数工具。

AI 智能体能发挥多大作用,很大程度上取决于它们能访问的数据。如果没有能够连接到互联网或数据库的函数工具,那么能力会受到严重限制。MCP 为 AI 工具提供了一种标准化的方法来发现其他 API 和工具,让 AI 工具能找到新的信息源并执行动作,而不仅仅是提供洞察。

以往,这意味着需要创建自定义集成才能让 AI 应用连接外部工具。MCP 使开发者能够更容易、更快速地构建工具集成,同时也方便在不同的工具之间切换,从而实现模块化和可扩展性。

构建 MCP 兼容工具服务器

让我们演示如何构建一个遵循 MCP 标准的 OCR 工具。

第 1 步:将 OCR 工具构建为服务器

# ocr_mcp_server.pyfrom typing import Any
from mcp.server.fastmcp import FastMCP
from google.cloud import vision
import base64
import asyncio# Initialize MCP server
mcp = FastMCP("ocr")# OCR Tool
@mcp.tool()
async def extract_text(file_content: str) -> str:"""Extract text from a base64-encoded PDF or image content."""client = vision.ImageAnnotatorClient()# Decode the base64 content back to bytesimage_bytes = base64.b64decode(file_content.encode("utf-8"))image = vision.Image(content=image_bytes)response = await asyncio.to_thread(client.document_text_detection, image=image)if not response.full_text_annotation or not response.full_text_annotation.text:return "No text found in document."return response.full_text_annotation.text# Run the server
if __name__ == "__main__":print("MCP Server starting in stdio mode...")mcp.run(transport="stdio")

第 2 步:定义 MCP 清单

{"name": "OCR MCP Server","description": "使用 Google Cloud Vision API 从 Base64 编码的 PDF 或图像文件中提取原始文本。","tools": [{"name": "extract_text","description": "从 Base64 编码的文件内容字符串中提取完整的文档文本。","input_schema": {"type": "object","properties": {"file_content": {"type": "string","description": "PDF 或图像的 Base64 编码二进制内容"}},"required": ["file_content"]},"output_schema": {"type": "string","description": "文档中经 OCR 识别的完整文本内容"}}]
}

这份清单使得任何模型编排器都能理解:

  • 此工具的功能是什么
  • 期望的输入/输出格式是怎样的
  • 请求应该发送到何处

MCP 客户端:将工具调用为动作

现在,编排器不再需要与具体的工具实现方式绑定,而是通过 MCP 客户端调用抽象的动作。

import base64
from mcp.client import MCPClient
import asyncio
import osasync def main():file_path = "sample.pdf"# Step 1: Read and encode filetry:with open(file_path, "rb") as f:file_bytes = f.read()file_content = base64.b64encode(file_bytes).decode("utf-8")except FileNotFoundError:print(f"Error: File not found at {file_path}")returnexcept Exception as e:print(f"Error reading file: {e}")return# Step 2: Initialize clientserver_url = "http://localhost:8001"print(f"Attempting to connect to MCP server at {server_url}...")try:client = MCPClient(server_url)# Step 3: Call the OCR toolprint("Calling 'extract_text' tool...")params = {"file_content": file_content}result = await client.call_tool("extract_text", params)# Step 4: Output extracted textprint("\nExtracted Document Text:\n")print(result)except Exception as e:print(f"An error occurred during MCP client call: {e}")print("Please ensure the MCP server is running and accessible at the specified URL.")if __name__ == "__main__":asyncio.run(main())

任何智能体或工具都无需了解其他部分的具体实现方式。这正是 MCP 的强大之处。

MCP 架构的优势

  • 模块化:每个工具都是独立的、可版本化和可测试的
  • 可组合性:智能体可以通过清单混合搭配工具
  • 可维护性:工具 Schema 的变化不会破坏编排逻辑
  • 可扩展性:添加新服务无需更新智能体
  • 跨模型兼容:适用于 GPT、Claude、LLaMA 等多种模型

MCP 与传统智能体 API 的对比

AI 智能体是智能系统,旨在无需指定每个步骤就能采取行动。比如在文档助手中,一旦上传了文件,无需手动调用 OCR、摘要或元数据提取。编排器智能体根据设定的指令自主处理这一切。

MCP 通过为智能体提供访问外部服务的标准化途径,提升了这种自主性。无需将函数调用硬编码到编排器中,而是可以将 OCR 或 Firestore 存储等能力作为独立的 MCP 服务器公开。智能体无需知道具体实现——它只需调用一个像 extract_text 这样的动作,底层服务器会处理其余部分。

这使得接入新工具或切换提供商变得更加容易,比如从 Google Vision 切换到 Azure OCR,而无需重写智能体逻辑。

总结

MCP 是一个注重开发者体验的框架,专为希望精确控制智能体如何与工具和数据交互的工程师而设计。它通过允许 AI 连接外部工具,来赋予 AI 具身智能的能力。

MCP 和传统智能体 API 为不同人群解决了不同问题,并且都在不断发展的 AI 生态系统中扮演着各自的角色。构建一个完全自动化系统最重要的考量应该是模块化、可扩展性和可靠性。如何实现这一步取决于个人偏好以及可用的工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87718.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87718.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度剖析】领信卓越:福耀玻璃的数字化转型(下篇3:阶段成效3-打造从功能部件到数据终端跃迁的智能化产品)

在数字经济持续发展的背景下,企业数字化转型方案成为实现转型的关键。不同行业内的企业因转型动机和路径的差异,其转型成效也各异。福耀玻璃自1983年创立以来,从一家濒临破产的乡镇水表玻璃厂蜕变为全球汽车玻璃行业的领军企业,其发展历程堪称中国制造业的典范。创始人曹德…

告别停机烦恼!AWS EC2实例升级的“零中断”实战方案

引言: “服务器要升级了,今晚得停机维护...” —— 这句话曾是多少运维工程师的“噩梦”,也是业务部门最不愿听到的通知。在追求极致用户体验和7x24小时业务连续性的今天,停机窗口已成为难以承受之重。尤其是在云时代&#xff0c…

奇葩的el-checkbox-group数组赋值

背景。自定义表单。多选组件封装。当选项被多选后&#xff0c;el-checkbox-group中v-model的值以数组形式存储了选中的内容。奇葩问题。存储的值时label属性。而渲染时需要使用插值单独将选项的名称渲染出来。而在el-checkbox标签中:label要赋值option.value很别扭。 <temp…

【Python系列PyCharm实战】ModuleNotFoundError: No module named ‘sklearn’ 系列Bug解决方案大全

【Python系列Colab实战】ModuleNotFoundError: No module named ‘sklearn’ 系列Bug解决方案大全 一、摘要 在使用 Jupyter、PyCharm 或 Google Colab 进行机器学习开发时&#xff0c;导入 sklearn&#xff08;scikit-learn&#xff09;相关模块时&#xff0c;常会遇到一系列…

小白的进阶之路系列之十六----人工智能从初步到精通pytorch综合运用的讲解第九部分

从零开始学习NLP 在这个由三部分组成的系列中,你将构建并训练一个基本的字符级循环神经网络 (RNN) 来对单词进行分类。 你将学习 如何从零开始构建循环神经网络NLP 的基本数据处理技术如何训练 RNN 以识别单词的语言来源。从零开始学自然语言处理:使用字符级 RNN 对名字进行…

MySQL在ubuntu下的安装

前言&#xff1a; 安装与卸载中&#xff0c;用户全部进行切换为root ,一旦安装&#xff0c;普通用户也是可以进行使用 初期联系mysql时不进行用户的管理&#xff0c;直接使用root 进行即可&#xff0c;尽快适应mysql语句&#xff0c;后面进行学了用户管理再考虑新建普通用户。&…

低代码技术实战:从 0 到 1 构建高效业务流程应用

引言 在当今竞争激烈的商业环境中&#xff0c;企业迫切需要简化运营并提高效率。低代码技术作为一种新兴的解决方案&#xff0c;正逐渐成为企业实现这一目标的有力工具。它能够将繁琐的手工业务流程转化为数字资产和应用程序&#xff0c;为企业带来诸多优势。本文将详细介绍低…

RPGMZ游戏引擎 如何手动控制文字显示速度

直接上代码 const _Window_Base_prototype_initialize Window_Base.prototype.initialize;Window_Base.prototype.initialize function(rect) {_Window_Base_prototype_initialize.call(this, rect);this.文字速度缓冲 0;}; this.文字速度缓冲 0; 进行缓冲 Window_Base…

Leetcode-1750. 删除字符串两端相同字符后的最短长度

Problem: 1750. 删除字符串两端相同字符后的最短长度1750. 删除字符串两端相同字符后的最短长度 1750. 删除字符串两端相同字符后的最短长度 思路 双指针遍历 解题过程 模拟题目描述的过程&#xff0c;使用指针 l, r 指向首尾两端。 如果相同就向中心移动。为了尽可能的删除多…

【mysql】通过information_schema.tables查询表的统计信息

1 查询表的统计信息 information_schema.tables 是 MySQL 中的一个系统视图&#xff0c;包含数据库中所有表的信息。 如何查询当前数据库的所有表信息&#xff1a; SELECT * FROM information_schema.tables WHERE table_schema DATABASE(); 返回的字段有&#xff1a; 字段名…

“地标界爱马仕”再启:世酒中菜联袂陈汇堂共筑新会陈皮顶奢产业

“地标界爱马仕”再启战略新篇&#xff1a;世酒中菜联袂陈汇堂&#xff0c;共筑新会陈皮顶奢产业生态 ——中世国际与陈汇堂股权合作签约仪式在国际地理标志服务基地举行 江门市新会区&#xff0c;2025年6月20日——被誉为“地标界爱马仕”的全球顶奢品牌运营商世酒中菜 &…

倒计时 效果

实现HTML <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>信质集团SAP/ERP切换倒计时</title…

高性能群集部署技术-Nginx+Tomcat负载均衡群集

目录 #1.1案例概述 1.1.1案例前置知识点 1.1.2案例环境 #2.1案例实施 2.1.1实施准备 2.1.2查看JDK是否安装 2.1.3安装配置Tomcat 2.1.4Tomcat主配置文件说明 2.1.5建立Java的Web站点 #3.1NginxTomcat负载均衡&#xff0c;动静分离群集的实验案例 3.1.1案例概述 3.1.2案例环境…

《Go语言圣经》函数值、匿名函数递归与可变参数

《Go语言圣经》函数值、匿名函数递归与可变参数 函数值&#xff08;Function Values&#xff09; 在 Go 语言中&#xff0c;函数被视为第一类值&#xff08;first-class values&#xff09;&#xff0c;这意味着它们可以像其他值一样被操作&#xff1a;拥有类型、赋值给变量、…

vtk和opencv和opengl直接的区别是什么?

简介 VTK、OpenCV 和 OpenGL 是三个在计算机图形学、图像处理和可视化领域广泛使用的工具库&#xff0c;但它们在功能、应用场景和底层技术上存在显著差异。以下是它们的核心区别和特点对比&#xff1a; 1. 核心功能与定位 工具核心功能主要应用领域VTK (Visualization Toolk…

最新豆包大模型发布!火山引擎推出Agent开发新范式

Datawhale大会 2025火山引擎 Force 原动力大会 6月11日-12日&#xff0c;北京国家会议中心人山人海&#xff0c;2025 火山引擎 Force 原动力大会如约而至。 作为开发者社区的一员&#xff0c;这场大会上的一系列新发布让我们感受到了&#xff1a;这个 Agent 技术落地元年的关键…

RFC4291-IPv6地址架构解说

RFC 4291 是由互联网工程任务组&#xff08;IETF&#xff09;发布的关于 IPv6 地址架构 的标准文档。 该文档详细定义了 IPv6 地址的格式、类型、表示方法以及分配方式。 以下是对 RFC 4291 中 IPv6 地址架构的全面解析&#xff0c;包括地址格式、类型、表示方法、特殊地址以…

简单对比 **HTTP**、**MQTT** 和 **CoAP** 这三种通信协议

对比 HTTP、MQTT 和 CoAP 这三种通信协议&#xff0c;从 消息结构、资源占用、安全性 等方面进行全面分析。 &#x1f310; HTTP vs MQTT vs CoAP 对比 特性HTTPMQTTCoAP协议层级应用层基于 TCP应用层基于 TCP / WebSocket应用层基于 UDP (也支持 TCP)消息模式请求/响应 (客户…

【Dify 案例】【自然语言转SQL案例】【五】【实战二】【财务管理查询商品信息数据】

援引实战一,进行数据业务处理化 1.开始 2.自然语言转SQL的工具 3.参数提取器 4.SQL查询

FPGA基础 -- Verilog语言要素之标识符

一、什么是标识符&#xff08;Identifier&#xff09; 在 Verilog 中&#xff0c;标识符是用户定义的名字&#xff0c;用于标识模块、变量、端口、函数、任务、参数、宏定义等各种语言要素。 就像 C 语言的变量名、函数名一样&#xff0c;Verilog 中的标识符为 HDL 代码提供了…