大模型学习:基于Python 开发 MCP 服务案例演示

模型上下文协议 MCP 是一种开放协议,旨在标准化 AI 应用程序与外部数据源和工具的连接方式。其核心目标在于简化大型语言模型 LLM 与各种上下文和工具的集成,从而解决将多种 LLM 与多种工具相集成的复杂性问题。

但你有没有想过,自己动手打造一个 MCP 服务呢?想象一下,亲手设计一个智能工具,无论是处理数据、调用外部 API,还是生成自定义报告。这种创造力和掌控力的体验,会不会更香呢?

MCP 本身是一个通用的协议,设计上是为了跨语言和跨平台的,因此可以使用各种语言来编写服务,比如常用的 Node.js。但如果不熟悉 Web 开发,也想自己写一写呢?Python 自然是不二之选。只是 MCP 具体的协议挺复杂的,很难快速上手。

不过,现在好了,因为有了 FastMCP,它是一个 Python 软件开发工具包 (SDK),专门设计用于简化构建 MCP 服务的过程。它提供了一个高级且符合 Python 语言习惯的接口,用于定义工具、资源和提示。FastMCP 的核心优势在于其能够帮助开发者更轻松地创建符合 MCP 规范的服务,而无需深入了解底层的协议细节。

但值得注意的是,你看网上代码会涉及两个 FastMCP 包,其中一个是,

https://github.com/jlowin/fastmcp

另一个则是官方的,

https://github.com/modelcontextprotocol/python-sdk

这两个什么关系呢?其实是官方收编了上面第一个包,但官方集成的是 fastmcp 的 v1.0 版本。然而,jlowin 继续开发 fastmcp,还发布了 v2.0 版本,其中包含代理和客户端采样等新功能。

使用的话这两个都可以,先看第一个的安装和导入,

pip install fastmcp
from fastmcp import FastMCP

官方的安装和导入如下所示,

pip install mcp
from mcp.server.fastmcp import FastMCP

本文使用官方 Python SDK 里的 FastMCP 来构建自己的 MCP 服务。

我们先来看一个最简单的例子。

./demo/server.py
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("Demo 🚀")

@mcp.tool()
def add_2_numbers(a: int, b: int) -> int:
    """两个数字相加"""
    return a + b

if __name__ == "__main__":
    mcp.run(transport='stdio')

这个例子展示了如何使用 FastMCP 库来创建一个简单的 MCP 服务器,它提供一个基本的工具(工具名:add_2_numbers),用于两个数字相加。这是一个非常简单的入门示例,适合理解 MCP 服务器的工作原理和 FastMCP 的基本用法。

  • 首先,从 mcp.server.fastmcp 模块中导入了 FastMCP 类。接着,创建了一个 FastMCP 类的实例,命名为 mcp。FastMCP 是服务器的核心类,它负责管理工具、资源和通信。参数「Demo 🚀」是服务器的名称,用于标识这个 MCP 服务器。
  • 然后,@mcp.tool() 是一个装饰器(decorator),它告诉 FastMCP 将 add_2_numbers 函数注册为一个可供客户端调用的工具。文档字符串(“”“两个数字相加”“”):这是函数的描述,客户端(如 MCP Inspector)会显示这个描述,帮助用户理解工具的功能。
  • 这个工具可以被外部客户端调用,例如通过 MCP 协议发送请求,传入两个整数 a 和 b,服务器会返回它们的和。例如,如果客户端调用 add_2_numbers(3, 5),服务器会返回 8。
  • mcp.run(transport='stdio') 启动 MCP 服务器,进入监听状态,等待客户端的连接和请求。transport='stdio' 指定了通信方式为标准输入输出(Standard I/O)。这意味着服务器通过命令行的标准输入(stdin)和标准输出(stdout)与客户端通信,适合本地开发和测试。如果需要远程通信,可以更改为其他传输方式(如 'sse'Server-Sent Events)。
    在这里插入图片描述
运行效果:

运行 python ./demo/server.py,服务器会启动并监听 stdio。任何支持 MCP 协议的客户端(例如 MCP InspectorClaude Desktop)都可以连接到它,调用 add_2_numbers 工具。

比如,可以通过 MCP Inspector 测试一下这个工具。

% mcp dev ./demo/server.py
Need to install the following packages:
@modelcontextprotocol/inspector@0.8.2
Ok to proceed? (y) y

