程序员必看!一文吃透 MCP:AI 时代的 “通用接口”,附上手实操思路

最近浏览AI技术社区时,“MCP”这个词的出现频率越来越高,无论是技术博文的核心议题,还是评论区的讨论焦点,几乎都能看到它的身影。相信很多和我一样关注AI技术落地的朋友,最初对MCP的认知都停留在“听说过,但不清楚具体能做什么”的阶段。为此,我花了不少时间梳理MCP的技术逻辑与实际应用场景,不仅会帮大家把MCP的核心用法讲透,还会补充实操层面的准备建议,助力快速上手。

一、拆解MCP:不止是协议,更是AI生态的“通用语言”

MCP的全称是Model Context Protocol,中文译为模型上下文协议。这一技术标准并非凭空出现,而是Anthropic在2024年11月25日正式发布的,初衷是解决AI应用开发中的“连接碎片化”问题。

我们可以先设想一个常见的AI开发场景:要搭建一个能处理本地文档的AI助手,需要把本地文件夹(数据源)、PDF解析工具(处理工具)和GPT-4o(AI模型)三者打通。在MCP出现前,这三者的连接方式完全依赖各自的接口规则——本地文件要通过自定义脚本读取,PDF解析工具要用其专属API调用,再把处理后的内容按模型要求的格式整理成prompt,整个过程就像用不同规格的插头接插座,必须逐个适配,既繁琐又容易出错。

而MCP的核心价值,就是在“应用程序”与“AI模型”之间搭建了一层统一的“翻译层”:它定义了上下文信息(包括数据内容、工具调用指令、交互历史等)的标准传输格式,无论你用的是本地数据库还是云端API,是数据分析工具还是图像处理插件,只要遵循MCP规则,就能无缝对接支持MCP的AI模型。

这就像USB-C接口的普及——以前充电线要分手机、平板、笔记本专用,现在一根线就能搞定多种设备。MCP要做的,就是让AI开发者不用再为“换个模型就要重写工具调用代码”发愁,实现“一次适配,多模型通用”。mcp architecture

二、MCP为何能成为AI开发的“新刚需”?从痛点到解决方案

在MCP未普及的阶段,AI模型与外部资源的连接主要依赖两种方式,但都存在明显短板:

第一种是“人工预处理”模式。比如要让AI分析某季度的销售数据,需要先从企业数据库导出Excel,用Python清洗数据,再把关键指标复制到prompt里发给模型。如果数据需要实时更新,或者要分析多个数据源的关联信息,这种“手动搬运”的方式不仅效率低,还容易因操作失误导致数据偏差,完全无法满足复杂场景的需求。

第二种是LLM平台推出的function call功能。它允许模型主动调用预设函数(比如调用天气API获取实时温度),比人工操作更自动化,但局限性也很突出:平台壁垒极强。OpenAI的Function Call、Google Gemini的Function Calling、阿里云通义千问的工具调用,各自的参数格式、调用逻辑完全不同——你为GPT-4写的“调用股票查询工具”代码,放到Gemini上根本无法运行,开发者切换模型时,相当于要重新做一遍适配工作,时间和人力成本都很高。此外,function call还存在数据暴露风险,调用工具时往往需要把原始数据上传到平台云端,企业的敏感信息(如客户数据、财务报表)安全无法保障。

