当前位置: 首页 > article >正文

开源模型应用落地-模型上下文协议(MCP)-从数据孤岛到万物互联(一)

一、前言

    当开发者还在为每个AI工具编写臃肿的API适配器时,一场关于「连接」的技术革命已悄然降临。模型上下文协议MCP)正在用一套全新的交互语法,重新定义人工智能与物理世界的对话方式。MCP协议如同为AI系统装上了“万能接口”,通过标准化的客户端-服务器架构,将大语言模型(LLM)与数据库、API乃至物理设备无缝连接。它不仅是数据孤岛的破壁者——让实时更新的企业文档、代码仓库直接成为模型的“记忆延伸”;更是行动力的赋能器——从自动生成销售报告到远程操控IoT设备,AI得以突破虚拟边界,真正成为生产力工具。这种“知行合一”的特性,正在重新定义人机协作的深度与广度。


二、术语介绍

2.1.MCP

     MCP协议(Model Context Protocol,模型上下文协议)是由Anthropic公司于2024年11月推出的开放标准协议,旨在为大型语言模型(LLM)与外部数据源、工具之间建立统一的通信接口。其核心作用在于解决AI模型因数据孤岛限制难以发挥潜力的问题,通过标准化交互方式提升AI应用的扩展性和实用性。

一、MCP协议的核心定义
    1.1. 协议定位
    MCP被类比为AI领域的“USB-C接口”,通过解耦LLM与外部系统的集成,实现一次开发即可动态连接多种服务(如数据库、API、本地文件系统等)。例如,开发者无需为每个新工具单独定制接口,只需遵循MCP标准即可实现AI与工具的即插即用。

    1.2. ​技术架构
    采用客户端-服务器模型,包含三个核心组件:

  • ​MCP主机:运行AI模型的环境(如Claude桌面应用);
  • ​MCP客户端:负责与服务器通信并转发请求;
  • ​MCP服务器:提供具体功能服务的轻量级程序(如文件管理或API调用)。

二、MCP协议的核心作用
​    2.1. 统一交互标准
    标准化JSON-RPC 2.0协议支持本地(标准输入输出)与远程(HTTP/SSE)通信,兼容Python、Java等多种编程语言,降低开发复杂度。例如,本地通信保障医疗数据安全传输,远程通信支持云端服务扩展。

​    2.2. 动态扩展能力
    通过资源(Resource)、工具(Tool)、提示(Prompt)三大核心概念,AI模型可自动发现新工具并实时交互。例如连接GitHub时,AI可自动提交代码或修复BUG,无需人工预定义接口。

    ​2.3. 安全与权限控制
    内置权限验证机制,用户需手动批准敏感操作(如文件删除或邮件发送),确保数据隐私。在企业场景中,该特性尤为重要,如金融分析时需严格管控市场数据访问权限。

2.2.STDIO vs SSE

    STDIOSSE是两种核心的传输机制,分别适用于不同的通信场景

  (一)STDIO(标准输入输出)​
    定义与实现:
    STDIO模式通过标准输入(stdin)和标准输出(stdout)​实现本地进程间通信。客户端将MCP服务端作为子进程启动,双方通过JSON-RPC消息进行交互:

  • 客户端通过stdin发送请求,服务端通过stdout返回响应。
  • 消息以换行符分隔,且需严格遵守JSON-RPC 2.0格式。

    作用与特点:

  • ​高效低延迟:适用于本地开发或单一机器环境,避免了网络传输开销。
  • ​简单易用:无需网络配置,适合快速集成命令行工具或调试。
  • ​局限性:仅支持本地通信,无法扩展至分布式场景。

    应用场景:

  • 本地AI助手与工具集成(如天气查询服务)。
  • 开发阶段的快速原型验证。

  (二)SSE(Server-Sent Events,服务端推送事件)​
    定义与实现
    SSE模式基于HTTP协议,服务端通过单向流式通信主动推送数据至客户端:

  • 服务端需提供两个端点:​SSE端点(用于客户端连接)​和HTTP POST端点(用于客户端发送消息)​。
  • 消息以SSE事件流形式传输,客户端通过长连接接收实时更新。

    作用与特点

  • ​实时性:支持服务端主动推送(如股票行情、实时日志),适用于需持续更新的场景。
  • ​分布式支持:可跨物理机器部署,允许多客户端并发连接。
  • ​协议限制:仅服务端到客户端单向通信,双向交互需结合HTTP POST请求。

    应用场景:

  • 远程AI代理系统(如跨区域部署的智能客服)。
  • 需要实时数据流的应用(如IoT设备监控)。

    对比与选择建议