在这里插入图片描述

浏览器中打开 http://127.0.0.1:6274,可以测试一下上面这个 mcp 服务里提供的 tool。

在这里插入图片描述

这个 mcp 过于简单,咱们就不安装来用了。下面我们手撸一个稍微复杂一点的 mcp 服务,并安装上真正使用起来。

记账 mcp 服务

我们基于 MCP 开发了一个轻量级(玩具级)记账服务 Money Track MCP,旨在帮助用户管理和跟踪财务数据。该服务利用 Python 和 FastMCP 框架,提供了三种核心功能类型(工具、资源和提示),为用户提供一个灵活、高效的解决方案来记录收入和支出、查询账户状态以及生成格式化的财务报告。

项目虽小,但涉及环境变量的设置和读取,用户数据的存储等多个方面,对于开发更强大服务来说是一个不错的基础。完整代码的地址见文末

核心功能
  1. 工具 (@tool):
    服务提供了一个名为 record_transaction 的工具,允许用户动态输入当天的收入和支出,如「今天赚了 500 元,花了 250 元」。工具会自动更新累积的总收入、总支出,并计算当前余额。这些数据持久化存储在用户指定的文件中,确保数据不会丢失。
  2. 资源 (@resource):
    通过 get_account_status 资源,用户可以安全地检索当前账户的最新状态,包括总收入、总支出和余额。资源数据存储在 JSON 文件中,文件路径可以由用户通过环境变量或配置文件自定义,默认位于 ./accounting_data/accounting_data.json
  3. 提示 (@prompt):
    format_account_report 提示负责将账户状态格式化为易读的报告。
技术架构
  • 框架:基于 FastMCP,一个高效的 Python 库,简化了 MCP 服务器的开发。
  • 存储:数据保存在 JSON 文件中,支持用户自定义存储路径(如通过环境变量 ACCOUNTING_WORKING_DIR 或配置文件)。
  • 通信:默认使用标准输入输出 (stdio) 传输协议,方便本地开发和测试。
  • 日志:支持 INFODEBUG 级别的日志记录,帮助开发者监控服务运行状态和调试问题。
使用场景

MoneyTrack MCP 适用于多种场景,包括但不限于:

  • 个人财务管理:个人用户可以通过客户端记录日常收支,并随时查看余额。
  • 企业/团队记账:小型企业或团队可以集成此服务到更大的财务系统中,快速统计现金流。
  • 教育与开发示例:开发者可以作为 MCP 服务的学习示例,了解工具、资源和提示的协同工作。

具体代码如下,

# ./src/server.py
from mcp.server.fastmcp import FastMCP
import os
import json
from typing import Dict, Optional
import logging

# 配置日志
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

# 从环境变量或默认值获取工作目录
DEFAULT_WORKING_DIR = "~/accounting_data"
WORKING_DIR = os.getenv("ACCOUNTING_WORKING_DIR", DEFAULT_WORKING_DIR)

# 确保目录存在
os.makedirs(WORKING_DIR, exist_ok=True)

# 数据文件路径
DATA_FILE = os.path.join(WORKING_DIR, "accounting_data.json")

# 初始数据(如果文件不存在)
INITIAL_DATA = {
    "total_income": 0,
    "total_expense": 0,
    "balance": 0
}

def load_data() -> Dict:
    """从文件中加载数据,如果文件不存在则创建默认数据"""
    try:
        if os.path.exists(DATA_FILE):
            with open(DATA_FILE, "r", encoding="utf-8") as f:
                return json.load(f)
        else:
            with open(DATA_FILE, "w", encoding="utf-8") as f:
                json.dump(INITIAL_DATA, f, indent=4)
            return INITIAL_DATA
    except Exception as e:
        logger.error(f"Failed to load data: {str(e)}")
        return INITIAL_DATA

def save_data(data: Dict) -> None:
    """将数据保存到文件"""
    try:
        with open(DATA_FILE, "w", encoding="utf-8") as f:
            json.dump(data, f, indent=4)
    except Exception as e:
        logger.error(f"Failed to save data: {str(e)}")

# 创建 MCP 服务器
mcp = FastMCP("money-track-mcp", log_level="ERROR")

