前言

各位开发者好!今天我要和大家分享一个激动人心的开发经历 —— 如何在短短5分钟内,利用MCP Factory开发一个能查询天气的MCP Server。相信很多人都有这样的感受:MCP开发繁琐、耗时,需要处理各种配置和接口问题。但今天,我将向你展示一种全新的开发方式,让MCP开发变得简单高效!

MCP开发的痛点

传统的软件开发工作,我们通常需要:

  • 搭建复杂的服务器环境
  • 编写大量的接口代码
  • 处理各种异常和错误
  • 进行繁琐的测试和调试

这些步骤不仅耗时,还容易出错。特别是对于初学者来说,这简直是一场噩梦!

MCP Factory:开发利器

MCP Factory是一个专为MCP Server开发而生的平台,它基于FastMCP框架打造,大大简化了MCP Server的开发复杂度。使用MCP Factory,你只需关注业务逻辑,而不必担心底层实现细节,开发过程中可以随时debug你的服务,测试完成后一键部署到云端k8s上运行,让你的开发效率直接翻倍。

MCP Factory的核心优势

  • 简洁的代码结构 :最小化代码量,专注业务逻辑
  • 快速部署 :一键部署,无需复杂配置
  • 高度可扩展 :轻松添加新功能和接口
  • 内置调试工具 :便于快速定位和解决问题

实战:5分钟开发天气查询MCP Server

下面,我将带领大家一步步完成一个能查询天气的MCP Server开发。

第一步:环境准备(1分钟)

如果已经安装好MCP Factory请直接跳转到第二步。
如果没有安装MCP Factory可以复制下面的链接,在任意一台linux服务器上一键安装,推荐使用ubuntu18版本以上(虚拟机配置推荐6核8G,预留80G根分区空间)

Bash
wget -qO - https://mcpfactory.cn/release/download/ce/installer-linux-amd64 | bash -s mcpfactory-ce-k3s install --env single

第二步:创建开发空间与项目结构(1分钟)

点击页面上“创建开发空间”,创建好后我们点击"创建MCP Server"
在这里插入图片描述
填写mcp server相关信息,给他加一些标签以方便后面大模型认识它,点击"创建"
在这里插入图片描述
云IDE创建运行起来后会自动弹出MCP Server的初始配置,这里我们要填写一些mcp功能函数的相关定义,比如这里查询天气我是根据城市来查询,所以我这里就创建一个city的变量,标签还用创建项目时候定义的标签。
在这里插入图片描述
它会自动帮你搭建好MCP开发的脚手架,期间需要按界面提示安装好pyenv环境和依赖包,然后我们只需要关注handler.py这个文件,我们接下来的实际代码也是在修改这个handler.py文件
在这里插入图片描述
第三步:编写核心代码(2分钟)

编写handler.py文件,实现天气查询功能

Python
#
# 代码运行所需的 OS 安装包放在 packages.txt 中,Python安装包放在requirements.txt,请注意都仅放置包名,每个包占一行
#
from server import mcp
import requests

# 创建会话对象,用于API请求
session = requests.Session()
session.headers = {"Content-Type":
                       "application/json"}


# 工具:天气mcp
@mcp.tool(
    name="weather_mcp",
    description="天气mcp",
    tags="工具,weather,天气"
)
def weather_mcp(city: str) -> str:
    """
    查询指定城市的天气信息

    Args:
        city: 城市名称,如:北京、上海、广州等

    Returns:
        str: 天气信息的JSON字符串
    """
    # 使用免费的天气API
    api_url = f"http://t.weather.sojson.com/api/weather/city/{get_city_code(city)}"

    try:
        response = session.get(url=api_url)
        if response.status_code == 200:
            weather_data = response.json()
            # 提取关键天气信息
            if weather_data["status"] == 200:
                data = weather_data["data"]
                result = {
                    "城市": weather_data["cityInfo"]["city"],
                    "日期": weather_data["date"],
                    "温度": data["wendu"] +"℃",
                    "湿度": data["shidu"],
                    "空气质量": data["quality"],
                    "今日天气": data["forecast"][0]["type"],
                    "风向": data["forecast"][0]["fx"],
                    "风力": data["forecast"][0]["fl"],
                    "最高温": data["forecast"][0]["high"],
                    "最低温": data["forecast"][0]["low"],
                    "提示": data["forecast"][0]["notice"]
                }
                return str(result)
            return f"查询失败:{weather_data['message']}"
        return f"请求失败,状态码:{response.status_code}"

    except Exception as e:
        return f"发生错误:{str(e)}"