2.3.UV

 是由Rust编写的高性能包管理工具,主要用于项目的依赖管理和打包。

    UV 作为 Python 生态中的新一代包管理工具,相比传统的 pip 具有显著优势,主要体现在以下几个方面:

一、极速性能(10-100 倍提升)
    UV 的核心竞争力在于其 ​Rust 语言实现的高性能引擎。以下为关键性能对比:

  • ​依赖安装:安装大型项目(如 Trio)时,UV 耗时约 0.06 秒,而 pip 需要 1.56 秒,速度提升 ​26 倍。
  • ​虚拟环境创建:UV 创建虚拟环境仅需 ​4.1 毫秒,而 pip 的 venv 需 1.5 秒,速度提升 ​365 倍。
  • ​依赖解析:通过 ​PubGrub 算法优化和并行处理,UV 能快速解决复杂依赖冲突,尤其在处理大规模依赖树时优势明显。

二、功能集成(一站式解决方案)

    UV ​整合了多个工具链,解决了 pip 需配合其他工具(如 virtualenv、pip-tools、pipx 等)的碎片化问题

三、兼容性与易用性

  • ​无缝迁移:支持现有 requirements.txt 和 pyproject.toml,无需修改项目配置即可直接替换 pip。
  • ​跨平台支持:兼容 Windows、macOS、Linux,并通过 ​全局缓存机制 减少重复下载,节省磁盘空间。
  • ​开发者友好:错误信息更清晰,包含依赖冲突的详细跟踪。支持 pip 的高级功能(如可编辑安装、Git 依赖、本地包安装)

三、前置条件

3.1.基础环境及前置条件

  1. 操作系统:无限

3.2.安装UV

  以windows系统为例

(一)直接使用pip安装

pip install uv

(二)使用脚本安装

irm https://astral.sh/uv/install.ps1 | iex

3.3.初始化及安装依赖

# 初始化项目
uv init mcp_test# 切换目录
cd mcp_test# 创建虚拟环境
uv venv -p 3.10# 激活虚拟环境
.venv\Scripts\activate# 安装依赖
uv add "mcp[cli]"

四、技术实现

4.1.MCP Server实现

# -*-  coding:utf-8 -*-
from mcp.server.fastmcp import FastMCPDEAULT_TRANSPORT = "stdio"# Create an MCP server
mcp = FastMCP("Demo")# Add an addition tool
@mcp.tool()
def add(a: int, b: int) -> int:"""Add two numbers"""print(f'a: {a},b: {b}')return a + b# Add a dynamic greeting resource
@mcp.resource(uri="greeting://",name="greeting")
def get_greeting() -> str:"""Get a personalized greeting"""return f"Hello, world!"@mcp.resource(uri="greeting://{name}",name="greeting")
def get_greeting(name: str) -> str:"""Get a personalized greeting"""return f"Hello, {name}!"@mcp.prompt()
def review_code(code: str) -> str:return f"Please review this code:\n\n{code}"if __name__ == "__main__":# Initialize and run the serverprint(f"start mcp server,transport: {DEAULT_TRANSPORT}...")  # 记录服务启动日志# mcp.run(transport='sse')mcp.run(transport=DEAULT_TRANSPORT)

调用:

 直接在pycharm中运行

4.2.STDIO MCP Client实现

