Python-MCPInspector调试

news2025/5/13 16:43:24

Python-MCPInspector调试

使用FastMCP开发MCPServer,熟悉【McpServer编码过程】+【MCPInspector调试方法】-> 可以这样理解:只编写一个McpServer,然后使用MCPInspector作为McpClient进行McpServer的调试


1-核心知识点

  • 1-熟悉【McpServer编码过程】
  • 2-熟悉【McpServer调试方法-MCP Inspector】

2-思路整理

1-核心思路

  • 1-编写传统的Service业务代码
  • 2-在Service业务代码头上添加@tool装饰器,即可实现FastMCP的Tool功能
  • 3-在Service业务代码头上添加@mcp.tool()装饰器,即可实现FastMCP的McpServer功能
  • 4-主程序指定运行方法-stdio进程启动(但是不要自己去启动)
  • 5-使用MCPInspector调试McpServer(2个步骤)
    • 【mcp dev city_02_mcp_server.py】是启动mcpInspector并指定mcpServer的路径,
    • 然后在Inspector中启动city_02_mcp_server.py->【uv run --with mcp mcp run city_02_mcp_server.py】

2-核心代码

  • 1-在Service业务代码头上添加@tool装饰器,即可实现FastMCP的Tool功能
# 假设 mcp 已经正确导入
try:
    from mcp import tool
except ImportError:
    # 如果 mcp 未找到,模拟一个 tool 装饰器
    def tool(func):
        return func

# 在 Service 业务代码头上添加 @tool 装饰器
@tool
async def get_city_list(self) -> list:
    """获取所有的城市信息。
    返回:
    str: 所有的城市信息列表
    """
    logging.info(f"获取所有的城市信息")
    city_list = []
    for city in self.CITY_WEATHER_DATA:
        city_list.append(city)
    return city_list

  • 2-在Service业务代码头上添加@mcp.tool()装饰器,即可实现FastMCP的McpServer功能
from mcp.server.fastmcp import FastMCP

from city_01_service import CityDataServer

# 1-初始化 MCP 服务器
mcp = FastMCP("CityDataServer")

# 2-初始化城市信息服务器(业务代码+@tool装饰器)
city_server = CityDataServer()


# 3-在 Service 业务代码头上添加@mcp.tool()装饰器
@mcp.tool()
# 获取所有城市列表
async def get_city_list():
    """获取所有城市列表。
    返回:
    str: 所有城市列表
    """
    city_list = await city_server.get_city_list()
    return city_list


# 4-主程序指定运行方法-stdio进程启动
if __name__ == "__main__":
    mcp.run(transport='stdio')


3-参考网址

  • 个人代码实现仓库:https://gitee.com/enzoism/python_mcp_01_inspector

4-上手实操

1-空工程初始化环境

mkdir my_project
cd my_project
python -m venv .venv

2-激活环境

# Windows
source .venv/Scripts/activate

# Mac
source .venv/bin/activate

3-添加依赖

对应的依赖是在激活的环境中

# uv用于后续MCP Inspector的连接
pip install uv httpx mcp

4-项目结构

  • city_01_service.py:城市服务脚本
  • city_02_mcp_server.py:MCP 服务器脚本

5-创建Python城市服务

city_01_service.py:城市服务脚本

import logging

# 假设 mcp 已经正确导入
try:
    from mcp import tool
except ImportError:
    # 如果 mcp 未找到,模拟一个 tool 装饰器
    def tool(func):
        return func

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


# 定义城市服务
class CityDataServer:
    # 模拟城市的天气数据
    CITY_WEATHER_DATA = {
        "北京": {"condition": "晴", "temperature": 25, "humidity": 40},
        "上海": {"condition": "多云", "temperature": 27, "humidity": 60},
        "广州": {"condition": "雨", "temperature": 30, "humidity": 80},
        "深圳": {"condition": "多云", "temperature": 29, "humidity": 70},
        "杭州": {"condition": "晴", "temperature": 26, "humidity": 50},
    }

    @tool
    async def get_city_weather(self, city: str) -> str:
        """获取指定城市的天气信息。

        参数:
        city (str): 城市名称

        返回:
        str: 天气信息描述
        """
        logging.info(f"获取天气信息: {city}")
        if city in self.CITY_WEATHER_DATA:
            weather = self.CITY_WEATHER_DATA[city]
            return f"{city} : {weather['condition']} , {weather['temperature']} °C,湿度 {weather['humidity']} %"
        else:
            return f"抱歉,未找到 {city} 的天气信息"

    @tool
    async def get_city_list(self) -> list:
        """获取所有的城市信息。
        返回:
        str: 所有的城市信息列表
        """
        logging.info(f"获取所有的城市信息")
        city_list = []
        for city in self.CITY_WEATHER_DATA:
            city_list.append(city)
        return city_list

    @tool
    async def get_city_detail(self, city: str) -> str:
        """获取指定城市的信息。

        参数:
        city (str): 城市名称

        返回:
        str: 城市信息
        """
        logging.info(f"获取指定城市的信息: {city}")

        if city in await self.get_city_list():
            return f"{city} : 一个风景秀丽的城市,你值得去玩一把"
        else:
            return f"抱歉,未找到 {city} 的城市信息"



