暂且抛开MCP,这23年的时候开始搭建AI Agent智能体,对第三方插件API进行交互的时候,我就开始设想能不能自己做一个通用代码协议框架,以后AI团队统一用这个协议,方便大家code review,更好协作。AI要触及到业务就必然逃不过与业务端接口或是数据进行联通,但是之前都没有标准的交互协议,需要理解各个三方接口和协议是比较费时的事情,但如果有类似像Java工程开发标准,那么我们就很方便开发第三方接口了,不会存在那么多不同开发形态的代码,方便维护。MCP协议出现之后发现大家都在慢慢融入到开源协议框架中,故而再对一些不了解MCP的朋友详细解述这一框架协议,以后必然是以开源协议为主导的代码生态。
我是Fanstuck,致力于将复杂的技术知识以易懂的方式传递给读者,每一篇文章都凝聚着我对技术的深刻洞察。从 人工智能的基础理论到前沿研究成果,从热门框架的深度解析到实战项目的详细拆解,内容丰富多样。无论是初学者想要入门,还是资深开发者追求进阶,都能在这里找到契合自身需求的知识养分。如果你对大模型的创新应用、AI技术发展以及实际落地实践感兴趣,那么请关注Fanstuck。
当前大模型需要处理特定领域的数据或执行复杂任务时,往往面临着“信息孤岛”的挑战。这意味着,尽管模型本身强大,但由于无法直接访问或整合外部数据源,其应用范围和实用性受到了限制。
如果你有一个全能的助手,能够流利地与您对话,解答各种问题。但当你要求它分析公司内部的销售数据、整理本地文件,或与其他软件工具协同工作时,它却显得无能为力。这正是当前许多AI助手所面临的困境:它们被困在自己的“知识围墙”内,无法有效地与外部世界交互。
为了解决这一问题,Anthropic公司于2024年11月推出了模型上下文协议(Model Context Protocol,简称MCP) 。MCP旨在为AI模型与外部数据源和工具之间搭建一座标准化的桥梁,使AI应用能够安全、灵活地访问和操作本地及远程数据。可以将MCP比作AI领域的“USB-C接口”,它为不同的数据源和工具提供了统一的连接方式,简化了集成过程,提升了AI系统的实用性和扩展性。
通过MCP,AI助手可以直接与本地文件系统交互,读取或编辑文档;连接数据库,查询或更新数据;甚至与在线服务(如Slack、GitHub)整合,实现消息发送、代码管理等功能。这种能力的提升,使得AI助手在处理实际业务场景时更加得心应手,真正成为用户的得力助手。在接下来的章节中,我们将深入探讨MCP的工作原理、核心组件、主要功能,以及它在实际应用中的优势和案例。全面了解MCP如何为AI模型赋能,打破信息孤岛,实现更广泛的应用和更高效的工作流程。
MCP的核心目标是为AI模型提供一个通用的接口,使其能够与各种外部数据源和工具进行无缝交互。具体功能包括:
标准化数据访问:通过统一的协议,简化AI模型与不同数据源的连接,避免为每个数据源单独开发接口代码。
增强上下文感知能力:允许AI模型访问实时、相关的数据和专门的工具,基于准确的信息做出响应。
双向安全通信:在AI应用和数据源之间建立安全的双向通信通道,确保数据的隐私性和交互的完整性。
MCP 与 API:
功能 | MCP | 传统 API |
---|---|---|
集成工作量 | 单一、标准化的集成 | 每个 API 的独立集成 |
实时通信 | ✅ 是 | ❌ 无 |
动态发现 | ✅ 是 | ❌ 无 |
可扩展性 | 简单(即插即用) | 需要额外的集成 |
安全与控制 | 在工具间保持一致 | 根据 API 而异 |
MCP 与 Function Calling 的区别
这两种技术都旨在增强 AI 模型与外部数据的交互能力,但 MCP 不止可以增强 AI 模型,还可以是其他的应用系统。
类型/特性 | MCP (Model Context Protocol) | Function Calling |
---|---|---|
性质 | 协议 | 功能 |
范围 | 通用(多数据源、多功能) | 特定场景(单一数据源或功能) |
目标 | 统一接口,实现互操作 | 扩展模型能力 |
实现 | 基于标准协议 | 依赖于特定模型实现 |
开发复杂度 | 低:通过统一协议实现多源兼容 | 高:需要为每个任务单独开发函数 |
复用性 | 高:一次开发,可多场景使用 | 低:函数通常为特定任务设计 |
灵活性 | 高:支持动态适配和扩展 | 低:功能扩展需要额外开发 |
常见场景 | 复杂场景,如跨平台数据访问与整合 | 简单任务,如天气查询 |
MCP采用客户端-服务器架构,主要组件包括客户端、服务器和资源。:
MCP主机(Host):MCP主机是运行AI应用程序的环境,负责发起与外部资源的连接。例如,Claude Desktop等AI助手应用,需要通过MCP访问本地文件、数据库或远程API。在实际应用中,用户通过Claude Desktop与AI助手交互,当需要访问本地文件时,Claude Desktop作为MCP主机,协调AI助手与本地文件系统之间的通信。
MCP客户端(Client):MCP客户端是嵌入在主机应用中的连接器,负责与MCP服务器建立一对一的连接。它充当AI模型与外部资源之间的桥梁,管理数据请求和响应的传递。例如,在Claude Desktop中,MCP客户端会向服务器请求访问特定的本地文件或远程API,并将获取的数据传递给AI模型进行处理。
MCP服务器(Server):MCP服务器是一个轻量级程序,通过标准化的MCP协议开放特定功能。它负责处理来自客户端的请求,与本地或远程资源交互,并将结果返回给客户端。例如,MCP服务器可以连接到本地文件系统,提供文件读取和写入功能;或连接到远程API,获取实时数据。这种设计使得AI应用能够通过统一的接口访问多种资源,简化了开发和集成的复杂度。
当AI模型需要访问外部数据或功能时,MCP客户端向MCP服务器发送请求,服务器与相应的数据源或工具交互后,将结果返回给客户端,最终供AI模型使用。清晰地看出MCP 本身不处理复杂的逻辑;它只是协调 AI 模型和工具之间数据和指令的流动。
本地与远程资源
假设你正在使用Claude Desktop与AI助手进行交互,希望它帮助你整理本地的PDF文件。在这种情况下,Claude Desktop作为MCP主机,内部的MCP客户端会向MCP服务器发送请求,要求访问本地的文件系统。MCP服务器接收到请求后,与本地文件系统交互,获取所需的PDF文件列表,并将结果返回给客户端。AI助手接收到这些信息后,可以进一步对文件进行分类、重命名或移动操作,从而帮助你高效地整理文件。
通过MCP的协同工作,AI应用能够灵活、安全地访问和操作各种资源,极大地扩展了AI助手的功能和应用范围。
MCP允许AI模型访问所需的上下文和数据,打破了信息孤岛的限制。例如,在企业环境中,AI助手需要获取内部文档、客户信息或销售数据,以提供准确的分析和建议。通过MCP,AI助手可以安全地连接到公司的数据库或文件系统,实时获取最新信息,确保决策的准确性和时效性。这种资源共享机制使AI模型能够在更广泛的领域发挥作用,提升工作效率。
MCP使AI模型能够调用外部功能,如查询数据库、调用API等,扩展了其能力范围。例如,开发者在编写代码时,可能需要查询特定的API文档或检查代码库的状态。通过MCP,AI助手可以直接与代码管理工具(如GitHub)交互,获取所需信息,甚至执行代码提交、创建分支等操作。这种工具调用功能使AI助手成为开发者的得力助手,简化了开发流程。
MCP支持为用户预定义完成特定任务的模板,简化交互过程。例如,在客户支持场景中,AI助手需要根据不同的客户需求提供相应的回复。通过提示模板,AI助手可以快速生成专业、准确的回复,提高客户满意度。此外,在内容创作领域,提示模板可以帮助AI助手生成符合特定风格和要求的文本,助力创作者高效完成工作。
要开始创建一个 MCP 服务器,需要对 Python 和异步编程有基本的了解。让我们一步步讲解如何设置和实现一个自定义的 MCP 服务器。
最简单的方法是使用官方的 MCP 服务器创建工具:
# Using uvx (recommended)uvx create-mcp-server# Or using pippip install create-mcp-serverpip install mcp-server-gitcreate-mcp-server
需要注意的是Python版本需要3.10以上。
我们通过pycharm来创建一个基础的目录
my-server/├── README.md├── pyproject.toml└── src/ └── my_server/ ├── __init__.py ├── __main__.py └── server.py
我们来构建一个后端 AI Agent 项目,通过定义清晰的工具接口与 JSON Schema,实现 AI 与外部知识库(arXiv)交互,返回结构化信息。该项目完整的开发流程图解:
开始 └── 初始化MCP服务器 └── 注册工具接口 (search-arxiv) └── 接收AI请求 (调用search-arxiv工具) └── 验证输入参数 (keyword) └── 调用arxiv API 检索论文 └── 获取论文数据 └── 格式化数据结果 └── 返回结构化的论文信息给AI大模型结束
import asyncio
from mcp.server.models import InitializationOptions
import mcp.types as types
from mcp.server import NotificationOptions, Server
import mcp.server.stdio
import arxiv
server = Server("mcp-scholarly")
client = arxiv.Client()
mcp-scholarly
的AI工具服务器。@server.list_tools()
)@server.list_tools()
async def handle_list_tools() -> list[types.Tool]:
return [
types.Tool(
name="search-arxiv",
description="Search arxiv for articles related to the given keyword.",
inputSchema={
"type": "object",
"properties": {
"keyword": {"type": "string"},
},
"required": ["keyword"],
},
)
]
具需要输入一个关键词(keyword
)进行论文检索。
@server.call_tool()
)@server.call_tool()
async def handle_call_tool(
name: str, arguments: dict | None
) -> list[types.TextContent | types.ImageContent | types.EmbeddedResource]:
if name != "search-arxiv":
raise ValueError(f"Unknown tool: {name}")
if not arguments:
raise ValueError("Missing arguments")
keyword = arguments.get("keyword")
if not keyword:
raise ValueError("Missing keyword")
# 调用arXiv API进行论文搜索
search = arxiv.Search(
query=keyword,
max_results=10,
sort_by=arxiv.SortCriterion.SubmittedDate
)
results = client.results(search)
# 格式化返回结果
formatted_results = []
for result in results:
article_data = "\n".join([
f"Title: {result.title}",
f"Summary: {result.summary}",
f"Links: {'||'.join([link.href for link in result.links])}",
f"PDF URL: {result.pdf_url}",
])
formatted_results.append(article_data)
return [
types.TextContent(
type="text",
text=f"Search articles for {keyword}:\n"
+ "\n\n\n".join(formatted_results)
),
]
实现实际的论文搜索逻辑:
InitializationOptions
配置服务器的基本信息和功能,包括服务器名称、版本以及支持的能力。async def
定义,表明这是一个异步函数,适合处理I/O密集型任务,如网络通信。async with
用于异步上下文管理,确保资源(如流)在使用后正确释放。标准IO通信:
mcp.server.stdio.stdio_server()
返回一个异步上下文管理器,用于通过标准输入输出与客户端通信。read_stream
和write_stream
分别代表输入流和输出流,用于接收和发送数据。服务器初始化选项:
InitializationOptions
配置服务器的基本信息和功能。server.get_capabilities()
获取服务器支持的能力,包括通知选项和实验性功能。随后启动服务即可:
python -m src.my_server
MCP Inspector 提供了一个测试服务器的界面,直接在终端运行即可:
npx @modelcontextprotocol/inspector python -m src.my_server
通过界面可以调试我们的所有功能,很方便测试我们的端口:
可以看到Tools是我们之前写的工具接口,List Tools是我们写的工具调用处理函数,包含search-arxiv,直接在keyword里面输入关键词,就可以看到服务器响应返回的全部数据了。
MCP的广泛应用仍处于初期阶段,社区对其潜力和局限性的讨论也在持续。一些开发者认为,MCP有望成为AI与外部系统交互的标准接口,但也有人担心其在安全性和性能方面的挑战。随着更多开发者的参与和贡献,MCP的生态系统有望进一步丰富和完善。
尽管MCP为AI模型与外部资源的交互提供了标准化的解决方案,但在实际应用中,仍存在一些需要改进的方面:
随着AI技术的不断发展和应用场景的日益复杂,MCP有望在未来发挥更重要的作用。我鼓励开发者积极探索和应用MCP,共同推动AI系统的能力和效率的提升,为构建更加智能和互联的贡献力量。
有更多感悟以及有关大模型的相关想法可随时联系博主深层讨论,我是Fanstuck,致力于将复杂的技术知识以易懂的方式传递给读者,热衷于分享最新的行业动向和技术趋势。如果你对大模型的创新应用、AI技术发展以及实际落地实践感兴趣,那么请关注Fanstuck,下期内容我们再见!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。