Model Context Protocol(MCP)模型上下文协议
Model Context Protocol(MCP)模型上下文协议
- 前言
- 一、什么是MCP
- 二、MCP的作用
- 三、MCP与Function call对比
- 四、构建一个简单的MCP DEMO
- 环境准备
- 实现MCP Server
- 运行 Server
- MCP Client端配置
- 验证
- 总结
前言
在Agent时代,将Agent确立为大模型未来发展的核心方向时,Function Calling技术尤为关键。这项技术通过工具赋能大模型,使其能够突破固有能力的限制。具体而言,大模型可借此实现实时信息查询、检索网络信息或调用企业内部API等功能。
一、什么是MCP
MCP(Model Context Protocol,模型上下文协议)是 Anthropic 于 2024 年 11 月 25 日提出并开源的一项新标准协议,专为LLM设计的开放、标准化通信协议,标准化了应用程序向 LLM 提供上下文的方式,旨在实现LLM与外部数据源、工具之间的高效交互,核心目标是解决传统集成中的“MxN”问题(即M个模型与N个工具之间的复杂集成)。

MCP核心组件如下:
- Host:宿主程序,即当前使用的大模型的载体应用,比如 Claude Desktop、Cursor、CherryStudio等。
- Client:MCP 客户端,即负责与 MCP Server 进行通信的组件,内置在 Host 中,比如 CherryStudio 就已经内置了,直接录入 MCP Server 后即可实现调用。
- Server:MCP 服务器,即实际提供外部数据和外部能力的组件,一般在 Host 外部,可以是本地文件的封装,也可以是远程 REST 接口的封装。
- Local Data Source:您的计算机文件、数据库和服务,MCP 服务器可以安全访问,这里可以实现通用的认证,不用单独为每个API进行权限控制。
- Remote Service:MCP 服务器可以连接的互联网外部系统,或者说其他服务商提供的MCP,如高德地图、搜索引擎等。
官网:https://modelcontextprotocol.io/introduction
二、MCP的作用
为什么有了Function Calling还会出现MCP呢?
首先我认识MCP出现是必然的。MCP是提出一种标准,是大模型与工具(服务/API)之间通信所遵循的标准,可以对大模型和工具进行解偶,可以让不管是用户还是大模型厂商还是服务提供商更加专注于本身的功能创新,摆脱适配的问题。
如ChatGPT的GPTPlugins不能直接在Claude中使用。
对于大模型应用开发人员,常会在大模型中集成了某个外部能力,比如Gitee代码仓库操作,但大模型A中集成的代码在大模型B中可能不能直接使用,这会造成整体工作的大量重复和浪费,也就是上文提到的“MxN”的问题。所以,MCP的出现就是解决了这个问题。
三、MCP与Function call对比
首先他俩的最终目标是一致的,都是为了给大模型赋能,让大模型应用更好的落地。
Function call是一种给大模型赋能的方法,实现了大模型可以调用外部工具。
MCP给大模型提供了一个“万能工具箱”,不管使用的是什么模型,都可以随意调用你所需要的工具,工具可能来自不同的厂商,但是都没有任何问题。
举个例子:
想象一下你(用户)正在和一个非常聪明的助手(LLM)交流,你想让他帮你出一份旅游攻略
无MCP情况下,你可能需要写很多代码,先分别从天气API、车票API、地图API获取数据,然后把这些杂乱的信息(可能格式各不相同)一股脑儿地塞给助手,助手需要费力地去理解这些不同来源、不同格式的数据。如果换一个助手模型,或者增加一个新的数据源(比如美团API),你可能又要重写很多集成代码。
有MCP情况下,每个厂商按照MCP标准把数据整成标准格式,这些API把这些已经符合 MCP 标准的、结构化的数据一起提供给助手(LLM)。助手接收到这些信息时,因为它们都遵循同一个标准协议 (MCP),所以它能更容易、更高效地理解这些数据,它们的结构都是我认识的标准样子。然后助手基于这些结构化、标准化的上下文信息,更容易地为你撰写销售策略报告。
总的来说:
- Function Calling: 是 LLM“向外看”,主动请求执行一个具体任务的方式。好比打电话。
- MCP: 是“向内看”,规范外部世界如何提供信息给 LLM 的标准方式。好比一个标准化的信息收件箱和阅读格式。
四、构建一个简单的MCP DEMO
官方提供的SDK有以下几种,这里我使用的 Python SDK