# 工具:记录收入和支出
@mcp.tool()
def record_transaction(income: Optional[int] = 0, expense: Optional[int] = 0) -> Dict:
    """记录今天的收入和支出,更新账户余额"""
    ifnot isinstance(income, (int, float)) ornot isinstance(expense, (int, float)):
        return {"error": "Income and expense must be numbers"}

    data = load_data()
    data["total_income"] += income
    data["total_expense"] += expense
    data["balance"] = data["total_income"] - data["total_expense"]
    save_data(data)

    return {
        "message": "Transaction recorded successfully",
        "total_income": data["total_income"],
        "total_expense": data["total_expense"],
        "balance": data["balance"]
    }

# 资源:获取当前账户状态
@mcp.resource("accounting://status")
def get_account_status() -> Dict:
    """获取当前账户的收入、支出和余额"""
    data = load_data()
    return {
        "total_income": data["total_income"],
        "total_expense": data["total_expense"],
        "balance": data["balance"]
    }

# 提示:格式化账户报告
@mcp.prompt()
def format_account_report(status: Dict) -> str:
    """格式化账户状态为易读的报告"""
    returnf"""
    === 账户报告 ===
    总收入: ${status["total_income"]:.2f}
    总支出: ${status["total_expense"]:.2f}
    当前余额: ${status["balance"]:.2f}
    ================
    """

def run_server():
    """运行 MCP 服务器"""
    print("=== Money Track MCP 服务启动 ===")
    logging.info("Money Track MCP 服务启动")
    print(f"当前工作目录: {os.getcwd()}")

    mcp.run(transport='stdio')

安装和运行

git clone https://github.com/mathinml/mcp_money_track.git
cd mcp_money_track
pip install mcp
pip install .

打开你喜欢的 mcp 客户端,比如 ClineRoo Code, Cursor 等等。mcp 配置文件中请参考如下设置,

"money-track-mcp": {
      "command": "/opt/anaconda3/bin/python",
      "args": [
        "-m",
        "mcp_money_track"
      ],
      "env": {
        "ACCOUNTING_WORKING_DIR": "/Users/xyz/account"
      }
    },

环境变量 "ACCOUNTING_WORKING_DIR" 是用于设置账本的保存目录。

1、Cline

在这里插入图片描述

点击 Approve 以后,

在这里插入图片描述

再次输入:我今天收入才 500 元,花掉了 1500 元。

没多说啥,它自动领会要记账啦,请看结果。

在这里插入图片描述

打开保存目录里的账本看一看,

在这里插入图片描述

2、Roo Code

然后在另一个客户端里试试,VS Code + 插件 Roo Code。

换套说辞,咱不提记账不记账,只跟它说:我想买个电脑,1 万元左右,看看我的余额还够吗?

在这里插入图片描述

点击 Approve,如果觉得每次要点太烦人,也可以在 Auto-approve 里设定总是允许。

在这里插入图片描述

余额不够啦,谁打赏一点让我凑个整呗。

3、Cherry Studio

在 Cherry Studio 里设置也是类似的,如图。

在这里插入图片描述

然后,在聊天界面一定要在 MCP 服务器里选中这个服务。

在这里插入图片描述

大模型这里我们选用 OpenRoute 提供的免费 Gemini 2.5 Pro,

在这里插入图片描述

也还行,速度上感觉比前面两个慢一丢丢。

好了,通过这个例子,应该已经明白如何使用 Python 来写一个简单但完整的 mcp 服务。

代码:https://github.com/mathinml/mcp_money_track

普通人如何抓住AI大模型的风口?

领取方式在文末

为什么要学习大模型?

目前AI大模型的技术岗位与能力培养随着人工智能技术的迅速发展和应用 , 大模型作为其中的重要组成部分 , 正逐渐成为推动人工智能发展的重要引擎 。大模型以其强大的数据处理和模式识别能力, 广泛应用于自然语言处理 、计算机视觉 、 智能推荐等领域 ,为各行各业带来了革命性的改变和机遇 。

目前,开源人工智能大模型已应用于医疗、政务、法律、汽车、娱乐、金融、互联网、教育、制造业、企业服务等多个场景,其中,应用于金融、企业服务、制造业和法律领域的大模型在本次调研中占比超过 30%。
在这里插入图片描述

随着AI大模型技术的迅速发展,相关岗位的需求也日益增加。大模型产业链催生了一批高薪新职业:

在这里插入图片描述

人工智能大潮已来,不加入就可能被淘汰。如果你是技术人,尤其是互联网从业者,现在就开始学习AI大模型技术,真的是给你的人生一个重要建议!