6-暴露Python城市MCPServer服务

city_02_mcp_server.py:MCP 服务器脚本

from mcp.server.fastmcp import FastMCP

from city_01_service import CityDataServer

# 初始化 MCP 服务器
mcp = FastMCP("CityDataServer")
# 初始化城市信息服务器
city_server = CityDataServer()


# 获取天气信息的工具
@mcp.tool()
async def get_city_weather(city: str) -> str:
    """获取指定城市的天气信息。

    参数:
    city (str): 城市名称

    返回:
    str: 天气信息描述
    """
    city_weather_info = await city_server.get_city_weather(city)
    return city_weather_info


@mcp.tool()
# 获取所有城市列表
async def get_city_list():
    """获取所有城市列表。
    返回:
    str: 所有城市列表
    """
    city_list = await city_server.get_city_list()
    return city_list


@mcp.tool()
# 获取指定城市的信息
async def get_city_detail(city: str):
    """获取指定城市的信息。

    参数:
    city (str): 城市名称

    返回:
    str: 指定城市的信息
    """
    city_info = await city_server.get_city_detail(city)
    return city_info


# 主程序
if __name__ == "__main__":
    mcp.run(transport='stdio')



7-MCP Inspector调试

1-安装MCP Inspector

运行机制:先运行【MCPInspector】再运行【uv run --with mcp mcp run city_02_mcp_server.py】

# 1-安装MCP Inspector
pip install mcp[cli]
2-运行MCP Inspector服务
# 2-运行MCP Inspector
mcp dev city_02_mcp_server.py
3-访问MCP Inspector网页

再运行【uv run --with mcp mcp run city_02_mcp_server.py】

  • http://127.0.0.1:6274

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

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

相关文章

Java设计模式-策略模式(行为型)

策略模式详解 一、策略模式概述 1.1 基本概念 策略模式是一种行为型设计模式,它主要用于处理算法的不同变体。其核心思想是将算法的定义与使用分离开来,把一系列具体的算法封装成独立的策略类,这些策略类实现相同的策略接口。客户端可以在…

html body 设置heigth 100%,body内元素设置margin-top出滚动条(margin 重叠问题)

今天在用移动端的时候发现个问题&#xff0c;html,body 设置 height&#xff1a;100% 会出现纵向滚动条 <!DOCTYPE html> <html> <head> <title>html5</title> <style> html, body {height: 100%; } * {margin: 0;padding: 0; } </sty…

C语言模糊不清的知识

1、malloc、calloc、realloc的区别和用法 malloc实在堆上申请一段连续指定大小的内存区域&#xff0c;并以void*进行返回&#xff0c;不会初始化内存。calloc与malloc作用一致&#xff0c;只是calloc会初始化内存&#xff0c;自动将内存清零。realloc用于重新分配之前通过mallo…

如何配置光猫+路由器实现外网IP访问内部网络?

文章目录 前言一、网络拓扑理解二、准备工作三、光猫配置3.1 光猫工作模式3.2 光猫端口转发配置&#xff08;路由模式时&#xff09; 四、路由器配置4.1 路由器WAN口配置4.2 端口转发配置4.3 动态DNS配置&#xff08;可选&#xff09; 五、防火墙设置六、测试配置七、安全注意事…

springboot3+vue3融合项目实战-大事件文章管理系统获取用户详细信息-ThreadLocal优化

一句话本质 为每个线程创建独立的变量副本&#xff0c;实现多线程环境下数据的安全隔离&#xff08;线程操作自己的副本&#xff0c;互不影响&#xff09;。 关键解读&#xff1a; 核心机制 • 同一个 ThreadLocal 对象&#xff08;如示意图中的红色区域 tl&#xff09;被多个线…

【高数上册笔记篇02】:数列与函数极限

【参考资料】 同济大学《高等数学》教材樊顺厚老师B站《高等数学精讲》系列课程 &#xff08;注&#xff1a;本笔记为个人数学复习资料&#xff0c;旨在通过系统化整理替代厚重教材&#xff0c;便于随时查阅与巩固知识要点&#xff09; 仅用于个人数学复习&#xff0c;因为课…

c++STL-string的模拟实现

cSTL-string的模拟实现 string的模拟实现string的模拟线性表的实现构造函数析构函数获取长度&#xff08;size&#xff09;和获取容量&#xff08;capacity&#xff09;访问 [] 和c_str迭代器&#xff08;iterator&#xff09;交换swap拷贝构造函数赋值重载&#xff08;&#x…

YashanDB(崖山数据库)V23.4 LTS 正式发布