环境准备
这里我使用的conda管理虚拟环境
conda env list
# conda environments:
#
base /Users/lpp/workspace/software/miniconda3
common /Users/lpp/workspace/software/miniconda3/envs/common
llmenv * /Users/lpp/workspace/software/miniconda3/envs/llmenvconda create -n mcpenv python=3.12 # conda创建虚拟环境conda activate mcpenv # 激活虚拟环境python -V # 查看py版本
Python 3.12.9pip install "mcp[cli]" # 安装SDKmcp version # 验证
MCP version 1.6.0
实现MCP Server
一个最简单的demo,用于获取本机文件列表。
import os
from mcp.server.fastmcp import FastMCPmcp = FastMCP() # 初始化 MCP 服务实例# 定义getfile函数,返回指定路径下的文件
@mcp.tool() # 装饰器,与langchain中tool作用一样,将函数封装成大模型可以识别的工具
def get_files(path):"""获取指定路径下文件列表:param path: 路径:return: 文件列表"""return os.listdir(os.path.expanduser(path))if __name__ == "__main__":mcp.run(transport='stdio') # 启动服务,使用标准输入输出通信,也可以是see,HTTP模式
运行 Server
mcp dev first_MCPserver.py
运行结果如下:

首次访问 http://127.0.0.1:6274 🚀可能会发现connet无法连接,在console控制台看到报错,如下图:

报错spawn uv ENOENT 意思是缺少 uv 命令,安装即可
pip install uv

启动成功后就可以进行访问web了,
因为我们写的是tool,所以选择Tools菜单进行测试。

MCP Client端配置
这里我使用的是CherryStdio
最新版:

老版本:

首次打开MCP服务器配置,红色方框位置会提示安装uv和bun,点击安装按钮即可。
可能会有人有疑问,为什么server端安装了uv,这里还要安装,这里说一下,cherrystudio默认从他根目录下bin读取命令,刚刚我们的uv命令是安装在了py虚拟环境,相当于隔离的两个环境。当然,也可以使用操作系统层面的环境变量,只需要一个uv就可以了。
MacOS默认安装在~/.cherrystudio/bin

这里我使用uv命令一直报错,一直无法连接MCPServer,网上基本都是说环境的问题,我尝试了几种方法也没有解决。

但从网上看到有大佬直接使用python去运行,测试可行!
配置如下:

配置文件如下:

验证
这里需要注意两点
- 要选择支持function calling调用的模型

- 添加MCP服务器

配置好了就可以提问了

