开源模型应用落地-模型上下文协议(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 FastMCP

DEAULT_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 server
    print(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 traceback

from 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 connection
                await session.initialize()

                # List available prompts
                prompts = await session.list_prompts()
                print(f'prompts: {prompts}')

                # Get a prompt
                prompt = await session.get_prompt(
                    "review_code", arguments={"code": "11111"}
                )
                print(f'prompt: {prompt}')

                # List available resources
                resources = await session.list_resources()
                print(f'resources: {resources}')

                resource = await session.read_resource('greeting://test')
                print(f'resource: {resource}')

                # List available tools
                tools = await session.list_tools()
                print(f'tools: {tools}')

                # Call a tool
                result = await session.call_tool("add", arguments={"a": 3, "b": 2})
                print(f'result: {result}')


if __name__ == "__main__":
    import asyncio

    asyncio.run(run())

调用:

 直接在pycharm中运行

4.3.SSE MCP Client实现

# -*-  coding:utf-8 -*-
from mcp import ClientSession
from mcp.client.sse import sse_client


async def run():
    async with sse_client(url='http://localhost:8000/sse') as (read, write):
        async with ClientSession(
            read, write
        ) as session:
            # Initialize the connection
            await session.initialize()

            # List available prompts
            prompts = await session.list_prompts()
            print(f'prompts: {prompts}')

            # Get a prompt
            prompt = await session.get_prompt(
                "review_code", arguments={"code": "11111"}
            )
            print(f'prompt: {prompt}')

            # List available resources
            resources = await session.list_resources()
            print(f'resources: {resources}')

            resource = await session.read_resource('greeting://test')
            print(f'resource: {resource}')

            # List available tools
            tools = await session.list_tools()
            print(f'tools: {tools}')

            # Call a tool
            result = await session.call_tool("add", arguments={"a": 3,"b": 2})
            print(f'result: {result}')

if __name__ == "__main__":
    import asyncio

    asyncio.run(run())

调用:

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

### 如何使用Visio绘制数据库ER #### 准备工作 确保已成功安装并启动Microsoft Visio版本2013或更高版[^1]。打开程序后,选择“文件”,接着点击“新建”。在搜索框内输入“实体关系”或者英文名称“Entity Relationship Diagram”。 #### 创建新表 当选择了合适的模板之后,点击进入编辑界面。此时可以看到左侧工具栏已经加载好了用于构建ER所需的各类形状和连接线。 #### 添加实体对象 通过拖拽方式从左侧菜单中的“实体(Entity)”分类下选取矩形代表表(Table),将其放置于布上作为实体元素。对于每一个新增加的实体,在属性窗口为其命名以便识别不同表格所对应的现实世界事物[^2]。 #### 定义属性字段 双击刚创建好的实体标可开启其内部结构视模式;在此处继续添加列(Column)即为该实体拥有的各个特性(Attribute)。注意设置主键(PK, Primary Key)以及其他约束条件(Unique, Not Null etc.)以满足实际需求。 #### 关联实体间的关系 利用线条(Link/Relationship Line)链接两个相关联的对象之间形成一对多、一对一或多对多等形式的关系连线。在线条两端会出现箭头指示方向性和基数(Cardinality)。 #### 自动调整布局 完成初步设计草稿后,如果觉得整体排列不够美观整齐,则可以尝试运用Visio内置的自动排版功能。“设计”选项卡下的“重新定位形状(Rearrange Shapes)”命令可以帮助快速优化视觉效果。 ```python # Python代码仅作示意用途,并非真实实现逻辑 def draw_er_diagram(): # 初始化绘环境 diagram = initialize_visio() # 描述操作流程而非具体编程语句 add_entity(diagram, 'Customer') define_attributes(diagram['Customer'], ['ID', 'Name']) set_primary_key(diagram['Customer']['Attributes'][0]) add_entity(diagram, 'Order') link_entities(diagram, 'Customer', 'Order', relationship='one-to-many') draw_er_diagram() ``` #### 保存与导出作品 最后不要忘记定期保存进度至本地磁盘以防意外丢失数据。另外还可以考虑将最终成果转换成片(JPEG/PNG)或是PDF文档分享给团队成员审阅讨论。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开源技术探险家

以微薄之力温暖这个世界

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值