使用MCP构建AI Apps 《MCP: Build Rich-Context AI Apps with Anthropic》
吴恩达老师新推出一门免费 MCP 学习短课程:《MCP: Build Rich-Context AI Apps with Anthropic》https://www.deeplearning.ai/short-courses/mcp-build-rich-context-ai-apps-with-anthropic/ 由 Anthropic 技术教育负责人 Elie Schoppik 主讲,将教我们如何使用 MCP 标准化 LLM 与外部工具、数据、提示词的连接方式。通过实践项目强化学习,包括构建 MCP 聊天助手、创建 MCP 服务器、连接第三方参考服务器等,帮助我们掌握这一标准化协议的应用能力。
课程大纲
- 1. 为什么选择mcp?
- 2. MCP架构
- 3. 问答机器人示例,建立一个自己的chatbot,并引入自己编写的tool。chatbot.py
- 4. 创立一个MCP服务器,基于FastMCP
- 5. 在聊天机器人中创建MCP客户端
- 6.将MCP Chatbot连接到引用服务器
- 7. 升级server:添加提示词和资源
1. 为什么选择mcp?
模型需要依赖提供的上下文来工作,mcp是模型上下文协议,mcp标准了ai应用与不同外部数据/系统交互的方式。
没有mcp的话,不同的ai应用访问相似的数据库,需要开发者重复造轮子。
有了mcp,可以通过大模型的自然语言能力,与不同的数据库交互,整合各种数据源。
谁可以开发mcp?任何人,或者采用社区版本。
2. MCP架构
https://modelcontextprotocol.io/specification/2025-03-26/architecture
基于client-server架构,MCP客户端和MCP服务器通过MCP定义的消息进行通信。客户端运行在Host上。
格式 json-rpc 2.0
Host:可以通过MCP访问数据库的LLM应用,如Claude桌面版,IDE, AI agent等
MCP服务器:通过MCP暴露特定能力的程序
MCP客户端:维护和服务器一对一的连接,通常在Host上的应用中。
三大功能:工具、资源、提示词模版
-
Tools 工具调度(Tool/Function Calling):集成第三方能力或系统指令的调用机制。
作用:在模型无法回答时调用外部函数或插件(如天气查询、数据库读取等);支持 OpenAI Function Calling 或 LangChain Tool 类型结构。 -
Resources 管理与调用(Resources / 数据资源):统一管理模型访问的结构化/非结构化数据源,如数据库、文档、索引库等。
作用:让模型能够查询企业数据,如 MySQL、PostgreSQL、MongoDB;提供基于语义检索的知识库接入;控制访问权限和速率,支持多租户资源隔离。 -
Prompt 模板管理(Prompt Templates)预定义用于规范和复用大语言模型的输入模板
作用:把用户请求统一转化为标准化 Prompt 模板,提高准确率和可控性。支持参数化、模板版本控制、场景配置(如问答/写作/代码生成等)。
客户端的任务是寻找资源和工具,服务器的任务是向客户端提供这些信息。
定义Tool,基于Python SDK @mcp.tool
定义resource,@mcp.resource
定义prompt,@mcp.prompt
MCP transport:client-server之间的传输。https://modelcontextprotocol.io/specification/2025-03-26/basic/transports client端发送请求到 MCP Server, 如工具调用、数据访问等。
- stdio模式:标准输入输出模式,用于本地通信。MCP Server 被当作一个本地可执行程序运行,MCP Client 将用户请求写入它的标准输入,Server 处理后将响应写到标准输出
- http模式:MCP Server 作为一个 HTTP 服务存在,MCP Client 通过 POST 请求将输入发送给 MCP Server。支持远程访问,需要网络配置,有一点http协议开销。
3. 问答机器人示例,建立一个自己的chatbot,并引入自己编写的tool。chatbot.py
准备:按照固定的格式构建tools, 如 search_papers, extract_info。tool use的json格式包括name description input_schema等等。同时需要编写代码,实现这些tool函数。比如search_papers工具的具体实现函数,具体是archive库实现的。
Tool Mapping:创建字典,将tool对应到底层的函数调用。
创建聊天机器人:process_query处理来自用户的query,类型分为text和tool_use。普通的query,比如hi,以message处理,大模型回复。可能会涉及到tool的query,大模型调用具体tool处理,再传回结果。
模型是如何从用户基于自然语言的query中,确定自己要调用哪个tool,以及tool需要参数是什么的?
Function Calling 模型的训练:支持 Tool Use 的模型(如 GPT-4-turbo、Claude、Gemini 等)是通过以下方式实现这种能力的:系统提示(System Prompt)中定义好 tools(函数列表 + 说明),模型已在训练中见过类似场景:如模型知道如何把“天气查询”映射到 get_weather(city),使用 JSON Schema 作为函数定义标准,让模型知道每个函数需要哪些参数,如果用的是 LangChain/OpenAI,Agent 层会反复调用直到找到合适的工具或回答。
这节实现了一个简单的大模型聊天机器人通过function calling获取arxiv相关topic文章列表的功能,function calling技术回顾:
4. 创立一个MCP服务器,基于FastMCP
在上一节写的tool文件里修改
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("research");
@mcp.tool() //定义mcp tool,装饰下面函数即可。
def search_papers() ... //上一节tool的具体实现
@mcp.tool()
def extract_info() ...if __name__ == "__main__""mcp.run(transport=‘stdio’)
配置环境并启动mcp服务器
> uv init
> uv venv
> source .venv/bin/activate //创建激活进入虚拟环境
> uv add mcp arxiv //安装依赖 npx @modelcontextprotocol/inspector uv run
> reserach_server.py//启动mcp inspector,打开网页进入
MCP inspector无需构建任何server和client,在沙盒环境中测试server返回的tool resource prompt。只测试server功能,无关大模型
5. 在聊天机器人中创建MCP客户端
指定配置,让客户端知道如何启动server
mcp_chatbot.py
初始化聊天机器人,connect to server and run。建立一个到server的连接,获取流和底层会话的访问权限,列出所需的工具,获取工具,传递给模型以供使用。
uv add anthropic python-dotenv nest_asyncio
uv run mcp_chatbot.py
query之后client会启动call tool request
6.将MCP Chatbot连接到引用服务器
https://github.com/modelcontextprotocol/servers
Fetch server https://github.com/modelcontextprotocol/servers/tree/main/src/fetch
Filesystem MCP Server https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem
将以上三者都接入chatbot,建立以下json文件。chatbot会load并解析出所有可用的tool list。
建立多个客户端,可以连接到多个server。可以看到所有tool都连接了。
提示词:从deeplearning.ai中找到一个有意思的关键词,寻找相关论文,总结到result.txt。
会分别使用fetch、serach_papers、abstrac_info、写入本地文件。
7. 升级server:添加提示词和资源
@mcp.resource(“papers://folers”)
def get_available_folers() //获取文件夹
@mcp.prompt()
def generate_search_prompt()
提示词本来是用户定义的,但是用户可能不知道最佳实践是什么。提示词模版在server端创建,发送至client端,以便用户能直接使用这些完整的模板,无需自行完成提示词工程。
在本文的例子里,与其要求用户仅指定如何搜索论文,server直接为用户提供经过实战检验的提示模版,包含可动态填充的信息字段。
在chatbot.py中list prompts和resource与tool一样。