# 城市代码映射表(部分城市)
def get_city_code(city_name):
    city_codes = {
        "北京": "101010100",
        "上海": "101020100",
        "广州": "101280101",
        "深圳": "101280601",
        "杭州": "101210101",
        "天津": "101030100"
    }
    return city_codes.get(city_name,"101010100")  # 默认返回北京


第四步:调试与运行(1分钟)

在debug文件夹中已经创建好main.py文件,用于本地调试

Python
# |------------------------------------------------------------------------------------------------------------------|
# | main.py is generated for debugging only.                                                                        |
# |------------------------------------------------------------------------------------------------------------------|
import asyncio
import logging
import os
import sys
import logging
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from server import mcp
import handler

# Configure logging to output to stdout (standard output)
# This setup ensures that all log messages at the INFO level and above are displayed
logging.basicConfig(
    stream=sys.stdout,                   # Direct log output to standard output
    level=logging.INFO,                  # Set the logging level to INFO
    format='%(levelname)s: %(message)s' # Define the format of log messages
)

# Set default transport if it doesn't exist
transport = getattr(handler, 'transport', 'http')


async def main():
    logging.info('Start MCP Server ...')

    # FastMCP handles the server setup automatically
    # Just run the FastMCP instance from the handler
    await mcp.run_async(
        transport=transport,
        host="0.0.0.0",
        port=5000,
        log_level="DEBUG",
        path="/"
    )


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

现在,我们可以运行我们的MCP Server了

Plain Text
python debug/main.py

在这里插入图片描述
服务器启动后,你可以通过API调用来查询天气,通过侧边栏测试功能来验证我们写的代码没有问题
在这里插入图片描述
选择weather_mcp工具,输入城市参数,比如"深圳",点击运行查看返回数据
在这里插入图片描述
响应示例:

JSON
{
result:
"{'城市': '深圳市', '日期': '20250902', '温度': '29.6℃', '湿度': '60%', '空气质量': '优', '今日天气': '阴', '风向': '东南风', '风力': '2级', '最高温': '高温 30℃', '最低温': '低温 27℃', '提示': '不要被阴云遮挡住好心情'}"
}

这样一个天气查询的MCP Server就开发好了,我们对接大模型试试

配置大模型对接你的Weather MCP

以ChatBOX客户端为例,我们先点击"端口映射"将在云端运行的mcp server访问地址复制出来
在这里插入图片描述
打开ChatBox添加一个MCP Server,将URL贴入URL框,点击"测试",没问题最下面会罗列出该MCP提供的工具函数名称,也就是mcp_tools中定义的name名称,点击"保存"
在这里插入图片描述
我们用自然语言向DeepSeek提问,它了解了我的意图并调用了我写的mcp server查询到深圳的天气并返回给我数据。
在这里插入图片描述
如果你在一个企业,你开发了之后想让它成为你们团队或公司服务的一部分,你就可以直接将编写好的mcp一键部署到远程环境。
在这里插入图片描述

MCP Factory开发的优势

通过上面的实例,我们可以看到使用MCP Factory开发MCP Server的诸多优势:

  • 代码简洁 :整个项目只需要几个文件,代码量极少
  • 开发迅速 :从零到可用只需5分钟
  • 功能强大 :轻松集成第三方API
  • 易于扩展 :可以方便地添加更多功能

进阶优化

如果你想进一步提升你的天气查询MCP Server,可以考虑以下优化:

  • 添加缓存机制 :减少API调用,提高响应速度
  • 支持更多城市 :扩展城市代码映射表
  • 增加更多天气数据 :如未来几天的天气预报
  • 添加用户认证 :保护你的API不被滥用
  • 部署到云服务 :让你的服务全球可用

结语

MCP开发不再是难事!通过MCP Factory,我们可以快速、高效地开发出功能强大的MCP Server。希望这篇文章能够帮助你解决MCP开发中的困扰,让你的开发之路更加顺畅。

如果你有任何问题或建议,欢迎在评论区留言。我们下期再见!

加入技术社群(二维码有效期7天)
在这里插入图片描述
群无法进入可以添加 MCP Factory 小助手
在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