# -*-  coding:utf-8 -*-
import sys
import tracebackfrom mcp import ClientSession, StdioServerParameters, types
from mcp.client.stdio import stdio_client# Create server parameters for stdio connection
server_params = StdioServerParameters(command="python",  args=["mcp_server.py"]
)async def run():async with stdio_client(server_params,errlog=sys.stderr) as (read, write):async with ClientSession(read, write) as session:# Initialize the connectionawait session.initialize()# List available promptsprompts = await session.list_prompts()print(f'prompts: {prompts}')# Get a promptprompt = await session.get_prompt("review_code", arguments={"code": "11111"})print(f'prompt: {prompt}')# List available resourcesresources = await session.list_resources()print(f'resources: {resources}')resource = await session.read_resource('greeting://test')print(f'resource: {resource}')# List available toolstools = await session.list_tools()print(f'tools: {tools}')# Call a toolresult = await session.call_tool("add", arguments={"a": 3, "b": 2})print(f'result: {result}')if __name__ == "__main__":import asyncioasyncio.run(run())

调用:

 直接在pycharm中运行

4.3.SSE MCP Client实现

# -*-  coding:utf-8 -*-
from mcp import ClientSession
from mcp.client.sse import sse_clientasync def run():async with sse_client(url='http://localhost:8000/sse') as (read, write):async with ClientSession(read, write) as session:# Initialize the connectionawait session.initialize()# List available promptsprompts = await session.list_prompts()print(f'prompts: {prompts}')# Get a promptprompt = await session.get_prompt("review_code", arguments={"code": "11111"})print(f'prompt: {prompt}')# List available resourcesresources = await session.list_resources()print(f'resources: {resources}')resource = await session.read_resource('greeting://test')print(f'resource: {resource}')# List available toolstools = await session.list_tools()print(f'tools: {tools}')# Call a toolresult = await session.call_tool("add", arguments={"a": 3,"b": 2})print(f'result: {result}')if __name__ == "__main__":import asyncioasyncio.run(run())

调用:

 直接在pycharm中运行,需要先修改MCP Server中的transport,调整为sse方式。

相关文章:

开源模型应用落地-模型上下文协议(MCP)-从数据孤岛到万物互联(一)

一、前言 当开发者还在为每个AI工具编写臃肿的API适配器时,一场关于「连接」的技术革命已悄然降临。模型上下文协议(MCP)正在用一套全新的交互语法,重新定义人工智能与物理世界的对话方式。MCP协议如同为AI系统装上了“万能接口”…...

基于YOLO的半自动化标注方法:提升铁路视频缺陷检测效率

论文地址:https://arxiv.org/pdf/2504.01010 1. 论文结构概述 本文提出了一种半自动化标注方法,旨在解决铁路缺陷检测中大规模图像/视频数据集标注成本高、耗时长的问题。论文结构清晰,分为以下核心部分: ​引言(Introduction)​ 强调传统手动标注的痛点(耗时、易错、…...

Spring Boot 国际化配置项详解

Spring Boot 国际化配置项详解 1. 核心配置项分类 将配置项分为以下类别,便于快速定位: 1.1 消息源配置(MessageSource 相关) 控制属性文件的加载、编码、缓存等行为。 配置项作用默认值示例说明spring.messages.basename指定属…...

【区块链安全 | 第三十八篇】合约审计之获取私有数据(二)

文章目录 前言漏洞代码代码审计攻击步骤修复建议审计思路 前言 在【区块链安全 | 第三十七篇】合约审计之获取私有数据(一)中,介绍了私有数据、访问私有数据实例、Solidity 中的数据存储方式等知识,本文通过分析具体合约代码进行…...

[ctfshow web入门] web23

前置知识 include:包含一个文件,也可以包含一些其他东西,后续用到再解析 substr:对字符串进行切片,第一个参数是字符串,第二第三个参数出从第a个索引开始切n个,索引从0开始计数。 例如&#xf…...

mac 苍穹外卖 后端初始 SkyApplication 报错

报错内容 java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field com.sun.tools.javac.tree.JCTree qualid deepseek 解决 打开 File > Project Structure > Project SDK, 选择 JDK17。我没有 JDK17就下载了一…...

CSS中的inline-flex与flex的区别

在CSS中,flex 和 inline-flex 都是用于实现弹性布局(Flexbox)的显示属性,但它们在布局行为上有所不同。 flex 属性会使元素表现为块级弹性容器,这意味着元素会在页面上占据一整行的空间,无论其内部内容的大…...

不用第三方库调用DeepSeek

又双叒叕很久不写博客,今天吐一口老曹。 一、为啥干这个 之前在修改OJ的时候,本着少修改多收益的原则,用Python写了一些DeepSeek的调用,真的很简单,用拉下来OpenAI按照官方文档复制粘贴就可以。接口文档页面&#xff…...

