自定义本地mcp server,使用 CodeBuddy 呼叫 mcp

该文章已生成可运行项目,

原因

之所以想体验 自定义 mcp server, 是因为项目里产生的log 很多,想有一个不要让我看log 的办法,最好直接给我对比结果,如果让AI 直接读取后分析的话,那么消耗 的token 可能都不够看一份log 的。

然后使用 claude code 写一个一个node js 版和python 版的,在claude code desktop 里都可以成功看到且应用。但是我想claude code desktop 消耗token 也很多,而且有使用限制,所以能否有一个更通用的版本呢,使用腾讯的 codebuddy 测试,可以成功。

步骤

  1. 在vscode 中下载 codebuddy 插件
    在这里插入图片描述
  2. 登陆自己的账号, 就能看到下面的界面, 然后点击 mcp
    在这里插入图片描述
  3. 点击已安装
    在这里插入图片描述
  4. 点击配置mcp server, 会打开 settings.json 文件, 加入下面的内容, 看到左侧 成功显示
    在这里插入图片描述
  5. 进入对话, 输入问题, 结果如下
    在这里插入图片描述

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
  }
}

常见查询模式

  1. 直接查询

    • “查询加州天气预警”
    • “纽约的天气预报”
  2. 带坐标查询

    • “查询 (40.7, -74.0) 的天气”
    • “这个位置 37.7749, -122.4194 的天气如何”
  3. 对比查询

    • “比较加州和德州的天气”
    • “哪个州天气更好,加州还是佛州”
  4. 探索性查询

    • “你能查天气吗?”
    • “有什么天气工具?”

提示

  • Claude 会自动识别州名和缩写(California → CA)
  • 可以提供城市名,Claude 会推断坐标
  • 支持中文和英文查询
  • 工具调用需要用户批准(在 Claude Desktop 中)
本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值