MCP快速入门—快速构建自己的服务器
引言
随着大语言模型(LLM)技术的快速发展,如何扩展其能力边界成为开发者关注的重点。MCP(Model Capability Protocol)作为一种协议标准,允许开发者构建自定义服务器来增强LLM的功能。
正文内容
1. MCP核心概念与技术背景
MCP服务器主要提供三种能力类型:
- 资源(Resources):客户端可读取的类似文件的数据(如API响应或文件内容)
- 工具(Tools):经用户批准后LLM可调用的函数
- 提示(Prompts):帮助用户完成特定任务的预编写模板
本教程将重点介绍工具类型的实现,通过构建两个实用工具(get-alerts和get-forecast)来扩展Claude的功能,使其能够获取天气预报和恶劣天气警报。
2. 环境准备与项目初始化
2.1 系统要求
- Python 3.10或更高版本
- Python MCP SDK 1.2.0或更高版本
2.2 安装uv并创建项目
# 安装uv包管理器
curl -LsSf https://astral.sh/uv/install.sh | sh
# 创建项目目录
uv init weather
cd weather
# 创建并激活虚拟环境
uv venv
source .venv/bin/activate
# 安装依赖
uv add "mcp[cli]" httpx
# 创建服务器文件
touch weather.py
3. 构建天气服务器
3.1 初始化FastMCP实例
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"
```
FastMCP类利用Python类型提示和文档字符串自动生成工具定义,简化了MCP工具的创建和维护过程。
3.2 实现辅助函数
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 None
def 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')}
"""
3.3 实现工具功能
@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 "无法获取警报或未发现警报"
if not data["features"]:
return "该州无活跃警报"
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 "无法获取该位置的预测数据"
# 从points响应中获取预测URL
forecast_url = points_data["properties"]["forecast"]
forecast_data = await make_nws_request(forecast_url)
if not forecast_data:
return "无法获取详细预测"
# 将时间段格式化为可读预测
periods = forecast_data["properties"]["periods"]
forecasts = []
for period in periods[:5]: # 仅显示接下来5个时段
forecast = f"""
{period['name']}:
温度: {period['temperature']}°{period['temperatureUnit']}
风速: {period['windSpeed']} {period['windDirection']}
预测: {period['detailedForecast']}
"""
forecasts.append(forecast)
return "\n---\n".join(forecasts)
3.4 运行服务器
if __name__ == "__main__":
# 初始化并运行服务器
mcp.run(transport='stdio')
4. 连接Claude for Desktop进行测试
4.1 配置客户端
{
"mcpServers": {
"weather": {
"command": "uv",
"args": [
"--directory",
"/ABSOLUTE/PATH/TO/PARENT/FOLDER/weather",
"run",
"weather.py"
]
}
}
}
4.2 测试命令
- "萨克拉门托的天气怎么样?"
- "德克萨斯州有哪些活跃的天气警报?"

5. 技术实现原理
当用户提问时,系统会经历以下流程:
- 客户端将问题发送给Claude
- Claude分析可用工具并决定使用哪些
- 客户端通过MCP服务器执行选定工具
- 结果返回给Claude
- Claude生成自然语言响应
- 向用户显示响应
结论
本文详细介绍了如何使用Python和MCP SDK快速构建一个功能完整的天气服务器。通过实现get-alerts和get-forecast两个工具,我们成功扩展了Claude的能力,使其能够查询实时天气信息。这种模式可以推广到其他领域,为LLM添加各种实用功能。MCP协议的灵活性和Python SDK的易用性使得开发者可以快速构建和集成自定义功能,极大地丰富了LLM的应用场景。
MCP快速入门—快速构建自己的服务器的更多相关文章
- Asp.net mvc4 快速入门之构建表单
1.asp.net mvc4 Index.cshtml页面上构建表单form的方式 @{ ViewBag.Title = "Index"; Layout = "~/Vi ...
- 第四章 istio快速入门(快速安装)
4.1 环境介绍 K8s 1.9 以上版本. 4.2 快速部署Istio 下载: https://github.com/istio/istio/releases/, 下载 1.1.0-snapsh ...
- 使用ASP.NET 构建 Web 应用程序快速入门-8小时的免费培训视频
- Scott Hanselman的中文博客[转载] [原文发表地址] Building Web Apps with ASP.NET Jump Start - 8 Hours of FREE Trai ...
- Spring Boot 2.x 快速入门(上)HelloWorld示例
本文重点 最近决定重新实践下Spring Boot的知识体系,因为在项目中遇到的总是根据业务需求走的知识点,并不能覆盖Spring Boot完整的知识体系,甚至没有一个完整的实践去实践某个知识点.最好 ...
- Gradle 1.12 翻译——第九章 Groovy快速入门
由于时间关系,没办法同时做笔记和翻译,关于Gradle的用户指南,本博客不再做相关笔记,而只对未翻译章节进行翻译并在此发表. 有关其他已翻译的章节请关注Github上的项目:https://githu ...
- python 全栈开发,Day88(csrf_exempt,ES6 快速入门,Vue)
BBS项目内容回顾 1. 登陆页面 1. 验证码 1. PIL(Pillow) 2. io 2. ORM 1. 增删改查 3. AJAX $.ajax({ url: '', type: '', dat ...
- SpringBoot介绍,快速入门小例子,目录结构,不同的启动方式,SpringBoot常用注解
SpringBoot介绍 引言 为了使用ssm框架去开发,准备ssm框架的模板配置 为了Spring整合第三方框架,单独的去编写xml文件 导致ssm项目后期xml文件特别多,维护xml文件的成本也是 ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(26)|实战3:Http服务器(多线程版本)]
[易学易懂系列|rustlang语言|零基础|快速入门|(26)|实战3:Http服务器(多线程版本)] 项目实战 实战3:Http服务器 我们今天来进一步开发我们的Http服务器,用多线程实现. 我 ...
- 快速入门系列--WebAPI--03框架你值得拥有
接下来进入的是俺在ASP.NET学习中最重要的WebAPI部分,在现在流行的互联网场景下,WebAPI可以和HTML5.单页应用程序SPA等技术和理念很好的结合在一起.所谓ASP.NET WebAPI ...
- 快速入门系列--MVC--01概述
虽然使用MVC已经不少年,相关技术的学习进行了多次,但是很多技术思路的理解其实都不够深入.其实就在MVC框架中有很多设计模式和设计思路的体现,例如DependencyResolver类就包含我们常见的 ...
随机推荐
- 经典常用SQL查询语句和常见问题
一.基础 1.常用sql: ------------------------ // mysql改root密码 mysqladmin -u用户名 -p旧密码 password 新密码 # ---more ...
- 一文速通Python并行计算:09 Python多进程编程-进程之间的数据同步-基于互斥锁、递归锁、信号量、条件变量、事件和屏障
一文速通 Python 并行计算:09 Python 多进程编程-进程之间的数据同步-基于互斥锁.递归锁.信号量.条件变量.事件和屏障 摘要: 多进程同步机制包括互斥锁.递归锁.信号量.条件变量.事件 ...
- 精选 14 款 .NET 开源、功能强大的快速开发框架,提高开发生产效率、避免工作996!
前言 最近发现DotNetGuide技术社区微信交流群有不少小伙伴在问:.NET有哪些不错的快速开发框架推荐的? 选择一款全面且功能强大的快速开发框架能够帮助我们解决C#..NET项目中的很多重复工作 ...
- 【记录】Word 2021|编号缩进调整
版本: Word 2021 专业版 Word编号缩进调整 有时候会觉得word列表的悬挂缩进太大或太小了. 第一步:右键编号的数字-调整列表缩进. 第二步:编辑格式-编号. 第三步:点击更多,选择编号 ...
- Nacos源码—7.Nacos升级gRPC分析二
大纲 5.服务变动时如何通知订阅的客户端 6.微服务实例信息如何同步集群节点 5.服务变动时如何通知订阅的客户端 (1)服务注册和服务订阅时发布的客户端注册和订阅事件的处理 (2)延迟任务的执行引擎源 ...
- HeapSter部署
pod资源需求,资源限制 Requests:需求,最低保障: Limits: 限制,硬限制: Limits >= request CPU: 1颗虚拟CPU=1000 毫核心 millicores ...
- k8s之serviceaccount,登录账号创建
kubectl --> 认证 --->授权 -->准入控制 认证:证书 身份识别 授权:rbac 权限检查 准入控制: 补充授权机制 多个插件实现 只在创建 删除 修改 或做代 ...
- Grid 布局-子项补充及常用布局
上篇我们介绍了 Grid 布局容器项的内容, 看上去属性很多, 其实并没有, 记住关键的概念和简写就行啦. 因为是二维的, 这个属性的数量就比 flex 要多很多哦, 但其实真正也没有常用那没多啦. ...
- Disruptor—3.核心源码实现分析
大纲 1.Disruptor的生产者源码分析 2.Disruptor的消费者源码分析 3.Disruptor的WaitStrategy等待策略分析 4.Disruptor的高性能原因 5.Disrup ...
- MySQL 把查询结果更新或者插入到新表
摘要:在MySQL数据库,把查询到的多条记录复制到另一张表中.复制通常包括两种场景,一种是使用update命令更新旧数据,另一种是使用insert命令插入新记录. 需求背景:在某些业务中,需要把查询到 ...