可以看到大模型调用了我们在Server端封装的get_files工具,并且输出正确。
总结
除了工具之外,还有资源、提示词,大家可以参考官网样例试验学习。当然还有 sse http调用模式也可以玩玩。
最后给大家分享一个MCP Server仓库,里面所有的MCP都是基于Typescript MCP SDK 或 Python MCP SDK 实现的,可以供大家使用和学习。
相关文章:
Model Context Protocol(MCP)模型上下文协议
Model Context Protocol(MCP)模型上下文协议 前言一、什么是MCP二、MCP的作用三、MCP与Function call对比四、构建一个简单的MCP DEMO环境准备实现MCP Server运行 ServerMCP Client端配置验证 总结 前言 在Agent时代,将Agent确立为大模型未来…...
第十二章:FreeRTOS多任务创建与删除
FreeRTOS多任务创建与删除教程 概述 本教程介绍FreeRTOS多任务的创建与删除方法,主要涉及两个核心函数: 任务创建:xTaskCreate()任务删除:vTaskDelete() 实践步骤 1. 准备工程文件 复制005工程并重命名为006 2. 创建多个任务…...
Seed-Thinking-v1.5:字节豆包新推理模型发布,200B参数战胜Deepseek
摘要 本文引入了Seed-Thinking-v1.5,能够在响应之前通过思考进行推理,从而提高了各种基准测试的性能。Seed-Thinking-v1.5在AIME 2024上获得86.7分,在Codeforces上获得55.0分,在GPQA上获得77.3分,展示了优秀的STEM和编…...
C#.NET模拟用户点击按钮button1.PerformClick自动化测试
PerformClick英文词是什么意思,几个词组成 PerformClick 是一个由两个英文单词组成的合成词,下面为你分别解释每个部分的含义以及整个词在编程语境中的意义: 单个单词含义 Perform:它是一个动词,读音为 /pəˈfɔːm/ÿ…...
微服务之间调用外键“翻译”的方法概述
写在前面的话:减少strean流操作,减少多层嵌套for循环。使用普通for循环和map的方式进行转换, 第一步查询数据 List<Student> findList studentDao.findList(findMap); 第二步准备遍历和赋值 if(CollectionUtil.isNotEmpty(findLis…...
AIDD-人工智能药物设计-提升分子预测反事实解释可靠性
UQ 过滤:提升分子预测反事实解释可靠性 目录 I-INF 指标结合 F1 评分,为评估大分子复合物(包括 RNA-蛋白质)的界面相互作用网络提供了可靠且全面的新方法。通过使用生成的人工 CAR 序列微调蛋白质语言模型(PLM),显著提高了 CAR-T 细胞活性的预测准确性,有效克服了合成蛋…...
软件界面设计:打造用户喜爱的交互体验
在数字化飞速发展的当下,软件已渗透进生活的各个角落,从日常使用的社交、购物软件,到专业领域的办公、设计软件,其重要性不言而喻。而软件界面作为用户与软件交互的桥梁,直接决定了用户对软件的第一印象与使用体验。出…...
【前端】webpack一本通
今日更新完毕,不定期补充,建议关注收藏点赞。 目录 简介使用webpack默认只能处理js文件 ->引入加载器对JS语法降级,兼容低版本语法合并文件再次打包进阶 工作原理html-webpack-plugin插件webpack开发服务器引入使用webpack-dev-server模块…...
代码学习总结(一)
代码学习总结(一) 这个系列的博客是记录下自己学习代码的历程,有来自平台上的,有来自笔试题回忆的,主要基于 C 语言,包括题目内容,代码实现,思路,并会注明题目难度&…...
DeepSeek在应急救援领域的应用解决方案
DeepSeek在应急救援领域的应用解决方案 一、引言 1.1 应急救援领域现状 近年来,我国应急管理工作全面加强,取得了显著成效。然而,一系列重特大灾害事故暴露出我国应急管理体系存在诸多问题短板。例如,在责任落实、应急处突、法…...
第十五届蓝桥杯C/C++B组省赛真题讲解(分享去年比赛的一些真实感受)
试题A——握手问题 一、解题思路 直接用高中学的排列组合思路 二、代码示例 #include<bits/stdc.h> using namespace std; int fun(int n) {int sum0;for(int i0;i<n;i){for(int ji1;j<n;j)sum; } return sum; } int main() {cout<<fun(50)-fun(7); }三、…...
【Qt】qDebug() << “中文测试“; 乱码问题
环境 Qt Creator版本:4.7.1 编译器:MSVC2015_32bit 解法一 在.pro文件中添加 msvc:QMAKE_CXXFLAGS -execution-charset:utf-8注意: 1、需要清理项目,并重新qmake,然后构建。 测试项目下载:https://do…...
Koordinator-NodeSLO
Reconcile() 获取node和nodeSLO,设置nodeExist和nodeSLOExistnode和nodeSLO都不存在,直接返回若!nodeExist 删除对应nodeSLO 若!nodeSLOExist 初始化nodeSLO创建nodeSLO 若nodeExist和nodeSLOExist都存在 获取nodeSLOSpec,若nodeSLOSpec改变…...
Vue接口平台学习六——接口列表及部分调试页面
一、实现效果图及界面布局简单梳理 整体布局分左右,左边调试,右边显示接口列表 左侧: 一个输入框按钮;下面展示信息,大部分使用代码编辑器就好了,除了请求体传文件类型需要额外处理。然后再下方显示响应信…...
2025年消防设施操作员考试题库及答案
一、多选题 31.区域报警系统主要由()等组成。 A.火灾探测器 B.手动火灾报警按钮 C.火灾声光警报器 D消防联动控制器 E.区域型火灾报警控制器 答案:ABCE 解析:根据《基础知识》第215页,“消防联动控制器”一项可…...
【C语言】预处理(下)(C语言完结篇)
一、#和## 1、#运算符 这里的#是一个运算符,整个运算符会将宏的参数转换为字符串字面量,它仅可以出现在带参数的宏的替换列表中,我们可以将其理解为字符串化。 我们先看下面的一段代码: 第二个printf中是由两个字符串组成的&am…...
深入理解全排列算法:DFS与回溯的完美结合
全排列问题是算法中的经典问题,其目标是将一组数字的所有可能排列组合列举出来。本文将详细解析如何通过深度优先搜索(DFS)和回溯法高效生成全排列,并通过模拟递归过程帮助读者彻底掌握其核心思想。 问题描述 给定一个正整数 n&a…...
低频rfid手持机,助力动物耳标智能化管理
低频RFID手持机,助力动物耳标智能化管理,正逐步成为现代畜牧业不可或缺的工具。它不仅能够高效读取动物耳标中的信息,如唯一识别码、疫苗接种记录、健康状态等,还极大地提升了数据录入的准确性和时效性。 1.精准识别与追踪 通过…...
【从零开始学习JVM | 第三篇】虚拟机的垃圾回收学习(一)
堆空间的基本结构 Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时,Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收。 Java 堆是垃圾收集器管理的主要区域,因此也被称作 GC 堆(Garbage Collected Heap&am…...
蓝桥杯之门牌
问题: 这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。 小蓝制作门牌的方法是先制作 0 到9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个字符 0,2 个…...
Jieba分词的原理及应用(三)
前言 “结巴”中文分词:做最好的 Python 中文分词组件 上一篇文章讲了使用TF-IDF分类器范式进行企业级文本分类的案例。其中提到了中文场景不比英文场景,在喂给模型之前需要进行分词操作。 分词的手段有很多,其中最常用的手段还是Jieba库进行…...
Openlayers:flat样式介绍
在前段时间我在使用WebGL矢量图层时接触到了flat样式,我对其十分的感兴趣,于是我花了几天的时间对其进行了了解,在这篇文章中我将简单的介绍一下flat样式的使用方式以及我对其的一些理解。 一、了解flat样式 1.什么是flat样式? …...
149页研读——华为基于IPD全过程研发质量管理【附全文阅读】
本文介绍了IPD(集成产品开发)的全过程研发质量管理,强调了以客户需求为导向,通过跨部门协同、资源整合、快速响应等方式提高研发效率和成功率。文章详细阐述了IPD研发管理体系的精要,包括其核心思想、优势、框架以及核心理念。 其中,跨领域平台与技术研发、端到端流程与项…...
Linux入门指南:从零开始探索开源世界
引言 欢迎来到Linux的奇妙世界!🌍 这个诞生于1991年的开源操作系统,如今已悄然成为数字世界的隐形支柱。从智能手机到超级计算机,从智能家电到航天器,Linux的身影无处不在。本文将带你纵览Linux的发展历程、主流发行版…...
Oracle 23ai Vector Search 系列之5 向量索引(Vector Indexes)
文章目录 Oracle 23ai Vector Search 系列之5 向量索引Oracle 23ai支持的向量索引类型内存中的邻居图向量索引 (In-Memory Neighbor Graph Vector Index)磁盘上的邻居分区矢量索引 (Neighbor Partition Vector Index) 创建向量索引HNSW索引IVF索引 向量索引示例参考 Windows 环…...
vue模拟扑克效果
vue模拟扑克效果 效果图: step1:C:\Users\wangrusheng\PycharmProjects\untitled18\src\views\Home.vue <template><div class"poker-container"><!-- 使用复合数据对象实现双行显示 --><divv-for"(card, index) in POKER_…...
Android12源码编译之预置Android Studio项目Android.mk文件编写
1、在AndroidManifest.xml文件中添加package"com.sprd.silentinstalldemo"属性,因为新版本的Android Studio默认生成的AndroidManifest.xml是没有这个属性值的 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:an…...
高阶函数/柯里化/纯函数
本篇文章主要是介绍一下标题里面的概念,在面试的时候经常文档,结合阅读到的资料,结合本人的个人见解出品了该文章,如有写的不好的地方或理解有误的,还望阁下多多指教。 1、高阶函数 什么是高阶函数? 接受…...
Spring Boot 测试详解,包含maven引入依赖、测试业务层类、REST风格测试和Mock测试
Spring Boot 测试详解 1. 测试依赖引入 Spring Boot 默认通过以下 Maven 依赖引入测试工具: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</s…...
探索 HTML5 新特性:提升网页开发的现代体验
在 Web 开发的演进历程中,HTML5 无疑是一座重要的里程碑。它不仅为网页带来了更丰富的功能,还提升了开发效率与用户体验。本文将深入探讨 HTML5 那些令人瞩目的新特性,助你紧跟现代 Web 开发潮流。 一、语义化标签:让结构更清晰 …...