最后

如果你真的想学习大模型,请不要去网上找那些零零碎碎的教程,真的很难学懂!你可以根据我这个学习路线和系统资料,制定一套学习计划,只要你肯花时间沉下心去学习,它们一定能帮到你!

大模型全套学习资料领取

这里我整理了一份AI大模型入门到进阶全套学习包,包含学习路线+实战案例+视频+书籍PDF+面试题+DeepSeek部署包和技巧,需要的小伙伴文在下方免费领取哦,真诚无偿分享!!!
vx扫描下方二维码即可
加上后会一个个给大家发

在这里插入图片描述

部分资料展示

一、 AI大模型学习路线图

整个学习分为7个阶段
在这里插入图片描述
在这里插入图片描述

二、AI大模型实战案例

涵盖AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,皆可用。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

三、视频和书籍PDF合集

从入门到进阶这里都有,跟着老师学习事半功倍。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

四、LLM面试题

在这里插入图片描述
在这里插入图片描述

五、AI产品经理面试题

在这里插入图片描述

六、deepseek部署包+技巧大全

在这里插入图片描述

😝朋友们如果有需要的话,可以V扫描下方二维码联系领取~
在这里插入图片描述

### 大模型 MCP 的技术文档与实现细节 #### 定义与背景 Model Context Protocol (MCP) 是一种新兴的技术协议,旨在为数据提供者和人工智能应用之间创建统一的数据交互标准。该协议最早由 Anthropic 在 2024 年 11 月提出,其目标是简化 AI 系统获取外部结构化信息的过程[^2]。 #### 技术核心原理 MCP 协议的核心在于构建了一个标准化框架,允许数据源通过专用的 MCP 服务器向 AI 系统传输上下文信息。这种设计使得 AI 能够更高效地理解复杂环境并作出决策。具体而言,MCP 提供了一种机制来描述数据的语义含义及其与其他数据的关系,从而增强了 AI 对动态变化的理解能力。 #### 工作流程与实例分析 以下是 MCP 的典型工作流程: 1. **数据准备阶段** 数据提供方需将其原始数据转换成符合 MCP 标准的形式,并部署到 MCP 服务器上。这一步骤通常涉及元数据标注、关系建模以及安全性配置。 2. **请求处理阶段** 当 AI 应用需要特定类型的上下文时,它会发起一个基于 MCP 的查询请求至对应的 MCP 服务端口。此过程可能包括身份验证、权限管理等功能以保障信息安全。 3. **响应返回阶段** 如果一切正常,则 MCP 服务器将以预定义格式将所需数据发送回给调用方——即运行中的 AI 实例。整个通信链路均遵循加密措施保护敏感资料免受未授权访问威胁。 下面是一个简单的 Python SDK 使用案例演示如何连接到远程 MCP Server 获取资源片段: ```python from mcp_client import MCPSession def fetch_mcp_data(api_key, server_url): session = MCPSession(server_url=server_url, api_key=api_key) try: response = session.get_context("example_dataset_id", timeout=10) return response.data except Exception as e: print(f"Error fetching data from MCP: {e}") if __name__ == "__main__": fetched_data = fetch_mcp_data(api_key="your_api_key_here", server_url="https://mcp.example.com") if fetched_data is not None: print("Fetched Data:", fetched_data[:50]) # 打印前50字符作为示例展示 ``` 上述代码展示了利用官方提供的 `MCPSession` 类型对象轻松完成一次完整的 MCP API 请求操作方法。 #### 优势与应用场景 采用 MCP 可带来诸多好处,比如提升跨平台协作效率、降低开发成本等。特别是在以下领域具有广泛适用价值: - 自然语言处理任务优化; - 图像识别精度改进; - 推荐算法性能增强等等[^1]^。 值得注意的是,随着 MCP 不断迭代升级,越来越多的大规模机器学习项目开始采纳这一先进解决方案,进一步推动行业整体进步步伐加快趋势明显可见一斑. #### 未来发展趋势与挑战 尽管当前版本已经展现出强大潜力,但仍存在一些亟待解决的问题有待克服。例如兼容性问题可能导致部分老旧系统难以无缝迁移;另外隐私泄露风险也不容忽视,因此加强防护手段成为当务之急之一. 同时考虑到实际落地过程中可能会遇到各种意想不到的情况发生,持续完善生态系统建设显得尤为重要. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值