claude code(五):【Claude Code官方最佳实践3️⃣】:mcp实战-写一个mcp,并在claude使用
本文介绍了如何开发一个基于高德地图API的天气查询MCP工具。首先需要注册高德开发者账号并获取API Key,然后编写Python服务端代码实现天气查询功能。文章详细说明了配置MCP服务器的步骤,包括创建.mcp.json配置文件,并解决了启动时遇到的JSON格式错误问题。最后展示了如何在Claude Code中调用该工具查询天气信息。开发过程中需要注意避免输出非JSON格式内容,确保MCP协议正
一、编写mcp工具并提供出来
1.1 第一步:获取高德地图 API 密钥 (Key)
- 访问高德开放平台官网,注册一个开发者账号。
- 进入控制台,点击“应用管理” -> “我的应用” -> “创建新应用”。
- 创建好应用后,点击“添加 Key”,服务平台选择 Web服务。
- 复制生成的那串 Key(一串字母和数字的组合),待会儿代码里要用。
1.2 第二步:编写天气 MCP 服务端代码
在你的电脑上创建一个文件夹(比如叫 weather-mcp),在里面新建一个 weather.py 文件,把下面的代码复制进去,记得把 你的_高德_API_KEY 替换成你刚才申请的真实 Key:
import os
import httpx
from mcp.server.fastmcp import FastMCP
# 替换为你自己的高德地图 API Key
AMAP_KEY = "你的_高德_API_KEY"
mcp = FastMCP("AmapWeather")
@mcp.tool()
async def get_weather(city: str) -> str:
"""
查询指定城市的实时天气情况
Args:
city: 城市名称(例如:宁波、北京)或城市编码(adcode)
"""
# 高德天气API接口
url = "https://restapi.amap.com/v3/weather/weatherInfo"
params = {
"key": AMAP_KEY,
"city": city,
"extensions": "base" # base返回实况天气,all返回预报天气
}
async with httpx.AsyncClient() as client:
resp = await client.get(url, params=params)
data = resp.json()
if data.get("status") == "1" and data.get("lives"):
live = data["lives"][0]
return (
f"📍 城市:{live['province']}{live['city']}\n"
f"🌤️ 天气:{live['weather']}\n"
f"🌡️ 温度:{live['temperature']}°C\n"
f"💨 风向:{live['winddirection']}风 {live['windpower']}级\n"
f"💧 湿度:{live['humidity']}%\n"
f"🕒 发布时间:{live['reporttime']}"
)
else:
return f"❌ 查询失败:{data.get('info', '未知错误,请检查城市名或API Key')}"
if __name__ == "__main__":
mcp.run()
注:运行前请确保你安装了必要的依赖库,可以在终端执行:pip install mcp httpx
1.3 第三步:将天气服务接入 Claude Code
代码写好后,打开你的 Claude Code 终端,直接对它说下面这句话(把路径换成你 weather.py 所在的真实绝对路径):
“帮我添加一个本地 MCP 服务器,名字叫 weather,执行命令是 python 你的文件夹绝对路径/weather.py。”
Claude Code 会自动帮你修改配置文件。配置完成后,重启一下 Claude Code 或者重新开启一个对话,就可以开始验收成果了!
你可以直接问它:
- “宁波现在的天气怎么样?”
- “北京今天冷不冷?”
二、执行步骤
-
启动vscode,mcp程序;
-
在weather_gd路径创建.mcp.json文件,并设置mcpServiers:

-
你的claude目录,新增.mcp.json文件(这一步我不知道是不是必须的,等我下次验证后,再来改):

-
重启claude,并询问当前mcp工具:

-
在claude code里问:

我的疑问,为啥我vscode控制台没有打印日志:
三、问题与解决
3.1 python环境问题
3.2 安装pip3 install httpx "fastmcp[all]" 出错问题解决
执行下面命令:
pip3 install httpx "fastmcp[all]"


3.2.1 报错原因:
这个报错是 Python 3.11+ 版本引入的一种保护机制(PEP 668)。它的意思是:“这是一个由外部(Homebrew)管理的 Python 环境,为了防止把你的 Python 环境搞乱,我不允许你直接用 pip 往里面强行安装包。”
既然你是在做开发(写 .py 文件),最标准、最推荐的做法是使用“虚拟环境”。
3.2.2 解决方法
请在终端中依次运行以下三行命令:
- 创建虚拟环境
在你的项目文件夹(weather_gd)里创建一个独立的“小环境”
python3 -m venv .venv
- 激活虚拟环境
告诉终端“我现在要用这个小环境”:
source .venv/bin/activate
行完这一步后,你会看到终端提示符前面多了一个 (.venv),说明激活成功了。
- 再次安装库
现在你可以随意安装库了,不会再报错:
pip install httpx "fastmcp[all]"
3.2.3 后续开发注意事项
- 每次打开终端都要激活
以后每次你关闭终端再重新打开,或者重启电脑后,如果要继续写代码,都需要先运行第 2 步的激活命令:
source .venv/bin/activate
- VS Code 设置(如果你用 VS Code)
- 按下
Cmd + Shift + P打开命令面板。 - 输入
Python: Select Interpreter并回车。 - 选择那个带有
.venv字样的解释器。 - 这样
VS Code就能识别你安装的库,代码里的红线也会消失。
3.2.3 为什么不推荐其他方法?
- 不推荐 --break-system-packages:虽然加上这个参数能强行安装,但这会污染你的 Python 全局环境,可能导致 Homebrew 管理的其他 Python 工具出问题。
- 不推荐 --user:这会把包安装到用户目录下,虽然不报错,但不利于项目管理和环境隔离。
3.2 执行【1.2】的python脚步出现错误

看报错信息 Invalid JSON: expected value at line 1 column 2 和 input_value='source ...',原因非常明确:MCP 服务器把虚拟环境的激活命令输出了,导致 Claude 读到了非 JSON 格式的乱码。
MCP 的 stdio 模式要求服务端 只能 输出标准的 JSON 通信数据,任何 print、source 命令的输出或日志都会破坏协议。
解决方法
请按照以下步骤修改你的配置或启动方式:
- 新增.mcp.json配置文件,文件内容如下:
{
"mcpServers": {
"weather": {
"command": "/Users/qian/Document_Management/Test_Space/weather_gd/.venv/bin/python",
"args": [
"/Users/qian/Document_Management/Test_Space/weather_gd/weather.py"
]
}
}
}

- 启动vscode,mcp程序
重启成功。
更多推荐

所有评论(0)