MCP(3)实践篇:搭建你的第一个MCP应用

前言

在前两篇文章中,我们已经介绍了MCP(模型上下文协议)的基本概念和技术架构。本篇文章将从理论走向实践,通过一个简单但完整的案例,手把手教你如何搭建和调试一个基于MCP的应用。我们将一起构建一个天气查询和活动推荐的MCP服务器,并将其与AI助手集成。

无论你是AI开发者、工具创建者,还是对MCP感兴趣的技术爱好者,通过本文的实践,你将能够掌握MCP的基本开发流程,为后续开发更复杂的MCP应用打下基础。

准备工作

在开始实践之前,我们需要准备好开发环境和相关工具。

环境要求

  • Python 3.8+(我们将使用Python实现MCP服务器)
  • 基本的命令行和代码编辑器使用经验
  • 初步的Python编程知识
  • 对JSON和API的基本了解

安装依赖

我们将使用Anthropic提供的MCP Python SDK来简化开发过程。首先,创建一个新项目文件夹,然后安装必要的依赖:

# 创建项目文件夹
mkdir mcp-weather-demo
cd mcp-weather-demo

# 创建虚拟环境
python -m venv venv
source venv/bin/activate  # Windows上使用: venv\Scripts\activate

# 安装MCP SDK和其他依赖
pip install mcp-python requests

项目概述

在本教程中,我们将构建一个包含以下功能的MCP服务器:

  1. 天气查询工具:根据城市名称返回当前天气信息
  2. 活动推荐工具:根据天气情况推荐适合的活动
  3. 城市信息资源:提供城市基本信息作为上下文资源

这个服务器将通过Server-Sent Events (SSE)协议与MCP客户端通信,允许任何符合MCP标准的AI应用调用我们的服务。

步骤一:设计MCP服务器的基本结构

首先,让我们设计MCP服务器的基本结构。创建一个名为weather_server.py的文件:

# weather_server.py
from mcp.server.fastmcp import FastMCP
import asyncio
import logging

# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

# 创建MCP服务器实例
mcp_server = FastMCP(
    name="weather-assistant",
    description="天气查询和活动推荐服务",
    host="0.0.0.0",
    port=1234
)

# 主函数
async def main():
    logger.info("启动MCP天气服务器,监听地址: http://localhost:1234")
    await mcp_server.run_sse_async()

if __name__ == "__main__":
    asyncio.run(main())

这段代码创建了一个基本的MCP服务器,它将监听1234端口,等待MCP客户端的连接。我们使用FastMCP类,这是MCP Python SDK提供的便捷服务器实现。

步骤二:实现天气查询工具

接下来,让我们实现天气查询工具。在真实应用中,你可能会调用外部天气API,但为了简化教程,我们将使用硬编码的天气数据:

# 在weather_server.py中添加

# 模拟的天气数据库
WEATHER_DATA = {
   
    "北京": {
   "condition": "晴", "temperature": 25, "humidity": 40},
    "上海": {
   "condition": "多云", "temperature": 27, "humidity": 60},
    "广州": {
   "condition": "雨", "temperature": 30, "humidity": 80},
    "深圳": {
   "condition": "多云", "temperature": 29, "humidity": 70},
    "杭州": {
   "condition": "晴", "temperature": 26, "humidity": 50}
}

@mcp_server.tool(name="get_weather", description="获取指定城市的天气信息")
async def get_weather(city: str) -> str:
    """
    获取指定城市的天气信息
    
    参数:
        city: 城市名称,如"北京"、"上海"
    
    返回:
        天气信息描述
    """
    logger.info(f"获取天气信息: {
     city}")
    
    if city in WEATHER_DATA:
        weather = WEATHER_DATA[city]
        return f"{
     city}{
     weather['condition']}{
     weather['temperature']}°C,湿度{
     weather['humidity']}%"
    else:
        return f"抱歉,未找到{
     city}的天气信息"

这段代码定义了一个名为get_weather的工具,它接受一个城市名称参数,返回该城市的天气信息。我们使用@mcp_server.tool装饰器将函数注册为MCP工具,这样MCP客户端就能发现并调用它。

步骤三:实现活动推荐工具

接下来,让我们实现活动推荐工具:

# 在weather_server.py中添加

# 基于天气的活动推荐
ACTIVITY_RECOMMENDATIONS = {
   
    "晴": ["户外散步", "骑自行车", "野餐", "参观公园", "户外运动"],
    "多云": ["参观博物馆", "购物", "咖啡馆休息", "室外摄影", "城市探索"],
    "雨": ["室内电影", "博物馆参观", "购物中心", "室内游泳", "图书馆阅读"],
    "雪": ["室内活动", "温泉", "热饮", "电影院", "室内游戏"]
}

