FastMCP 实战开发 MCP 服务,小白也能快速上手,附完整代码!

今天主要给大家介绍一下如何使用 FastMCP 实战开发 MCP 服务

01 MCP 和 FastMCP 简介

模型上下文协议(MCP,Model Context Protocol)是一种开放协议,其核心作用是为应用程序向大语言模型(LLM)提供上下文建立标准化规范。可以将 MCP 视为AI应用领域的 USB-C 接口——正如 USB-C 为电子设备与各类外设配件提供了通用连接标准,MCP 同样为 AI 模型与多样化数据源及工具搭建了标准化连接桥梁。

在 AI 应用越来越需要“连接外部工具”的今天,MCP 正逐渐成为行业底层标准。

过去的函数调用(Function Calling),像是给大模型一堆“遥控器”,但每一个都不兼容。而 MCP 的理念,是打通接口,让模型像人一样理解工具、协同执行任务。

MCP 本质上采用客户端-服务器架构,主体应用程序可通过该协议连接多个服务器。

MCP 的核心架构:

  • MCP 主体(Hosts):指需要通过MCP获取数据的程序,例如:Claude桌面应用、集成开发环境(IDE)或其他AI工具;

  • MCP 客户端(Clients):与服务器保持一对一连接的协议客户端程序;

  • MCP 服务器(Servers):轻量级服务程序,通过标准化的模型上下文协议(Model Context Protocol)提供特定功能;

  • 本地数据源(Local Data Sources):MCP 服务器可安全访问的计算机本地文件、数据库及服务;

  • 远程服务(Remote Services):MCP 服务器可通过互联网连接的外部系统(例如:通过API访问的服务)。

FastMCP 是用于模型上下文协议(Model Context Protocol)的标准开发框架。2024 年发布的 FastMCP 1.0 已被正式纳入 MCP Python SDK。

FastMCP 能够以简洁直观的方式构建 MCP 服务器和客户端,开发者可通过符合 Python 风格的代码轻松实现以下功能:

  1. 创建工具(Tools):以装饰器定义可执行函数,支持复杂计算或 API 调用;

  2. 暴露资源(Resources):通过 URI 模板安全地提供静态或动态数据;

  3. 定义提示(Prompts):设计可复用的交互模板,优化与大语言模型的协作;

  4. 扩展功能:支持上下文管理、服务器组合等高级特性。

我们将使用最新版的 FastMCP 2.0 进行 MCP 开发实战。

在正式实战前,我们可以使用 pip 的方式安装 FastMCP:

pip install fastmcp -i http://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com

02 MCP 服务端

MCP 服务端代码 fastmcp_server.py:

import os

from fastmcp import FastMCP

CURRENT_PATH = os.getcwd()

mcp = FastMCP(name="StockMCPServer")


@mcp.tool()
def get_stock_info(code: str) -> str:
    """
    工具:根据股票代码获取股票信息
    :param code:
    :return:
    """
    if code == "09988":
        returnf"阿里巴巴-W,港股,股票代码为{code}"
    elif code == "00700":
        returnf"腾讯控股,港股,股票代码为{code}"
    else:
        returnf"未找到股票代码{code}对应的股票信息"


@mcp.tool()
def get_stock_price(code: str) -> float:
    """
    工具:根据股票代码获取股票价格
    :param code:
    :return:
    """
    stock_price_dict = {
        "09988": 111.6,
        "00700": 500.5
    }
    return stock_price_dict.get(code, 0.0)


@mcp.resource("config://app-version")
def get_app_version() -> str:
    """
    资源:返回应用版本
    :return:
    """
    app_version = "v1.0.0"
    return app_version


@mcp.resource("db://stocks/{code}/name")
asyncdef get_stock_name(code: str) -> str:
    """
    资源:根据股票代码获取股票名称
    :param code:
    :return:
    """
    stock_name_dict = {
        "09988": "阿里巴巴-W",
        "00700": "腾讯控股"
    }
    return stock_name_dict.get(code, "未知股票")


@mcp.resource("data://stock-codes")
def get_stock_codes() -> list[str]:
    """
    资源:获取所有股票代码列表
    :return:
    """
    stock_code_list = ["09988", "00700"]
    return stock_code_list


@mcp.prompt
def introduce_stock(code: str) -> str:
    """
    提示:根据股票代码介绍股票信息
    :param code:
    :return:
    """
    prompt = f"你能帮忙介绍一下股票代码为{code}的详细信息吗?"
    return prompt


if __name__ == "__main__":
    mcp.run(transport="sse", host="0.0.0.0", port=8090)

使用 IDE(如:PyCharm)将 MCP 服务端代码 fastmcp_server.py 运行起来。

03 MCP 客户端