而MCP恰好精准解决了这些痛点,甚至带来了额外的生态优势:

  • 生态丰富度拉满:MCP社区目前已积累了上千个现成插件,涵盖文档处理(如多格式文件解析)、数据查询(如SQL/NoSQL数据库连接)、第三方API调用(如地图、支付接口)等场景。开发者不用再从零开发工具适配模块,直接下载插件就能用,大幅缩短开发周期。比如要做一个“AI+本地知识库”的应用,只需下载MCP的“本地文件索引插件”,就能让模型直接读取电脑里的文档,无需写一行解析代码。

  • 彻底打破平台依赖:只要模型支持MCP协议(目前Anthropic Claude 3、Meta Llama 3等主流模型已适配),就能实现“无缝切换”。比如你原本用Claude 3开发了一个“AI数据分析助手”,后来想换成Llama 3,无需修改工具调用逻辑,只需在代码里更换模型地址即可——这就像换手机时,原来的USB-C充电线依然能用,不用再买新配件。

  • 数据安全主动权完全在你手里:MCP支持“本地代理”模式,敏感数据可以留在本地服务器或个人电脑上,无需上传到模型平台。具体来说,你可以通过MCP的“数据过滤接口”,精确控制哪些数据传给模型(比如只传销售数据的统计结果,不传客户姓名、电话等隐私信息),甚至让模型通过本地代理调用工具(比如在本地完成数据计算后,只把结果返回给模型)。这种“数据不落地云端”的模式,对企业、医疗等对数据安全要求高的场景来说,无疑是重大利好。

三、手把手教学:用户如何使用MCP?

对于普通用户而言,无需深入了解MCP的底层实现原理,重点关注如何便捷地使用这一强大特性即可。

使用MCP的具体操作,可以参考官方文档《For Claude Desktop Users》。按照文档步骤完成配置后,就可以在Claude中进行测试。例如,输入“Can you write a poem and save it to my desktop?”,Claude会在请求你的权限后,在本地新建一个文件保存诗歌📄。

此外,官方还提供了众多现成的MCP Servers,涵盖各种实用工具。用户只需要根据自己的需求,选择希望接入的工具,按照指引完成接入操作,就能轻松让AI模型调用这些工具,实现丰富的功能。比如官方介绍的filesystem工具,它允许Claude像在本地文件系统中一样,自由读取和写入文件。workflow

四、MCP架构与原理剖析

(一)MCP的核心组件

MCP由三个核心组件构成:HostClientServer。我们通过一个实际场景来理解它们的工作机制: 假设你在Claude Desktop(作为Host)中询问:“我桌面上有哪些文档?”

  • Host:负责接收用户的提问,并与Claude模型进行交互,它就像是用户与模型之间的桥梁。
  • Client:当Claude模型判断需要访问文件系统获取信息时,Host中内置的MCP Client会被激活。Client的任务是与合适的MCP Server建立连接,传递请求并接收响应。
  • Server:在这个例子中,文件系统MCP Server会被调用。它负责执行实际的文件扫描操作,访问桌面目录,并将找到的文档列表返回。

整个流程如下:用户提问→Claude Desktop(Host)→Claude模型→判断需要文件信息→激活MCP Client连接→文件系统MCP Server→执行扫描操作→返回结果→Claude模型生成回答→在Claude Desktop显示答案。

这种架构设计的优势在于,开发者只需专注于开发对应的MCP Server,无需关心Host和Client的实现细节,就能让AI模型在不同场景下灵活调用各种工具和数据源。

(二)模型如何确定工具的选用?

  1. 模型如何智能选择工具当用户提出问题后,模型通过prompt工程来确定使用哪些工具。以MCP官方提供的client example为例,简化后的代码如下:
import asyncio
from typing import Any

# 省略了无关的代码
asyncdef start(self):
    # 初始化所有的mcp server
    for server in self.servers:
        await server.initialize()

    # 获取所有的tools命名为all_tools
    all_tools = []
    for server in self.servers:
        tools = await server.list_tools()
        all_tools.extend(tools)

    # 将所有的tools的功能描述格式化成字符串供LLM使用
    # tool.format_for_llm() 我放到了这段代码最后,方便阅读。
    tools_description = "\n".join(
        [tool.format_for_llm() for tool in all_tools]
    )

    # 这里就不简化了,以供参考,实际上就是基于prompt和当前所有工具的信息
    # 询问LLM(Claude)应该使用哪些工具。
    system_message = (
        "You are a helpful assistant with access to these tools:\n\n"
        f"{tools_description}\n"
        "Choose the appropriate tool based on the user's question. "
        "If no tool is needed, reply directly.\n\n"
        "IMPORTANT: When you need to use a tool, you must ONLY respond with "
        "the exact JSON object format below, nothing else:\n"
        "{\n"
        '    "tool": "tool-name",\n'
        '    "arguments": {\n'
        '        "argument-name": "value"\n'
        "    }\n"
        "}\n\n"
        "After receiving a tool's response:\n"
        "1. Transform the raw data into a natural, conversational response\n"
        "2. Keep responses concise but informative\n"
        "3. Focus on the most relevant information\n"
        "4. Use appropriate context from the user's question\n"
        "5. Avoid simply repeating the raw data\n\n"
        "Please use only the tools that are explicitly defined above."
    )
    messages = [{"role": "system", "content": system_message}]

    whileTrue:
        # Final... 假设这里已经处理了用户消息输入.
        messages.append({"role": "user", "content": user_input})

        # 将system_message和用户消息输入一起发送给LLM
        llm_response = self.llm_client.get_response(messages)

       ... # 后面和确定使用哪些工具无关