Proximal Policy Optimization (PPO)

2.1 策略梯度方法 策略梯度方法计算策略梯度的估计值并将其插入到随机梯度上升算法中。最常用的梯度估计器的形式如下: g ^ E t [ ∇ θ log ⁡ π θ ( a t ∣ s t ) A ^ t ] (1) \hat{g} \mathbb{E}_t \left[ \nabla_{\theta} \log \pi_{\theta}(a_t | s_t) \h…...

微信小程序:动态表格实现,表头单元格数据完全从data中获取,宽度自定义,自定义文本框,行勾选,样式效果,横向滚动表格(解决背景色不足的问题)等

一、样式效果 二、代码 1、wxml <view class"line flex flex-center"><view class"none" wx:if"{{info.length 0}}">暂无料号</view><view wx:else class"table-container"><!-- 动态生成表头 -->&…...

Java基础编程练习第38题-除法器

题目&#xff1a;编写一个除法器&#xff0c;输入被除数和除数&#xff0c;并将结果输出。 这道题看似很简单&#xff0c;实则也不难。 就是假如用户输入的类型不同怎么办呢&#xff1f;用户输入int或者double类型应该怎么解决。这里我们就需要用到函数的重载。 代码如下&am…...

fabric.js基础使用

1.正方形 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Fabric.js Watermark Example</tit…...

python-Leetcode 65.搜索旋转排序数组

题目&#xff1a; 整数数组nums按升序排列&#xff0c;数组中的值互不相同 在传递给函数之前&#xff0c;nums在预先未知的某个小标K上进行了旋转&#xff0c;使数组变为[nums[k], nums[k1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]]&#xff0c;小标从0开始计数。…...

质数质数筛

1.试除法判定质数–O(sqrt(N)) bool is_prime(int x) {if (x < 2) return false;for (int i 2; i < x / i; i )if (x % i 0)return false;return true; }2.试除法分解质因数–O(logN)~O(sqrt(N)) void divide(int x) {for (int i 2; i < x / i; i )if (x % i …...

Django学习记录-1

Django学习记录-1 虽然网上教程都很多&#xff0c;但是感觉自己记录一下才属于自己&#xff0c;之后想找也方面一点&#xff0c;文采不佳看的不爽可绕道。 参考贴 从零开始的Django框架入门到实战教程(内含实战实例) - 01 创建项目与app、加入静态文件、模板语法介绍&#xff…...

K8s私有仓库拉取镜像报错解决:x509 certificate signed by unknown authority

前言 在Kubernetes环境中使用自签名证书的私有Harbor镜像仓库时&#xff0c;常会遇到证书验证失败的问题。本文将详细讲解如何解决这个常见的证书问题。 环境信息&#xff1a; Kubernetes版本&#xff1a;1.28.2容器运行时&#xff1a;containerd 1.6.20私有仓库&#xff1a…...

使用python访问mindie部署的vl多模态模型

说明 今天使用mindie1.0部署了qwen2_7b_vl模型&#xff0c;测试过程出现一些问题&#xff0c;这里总结下。 问题1&#xff1a;transformers版本太低 报错信息&#xff1a; [ERROR] [model_deploy_config.cpp:159] Failed to get vocab size from tokenizer wrapper with ex…...

LabVIEW 长期项目开发

LabVIEW 凭借其图形化编程的独特优势&#xff0c;在工业自动化、测试测量等领域得到了广泛应用。对于长期运行、持续迭代的 LabVIEW 项目而言&#xff0c;其开发过程涵盖架构设计、代码管理、性能优化等多个关键环节&#xff0c;每个环节都对项目的成功起着至关重要的作用。下面…...

MongoDB 的详细介绍

以下是 MongoDB 的详细介绍,涵盖核心概念、使用场景、优势与操作示例: 一、MongoDB 简介 MongoDB 是一个开源的 文档型 NoSQL 数据库,采用灵活的 JSON-like(BSON)格式存储数据,适合处理非结构化或半结构化数据。 核心特点: Schema-free:无需预定义表结构,字段可动态扩…...

Ubuntu 22.04 AI大模型环境配置及常用工具安装

一、基础环境准备 1.1 系统准备 建议使用 Ubuntu22.04 以下配置皆以 Ubuntu22.04 系统版本为例 1.2 安装git apt-get update && apt-get install git -y1.3 安装 Python 3.9 【建议安装 3.10】&#xff08;安装miniconda或者conda来管理虚拟环境&#xff09; wget …...

蓝桥杯真题——好数、R格式

目录 蓝桥杯2024年第十五届省赛真题-好数 【模拟题】 题目描述 输入格式 输出格式 样例输入 样例输出 提示 代码1&#xff1a;有两个案例过不了&#xff0c;超时 蓝桥杯2024年第十五届省赛真题-R 格式 【vector容器的使用】 题目描述 输入格式 输出格式 样例输入…...

AWS S3深度剖析:云存储的瑞士军刀

1. 引言 在当今数据驱动的世界中,高效、可靠、安全的数据存储解决方案至关重要。Amazon Simple Storage Service (S3)作为AWS生态系统中的核心服务之一,为企业和开发者提供了一个强大而灵活的对象存储平台。本文将全面解析S3的核心特性,帮助读者深入理解如何充分利用这一&q…...

Qt基础:右键菜单

右键菜单 1. 基于鼠标事件实现1.1 原理1.2 操作 2. 基于窗口的菜单策略实现2.1 Qt::DefaultContextMenu2.2 Qt::ActionsContextMenu 2.3 Qt::CustomContextMenu 显示右键菜单, 其处理方式大体上有两种&#xff1a; 基于鼠标事件实现&#xff1b;基于窗口的菜单策略实现。 1. …...

Json快速入门

引言 Jsoncpp 库主要是用于实现 Json 格式数据的序列化和反序列化&#xff0c;它实现了将多个数据对象组织成 为Json格式字符串&#xff0c;以及将 Json 格式字符串解析得到多个数据对象的功能&#xff0c;独立于开发语言。 Json数据对象 Json数据对象类的表示&#xff1a; …...

WinForm真入门(10)——CheckBox控件详解

在 WinForm 中&#xff0c;CheckBox 控件是一个用于表示布尔状态&#xff08;选中/未选中&#xff09;的核心组件。它广泛应用于配置选项、表单提交、条件筛选等场景。以下是 ‌CheckBox 的详细解析‌&#xff0c;涵盖属性、事件、使用技巧和实际案例。 一、CheckBox 核心属性…...

网络安全应急响应-系统排查

在网络安全应急响应中&#xff0c;系统排查是快速识别潜在威胁的关键步骤。以下是针对Windows和Linux系统的系统基本信息排查指南&#xff0c;涵盖常用命令及注意事项&#xff1a; 一、Windows系统排查 1. 系统信息工具&#xff08;msinfo32.exe&#xff09; 命令执行&#x…...

[QMT量化交易小白入门]-四十二、五年年化收益率26%,当日未成交的下单,取消后重新委托

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。 QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。 文章目录 相关阅读委托查询功能3.1 数据获取层3.2 数据结构初始…...

Windows版-RabbitMQ自动化部署

一键完成Erlang环境变量配置&#xff08;ERLANG_HOME系统变量&#xff09;‌ 一键完成RabbitMQ环境变量配置&#xff08;RabbitMQ系统变量&#xff09;‌ 实现快速安装部署RabbitMQ PS&#xff1a; 需提前下载安装&#xff1a; - otp_win64_25.0.exe (Erlang) - rabbit…...

openEuler24.03 LTS下安装Flink

目录 Flink的安装模式下载Flink安装Local模式前提条件解压安装包启动集群查看进程提交作业文件WordCount持续流WordCount 查看Web UI配置flink-conf.yaml简单使用 关闭集群 Standalone Session模式前提条件Flink集群规划解压安装包配置flink配置flink-conf.yaml配置workers配置…...

LeetCode热题100记录-【二分查找】

二分查找 35.搜索插入位置 思考&#xff1a;二分查找先判定边界条件 记录&#xff1a;不需要二刷 class Solution {public int searchInsert(int[] nums, int target) {int left 0,right nums.length-1;if(nums[right] < target){return right1;}if(nums[left] > tar…...