引言

随着大语言模型(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. 技术实现原理

当用户提问时,系统会经历以下流程:

  1. 客户端将问题发送给Claude
  2. Claude分析可用工具并决定使用哪些
  3. 客户端通过MCP服务器执行选定工具
  4. 结果返回给Claude
  5. Claude生成自然语言响应
  6. 向用户显示响应

结论

本文详细介绍了如何使用Python和MCP SDK快速构建一个功能完整的天气服务器。通过实现get-alerts和get-forecast两个工具,我们成功扩展了Claude的能力,使其能够查询实时天气信息。这种模式可以推广到其他领域,为LLM添加各种实用功能。MCP协议的灵活性和Python SDK的易用性使得开发者可以快速构建和集成自定义功能,极大地丰富了LLM的应用场景。

MCP 核心架构解析

MCP快速入门—快速构建自己的服务器的更多相关文章

  1. Asp.net mvc4 快速入门之构建表单

    1.asp.net mvc4  Index.cshtml页面上构建表单form的方式 @{ ViewBag.Title = "Index"; Layout = "~/Vi ...

  2. 第四章 istio快速入门(快速安装)

    4.1 环境介绍 K8s 1.9 以上版本. 4.2 快速部署Istio 下载:  https://github.com/istio/istio/releases/,  下载 1.1.0-snapsh ...

  3. 使用ASP.NET 构建 Web 应用程序快速入门-8小时的免费培训视频

    - Scott Hanselman的中文博客[转载] [原文发表地址] Building Web Apps with ASP.NET Jump Start - 8 Hours of FREE Trai ...

  4. Spring Boot 2.x 快速入门(上)HelloWorld示例

    本文重点 最近决定重新实践下Spring Boot的知识体系,因为在项目中遇到的总是根据业务需求走的知识点,并不能覆盖Spring Boot完整的知识体系,甚至没有一个完整的实践去实践某个知识点.最好 ...

  5. Gradle 1.12 翻译——第九章 Groovy快速入门

    由于时间关系,没办法同时做笔记和翻译,关于Gradle的用户指南,本博客不再做相关笔记,而只对未翻译章节进行翻译并在此发表. 有关其他已翻译的章节请关注Github上的项目:https://githu ...

  6. python 全栈开发,Day88(csrf_exempt,ES6 快速入门,Vue)

    BBS项目内容回顾 1. 登陆页面 1. 验证码 1. PIL(Pillow) 2. io 2. ORM 1. 增删改查 3. AJAX $.ajax({ url: '', type: '', dat ...

  7. SpringBoot介绍,快速入门小例子,目录结构,不同的启动方式,SpringBoot常用注解

    SpringBoot介绍 引言 为了使用ssm框架去开发,准备ssm框架的模板配置 为了Spring整合第三方框架,单独的去编写xml文件 导致ssm项目后期xml文件特别多,维护xml文件的成本也是 ...

  8. [易学易懂系列|rustlang语言|零基础|快速入门|(26)|实战3:Http服务器(多线程版本)]

    [易学易懂系列|rustlang语言|零基础|快速入门|(26)|实战3:Http服务器(多线程版本)] 项目实战 实战3:Http服务器 我们今天来进一步开发我们的Http服务器,用多线程实现. 我 ...

  9. 快速入门系列--WebAPI--03框架你值得拥有

    接下来进入的是俺在ASP.NET学习中最重要的WebAPI部分,在现在流行的互联网场景下,WebAPI可以和HTML5.单页应用程序SPA等技术和理念很好的结合在一起.所谓ASP.NET WebAPI ...

  10. 快速入门系列--MVC--01概述

    虽然使用MVC已经不少年,相关技术的学习进行了多次,但是很多技术思路的理解其实都不够深入.其实就在MVC框架中有很多设计模式和设计思路的体现,例如DependencyResolver类就包含我们常见的 ...

随机推荐

  1. 经典常用SQL查询语句和常见问题

    一.基础 1.常用sql: ------------------------ // mysql改root密码 mysqladmin -u用户名 -p旧密码 password 新密码 # ---more ...

  2. 一文速通Python并行计算:09 Python多进程编程-进程之间的数据同步-基于互斥锁、递归锁、信号量、条件变量、事件和屏障

    一文速通 Python 并行计算:09 Python 多进程编程-进程之间的数据同步-基于互斥锁.递归锁.信号量.条件变量.事件和屏障 摘要: 多进程同步机制包括互斥锁.递归锁.信号量.条件变量.事件 ...

  3. 精选 14 款 .NET 开源、功能强大的快速开发框架,提高开发生产效率、避免工作996!

    前言 最近发现DotNetGuide技术社区微信交流群有不少小伙伴在问:.NET有哪些不错的快速开发框架推荐的? 选择一款全面且功能强大的快速开发框架能够帮助我们解决C#..NET项目中的很多重复工作 ...

  4. 【记录】Word 2021|编号缩进调整

    版本: Word 2021 专业版 Word编号缩进调整 有时候会觉得word列表的悬挂缩进太大或太小了. 第一步:右键编号的数字-调整列表缩进. 第二步:编辑格式-编号. 第三步:点击更多,选择编号 ...

  5. Nacos源码—7.Nacos升级gRPC分析二

    大纲 5.服务变动时如何通知订阅的客户端 6.微服务实例信息如何同步集群节点 5.服务变动时如何通知订阅的客户端 (1)服务注册和服务订阅时发布的客户端注册和订阅事件的处理 (2)延迟任务的执行引擎源 ...

  6. HeapSter部署

    pod资源需求,资源限制 Requests:需求,最低保障: Limits: 限制,硬限制: Limits >= request CPU: 1颗虚拟CPU=1000 毫核心 millicores ...

  7. k8s之serviceaccount,登录账号创建

    kubectl  --> 认证 --->授权 -->准入控制 认证:证书 身份识别 授权:rbac  权限检查 准入控制:  补充授权机制 多个插件实现 只在创建 删除 修改 或做代 ...

  8. Grid 布局-子项补充及常用布局

    上篇我们介绍了 Grid 布局容器项的内容, 看上去属性很多, 其实并没有, 记住关键的概念和简写就行啦. 因为是二维的, 这个属性的数量就比 flex 要多很多哦, 但其实真正也没有常用那没多啦. ...

  9. Disruptor—3.核心源码实现分析

    大纲 1.Disruptor的生产者源码分析 2.Disruptor的消费者源码分析 3.Disruptor的WaitStrategy等待策略分析 4.Disruptor的高性能原因 5.Disrup ...

  10. MySQL 把查询结果更新或者插入到新表

    摘要:在MySQL数据库,把查询到的多条记录复制到另一张表中.复制通常包括两种场景,一种是使用update命令更新旧数据,另一种是使用insert命令插入新记录. 需求背景:在某些业务中,需要把查询到 ...