class Tool:
    """Represents a tool with its properties and formatting."""

    def __init__(
        self, name: str, description: str, input_schema: dict[str, Any]
    ) -> None:
        self.name: str = name
        self.description: str = description
        self.input_schema: dict[str, Any] = input_schema

    # 把工具的名字 / 工具的用途(description)和工具所需要的参数(args_desc)转化为文本
    def format_for_llm(self) -> str:
        """Format tool information for LLM.

        Returns:
            A formatted string describing the tool.
        """
        args_desc = []
        if"properties"in self.input_schema:
            for param_name, param_info in self.input_schema["properties"].items():
                arg_desc = (
                    f"- {param_name}: {param_info.get('description', 'No description')}"
                )
                if param_name in self.input_schema.get("required", []):
                    arg_desc += " (required)"
                args_desc.append(arg_desc)

        returnf"""
 Tool: {self.name}
 Description: {self.description}
 Arguments:
 {chr(10).join(args_desc)}
 """

从代码中可以看出,模型通过将所有工具的具体使用描述(包括工具名称、功能描述、参数说明等)以文本形式传递给它,结合实时的用户问题,来判断应该使用哪些工具。

  1. 工具执行与结果反馈机制当模型分析用户请求后,会判断是否需要调用工具:
  • 无需工具时:模型直接生成自然语言回复。
  • 需要工具时:模型输出结构化JSON格式的工具调用请求。

客户端收到包含结构化JSON格式的工具调用请求后,会根据这个json代码执行对应的工具。如果模型执行了tool call,工具执行的结果会和system prompt、用户消息一起重新发送给模型,请求模型生成最终回复。如果tool call的json代码存在问题或者模型产生幻觉,客户端会跳过无效的调用请求。相关代码逻辑如下:

... # 省略无关的代码
asyncdef start(self):
   ... # 上面已经介绍过了,模型如何选择工具

    whileTrue:
        # 假设这里已经处理了用户消息输入.
        messages.append({"role": "user", "content": user_input})

        # 获取LLM的输出
        llm_response = self.llm_client.get_response(messages)

        # 处理LLM的输出(如果有tool call则执行对应的工具)
        result = await self.process_llm_response(llm_response)

        # 如果result与llm_response不同,说明执行了tool call (有额外信息了)
        # 则将tool call的结果重新发送给LLM进行处理。
        if result != llm_response:
            messages.append({"role": "assistant", "content": llm_response})
            messages.append({"role": "system", "content": result})

            final_response = self.llm_client.get_response(messages)
            logging.info("\nFinal response: %s", final_response)
            messages.append(
                {"role": "assistant", "content": final_response}
            )
        # 否则代表没有执行tool call,则直接将LLM的输出返回给用户。
        else:
            messages.append({"role": "assistant", "content": llm_response})      

通过以上原理分析可知,工具文档至关重要,因为模型依赖工具描述文本来理解和选择工具。同时,虽然从理论上讲任何模型都适配MCP,但非Claude模型由于没有经过专门训练,使用效果和体验可能无法得到有效保证。core

五、实战演练:手把手教你开发MCP Server

对于AI开发者来说,了解如何开发MCP Server是发挥MCP强大功能的关键。下面通过一个简单示例,使用Python实现一个MCP Server,用于统计当前桌面上的txt文件数量并获取对应文件名,即使是初学者也能轻松上手!

