Model Context Protocol(MCP)模型上下文协议

news2025/4/17 3:50:52

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/llmenv

conda create -n mcpenv python=3.12 # conda创建虚拟环境

conda activate mcpenv # 激活虚拟环境

python -V # 查看py版本
Python 3.12.9

pip install "mcp[cli]" # 安装SDK

mcp version # 验证
MCP version 1.6.0

实现MCP Server

一个最简单的demo,用于获取本机文件列表。

import os
from mcp.server.fastmcp import FastMCP

mcp = 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服务器配置,红色方框位置会提示安装uvbun,点击安装按钮即可。

可能会有人有疑问,为什么server端安装了uv,这里还要安装,这里说一下,cherrystudio默认从他根目录下bin读取命令,刚刚我们的uv命令是安装在了py虚拟环境,相当于隔离的两个环境。当然,也可以使用操作系统层面的环境变量,只需要一个uv就可以了。

MacOS默认安装在~/.cherrystudio/bin

在这里插入图片描述

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

在这里插入图片描述

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

配置如下:
在这里插入图片描述
配置文件如下:
在这里插入图片描述

验证

这里需要注意两点

  1. 要选择支持function calling调用的模型
    在这里插入图片描述
  2. 添加MCP服务器
    在这里插入图片描述

配置好了就可以提问了

在这里插入图片描述
可以看到大模型调用了我们在Server端封装的get_files工具,并且输出正确。

总结

除了工具之外,还有资源、提示词,大家可以参考官网样例试验学习。当然还有 sse http调用模式也可以玩玩。

最后给大家分享一个MCP Server仓库,里面所有的MCP都是基于Typescript MCP SDK 或 Python MCP SDK 实现的,可以供大家使用和学习。

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

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

相关文章

第十二章: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和编…

AIDD-人工智能药物设计-提升分子预测反事实解释可靠性

UQ 过滤:提升分子预测反事实解释可靠性 目录 I-INF 指标结合 F1 评分,为评估大分子复合物(包括 RNA-蛋白质)的界面相互作用网络提供了可靠且全面的新方法。通过使用生成的人工 CAR 序列微调蛋白质语言模型(PLM),显著提高了 CAR-T 细胞活性的预测准确性,有效克服了合成蛋…

【前端】webpack一本通

今日更新完毕,不定期补充,建议关注收藏点赞。 目录 简介使用webpack默认只能处理js文件 ->引入加载器对JS语法降级,兼容低版本语法合并文件再次打包进阶 工作原理html-webpack-plugin插件webpack开发服务器引入使用webpack-dev-server模块…

代码学习总结(一)

代码学习总结(一) 这个系列的博客是记录下自己学习代码的历程,有来自平台上的,有来自笔试题回忆的,主要基于 C 语言,包括题目内容,代码实现,思路,并会注明题目难度&…

第十五届蓝桥杯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版本&#xff1a;4.7.1 编译器&#xff1a;MSVC2015_32bit 解法一 在.pro文件中添加 msvc:QMAKE_CXXFLAGS -execution-charset:utf-8注意&#xff1a; 1、需要清理项目&#xff0c;并重新qmake&#xff0c;然后构建。 测试项目下载&#xff1a;https://do…

Vue接口平台学习六——接口列表及部分调试页面

一、实现效果图及界面布局简单梳理 整体布局分左右&#xff0c;左边调试&#xff0c;右边显示接口列表 左侧&#xff1a; 一个输入框按钮&#xff1b;下面展示信息&#xff0c;大部分使用代码编辑器就好了&#xff0c;除了请求体传文件类型需要额外处理。然后再下方显示响应信…

【C语言】预处理(下)(C语言完结篇)

一、#和## 1、#运算符 这里的#是一个运算符&#xff0c;整个运算符会将宏的参数转换为字符串字面量&#xff0c;它仅可以出现在带参数的宏的替换列表中&#xff0c;我们可以将其理解为字符串化。 我们先看下面的一段代码&#xff1a; 第二个printf中是由两个字符串组成的&am…

低频rfid手持机,助力动物耳标智能化管理

低频RFID手持机&#xff0c;助力动物耳标智能化管理&#xff0c;正逐步成为现代畜牧业不可或缺的工具。它不仅能够高效读取动物耳标中的信息&#xff0c;如唯一识别码、疫苗接种记录、健康状态等&#xff0c;还极大地提升了数据录入的准确性和时效性。 1.精准识别与追踪‌ 通过…

【从零开始学习JVM | 第三篇】虚拟机的垃圾回收学习(一)

堆空间的基本结构 Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时&#xff0c;Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收。 Java 堆是垃圾收集器管理的主要区域&#xff0c;因此也被称作 GC 堆&#xff08;Garbage Collected Heap&am…

Jieba分词的原理及应用(三)

前言 “结巴”中文分词&#xff1a;做最好的 Python 中文分词组件 上一篇文章讲了使用TF-IDF分类器范式进行企业级文本分类的案例。其中提到了中文场景不比英文场景&#xff0c;在喂给模型之前需要进行分词操作。 分词的手段有很多&#xff0c;其中最常用的手段还是Jieba库进行…

Openlayers:flat样式介绍

在前段时间我在使用WebGL矢量图层时接触到了flat样式&#xff0c;我对其十分的感兴趣&#xff0c;于是我花了几天的时间对其进行了了解&#xff0c;在这篇文章中我将简单的介绍一下flat样式的使用方式以及我对其的一些理解。 一、了解flat样式 1.什么是flat样式&#xff1f; …

149页研读——华为基于IPD全过程研发质量管理【附全文阅读】

本文介绍了IPD(集成产品开发)的全过程研发质量管理,强调了以客户需求为导向,通过跨部门协同、资源整合、快速响应等方式提高研发效率和成功率。文章详细阐述了IPD研发管理体系的精要,包括其核心思想、优势、框架以及核心理念。 其中,跨领域平台与技术研发、端到端流程与项…

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模拟扑克效果 效果图&#xff1a; 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"属性&#xff0c;因为新版本的Android Studio默认生成的AndroidManifest.xml是没有这个属性值的 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:an…

Spring Boot 测试详解,包含maven引入依赖、测试业务层类、REST风格测试和Mock测试

Spring Boot 测试详解 1. 测试依赖引入 Spring Boot 默认通过以下 Maven 依赖引入测试工具&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</s…

leetcode刷题日记——螺旋矩阵

[ 题目描述 ]&#xff1a; [ 思路 ]&#xff1a; 题目要求按顺时针顺序给出m行n列的矩阵的数组按照题目所给的顺序挨个插入答案数组中运行如下 int* spiralOrder(int** matrix, int matrixSize, int* matrixColSize, int* returnSize) {*returnSize matrixSize * matrixCol…

模板引擎语法-标签

模板引擎语法-标签 文章目录 模板引擎语法-标签[toc]一、用于进行判断的{% if-elif-else-endif %}标签二、关于循环对象的{% for-endfor %}标签三、关于自动转义的{% autoescape-endautoescape %}标签四、关于循环对象的{% cycle %}标签五、关于检查值是否变化的{% ifchange %}…