Windows 平台上基于 MCP 构建“文心一言+彩云天气”服务实战
Windows 平台上基于 MCP 构建“文心一言+彩云天气”服务实战
本文示例将带你在 Windows 操作系统下,使用 Python 和 MCP(Model Context Protocol)框架,结合百度“文心一言”大模型与彩云天气 API,快速搭建一个既能查询天气又能生成中文自然回复的智能服务。
一、为什么选用 MCP
- 统一上下文:MCP 提供标准化的上下文帧(Context Frame),让多轮会话、工具调用和模型生成之间做到清晰解耦。
- 可扩展工具:新增、替换外部服务(如天气、翻译、检索)时,无需改动 Agent 核心逻辑,仅注册新工具即可。
- 可观测与可测:上下文帧全量记录、可序列化到 Redis 或本地文件,方便调试与审计。
二、Windows 环境准备
- 安装 Python 3.10+。
- 打开 PowerShell 或 CMD,执行:
python -m venv .venv .\.venv\Scripts\activate pip install --upgrade pip
- 安装项目依赖:
pip install mcp[cli] httpx python-dotenv
- 在项目根目录下新建
.env
文件,写入:WENXIN_API_KEY=你的文心一言 API Key WENXIN_SECRET_KEY=你的文心一言 Secret Key CY_TOKEN=你的彩云天气 Token
三、项目目录结构
weather-mcp-windows/
├─ .env
├─ .venv/
├─ weather.py
└─ requirements.txt
四、集成“文心一言”大模型
在 weather.py
文件顶部,导入模块并加载环境变量:
import os, json, asyncio
import httpx
from dotenv import load_dotenv
from mcp.server.fastmcp import FastMCPload_dotenv()
WENXIN_API_KEY = os.getenv("WENXIN_API_KEY")
WENXIN_SECRET_KEY = os.getenv("WENXIN_SECRET_KEY")
实现获取访问令牌函数:
async def get_wenxin_token() -> str:url = "https://aip.baidubce.com/oauth/2.0/token"params = {"grant_type": "client_credentials","client_id": WENXIN_API_KEY,"client_secret": WENXIN_SECRET_KEY}async with httpx.AsyncClient() as client:resp = await client.post(url, params=params, timeout=10)return resp.json().get("access_token", "")
封装调用文心一言接口:
async def call_wenxin(prompt: str) -> str:token = await get_wenxin_token()api = f"https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat?access_token={token}"payload = {"messages": [{"role":"user","content": prompt}],"model": "ernie_bot_turbo"}async with httpx.AsyncClient() as client:resp = await client.post(api, json=payload, timeout=15)return resp.json()["result"][0]["content"]
五、接入彩云天气 API
CY_TOKEN = os.getenv("CY_TOKEN")
CY_API = "https://api.caiyunapp.com/v2.5"async def get_caiyun_weather(lon: float, lat: float) -> dict:url = f"{CY_API}/{CY_TOKEN}/{lon},{lat}/weather.json"async with httpx.AsyncClient() as client:r = await client.get(url, timeout=10)return r.json()
六、定义 MCP 工具
mcp = FastMCP("weather_mcp_win")@mcp.tool()
async def query_weather(lon: float, lat: float) -> str:"""调用彩云天气获取指定经纬度的当前天气Args:lon: 经度lat: 纬度"""data = await get_caiyun_weather(lon, lat)if data.get("status") != "ok":return "天气服务调用失败"now = data["result"]["realtime"]return f"{now['skycon']},温度 {now['temperature']}°C," \f"湿度 {int(now['humidity']*100)}%"@mcp.tool()
async def describe_weather(natural_prompt: str) -> str:"""基于“文心一言”大模型,对天气情况生成优美文案Args:natural_prompt: 包含天气信息的简要描述"""prompt = f"请根据以下内容生成一段优美的中文天气描述:{natural_prompt}"return await call_wenxin(prompt)
七、启动 MCP 服务(Windows)
在 weather.py
文件末尾,添加:
if __name__ == "__main__":mcp.run(transport="http", host="127.0.0.1", port=8000)
启动服务:
python weather.py
浏览器访问 http://127.0.0.1:8000/docs
,可见自动生成的 OpenAPI 接口文档。
八、示例客户端调用
import requests, json# 1. 获取当前天气
resp1 = requests.post("http://127.0.0.1:8000/query_weather",json={"lon":116.397, "lat":39.907}
)
weather_brief = resp1.json()["result"]# 2. 生成中文描述
resp2 = requests.post("http://127.0.0.1:8000/describe_weather",json={"natural_prompt": weather_brief}
)print("简要:", weather_brief)
print("文心一言生成:", resp2.json()["result"])
九、后续扩展思路
- 上下文持久化:引入 Redis 或 SQLite 存储历史 Context Frame。
- 增加多模型切换:注册腾讯混元、华为昇思等国内模型工具,按需路由调用。
- 实时推送:通过 WebSocket 或 Server-Sent Events 向前端推送天气更新。
- 本地化部署:使用 Windows 容器(Docker Desktop for Windows)自动化运维,结合 IIS 或 Nginx 反代。
- 面向企业:在企业内网搭建私有化 MCP 服务,使用自研知识库、流程引擎、OCR、文生图等多种工具。
让 MCP 成为你国产大模型与各种业务工具的“中枢神经”,清晰管理上下文、快速接入新能力,拥抱结构化智能新时代!