(一)前置工作

  1. 安装Claude Desktop。
  2. 确保系统安装Python 3.10及以上版本。
  3. 安装Python MCP SDK 1.2.0及以上版本。

(二)环境配置

这里使用官方推荐的配置方式,借助uv工具(一个用Rust编写的超快速Python包管理器和环境管理工具)进行配置:

# 安装uv
curl -LsSf https://astral.sh/uv/install.sh | sh

# 创建项目目录
uv init txt_counter
cd txt_counter

# 设置Python 3.10+环境
echo"3.11" >.python-version

# 创建虚拟环境并激活
uv venv
source.venv/bin/activate

# Install dependencies
uv add "mcp[cli]" httpx

# Create our server file
touch txt_counter.py

(三)构造一个prompt

在开始编写代码前,先构造一个prompt,明确我们要开发的MCP Server的功能需求:

"""
... (这里是已经引入的domain knowledge,可从MCP Python SDK的README文件等获取相关内容)
"""
打造一个MCP服务器,它能够:
- 功能:
    - 统计当前桌面上的txt文件数量
    - 获取对应文件的名字
要求:
- 不需要给出prompt和resource相关代码。
- 你可以假设我的桌面路径为 /Users/{username}/Desktop

(四)实现MCP Server

以下代码由Claude 3.7生成,实现了我们所需的功能:

import os
from pathlib import Path
from mcp.server.fastmcp import FastMCP

# 创建MCP Server
mcp = FastMCP("桌面TXT文件统计器")

@mcp.tool()
def count_desktop_txt_files() -> int:
    """Count the number of.txt files on the desktop."""
    # Get the desktop path
    username = os.getenv("USER") or os.getenv("USERNAME")
    desktop_path = Path(f"/Users/{username}/Desktop")

    # Count.txt files
    txt_files = list(desktop_path.glob("*.txt"))
    return len(txt_files)

@mcp.tool()
def list_desktop_txt_files() -> str:
    """Get a list of all.txt filenames on the desktop."""
    # Get the desktop path
    username = os.getenv("USER") or os.getenv("USERNAME")
    desktop_path = Path(f"/Users/{username}/Desktop")

    # Get all.txt files
    txt_files = list(desktop_path.glob("*.txt"))

    # Return the filenames
    ifnot txt_files:
        return"No.txt files found on desktop."

    # Format the list of filenames
    file_list = "\n".join([f"- {file.name}"for file in txt_files])
    returnf"Found {len(txt_files)}.txt files on desktop:\n{file_list}"

if __name__ == "__main__":
    # Initialize and run the server
    mcp.run()

(五)测试MCP Server

完成代码编写后,在终端执行以下命令进行测试:

mcp dev txt_counter.py

执行后,会看到类似以下输出:

Starting MCP inspector...
Proxy server listening on port 3000
MCP Inspector is up and running at http://localhost:5173

