使用 Python 开发 MCP Server 及 Inspector 工具详解
使用 Python 开发 MCP Server 及 Inspector 工具详解
前言
模型上下文协议 (Model Context Protocol, MCP) 是一种新兴的协议,旨在让大型语言模型 (LLM) 更容易地与外部工具和服务集成。本文将介绍如何使用 Python 开发一个 MCP Server,并详细讲解如何使用 MCP Inspector 工具进行测试和调试。
什么是 MCP?
MCP 允许 LLM 通过定义明确的接口(资源、工具和提示)与外部世界进行交互。这使得 LLM 能够访问实时信息、执行复杂计算,以及与各种应用程序和服务集成。
MCP Server 架构
MCP Server 负责处理来自 LLM 的请求,执行相应的操作,并将结果返回给 LLM。一个 MCP Server 可以提供以下三种类型的能力:
- 资源 (Resources): 类似于文件,LLM 可以读取资源的内容,例如 API 响应或文件内容。
- 工具 (Tools): 类似于函数,LLM 可以调用工具来执行特定任务,例如获取天气预报或发送电子邮件。
- 提示 (Prompts): 预定义的模板,帮助用户完成特定任务。
使用 Python 开发 MCP Server
以下是一个使用 Python 开发简单天气服务器的示例,该示例基于官方教程:
1. 环境准备
- Python 3.10 或更高版本
- 安装
uv
和httpx
:
# MacOS/Linux
curl -LsSf https://astral.sh/uv/install.sh | sh# Windows
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
- 创建项目并设置虚拟环境:
# MacOS/Linux
uv init weather
cd weather
uv venv
source .venv/bin/activate# Windows
uv init weather
cd weather
uv venv
.venv\Scripts\activate
- 安装依赖:
uv add "mcp[cli]" httpx
- 创建服务器文件
weather.py
。
2. 代码实现 (weather.py)
from typing import Any
import httpx
from mcp.server.fastmcp import FastMCP# 初始化 FastMCP 服务器
mcp = FastMCP("weather")# 常量
NWS_API_BASE = "https://api.weather.gov"
USER_AGENT = "weather-app/1.0"async def make_nws_request(url: str) -> dict[str, Any] | None:"""向 NWS API 发起请求,并进行错误处理。"""headers = {"User-Agent": USER_AGENT,"Accept": "application/geo+json"}async with httpx.AsyncClient() as client:try:response = await client.get(url, headers=headers, timeout=30.0)response.raise_for_status()return response.json()except Exception:return Nonedef format_alert(feature: dict) -> str:"""将警报信息格式化为可读字符串。"""props = feature["properties"]return f"""
Event: {props.get('event', 'Unknown')}
Area: {props.get('areaDesc', 'Unknown')}
Severity: {props.get('severity', 'Unknown')}
Description: {props.get('description', 'No description available')}
Instructions: {props.get('instruction', 'No specific instructions provided')}
"""@mcp.tool()
async def get_alerts(state: str) -> str:"""获取美国州的天气警报。Args:state: 美国州的代码 (例如 CA, NY)"""url = f"{NWS_API_BASE}/alerts/active/area/{state}"data = await make_nws_request(url)if not data or "features" not in data:return "Unable to fetch alerts or no alerts found."if not data["features"]:return "No active alerts for this state."alerts = [format_alert(feature) for feature in data["features"]]return "\n---\n".join(alerts)@mcp.tool()
async def get_forecast(latitude: float, longitude: float) -> str:"""获取地点的天气预报。Args:latitude: 地点的纬度longitude: 地点的经度"""points_url = f"{NWS_API_BASE}/points/{latitude},{longitude}"points_data = await make_nws_request(points_url)if not points_data:return "Unable to fetch forecast data for this location."forecast_url = points_data["properties"]["forecast"]forecast_data = await make_nws_request(forecast_url)if not forecast_data:return "Unable to fetch detailed forecast."periods = forecast_data["properties"]["periods"]forecasts = []for period in periods[:5]:forecast = f"""
{period['name']}:
Temperature: {period['temperature']}°{period['temperatureUnit']}
Wind: {period['windSpeed']} {period['windDirection']}
Forecast: {period['detailedForecast']}
"""forecasts.append(forecast)return "\n---\n".join(forecasts)if __name__ == "__main__":# 初始化并运行服务器mcp.run(transport='stdio')
3. 运行服务器
uv run weather.py
MCP Inspector 工具详解
MCP Inspector 是一个交互式开发工具,用于测试和调试 MCP 服务器。
1. 安装和基本用法
Inspector 直接通过 npx
运行,无需安装:
npx @modelcontextprotocol/inspector <command>
npx @modelcontextprotocol/inspector <command> <arg1> <arg2>
2. 检查来自 NPM 或 PyPi 的服务器
# NPM 包
npx -y @modelcontextprotocol/inspector npx <package-name> <args>
# For example
npx -y @modelcontextprotocol/inspector npx server-postgres postgres://127.0.0.1/testdb# PyPi 包
npx @modelcontextprotocol/inspector uvx <package-name> <args>
# For example
npx @modelcontextprotocol/inspector uvx mcp-server-git --repository ~/code/mcp/servers.git
3. 检查本地开发的服务器
# TypeScript
npx @modelcontextprotocol/inspector node path/to/server/index.js args...# Python
npx @modelcontextprotocol/inspector \uv \--directory path/to/server \run \package-name \args...
4. Inspector 界面功能概览
- 服务器连接面板 (Server connection pane): 选择连接服务器的传输方式,并可自定义命令行参数和环境变量(对于本地服务器)。
- 资源标签 (Resources tab): 列出所有可用的资源,显示资源元数据(MIME 类型、描述),允许资源内容检查,支持订阅测试。
- 提示标签 (Prompts tab): 显示可用的提示模板,显示提示参数和描述,启用带有自定义参数的提示测试,预览生成的消息。
- 工具标签 (Tools tab): 列出可用的工具,显示工具模式和描述,启用带有自定义输入的工具测试,显示工具执行结果。
- 通知面板 (Notifications pane): 呈现服务器记录的所有日志,显示服务器收到的通知。
5. 最佳实践
- 开发流程:
- 启动 Inspector 并连接服务器。
- 验证基本连接和能力协商。
- 迭代测试:修改服务器代码,重建服务器,重新连接 Inspector,测试受影响的功能,监控消息,测试边缘情况(无效输入、缺失参数、并发操作)。
- 错误处理验证: 确保服务器能够正确处理错误输入和并发操作,并返回相应的错误响应。
总结
本文介绍了使用 Python 开发 MCP Server 的基本步骤,以及如何使用 MCP Inspector 工具进行测试和调试。通过使用 MCP,开发者可以更轻松地将 LLM 与外部工具和服务集成,从而扩展 LLM 的能力。希望本文能帮助您快速入门 MCP 开发。
参考资料
- 快速入门教程
相关文章:
使用 Python 开发 MCP Server 及 Inspector 工具详解
使用 Python 开发 MCP Server 及 Inspector 工具详解 前言 模型上下文协议 (Model Context Protocol, MCP) 是一种新兴的协议,旨在让大型语言模型 (LLM) 更容易地与外部工具和服务集成。本文将介绍如何使用 Python 开发一个 MCP Server,并详细讲解如何使…...
论坛系统测试报告
一、项目背景 为论坛系统项目设计并进行自动化测试。论坛系统由六个页面构成:用户登录页、用户注册页、个人中心页面、我的帖子页面、帖子编辑页、帖子列表页以及帖子详情页。 通过使用selenium工具来定位到web中的元素,对获取到的元素进行自动化测试等操…...
Android一个APP里面最少有几个线程
Android应用启动时,默认会创建一个进程,该进程中最少包含5个系统自动创建的线程,具体如下: Main线程(主线程/UI线程) 负责处理用户交互、UI更新等核心操作,所有与界面相关的逻辑必须在此线程执行。若在此线程执行耗时操作(如网络请求),会导致界面卡顿甚至触发ANR(应…...
DML 数据操纵语言学习笔记
一、DML 核心概念体系 1.1 语言定位与边界 DML(Data Manipulation Language)作为 SQL 三大核心语言之一,专注于数据行级操作,区别于 DDL(结构定义)和 DCL(权限控制)。其核心指令包…...
7-Zip 功能介绍
7-Zip 是一款开源、高效的文件压缩与解压缩工具,支持多种格式,以高压缩率和灵活性著称。以下是其核心功能: 多格式支持 压缩 / 解压:支持 7z(默认格式,压缩率极高)、ZIP、RAR、GZIP、BZIP2、TAR…...
《基于python游戏设计与实现》开题报告
个人主页:@大数据蟒行探索者 一、研究背景、目的及意义 (一)研究背景 游戏的普及与成功:随着智能手机的普及和网络技术的发展,手机游戏产业逐渐成熟,成为娱乐文化产业的重要组成部分。《开心消消乐》作为一款休闲类游戏,自上线以来凭借其简单易上手的玩法和丰富的…...
鸿蒙学习笔记(3)-像素单位、this指向问题、RelativeContainer布局、@Style装饰器和@Extend装饰器
一、像素单位 物理像素:用px表示。 逻辑像素:在布局的时候,底层针对物理像素和屏幕尺寸关系进行转化的中间层。 分辨率:代表在屏幕上到底布局了多少了像素点(发光点) 官方同时也提供了相关单位,在开发中…...
Selenium之简介
Selenium简介 首先,让我们看看官网是怎么定义的 Selenium是一个支持web浏览器自动化的一系列工具和库的综合项目,提供了扩展来模拟用户和浏览器的交互,用于扩展浏览器分配的分发服务器;用于W3C WebDriver规范的基础架构 其实&a…...
使用Ollama(自定义安装位置)与RagFlow构建本地知识库
目录 1. 为什么不直接使用网页版DeepSeek?2. 如何实现网页版DeepSeek不能实现的需求?3. 目标效果预览4. 为什么要使用RAG技术?RAG和模型微调的区别?5. 什么是Embedding?为什么需要“Embedding模型”?6. 本地部署全流程6.1 下载ollama,通过olama将DeepSeek模型…...
基于ssm的医院预约挂号系统
一、系统架构 前端:jsp | bootstrap | jquery | css | ajax 后端:spring | springmvc | mybatis 环境:jdk1.8 | mysql | maven | tomcat 二、代码及数据 三、功能介绍 01. 注册 02. 登录 03. 首页 04. 医院挂号 05. …...
如何通过less在vue2中达到切换皮肤的目的
先装less npm install less less-loader --save-dev 然后将该 loader 添加到 webpack 的配置中去,例如: webpack.config.js module.exports {module: {rules: [{test: /\.less$/i,use: [// compiles Less to CSSstyle-loader,css-loader,less-loade…...
DeepSeek概述
一、DeepSeek概述 1.1 DeepSeek是什么 DeepSeek是一家专注 通用人工智能(AGI,Artificial General Intelligence)的中国科技公司,主攻大数据研发与应用。DeepSeek-R1是其开源的推理模型,擅长处理复杂任务且可免费商用…...
生成模型速通(Diffusion,VAE,GAN)
基本概念 参考视频https://www.bilibili.com/video/BV1re4y1m7gb/?spm_id_from333.337.search-card.all.click&vd_sourcef04f16dd6fd058b8328c67a3e064abd5 生成模型其实是主要是依赖概率分布,对输入特征的概率密度函数建模 隐空间(latent space)…...
linux/android 如何获取当前系统启动时长
uptime 指令获取 trinket:/ # uptime12:03:31 up 3 min, 0 users, load average: 1.02, 0.68, 0.29...
Elasticsearch客户端工具初探--kibana
1 Kibana简介 Kibana是Elastic Stack(ELK)中的可视化工具,用于对Elasticsearch中存储的数据进行搜索、分析和可视化展示。它提供了直观的Web界面,支持日志分析、业务监控、数据探索等功能,广泛应用于运维监控、安全分析…...
深克隆和浅克隆(建造者模式,内含简版)
让我们来看一个例子: 设计一个客户类Customer,其中客户地址存储在地址类Address中,用浅克隆和深克隆分别实现Customer对象的复制并比较这两种克隆方式的异同。 代码实现 Customer类和Address类都是实现的Java 内置的 java.lang.Cloneable …...
吴恩达机器学习笔记复盘(十二)逻辑回归的梯度下降和拟合问题
梯度下降算法推导过程 一、逻辑回归模型基础 逻辑回归用于二分类问题,其假设函数为sigmoid函数: 其中,是模型参数向量,是特征向量。输出表示样本属于正类的概率。 二、损失函数 逻辑回归的损失函数采用 对数损失(交…...
OSPF五种报文分析(仅部分比较重要的)
OSPF五种报文分别是: hello报文,DBD数据库描述报文,LSR链路状态请求报文,LSU链路状态更新报文,LSACK链路状态确认包 以下是这五种报文的详细解读: 1. Hello报文 作用: 用于邻居的发现、建立和…...
Ubuntu 22.04 二进制安装单节点 MySQL
Ubuntu 22.04 二进制安装 MySQL LTS(长期支持版)完整教程 MySQL LTS 版本选择: 目前 MySQL 8.4.4 是长期支持(LTS)版本,持续更新并保持稳定。 下载版本: 你也可以在 MySQL 官方网站确认最新稳…...
python处理音频相关的库
1 音频信号采集与播放 pyaudio import sys import pyaudio import wave import timeCHUNK 1024 FORMAT pyaudio.paInt16 CHANNELS 1#仅支持单声道 RATE 16000 RECORD_SECONDS 3#更改录音时长#录音函数,生成wav文件 def record(file_name):try:os.close(file_…...
python+ffmpeg给音频添加背景音乐
说明: 我希望用python,将name.mp3这段录音文件,添加背景音乐,bg.mp3,然后生成新的文件 step1: 添加依赖 pip install pydubstep2:下载ffmpeg 1.打开windows powershell ,管理员运行 2.winget install ff…...
《TypeScript 面试八股:高频考点与核心知识点详解》
“你好啊!能把那天没唱的歌再唱给我听吗? ” 前言 因为主包还是主要学习js,ts浅浅的学习了一下,在简历中我也只会写了解,所以我写一些比较基础的八股,如果是想要更深入的八股的话还是建议找别人的。 Ts基…...
鸡生蛋还是蛋生鸡? 基于python的CCM因果关系计算
文章目录 前言一、安装二、代码1.全部代码2.结果展示总结前言 因果推断在科学研究中起着重要的作用,尤其是在复杂系统中,例如生态学、气候学、经济学等领域。在这些领域中,了解变量之间的因果关系可以帮助我们更好地理解系统的动态行为和相互作用。传统的相关性分析并不足以…...
PyBluez2 的详细介绍、安装指南、使用方法及配置说明
PyBluez2:Python 蓝牙开发的核心库 一、PyBluez2 简介 PyBluez2 是 Python 的开源蓝牙编程库,支持蓝牙 2.0、BLE(低功耗蓝牙)和传统蓝牙协议栈的开发。它提供了对蓝牙硬件适配器的底层控制,适用于设备发现、配对、数…...
鸿蒙HarmonyOS NEXT之无感监听
鸿蒙中存在一些无感监听,这些监听经过系统API封装使用很简单,但是对实际业务开发中有很重要,例如埋点业务、数据统计、行为上报、切面拦截等。 Navigation的页面切换 在鸿蒙中Navigation被用来作为路由栈进行页面跳转,如果你想知…...
质检LIMS系统在食品生产加工企业的应用 如何保证食品生产企业的安全
在食品生产加工领域,质量安全是贯穿全产业链的生命线。随着《食品安全法》对全过程追溯要求的深化,传统实验室管理模式已难以满足高效、精准的质量管控需求。质检实验室信息管理系统(LIMS)作为数字化升级的核心工具,正…...
linux中如何获取其他进程的退出状态
进程的退出状态至关重要,用wait系列函数,父进程可以捕捉到子进程的退出状态,若给定任意进程,其父进程已经确定,无法改变,自己如何获取到其退出状态呢。 可以用ptrace系统api attach到相应的进程,…...
【android】补充
3.3 常用布局 本节介绍常见的几种布局用法,包括在某个方向上顺序排列的线性布局,参照其他视图的位置相对排列的相对布局,像表格那样分行分列显示的网格布局,以及支持通过滑动操作拉出更多内容的滚动视图。 3.3.1 线性布局Linea…...
Unix Domain Socket、IPC、RPC与gRPC的深度解析与实战
Unix Domain Socket、IPC、RPC与gRPC的深度解析与实战 引言 在分布式系统和本地服务通信中,进程间通信(IPC)与远程过程调用(RPC)是核心能力。本文将深入剖析 Unix Domain Socket(UDS)、IPC、RP…...
从 MySQL 到时序数据库 TDengine:Zendure 如何实现高效储能数据管理?
小T导读:TDengine 助力广州疆海科技有限公司高效完成储能业务的数据分析任务,轻松应对海量功率、电能及输入输出数据的实时统计与分析,并以接近 1 : 20 的数据文件压缩率大幅降低存储成本。此外,taosX 强大的 transform 功能帮助用…...
华为OD机试A卷 - 积木最远距离(C++ Java JavaScript Python )
最新华为OD机试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 题目描述 小华和小薇一起通过玩积木游戏学习数学。 他们有很多积木,每个积木块上都有一个数字,积木块上的数字可能相同。 小华随机拿一些积木挨着排成一排,请小薇找到这排积木中数字相同且所处…...
Zerotier虚拟局域网在树莓派的应用和Syncthing配合Zerotier实现端到端文件同步
一、Zerotier的部署 1、官网注册账号 https://my.zerotier.com/i 2、选择linux系统,执行安装Zerotier curl -s https://install.zerotier.com | sudo bash3、将树莓派网络加入Zerotier zerotier-cli join DB62228FEDF6CE55DB62228FEDF6CE55 为你的Zerotier IP 需…...
C++设计模式-桥梁模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
一、桥梁模式基本介绍 桥梁模式(Bridge Pattern)是一种结构型设计模式,又叫桥接模式,其核心思想是将抽象部分与实现部分分离,使它们可以独立变化。这种模式通过组合代替继承,有效解决了多层继承导致的类爆…...
系统转换、系统维护、净室软件工程、构件软件工程(高软51)
系列文章目录 系统转换、系统维护、净室软件工程、构件软件工程 文章目录 系列文章目录前言一、系统转换二、系统维护三、净室软件工程四、基于构件的软件工程总结 前言 本节讲明遗留系统的系统转换、系统维护、净室软件工程、基于构件软件工程相关知识。 一、系统转换 就是讲…...
自然语言处理(13:RNN的实现)
系列文章目录 第一章 1:同义词词典和基于计数方法语料库预处理 第一章 2:基于计数方法的分布式表示和假设,共现矩阵,向量相似度 第一章 3:基于计数方法的改进以及总结 第二章 1:word2vec 第二章 2:word2vec和CBOW模型的初步实现 第二章 3:CBOW模型…...
Docker镜像迁移方案
Docker镜像迁移方案 文章目录 Docker镜像迁移方案一:背景二:操作方式三:异常原因参考: 一:背景 比如机器上已经有先有的容器,但是docker pull的时候是失败的二:操作方式 1、停止正在运行的容器…...
深度学习框架PyTorch——从入门到精通(10)PyTorch张量简介
这部分是 PyTorch介绍——YouTube系列的内容,每一节都对应一个youtube视频。(可能跟之前的有一定的重复) 创建张量随机张量和种子张量形状张量数据类型 使用PyTorch张量进行数学与逻辑运算简单介绍——张量广播关于张量更多的数学操作原地修改…...
Springboot 集成 Flowable 6.8.0
1. 创建 Spring Boot 项目 通过 Spring Initializr(https://start.spring.io/ )创建一个基础的 Spring Boot 项目,添加以下依赖: Spring WebSpring Data JPAMySQL DriverLombok(可选,用于简化代码&#x…...
Vue3 项目通过 docxtemplater 插件动态渲染 .docx 文档(带图片)预览,并导出
Vue3 项目通过 docxtemplater 插件动态渲染 .docx 文档(带图片)预览,并导出 预览安装插件示例代码项目目录结构截图实际效果截图 动态渲染 .docx 文档(带图片),预览、导出安装插件docx 模板文件内容完整代码…...
实验一、Linux环境下实现进度条小程序:深入解析核心实现与关键技术细节
目录 引言:为什么需要进度条?环境准备与项目结构分析原理剖析:从终端输出到动态刷新代码逐行解析(附完整代码) 4.1 头文件与宏定义4.2 进度条的动态构建逻辑4.3 关键转义字符:\r与\n的深度对比4.4 缓冲机制…...
生活电子常识——cmd不能使用anaconda的python环境,导致输入python打开应用商店
前言 电脑已经安装了anaconda,从自带的Anaconda Prompt (Anaconda3)中是可以识别python环境的,然而切换到cmd时,突然发现cmd中无法识别anaconda的python环境,竟然打开了应用商店让我安装Python,这当然是不对的。 解决 这是因为…...
TypeScript中的声明合并:与JavaScript的对比与实践指南
引言 在大型项目开发中,代码的可维护性和可扩展性至关重要。TypeScript作为JavaScript的超集,通过静态类型系统带来了更强大的代码组织能力。其中声明合并(Declaration Merging) 是TypeScript独有的重要特性,本文将深…...
数据结构初阶-二叉树链式
目录 1.概念与结构 2.二叉数链式的实现 2.1遍历规则 2.2申请内存空间 2.3手动构建一棵二叉树 2.4二叉树结点的个数 2.5二叉树叶子结点的个数 2.6二叉树第K层结点个数 2.7二叉树的高度 2.8二叉树中查找值为x的结点 2.9二叉树的销毁 3.层序遍历 3.1概念 3.2层序遍历…...
2024年认证杯SPSSPRO杯数学建模B题(第二阶段)神经外科手术的定位与导航全过程文档及程序
2024年认证杯SPSSPRO杯数学建模 B题 神经外科手术的定位与导航 原题再现: 人的大脑结构非常复杂,内部交织密布着神经和血管,所以在大脑内做手术具有非常高的精细和复杂程度。例如神经外科的肿瘤切除手术或血肿清除手术,通常需要…...
Linux程序性能分析
为什么程序会慢? 在深入工具和方法之前,我们先来聊聊为什么程序会慢。一个程序主要在三个方面消耗资源: CPU时间 - 计算太多、算法效率低 内存使用 - 内存泄漏、频繁申请释放内存 I/O操作 - 文件读写、网络通信太频繁 今天我们主要聚焦C…...
【开题报告+论文+源码】基于SpringBoot的智能安全与急救知识科普系统设计与实现
项目背景与意义 在全球范围内,安全与急救知识的普及已成为提升公众安全素养、减少意外伤害发生率、提高突发事件应对能力的重要举措。尤其是在当今社会,人们面临的生活、工作环境日益复杂,交通事故、火灾、溺水、突发疾病等各种意外事件的发生…...
Linux shift 命令使用详解
简介 在 Bash 脚本中,shift 命令用于将命令行参数向左移动,有效地丢弃第一个参数并将其他参数向下移动。 基础语法 shift [N]N(可选)→ 要移动的位置数。默认值为 1 示例用法 移动参数 #!/bin/bash echo "Before shift…...
【C++网络编程】第5篇:UDP与广播通信
一、UDP协议核心特性 1. UDP vs TCP 特性 UDPTCP连接方式无连接面向连接(三次握手)可靠性不保证数据到达或顺序可靠传输(超时重传、顺序控制)传输效率低延迟,高吞吐相对较低(因握手和确认机制&…...
C++11QT复习 (五)
文章目录 **Day6-2 成员访问运算符重载(2025.03.25)****1. 复习****2. 成员访问运算符重载****2.1 箭头运算符 (->) 重载****(1) 语法** **2.2 解引用运算符 (*) 重载****(1) 语法** **3. 代码分析****3.1 代码结构****3.2 代码解析****(1) Data 类**…...
Python项目-基于Python的网络爬虫与数据可视化系统
1. 项目简介 在当今数据驱动的时代,网络爬虫和数据可视化已成为获取、分析和展示信息的重要工具。本文将详细介绍如何使用Python构建一个完整的网络爬虫与数据可视化系统,该系统能够自动从互联网收集数据,进行处理分析,并通过直观…...