MCP 客户端代码 fastmcp_client.py:

import asyncio

from fastmcp import Client


asyncdef run_client():
    """
    运行客户端
    :return:
    """
    asyncwith Client("http://localhost:8090/sse") as client:
        tools = await client.list_tools()
        print(f"可用的工具列表: {tools}")

        resources = await client.list_resources()
        print(f"可用的资源列表: {resources}")

        get_stock_info_result = await client.call_tool("get_stock_info", {"code": "00700"})
        print(f"调用工具 get_stock_info 返回的结果 : {get_stock_info_result}")

        app_version_result = await client.read_resource("config://app-version")
        print(f"读取资源 config://app-version 返回的结果 : {app_version_result}")

        stock_codes_result = await client.read_resource("data://stock-codes")
        print(f"读取资源 data://stock-codes 返回的结果 : {stock_codes_result}")

        introduce_stock_result = await client.get_prompt("introduce_stock", {"code": "00700"})
        print(f"获取提示 introduce_stock 返回的结果 : {introduce_stock_result}")


if __name__ == "__main__":
    asyncio.run(run_client())

使用 IDE(如:PyCharm)运行 MCP 客户端代码 fastmcp_client.py。

04 结语

相信你现在已经知道如何使用 FastMCP 实战开发 MCP 服务 。建议你不妨亲自动手去实践,体验一下开发 MCP 服务的乐趣。

05 如何学习AI大模型?

我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习和面试资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

在这里插入图片描述

