从MCP基础到FastMCP实战应用

MCP(https://github.com/modelcontextprotocol)

MCP(模型上下文协议) 是一种专为 基于LLM的工具调用外部工具而设计的协议
本质上是 LLM ↔ 工具之间的RPC(远程过程调用) 的一种安全且一致的处理方式,
是一种 轻量级的JSON-RPC标准

我是韩国人,不是中国人。但最近在韩国,如果不使用MCP,就会被认为是跟不上潮流的人,MCP非常火热。我的博客虽然喜欢写大多数人能享受的编程理论文章,但由于理论文章的资料整理与验证需要耗费大量时间,再加上最近因为体力劳动没有太多时间,并且考虑到概念理解上Python非常适合,因此我打算用Python的FastMCP快速实现一个MCP。

1.一般来说,MCP结构如下所示:

[用户提示]

[LLM]

生成 "tool_call" (MCP)

↓ [

工具服务器执行(如FastMCP等)]

生成MCP响应 → 传递给LLM

LLM生成最终响应

2.MCP协议格式

实际上,MCP = JSON-RPC 2.0的子集
(即遵循JSON-RPC标准,但仅提供MCP特定的工具调用方式)

MCP字段

说明

jsonrpc

"2.0"(固定值)

method

要调用的工具名称

params

传递给工具的参数(字典形式)

id

调用标识符(自动递增等)

result

工具的执行结果

基本结构

{"jsonrpc": "2.0","id": 1,"method": "tool_name","params": {"argument1": "value1","argument2": 42}
}

2. 核心组成部分

1. tool_call (Claude → MCP服务器: 请求消息 )

当Claude判断需要调用工具时,会向MCP服务器发送以下的JSON-RPC 2.0请求消息

// Claude -> MCP服务器 (请求示例)
{"jsonrpc": "2.0","id": 123, // 请求标识符(由Claude生成,与响应匹配)"method": "search_nature_articles", // 调用的工具(函数)名称"params": { // 将传递给工具(函数)的参数(字典形式)"keyword": "quantum computing","max_results": 3 // 示例:附加参数}
}
2. MCP Server (本地或远程工具执行器)
  • Claude Desktop会在本地运行配置好的MCP服务器。
  • 必须注册tool_name(即method字段值),并将其绑定到可执行函数。
  • 在Python中,FastMCP可以轻松实现这一点。
@mcp.tool()
def search_nature_articles(keyword: str, max_results: int = 3): # 与params匹配...
3. MCP Response (MCP服务器 → Claude: 响应消息 )
  • 工具(函数)在MCP服务器上执行后,其结果将以JSON-RPC 2.0响应消息 的形式返回给Claude。包括成功或失败(错误)两种情况。
// MCP服务器 -> Claude (成功响应示例)
{"jsonrpc": "2.0","id": 123, // 必须与请求消息中的id相同"result": "'quantum computing'相关论文3篇搜索结果:\n1. Title A...\n..." // 工具执行结果(字符串、数字、列表、对象等均可)
}
// MCP服务器 -> Claude (错误响应示例)
{"jsonrpc": "2.0","id": 123, // 与请求id相同(如果无法识别,也可以为null)"error": { // 发生错误时包含'error'对象而不是'result'"code": -32000, // 示例:服务器错误代码"message": "Springer Nature API密钥认证失败" // 错误消息}
}

为什么需要MCP?

用表格总结如下:

问题

MCP的解决方案

LLM无法执行代码

通过调用外部工具解决

结构化输入/输出困难

使用JSON-RPC实现一致的参数传递

工具错误处理困难

提供明确的错误响应

工具增多导致结构复杂

基于名称的路由 + 分离的服务器架构解决

要素

内容

协议名称

MCP(模型上下文协议)

技术基础

JSON-RPC 2.0

目标

让LLM能够安全地调用外部工具并接收响应

执行方式

在本地服务器或本地进程中运行MCP兼容服务器

典型实现

FastMCP(Python),server-filesystem(JS)

通信对象

Claude Desktop / Claude API

本文将指导如何快速在 VS Code 环境中设置开发 Claude MCP 系统的步骤。
这是使用 FastMCP 构建 MCP 服务器并运行基于 Python 的工具所需的配置。

FastMCP 是一个完整的 Claude 专用 MCP 工具服务器实现。

FastMCP (Python) 不直接打开端口

  • FastMCP 不会直接打开 TCP 套接字或 HTTP 服务器。

  • 相反,它通过 stdio(标准输入输出)与 Claude Desktop 进行通信

  • 换句话说,Claude 内部会以 stdin/stdout 的方式启动 MCP 进程来进行通信。


通常,许多示例中会有以下结构:

mcp_server.py
mcp_client.py

这种结构仅用于练习或调试 JSON-RPC 协议,但并不会与 Claude 实际集成(仅用于测试目的)。

因此,为了实现与 Claude 的实际集成,使用 FastMCP 是最简单的方法之一。接下来我们将使用 FastMCP 实际构建一个 MCP。

总结

  • FastMCP 是专为 Claude 设计的轻量级工具,避免了复杂的网络设置。
  • 它通过标准输入输出 (stdin/stdout) 与 Claude 桌面版通信。
  • 使用 FastMCP 可以更高效地完成实际的 MCP 开发和集成。

1. 安装 VS Code

  • 访问 https://code.visualstudio.com

  • 下载并运行与操作系统对应的安装文件。

2. 安装 VS Code 及扩展

启动 VS Code 后,在左侧的扩展(Extensions)选项卡中搜索并安装以下内容:

  • Python (ms-python.python)

  • (可选)Pylance、IntelliCode(用于增强自动补全功能)

3. 创建并打开项目文件夹

  • 在计算机上创建一个项目文件夹。在我的情况下,我将其命名为 PaperPort

4. 虚拟环境设置

  • 在 VSCode 菜单中选择 终端(Terminal) -> 新建终端(New Terminal),即可在 VS Code 内打开终端。
  • 在终端中输入以下命令,创建一个名为 .venv 的虚拟环境
python -m venv .venv
# 或者 python3 -m venv .venv (根据系统不同)

一定要用 '.venv' 吗? : venv 模块本身对虚拟环境文件夹的名称没有特别限制。你可以使用任何你想要的文件夹名称 。不过,如果文件夹名称前加了点(.),在 Linux 或 macOS 等 Unix 系统中会被视为隐藏文件夹,而 .venv 是一种常见的命名约定。

激活虚拟环境 : 创建虚拟环境后,你需要将其“激活”才能使用。根据终端类型不同,激活命令略有差异。

  • Windows (PowerShell):
  • .\.venv\Scripts\Activate.ps1
  • Windows (Command Prompt - cmd):
  • .\.venv\Scripts\activate.bat
  • macOS / Linux (bash/zsh):
  • source .venv/bin/activate

    实际上,查看 .venv 文件夹中的文件并执行相应的文件会更快。在我的情况下,生成了 activate.bat 文件,因此我执行了该文件。

    5. 设置所需的库

    根据我对 fastmcp 示例的搜索结果,requests 库也是必需的,因此可以一起安装。

    创建 requirements.txt 文件: 将安装的库列表保存到文件中,这样以后在其他环境中可以轻松地进行相同的设置,或者与他人共享。由于我的环境可能会有所不同,因此我会创建这个文件。

    使用 requirements.txt 安装依赖的命令:

    pip install -r requirements.txt

    6. 获取 API 密钥

  • 创建一个 .env 文件。.env 是环境变量文件,用于连接实际的密钥。
  • 直接将密钥写入 Python 文件的方式存在安全问题。

6-1. Claude API 访问方法

访问 https://www.anthropic.com/api 。

创建密钥。

由于我的密钥是私人的,为了不展示,我特意创建了一个新账户。

访问 https://dev.springernature.com/ 并创建密钥。

同样,我的密钥不会展示。

7. 编写 MCP 工具代码

  • 在项目文件夹中创建一个以 .py 结尾的 Python 文件。
  • 我们的目标是创建一个 Nature 论文搜索工具,因此命名为 tool_nature.py
from fastmcp import FastMCP
import requests
from urllib.parse import urlencode
import os
from dotenv import load_dotenv
import sys# 加载环境变量
load_dotenv()# 初始化 MCP 实例
mcp = FastMCP("Nature API Tool Server")# 定义常量
BASE_URL = "http://api.springernature.com/metadata/json"
API_KEY = os.getenv("NATURE_API_KEY")# 如果没有 API 密钥则立即退出
if not API_KEY:print("[FATAL] 环境变量 'NATURE_API_KEY' 未设置。", file=sys.stderr)raise RuntimeError("[CRITICAL] 环境变量 'NATURE_API_KEY' 未设置。请在 .env 或系统环境中注册密钥。")@mcp.tool()
def search_nature_articles(keyword: str, max_results: int = 3) -> str:"""使用 Nature(Open API)根据给定的关键字搜索论文标题和摘要。结果将以摘要形式返回。"""query_params = {"q": keyword,"api_key": API_KEY,"p": max_results}try:response = requests.get(f"{BASE_URL}?{urlencode(query_params)}")response.raise_for_status()data = response.json()records = data.get("records", [])if not records:return f"未找到关于 '{keyword}' 的结果。"output_lines = [f"\n 搜索结果: {keyword}"]for i, article in enumerate(records):title = article.get("title", "无标题")# 摘要类型安全处理abstract_raw = article.get("abstract", "无摘要")if isinstance(abstract_raw, dict):abstract = abstract_raw.get("p", "无摘要")else:abstract = abstract_rawurl_list = article.get("url", [])url = url_list[0].get("value") if url_list else "N/A"abstract_summary = (abstract[:400] + "...") if len(abstract) > 400 else abstractoutput_lines.append(f"\n{i+1}. {title}\n   URL: {url}\n   摘要: {abstract_summary}")return "\n".join(output_lines)except requests.exceptions.RequestException as e:print(f"[ERROR] API 请求时发生错误: {e}", file=sys.stderr)return f"[ERROR] API 请求时发生错误: {e}"except Exception as e:print(f"[ERROR] 数据处理时发生错误: {e}", file=sys.stderr)return f"[ERROR] 数据处理时发生错误: {e}"# 启动 MCP 服务器if __name__ == "__main__":# --------------------------------------------------------------------------# [重要] 下面的 print 语句中的 'http://localhost:3333' 地址相关说明:# 1. 该地址仅为示例,不是实际的 FastMCP 服务器访问地址。# 2. 当使用 Claude Desktop 执行此脚本作为 MCP 服务器时,#    FastMCP 不使用网络端口(HTTP),#    而是通过 stdio(标准输入输出)与 Claude Desktop 进行通信。# 3. 因此无法直接访问 'http://localhost:3333'。# 4. 该地址仅供参考,假设将来使用 FastAPI 构建网络服务器或扩展时,#    可将其视为占位符或示例。# --------------------------------------------------------------------------print(" 正在启动 Nature 工具服务器... http://localhost:3333")mcp.run()

7-1 ## .vscode/launch.json 示例(用于调试)

{"version": "0.2.0","configurations": [{"name": "运行 MCP 工具","type": "python","request": "launch","program": "${workspaceFolder}/tool_nature.py","envFile": "${workspaceFolder}/.env"}]
}

8. 配置 MCP 服务器

配置通过修改 claude_desktop_config.json 文件进行。

可以在以下路径创建该文件:

  • Windows: %APPDATA%\Claude\claude_desktop_config.json
  • MacOS: ~/Library/Application Support/Claude/claude_desktop_config.json

或者: 点击 Claude 桌面左上角菜单 - 文件 - 设置 - 开发者 - 编辑配置按钮。

8-1. 手动注册 MCP 服务器(修改配置文件 claude_desktop_config.json

Claude Desktop 可以通过配置文件手动注册 MCP 服务器。

(示例是我的文件路径。)

{"mcpServers": {"nature": {"command": "Python 路径","args": ["py 文件所在的路径"]}}
}

运行 tool_nature.py 

9. 启动

首先需要在 VSCode 中运行 py 脚本。

然后可以在 Claude 桌面开发者界面看到正在运行的状态。

10. 现在可以做的事

摘要总结

Call tool search_nature_articles with keyword="感兴趣的领域关键词"

URL 返回

search_nature_articles(keyword="感兴趣的领域关键词")

获取两篇相关论文,并返回其摘要和 URL。

Bouns: 如果想在 "localhost:3333" 端口上通过 HTTP 接收请求,该怎么做?

这需要使用 FastAPI、Flask、aiohttp 等单独启动服务器 ,而不是使用 FastMCP

from fastapi import FastAPI
from fastmcp import MCPMiddlewareapp = FastAPI()
app.add_middleware(MCPMiddleware, tools=[...])# 这样 FastAPI 就会在 http://localhost:3333 端口上监听请求

→ 这种方式适用于使用 transport="sse" 的情况。
→ 当前的 FastMCP 默认不使用这种方式。

平時上傳的文章性質與以往有很大的不同,因此感到有些遺憾。

我的博客文章通常面向所有語言的使用者,但最近發表了一些針對特定語言的內容,對此我感到對欣賞本博客的所有讀者有些抱歉。

最近因為忙於工地工作,沒有時間撰寫理論性的文章。

對期待我的讀者們表示歉意。

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

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

相关文章

深入理解C语言中的整形提升与算术转换

深入理解C语言中的整形提升与算术转换 一.整形提升:概念与原理 在C语言中,整形提升(Integer Promotion)是一个重要但容易被忽视的概念。它指的是在表达式中,任何小于int类型的整型(如char、short&#xf…

编程题python常用技巧-持续

1.字典 1.1排序 在Python中,要按照字典的值进行排序,可以按照以下步骤操作: 方法说明 ‌获取键值对列表‌:使用 dict.items() 获取字典的键值对视图。‌排序键值对‌:使用 sorted() 函数,并通过 key 参…

硬件工程师面试常见问题(11)

第五十一问:器件手册的翻译题目 要学英语啊,孩子。 第五十二问:二极管三极管常识题 1.二极管的导通电压一般是 0.7V 2.MOS管根据掺杂类型可以分为 NMOS和PMOS 3.晶体三极管在工作时,发射结和集电结均处于正向偏置,该晶体管工作在一饱和态。…

mysql 配置文件中的[client]、[mysqld]、[mysqldump]和[mysql]区块的作用区别

1. [client] 区块 作用: 适用于 所有 MySQL 客户端工具(如 mysql 命令行客户端、mysqldump、mysqladmin 等)。 常见配置项: [client] host 127.0.0.1 # 默认连接的服务器地址 port 3306 # 默认端口 user root …

SARSA 算法详解:python从零实现

喜欢可以订阅专栏哟 第一章 强化学习基础与核心概念 1.1 强化学习的定义与特点 强化学习(Reinforcement Learning, RL)是机器学习三大范式之一(监督学习、无监督学习、强化学习),其核心思想是通过智能体(Agent)与环境(Environment)的持续交互来学习最优策略。与监督…

(C题|社交媒体平台用户分析问题)2025年第二十二届五一数学建模竞赛(五一杯/五一赛)解题思路|完整代码论文集合

我是Tina表姐,毕业于中国人民大学,对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在,我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…

AI重塑SEO关键词策略

内容概要 传统SEO策略主要依赖人工经验与基础工具进行关键词布局,存在效率低、覆盖维度单一等痛点。而AI技术的介入,使关键词优化从静态词库匹配转向动态语义网络构建。通过自然语言处理(NLP)与深度学习模型,AI不仅能…

【Unity】 组件库分类详解

1️⃣ Audio(音频组件) 用于处理游戏中的声音。 Audio Source 读音[ˈɔːdiəʊ ˈsɔːs],音频源组件,用于播放音频文件,可设置音量、Pitch、循环播放等属性,是音频播放的核心组件。 Audio Listener 读音…

【区块链】区块链技术介绍

引言 区块链技术自2008年中本聪提出比特币概念以来,逐渐从加密货币的底层技术演变为一场颠覆传统信任机制的全球性革命。它不仅重塑了金融体系,更在物流、医疗、政务等领域展现出巨大潜力。本文将用通俗易懂的语言,结合实例与原理&#xff0c…

MySQL零基础入门:Ubuntu环境安装与操作精解

知识点1【数据库】 数据的存储方式,我们之前学的,从变量,数组,链表,最后到文件,文件之上,便是数据库,而我们要介绍的MySQL就是数据库的关系数据库中的其中一种。 1、数据库 本质&…

力扣——23合并升序链表

目录 1:题目描述: 2.算法思想: 3.代码展示: 1:题目描述: 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例 1: 输入&#xff…

AI重构危化品进口清关:一场效率与安全的双重革命

在全球化工产业链深度捆绑的今天,每年超过3亿吨危险化学品通过中国各大口岸流入国内市场。这些支撑着新能源电池、半导体材料等战略产业的“工业血液”,其进口清关流程却长期困于效率与安全的两难困境:人工审核单据平均耗时72小时&#xff0c…

牛客网题解 | 栈的压入、弹出序列

栈的压入、弹出序列 一、题目链接二、题目三、算法原理:用一个栈模拟入栈出栈的过程四、编写代码 一、题目链接 栈的压入、弹出序列 二、题目 三、算法原理:用一个栈模拟入栈出栈的过程 思路:用一个栈模拟入栈出栈的过程,模拟出…

使用CubeMX新建DMA工程——存储器到存储器模式

目录 1、新建板级支持包 2、修改main.c 3、程序流程 4、问题 新建工程的基本操作步骤参考这里: 【【野火】STM32 HAL库开发实战指南 教学视频 手把手教学STM32全系列 零基础入门CubeMXHAL库,基于野火全系列STM32开发板】 https://www.bilibili.com/…

HTML5 新增的主要标签整理

一、语义化标签&#xff08;让网页结构更清晰&#xff09; 1. <header> 和 <footer> 定义&#xff1a;表示网页的「顶部区域」和「底部区域」。场景&#xff1a; <header>&#xff1a;放 Logo、导航栏、搜索框。<footer>&#xff1a;放版权信息、联系…

Mysql数据库高可用解决方案-Mysql Router

目录 一.MySQL Router介绍 1. 什么是 MySQL Router&#xff1f; 2. MySQL Router 的主要用途 3. MySQL Router 的工作原理 4. MySQL Router 的核心组件 5. MySQL Router 的部署和配置 6. MySQL Router 的优势 7. 注意事项 8. MySQL Router 与其他工具的对比 9. 总结 …

【学习笔记】机器学习(Machine Learning) | 第六周|过拟合问题

机器学习&#xff08;Machine Learning&#xff09; 简要声明 基于吴恩达教授(Andrew Ng)课程视频 BiliBili课程资源 文章目录 机器学习&#xff08;Machine Learning&#xff09;简要声明 摘要过拟合与欠拟合问题一、回归问题中的过拟合1. 欠拟合&#xff08;Underfit&#x…

当算力遇上堵车:AI如何让城市血管不再“血栓”?

目录 一、算力治堵的“外科手术” 二、算力治堵的“内科检查” 三、算力治堵的“中医调理” 治堵如治水,算力是新时代的“大禹” “堵车”是每个大城市的通病,但鲜少有人意识到:交通拥堵的根源并非车辆过多,而在于车速过慢,不是因为堵车才慢,而是因为慢才堵车。中国工…

VM虚拟机安装CentOS7.9

目录 1.下载CentOS7.9 2.VM虚拟机选择自定义&#xff0c;然后一直傻瓜式下一步 3.选择编辑虚拟机设置&#xff0c;然后选择刚刚下载的ISO 4.输入 ip addr 获取ip地址 5.用Xshell连接 1.下载CentOS7.9 链接&#xff1a;https://pan.baidu.com/s/1kW2gGWnbcjNtq4kz46LKVw?p…

文本解析到大模型应用

文本解析到到大模型应用 一、背景 最近接到一个比较恶心的工作&#xff0c;之前有个同事将很多个小的文档整合到了一个大文档中&#xff0c;同时暴露出一个新的问题&#xff0c;大的文档虽然查找问题比较方便但是维护起来较为麻烦&#xff0c;所以需要将大的文档按照标题拆分…