此时,进入给出的链接(http://localhost:5173),按照页面提示操作,即可查看MCP Server是否正常工作,能否正确统计和列出桌面上的txt文件信息。

(六)接入Claude

最后一步,将开发好的MCP Server接入到Claude Desktop中:

  1. 打开claude_desktop_config.json(MacOS / Linux系统路径为~/Library/Application Support/Claude/claude_desktop_config.json),可以使用code命令(如果你用的是cursor或者vim等编辑器,请使用对应的命令):
code ~/Library/Application\ Support/Claude/claude_desktop_config.json
  1. 在配置文件中添加以下内容,记得将路径和用户名替换为实际信息:
{
  "mcpServers": {
    "txt_counter": {
      "command": "/Users/{username}/.local/bin/uv",
      "args": [
        "--directory",
        "/Users/{username}/work/mcp-learn/code-example-txt", // 你的项目路径(这里是我的)
        "run",
        "txt_counter.py" // 你的MCP Server文件名
      ]
    }
  }
}

其中,uv最好使用绝对路径,推荐使用which uv命令获取。 3. 配置完成后,重启Claude Desktop,如果配置无误,就能在Claude中看到对应的MCP Server。

(七)实际使用

在Claude中输入测试prompt,例如“能推测我当前桌面上txt文件名的含义吗?”,此时Claude可能会请求使用权限,点击“Allow for This Chat”,即可看到MCP Server正常工作,Claude基于MCP Server获取的信息给出回答!

六、总结

MCP(Model Context Protocol)的出现,标志着AI与外部工具和数据交互朝着标准化迈出了重要一步。通过本文,我们深入了解到:

  • MCP的本质:是一个统一的协议标准,类似于AI世界的“USB-C”接口,实现了AI模型与各类数据源、工具的一致连接。
  • MCP的价值:解决了传统function call的平台依赖等问题,提供了更统一、开放、安全、灵活的工具调用机制,让用户和开发者都能从中受益。
  • 使用与开发:普通用户可以借助丰富的现成工具轻松使用MCP;开发者则可以依据清晰的架构和SDK,开发出各种强大的MCP Server。

目前,MCP虽然还处于发展初期,但潜力巨大。随着基于MCP统一标准的生态不断完善,必将推动整个AI领域迈向新的高度!赶紧动手实践起来,探索MCP的无限可能吧!

那么,如何系统的去学习大模型LLM?

作为一名从业五年的资深大模型算法工程师,我经常会收到一些评论和私信,我是小白,学习大模型该从哪里入手呢?我自学没有方向怎么办?这个地方我不会啊。如果你也有类似的经历,一定要继续看下去!这些问题啊,也不是三言两语啊就能讲明白的。

所以我综合了大模型的所有知识点,给大家带来一套全网最全最细的大模型零基础教程。在做这套教程之前呢,我就曾放空大脑,以一个大模型小白的角度去重新解析它,采用基础知识和实战项目相结合的教学方式,历时3个月,终于完成了这样的课程,让你真正体会到什么是每一秒都在疯狂输出知识点。

由于篇幅有限,⚡️ 朋友们如果有需要全套 《2025全新制作的大模型全套资料》,扫码获取~
在这里插入图片描述

为什么要学习大模型?

我国在A大模型领域面临人才短缺,数量与质量均落后于发达国家。2023年,人才缺口已超百万,凸显培养不足。随着AI技术飞速发展,预计到2025年,这一缺口将急剧扩大至400万,严重制约我国AI产业的创新步伐。加强人才培养,优化教育体系,国际合作并进是破解困局、推动AI发展的关键。

在这里插入图片描述

在这里插入图片描述

👉大模型学习指南+路线汇总👈

我们这套大模型资料呢,会从基础篇、进阶篇和项目实战篇等三大方面来讲解。
在这里插入图片描述
在这里插入图片描述

👉①.基础篇👈

基础篇里面包括了Python快速入门、AI开发环境搭建及提示词工程,带你学习大模型核心原理、prompt使用技巧、Transformer架构和预训练、SFT、RLHF等一些基础概念,用最易懂的方式带你入门大模型。
在这里插入图片描述

👉②.进阶篇👈

接下来是进阶篇,你将掌握RAG、Agent、Langchain、大模型微调和私有化部署,学习如何构建外挂知识库并和自己的企业相结合,学习如何使用langchain框架提高开发效率和代码质量、学习如何选择合适的基座模型并进行数据集的收集预处理以及具体的模型微调等等。
在这里插入图片描述

👉③.实战篇👈

实战篇会手把手带着大家练习企业级的落地项目(已脱敏),比如RAG医疗问答系统、Agent智能电商客服系统、数字人项目实战、教育行业智能助教等等,从而帮助大家更好的应对大模型时代的挑战。
在这里插入图片描述

👉④.福利篇👈

最后呢,会给大家一个小福利,课程视频中的所有素材,有搭建AI开发环境资料包,还有学习计划表,几十上百G素材、电子书和课件等等,只要你能想到的素材,我这里几乎都有。我已经全部上传到优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费
在这里插入图片描述
相信我,这套大模型系统教程将会是全网最齐全 最易懂的小白专用课!!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值