<think>我们正在讨论FastMCP如何调用外部MCP服务。根据引用[3]和[5],FastMCP主要是一个用于构建MCP服务器的框架。然而,用户的问题是关于如何调用外部的MCP服务(即作为客户端)。 在MCP架构中(引用[3]): - MCP Host: 使用AI的应用程序(如Claude客户端) - MCP Client: 负责与MCP Server通信的组件 - MCP Server: 提供功能接口的组件 FastMCP主要用于构建MCP Server(引用[2][5])。但是,调用外部MCP服务需要扮演MCP Client的角色。 然而,查看引用[5]的示例代码,它只展示了如何创建MCP Server(使用`FastMCP`类,定义工具和资源,然后运行)。并没有直接展示如何作为客户端调用外部服务。 但是,我们注意到引用[3]中提到“MCP Client:与MCP Server建立连接的组件,负责处理通信细节”。因此,要调用外部MCP服务,我们需要一个MCP客户端。 由于FastMCP的文档和引用中主要关注服务端,可能没有直接提供客户端库。但我们可以根据MCP协议(一种基于JSON的协议)来实现客户端调用。 步骤: 1. 了解MCP协议:MCP协议通常通过标准输入输出(stdio)或HTTP等传输层进行通信。消息是JSON格式。 2. 作为客户端,我们需要向MCP服务器发送请求并接收响应。 例如,如果我们有一个运行在HTTP上的MCP服务器,我们可以发送HTTP POST请求到服务器的端点,请求体为JSON格式的MCP请求。 但是,引用[5]中的示例使用的是`stdio`传输(即标准输入输出),这意味着它设计用于与父进程通过管道通信。在这种情况下,调用外部MCP服务(作为另一个进程)需要以子进程方式启动它,并通过管道进行通信。 然而,用户的问题可能是:在FastMCP构建的服务中,如何调用另一个外部的MCP服务?即我们构建的FastMCP服务器需要作为客户端去调用其他MCP服务器。 由于FastMCP主要关注服务端,它可能没有内置的客户端功能。因此,我们需要自己实现一个MCP客户端。 实现MCP客户端的基本步骤(以HTTP传输为例): 1. 确定外部MCP服务的端点(URL)。 2. 根据MCP协议构造请求(JSON格式)。 3. 发送HTTP POST请求。 4. 解析响应。 但是,如果外部MCP服务使用stdio传输(如引用[5]的示例),则调用方式不同:我们需要启动该外部服务作为子进程,并通过标准输入输出与其通信。 由于MCP协议的具体消息格式在引用中没有给出,我们可以参考MCP的官方文档或标准。但根据常见实现,一个简单的MCP请求可能如下: 请求: ```json { "id": "unique-request-id", "method": "方法名", "params": { "param1": value1, "param2": value2 } } ``` 响应: ```json { "id": "unique-request-id", "result": ..., "error": null } ``` 因此,如果我们使用HTTP传输,可以这样调用(使用Python的requests库): ```python import requests url = "http://external-mcp-server/endpoint" payload = { "id": "1", "method": "add", # 假设外部服务有一个add方法 "params": { "a": 2, "b": 3 } } response = requests.post(url, json=payload) result = response.json()['result'] ``` 如果是stdio传输,则更复杂,需要管理子进程的输入输出。例如: ```python import subprocess import json # 启动外部MCP服务进程(假设它是一个可以通过命令行启动的程序) process = subprocess.Popen(['python', 'external_mcp_server.py'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True) # 构造请求 request = { "id": "1", "method": "add", "params": { "a": 2, "b": 3 } } # 发送请求 process.stdin.write(json.dumps(request) + '\n') process.stdin.flush() # 获取响应 response_line = process.stdout.readline() response = json.loads(response_line) result = response['result'] ``` 注意:stdio模式下,通常以换行符分隔的JSON消息进行通信。 在FastMCP构建的服务中,如果我们想要调用外部服务,我们可以在FastMCP定义的工具函数中实现上述客户端逻辑。例如: ```python from mcp.server.fastmcp import FastMCP import requests mcp = FastMCP("My Server") @mcp.tool() def call_external_service(a: int, b: int) -> int: """调用外部MCP服务的add方法""" # 假设外部服务是HTTP传输 url = "http://localhost:8000/mcp" payload = { "id": "1", "method": "add", "params": {"a": a, "b": b} } response = requests.post(url, json=payload) if response.status_code == 200: return response.json()['result'] else: raise Exception("调用外部服务失败") # ... 其他工具和资源 ``` 总结:FastMCP本身没有提供调用外部MCP服务的客户端库,但我们可以根据传输方式(HTTP或stdio)使用常规的HTTP客户端或子进程管理来实现。 注意:在实现客户端时,需要了解目标MCP服务的具体协议细节(方法名、参数、传输方式等)。 因此,回答用户问题:FastMCP如何调用外部MCP服务?我们可以通过自行实现MCP客户端(使用HTTP请求或子进程通信)来调用。</think>### FastMCP 调用外部 MCP 服务的技术实现 在 FastMCP 中调用外部 MCP 服务需要遵循 MCP 协议的客户端-服务器架构。以下是实现步骤和技术要点: #### 1. **理解 MCP 架构角色** - **MCP Host**:发起请求的应用程序(如 AI 客户端)[^3] - **MCP Client**:负责连接外部服务的组件(需自行实现) - **MCP Server**:外部服务提供方(已存在) ```mermaid graph LR A[MCP Host] --> B[MCP Client] B --> C[外部 MCP Server] ``` #### 2. **实现 MCP 客户端** FastMCP 主要提供**服务开发能力**,调用外部服务需自行构建客户端逻辑。核心步骤: ```python import requests import json class MCPClient: def __init__(self, server_url: str): self.base_url = server_url # 外部服务地址,如 http://external-mcp:8000 def call_tool(self, tool_name: str, params: dict) -> dict: """调用外部服务的工具""" payload = { "method": tool_name, "params": params, "id": "req_123" # 唯一请求ID } response = requests.post( f"{self.base_url}/invoke", json=payload, headers={"Content-Type": "application/json"} ) return response.json() ``` #### 3. **在 FastMCP 服务中集成调用** 在 FastMCP 定义的工具中嵌入客户端调用: ```python from mcp.server.fastmcp import FastMCP mcp = FastMCP("GatewayService") # 创建客户端实例 external_client = MCPClient("http://external-service:8000") @mcp.tool() def combined_calculation(a: int, b: int) -> dict: """调用外部服务的加法工具并本地处理""" # 调用外部服务 external_res = external_client.call_tool("add", {"a": a, "b": b}) # 本地处理 local_calc = a * b return { "external_sum": external_res["result"], "local_product": local_calc } ``` #### 4. **通信协议要点 - **传输格式**:JSON-RPC 风格协议[^3] - **典型请求**: ```json { "method": "add", "params": {"a": 5, "b": 3}, "id": "req_2023" } ``` - **响应结构**: ```json { "result": 8, "error": null, "id": "req_2023" } ``` #### 5. **高级场景处理 - **异步调用**:使用 `asyncio` + `aiohttp` 实现非阻塞 - **错误处理**: ```python try: result = external_client.call_tool("divide", {"x": 10, "y": 0}) except MCPError as e: return {"error": f"External service failed: {e.code}"} ``` - **安全认证**:在请求头添加 JWT 或 API Key ```python headers={"Authorization": "Bearer <TOKEN>"} ``` ### 关键注意事项 1. **协议兼容性**:确保外部服务遵循标准 MCP 协议规范 2. **传输层适配**:根据目标服务支持 `HTTP`/`WebSocket`/`stdio`[^5] 3. **超时控制**:设置合理超时(建议 3-5 秒) 4. **服务发现**:复杂系统需集成服务注册中心(如 Consul) > 提示:对于复杂集成场景,建议封装可复用的 MCP Client SDK,统一处理序列化、重试和监控逻辑[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值