@mcp_server.tool(name="suggest_activity", description="根据天气状况推荐适合的活动")
async def suggest_activity(weather_condition: str) -> str:
    """
    根据天气状况推荐适合的活动
    
    参数:
        weather_condition: 天气状况描述,如"晴"、"多云"、"雨"
    
    返回:
        推荐活动列表
    """
    logger.info(f"推荐活动: 基于天气 {
     weather_condition}")
    
    # 提取天气关键词(简单处理)
    for key in ACTIVITY_RECOMMENDATIONS:
        if key in weather_condition:
            activities = ACTIVITY_RECOMMENDATIONS[key]
            return f"基于当前{
     key}天气,推荐的活动:{
     ', '.join(activities[:3])}"
    
    return "无法根据提供的天气状况推荐活动,建议选择适合当地气候的活动"

这个工具接受天气状况作为输入,根据天气关键词推荐适合的活动。这展示了MCP工具如何实现基于一个工具输出的结果来调用另一个工具的模式。

步骤四:添加城市信息资源

除了工具外,MCP还支持资源(Resources),这些是只读的信息,可以帮助模型更好地理解上下文。让我们添加一些城市信息作为资源:

# 在weather_server.py中添加

# 城市信息资源
CITY_INFO = 
<think>好的,用户想了解如何搭建MCP Server,特别是用Python在Windows本地快速启动。首先,我需要回忆一下之前处理过的类似问题。根据引用[1],有一篇面向零基础用户的教程,指导如何在Windows上快速启动MCP Server,可能需要Python环境。 首先,我应该检查用户提到的MCP Server的具体定义,但可能是指Minecraft联机服务器的MCP(Mod Coder Pack),但更可能是某个自定义的服务器应用。不过根据引用中的内容,用户提到的是用Python搭建,所以可能是一个自定义的服务器,比如基于某种框架的。 接下来,需要确保步骤清晰,适合新手。可能需要安装Python,然后安装必要的库,比如Flask或socket库,具体取决于MCP Server的实现方式。然后编写服务器代码,运行脚本,最后测试连接。 还要注意用户可能遇到的常见问题,比如防火墙设置、端口被占用等,需要给出解决方法。同时,按照用户的要求,生成相关问题,比如优化、部署到生产环境等。 需要确保所有代码块正确,使用正确的语法,并符合用户要求的格式,比如行内数学公式用$...$,独立公式用$$...$$,但这个问题可能不涉及数学公式,所以可能不需要。但系统指令里有提到,可能需要检查是否有数学内容需要转换。 最后,生成的相关问题需要与搭建MCP Server相关,比如性能优化、安全配置、客户端连接等。确保引用正确,在回答末尾添加引用标识,比如[^1]。 现在整理步骤:安装Python,安装依赖库,编写服务器代码,运行服务器,测试连接,常见问题处理。每一步详细说明,代码示例正确,使用Python的socket或Flask库。例如,可能使用Flask搭建一个简单的HTTP服务器作为MCP Server的基础。 检查是否需要更多的细节,比如具体的代码示例,如何配置端口,处理请求等。同时,提醒用户注意安全,比如不要使用简单密码,暴露公网需要防火墙规则等。 最后,确保回答结构清晰,分步骤说明,代码块正确,相关问题合理。可能用户的问题中的引用[1]是关于搭建MCP Server的基础教程,所以需要准确引用,并在末尾添加引用标识。</think>### 如何搭建 MCP Server(详细教程) MCP Server 通常指基于 Python 的轻量级服务端应用,适用于本地开发或小型项目。以下是面向零基础用户的详细搭建步骤: --- #### **1. 环境准备** - **安装 Python** 访问 [Python官网](https://www.python.org/),下载 Windows 版安装包(建议 Python 3.8+),安装时勾选 `Add Python to PATH`。 - **验证安装** 打开命令提示符,输入: ```bash python --version ``` 若显示版本号(如 `Python 3.10.6`),则安装成功。 --- #### **2. 创建项目目录** - 新建文件夹(如 `mcp_server`),用于存放代码和配置文件。 - 在文件夹内新建文件 `server.py`(主程序文件)。 --- #### **3. 编写 MCP Server 代码** 使用 Python 内置库 `http.server` 快速搭建基础服务器: ```python from http.server import SimpleHTTPRequestHandler, HTTPServer # 定义请求处理类 class MCPHandler(SimpleHTTPRequestHandler): def do_GET(self): self.send_response(200) self.send_header("Content-type", "text/html") self.end_headers() self.wfile.write(b"<h1>MCP Server Running!</h1>") # 配置服务器参数 HOST = "localhost" PORT = 8000 # 启动服务器 with HTTPServer((HOST, PORT), MCPHandler) as server: print(f"Server started at http://{HOST}:{PORT}") server.serve_forever() ``` --- #### **4. 运行服务器** 在命令提示符中进入项目目录,执行: ```bash python server.py ``` 若看到输出 `Server started at http://localhost:8000`,则服务已启动。 --- #### **5. 测试访问** 浏览器访问 `http://localhost:8000`,若显示 `MCP Server Running!`,则搭建成功。 --- #### **6. 常见问题处理** - **端口冲突**:修改 `PORT` 值(如 `8080`)并重启服务。 - **防火墙拦截**:允许 Python 通过 Windows 防火墙。 - **依赖缺失**:若使用第三方库,通过 `pip install 库名` 安装。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员查理

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值