2024年回顾 2024年11月我们受邀去深圳参与了2024国产数据库创新生态大会。在大会上崖山官方发布了23.3。这个也是和Oracle一样采用的事编年体命名。 那次大会官方希望我们这些在一直从事在一线的KOL帮助产品提一些改进建议。对于这样的想法&#xff0c;我们都是非常乐于合作…

python 写一个工作 简单 番茄钟

1、图 2、需求 番茄钟&#xff08;Pomodoro Technique&#xff09;是一种时间管理方法&#xff0c;由弗朗西斯科西里洛&#xff08;Francesco Cirillo&#xff09;在 20 世纪 80 年代创立。“Pomodoro”在意大利语中意为“番茄”&#xff0c;这个名字来源于西里洛最初使用的一个…

PyCharm 加载不了 conda 虚拟环境,不存在的

#工作记录 前言 在开发过程中&#xff0c;PyCharm 无法加载 Conda 虚拟环境是常见问题。 在不同情况下&#xff0c;“Conda 可执行文件路径”的指定可能会发生变化&#xff0c;不会一尘不变&#xff0c;需要灵活处置。 以下是一系列解决此问题的经验参考。 检查 Conda 安装…

设计模式学习整理

目录 UML类图 设计模式六大原则 1.单一职责原则 2.里氏替换原则 3.依赖倒置原则 4.接口隔离原则 5.迪米特法则(最少知道原则) 6.开(放封)闭原则 设计模式分类 1.创建型模式 2.结构型模式 4.行为型模式 一、工厂模式(factory——简单工厂模式和抽象工厂模式) 1.1、…

二分查找的理解

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h>int binary_search(int arr[], int k, int sz) {int left 0;int right sz - 1;//这个是下标&#xff0c;减一是因为在0开始的&#xff0c;怕越界&#xff08;访问无效&#xff09;while (left < right){int mid…

【Java】线程实例化 线程状态 线程属性

线程实例化 继承 Thread 类 创建类继承自 Thread 类 . class MyThread extends Thread重写 run() 方法 . Overridepublic void run(){// 线程要执行的任务代码}实例化自定义线程类 . 实现 Runnable 接口 创建类实现 Runnable 接口 . class MyRunnable implements Runnable实…

卫宁健康WiNGPT3.0与WiNEX Copilot 2.2:医疗AI创新的双轮驱动分析

引言:医疗AI的双翼时代 在医疗信息化的浪潮中,人工智能技术的深度融入正在重塑整个医疗行业。卫宁健康作为国内医疗健康和卫生领域数字化解决方案的领军企业,持续探索AI技术在医疗场景中的创新应用。2025年5月10日,在第29届中国医院信息网络大会(CHIMA2025)上,卫宁健康…

I2C通讯

3.1. 本章节的代码仓库 1 2 3 4 5 6 #如之前有获取则可跳过 #获取仓库 git clone https://gitee.com/LubanCat/lubancat_rk_code_storage.git#代码所在的位置 lubancat_rk_code_storage/quick_start/i2c3.2. i2c I2C(Inter&#xff0d;Integrated Circuit)是一种通用的总线协…

Excel实现单元格内容拼接

一、应用场景&#xff1a; 场景A&#xff1a;将多个单元格拼接&#xff0c;比如写测试用例时&#xff0c;将多个模块拼接&#xff0c;中间用“-”隔开 场景B&#xff1a;将某单元格内容插入另一单元格固定位置&#xff08;例如在B1中添加A1的内容&#xff09; 二、实际应用&a…

2025前端面试遇到的问题(vue+uniapp+js+css)

Vue相关面试题 vue2和vue3的区别 一、核心架构差异 特性Vue2Vue3响应式系统基于Object.defineProperty基于Proxy&#xff08;支持动态新增/删除属性&#xff09;代码组织方式Options API&#xff08;data/methods分块&#xff09;Composition API&#xff08;逻辑按功能聚合&am…

广东省省考备考(第八天5.11)—言语:逻辑填空(每日一练)

错题 解析 第一空&#xff0c;搭配“期盼”&#xff0c;且根据“生命&#xff0c;是来自上天的馈赠”&#xff0c;可知父母对孩子的出生是非常期盼的。A项“望穿秋水”&#xff0c;形容对远地亲友的殷切盼望&#xff0c;C项“望眼欲穿”&#xff0c;形容盼望殷切&#xff0c;均…

github+ Picgo+typora

github Picgotypora 本文将介绍如何使用Picgo在typora中实现上传服务 创建github仓库以及配置token 创建仓库 注意需要Initialize 添加README 配置为public 配置token github点击头像找到setting 选择Developer setting 配置token generate 选第一个第二个都行(我这里选第…

[网安工具] IP 信息收集工具 —— LBD · 使用手册

&#x1f31f;想了解其它网安工具&#xff1f;看看这个&#xff1a;[网安工具] 网络安全工具管理 —— 工具仓库 管理手册 lbd | Kali Linux ToolsVideolbd Usage ExampleTest to see if the target domain (example.com) is using a load balancer:rootkali:~# lbd example.c…