原因
之所以想体验 自定义 mcp server, 是因为项目里产生的log 很多,想有一个不要让我看log 的办法,最好直接给我对比结果,如果让AI 直接读取后分析的话,那么消耗 的token 可能都不够看一份log 的。
然后使用 claude code 写一个一个node js 版和python 版的,在claude code desktop 里都可以成功看到且应用。但是我想claude code desktop 消耗token 也很多,而且有使用限制,所以能否有一个更通用的版本呢,使用腾讯的 codebuddy 测试,可以成功。
步骤
- 在vscode 中下载 codebuddy 插件

- 登陆自己的账号, 就能看到下面的界面, 然后点击 mcp

- 点击已安装

- 点击配置mcp server, 会打开 settings.json 文件, 加入下面的内容, 看到左侧 成功显示

- 进入对话, 输入问题, 结果如下

Weather Demo MCP Server - 快速开始指南
📦 已创建的文件
weather-demo/
├── weather.py # MCP 服务器主程序(基于官方示例)
├── pyproject.toml # 项目配置
pyproject.toml 内容
[project]
name = "weather-demo"
version = "1.0.0"
description = "Simple weather MCP server based on official tutorial"
requires-python = ">=3.10"
dependencies = [
"mcp[cli]>=1.2.0",
"httpx>=0.27.0",
]
[project.scripts]
weather-demo = "weather:main"
weather.py 内容
#!/usr/bin/env python3
"""
简单的天气 MCP 服务器
基于官方文档示例: https://modelcontextprotocol.io/docs/develop/build-server
"""
from typing import Any
import asyncio
import httpx
from mcp.server.fastmcp import FastMCP
# 创建 MCP 服务器实例
mcp = FastMCP("weather-demo")
# NWS API 基础 URL
NWS_API_BASE = "https://api.weather.gov"
USER_AGENT = "weather-demo-mcp-server/1.0"
async def make_nws_request(url: str) -> dict[str, Any] | None:
"""
向 NWS API 发送请求
Args:
url: API 端点 URL
Returns:
JSON 响应数据或 None(如果请求失败)
"""
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 httpx.HTTPError as e:
return {
"error": f"请求失败: {str(e)}",
"url": url
}
except Exception as e:
return {
"error": f"未知错误: {str(e)}",
"url": url
}
@mcp.tool()
async def get_alerts(state: str) -> str:
"""
获取美国某州的天气预警信息
Args:
state: 美国州的两字母缩写(例如: CA, NY, TX)
Returns:
预警信息的格式化字符串
"""
url = f"{NWS_API_BASE}/alerts?area={state.upper()}"
data = await make_nws_request(url)
if not data:
return f"无法获取 {state} 的预警信息"
if "error" in data:
return f"错误: {data['error']}"
features = data.get("features", [])
if not features:
return f"{state.upper()} 州当前没有活动预警"
# 格式化预警信息
alerts = []
for idx, feature in enumerate(features[:5], 1): # 只显示前5条
props = feature.get("properties", {})
event = props.get("event", "未知事件")
headline = props.get("headline", "无标题")
severity = props.get("severity", "未知")
alerts.append(f"{idx}. {event} (严重程度: {severity})\n {headline}")
result = f"{state.upper()} 州的天气预警 (共 {len(features)} 条):\n\n"
result += "\n\n".join(alerts)
if len(features) > 5:
result += f"\n\n... 还有 {len(features) - 5} 条预警未显示"
return result
@mcp.tool()
async def get_forecast(latitude: float, longitude: float) -> str:
"""
获取指定坐标的天气预报
Args:
latitude: 纬度(例如: 39.7456)
longitude: 经度(例如: -97.0892)
Returns:
天气预报的格式化字符串
"""
# 第一步:获取预报网格端点
point_url = f"{NWS_API_BASE}/points/{latitude},{longitude}"
point_data = await make_nws_request(point_url)
if not point_data:
return f"无法获取坐标 ({latitude}, {longitude}) 的信息"
if "error" in point_data:
return f"错误: {point_data['error']}"
# 第二步:从网格端点获取预报 URL
properties = point_data.get("properties", {})
forecast_url = properties.get("forecast")
if not forecast_url:
return "无法获取预报 URL"
# 第三步:获取实际预报数据
forecast_data = await make_nws_request(forecast_url)
if not forecast_data:
return "无法获取预报数据"
if "error" in forecast_data:
return f"错误: {forecast_data['error']}"
# 格式化预报信息
periods = forecast_data.get("properties", {}).get("periods", [])
if not periods:
return "没有可用的预报数据"
forecasts = []
for period in periods[:5]: # 只显示前5个时段
name = period.get("name", "未知时段")
temp = period.get("temperature", "N/A")
temp_unit = period.get("temperatureUnit", "F")
wind = period.get("windSpeed", "N/A")
forecast = period.get("shortForecast", "无预报")
forecasts.append(
f"{name}:\n"
f" 温度: {temp}°{temp_unit}\n"
f" 风速: {wind}\n"
f" 天气: {forecast}"
)
result = f"坐标 ({latitude}, {longitude}) 的天气预报:\n\n"
result += "\n\n".join(forecasts)
return result
@mcp.resource("weather://alerts/{state}")
def get_alerts_resource(state: str) -> str:
"""
资源: 获取某州的天气预警(同步版本)
Args:
state: 美国州的两字母缩写
Returns:
预警信息
"""
# 注意:资源处理器需要同步,这里我们返回一个提示
return f"使用 get_alerts 工具获取 {state.upper()} 的实时预警信息"
@mcp.prompt()
def weather_prompt(location: str = "California") -> str:
"""
提示模板: 查询天气信息
Args:
location: 位置名称(默认: California)
Returns:
格式化的提示文本
"""
return f"请使用天气工具查询 {location} 的天气预警和预报信息。"
def main():
"""启动 MCP 服务器"""
# 使用 stdio 传输方式
mcp.run(transport='stdio')
if __name__ == "__main__":
main()
codebuddy的 settings.json 文件内容:
{
"mcpServers": {
"weather-demo": {
"command": "C:\\uv-x86_64-pc-windows-msvc\\uv.exe",
"args": [
"--directory",
"i:\\mcp-tools\\weather-demo",
"run",
"weather.py"
],
"disabled": false
}
}
}
安装依赖的步骤:
# 创建虚拟环境
uv venv
# 进入虚拟环境
.venv\Scripts\activate.bat
# 安装依赖
uv add "mcp[cli]" httpx
成功安装的界面:

推荐使用 uv, uv安装教程
我是直接从 github下载地址 下载的下面的版本后解压的,解压后加到环境变量里

Weather Demo - Claude 对话示例
示例 1:查询天气预警
用户:
查询德克萨斯州的天气预警
Claude 响应:
我会使用 get_alerts 工具查询德克萨斯州的天气预警。
[调用工具: get_alerts(state="TX")]
德克萨斯州当前的天气预警:
1. 洪水预警 (严重程度: Severe)
Houston地区洪水预警,预计持续到明天早上
2. 雷暴预警 (严重程度: Moderate)
达拉斯地区有强雷暴活动
... (更多预警信息)
示例 2:获取天气预报
用户:
帮我查一下旧金山的天气预报,坐标是 37.7749, -122.4194
Claude 响应:
我会使用 get_forecast 工具查询旧金山的天气预报。
[调用工具: get_forecast(latitude=37.7749, longitude=-122.4194)]
旧金山 (37.7749, -122.4194) 的天气预报:
今晚:
温度: 55°F
风速: 10 mph
天气: 多云
明天:
温度: 68°F
风速: 5 mph
天气: 晴朗
明天晚上:
温度: 52°F
风速: 8 mph
天气: 部分多云
... (更多预报信息)
示例 3:多次查询
用户:
比较一下加州和纽约的天气情况
Claude 响应:
我会分别查询加州和纽约的天气信息。
首先查询加州的预警:
[调用工具: get_alerts(state="CA")]
加州预警:目前没有活动预警
然后查询纽约的预警:
[调用工具: get_alerts(state="NY")]
纽约预警:
1. 寒潮预警 (严重程度: Moderate)
纽约市及周边地区将出现低温天气
对比总结:
- 加州:天气平稳,无预警
- 纽约:有寒潮预警,需注意保暖
示例 4:查看可用工具
用户:
你有哪些天气相关的工具?
Claude 响应:
我有以下天气相关的工具:
1. get_alerts - 获取美国某州的天气预警
参数:state (州的两字母缩写)
2. get_forecast - 获取指定坐标的天气预报
参数:latitude (纬度), longitude (经度)
这些工具使用美国国家气象局(NWS)的 API,提供实时的天气数据。
示例 5:错误处理
用户:
查询中国北京的天气
Claude 响应:
很抱歉,当前的天气工具仅支持美国地区的查询,因为它使用的是美国国家气象局(NWS)的 API。
对于北京的天气,你可以:
1. 使用其他天气服务(如 OpenWeatherMap)
2. 我可以帮你创建一个支持国际城市的新 MCP 工具
需要我帮你创建一个支持全球天气查询的工具吗?
示例 6:提示模板
用户:
使用天气提示查询佛罗里达
Claude 响应:
[使用 weather_prompt 提示模板]
好的,让我查询佛罗里达的天气信息。
[调用工具: get_alerts(state="FL")]
佛罗里达州的天气预警:
1. 飓风预警 (严重程度: Severe)
南佛罗里达沿海地区飓风警告
2. 雷暴预警 (严重程度: Moderate)
奥兰多地区雷暴活动
请注意安全,特别是沿海地区的飓风预警!
工具调用的技术细节
get_alerts 工具调用
{
"tool": "get_alerts",
"arguments": {
"state": "CA"
}
}
get_forecast 工具调用
{
"tool": "get_forecast",
"arguments": {
"latitude": 40.7128,
"longitude": -74.0060
}
}
常见查询模式
-
直接查询:
- “查询加州天气预警”
- “纽约的天气预报”
-
带坐标查询:
- “查询 (40.7, -74.0) 的天气”
- “这个位置 37.7749, -122.4194 的天气如何”
-
对比查询:
- “比较加州和德州的天气”
- “哪个州天气更好,加州还是佛州”
-
探索性查询:
- “你能查天气吗?”
- “有什么天气工具?”
提示
- Claude 会自动识别州名和缩写(California → CA)
- 可以提供城市名,Claude 会推断坐标
- 支持中文和英文查询
- 工具调用需要用户批准(在 Claude Desktop 中)
653

被折叠的 条评论
为什么被折叠?



