基于华为开发者空间从0实现一个MCP Server

作者:高校俱乐部日期:2025/11/25

1 概述

1.1 案例介绍

MCP (Model Context Protocol) 是一个开放协议,用于标准化应用程序如何向 LLM 提供上下文。可以将 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 为设备连接各种外设和配件提供标准化方式一样,MCP 为 AI 模型连接不同的数据源和工具提供了标准化的方式。 MCP 的核心遵循客户端-服务器架构,其中主机应用程序可以连接到多个服务器: {{{width="60%" height="auto"}}} - MCP 主机:希望通过 MCP 访问数据的 Claude Desktop、IDE 或 AI 工具等程序; - MCP 客户端:与服务器保持 1:1 连接的协议客户端; - MCP 服务器:轻量级程序,每个程序都通过标准化的 Model Context Protocol 公开特定功能; - 本地数据源:MCP 服务器可以安全访问的计算机文件、数据库和服务; - 远程服务:MCP 服务器可以连接到的 Internet 上可用的外部系统(例如,通过 API)。 本案例通过实际操作,让大家深入了解如何利用云主机完成MCP Server开发和部署,如何通过大模型调用MCP Server服务。

1.2 适用对象

  • 企业
  • 个人开发者
  • 高校学生

1.3 案例时间

本案例总时长预计60分钟。

1.4 案例流程

{{{width="70%" height="auto"}}}

说明: ① 用户打开华为开发者空间云主机; ② 浏览器下载VSCode,完成安装配置; ③ VSCode中使用cline插件配置MaaS提供免费版DeepSeek-R1模型; ④ MCP Server服务开发及部署; ⑤ Cline插件配置MCP Server服务并调用MCP Server提供的工具。

1.5 资源总览

本案例预计花费0元。 |资源名称|规格|单价(元)|时长(分钟)| |-|-|-|-| |开发者空间--云主机|2vCPUs | 4GB X86 |Ubuntu 22.04 Server定制版 |0| 60

2 环境配置

2.1 开发者空间配置

面向广大开发者群体,华为开发者空间提供一个随时访问的“开发桌面云主机”、丰富的“预配置工具集合”和灵活使用的“场景化资源池”,开发者开箱即用,快速体验华为根技术和资源。 如果还没有领取开发者空间云主机,可以参考免费领取云主机文档领取。 领取云主机后可以直接进入华为开发者空间工作台界面,点击进入桌面连接云主机。

2.2 免费领取DeepSeek-R1满血版

详细步骤请参考案例中步骤2.1

2.3 安装VSCode

详细步骤请参考案例中步骤2.2

2.4 安装并配置Cline插件

详细步骤请参考案例中步骤2.3

3 项目构建

3.1 Server环境设置

  1. 在VSCode中,左上角点击文件->打开文件夹,在截图目录下创建文件mcp-test,点击左上角打开。 通过Ctrl + `键打开终端,安装并设置运行脚本所需的Python所需的环境和配置。 也可以点击顶部终端->新建终端打开。
1curl -fsSL https://dtse-mirrors.obs.cn-north-4.myhuaweicloud.com/case/0037/uv-installer.sh -o uv-installer.sh | sh
2

1sudo snap install astral-uv --classic
2

安装完毕后,在终端输入uv --version,查看uv版本。

  1. 通过Ctrl + ` 键打开终端,执行如下命令完成工程初始化,运行成功后,左侧目录下会出现weather文件夹。
1uv init weather
2cd weather
3

3. 初始化完毕后,进行虚拟环境创建并激活,将以下命令复制到终端中。

1uv venv
2source .venv/bin/activate
3

  1. 激活完成后,在终端前方会出现(weather)字样,代表激活成功。
  2. 执行以下命令安装MCP Server开发所需要的依赖包。
1uv add "mcp[cli]" httpx -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple
2

  1. 创建weather.py文件,创建完毕后,在weather文件夹下会出现weather.py文件,表示文件创建成功。
1touch weather.py
2

3.2 MCP Server功能实现

注意:此步骤中所有代码统一复制到weather.py文件中。 1. 初始化Server实例,并定义API变量。将以下代码复制到创建的weather.py文件中。 FastMCP类使用Python类型提示和文档字符串自动生成工具定义,从而轻松创建和维护MCP工具。

1from typing import Any
2import httpx
3from mcp.server.fastmcp import FastMCP
4
5# Initialize FastMCP server
6mcp = FastMCP("weather")
7
8# Constants
9NWS_API_BASE = "https://api.weather.gov"
10USER_AGENT = "weather-app/1.0"
11

2. 定义用于查询和格式化Weather Service API中的数据的帮助函数:

1async def make_nws_request(url: str) -> dict[str, Any] | None:
2    """Make a request to the NWS API with proper error handling."""
3    headers = {
4        "User-Agent": USER_AGENT,
5        "Accept": "application/geo+json"
6    }
7    async with httpx.AsyncClient() as client:
8        try:
9            response = await client.get(url, headers=headers, timeout=30.0)
10            response.raise_for_status()
11            return response.json()
12        except Exception:
13            return None
14
15def format_alert(feature: dict) -> str:
16    """Format an alert feature into a readable string."""
17    props = feature["properties"]
18    return f"""
19Event: {props.get('event', 'Unknown')}
20Area: {props.get('areaDesc', 'Unknown')}
21Severity: {props.get('severity', 'Unknown')}
22Description: {props.get('description', 'No description available')}
23Instructions: {props.get('instruction', 'No specific instructions provided')}
24"""
25

  1. 定义MCP Server工具函数get_alerts和get_forecast,工具函数用来执行查询天气情况的逻辑,将以下代码复制到weather.py文件中。
1@mcp.tool()
2async def get_alerts(state: str) -> str:
3    """Get weather alerts for a US state.
4
5    Args:
6        state: Two-letter US state code (e.g. CA, NY)
7    """
8    url = f"{NWS_API_BASE}/alerts/active/area/{state}"
9    data = await make_nws_request(url)
10
11    if not data or "features" not in data:
12        return "Unable to fetch alerts or no alerts found."
13
14    if not data["features"]:
15        return "No active alerts for this state."
16
17    alerts = [format_alert(feature) for feature in data["features"]]
18    return "\n---\n".join(alerts)
19
20@mcp.tool()
21async def get_forecast(latitude: float, longitude: float) -> str:
22    """Get weather forecast for a location.
23
24    Args:
25        latitude: Latitude of the location
26        longitude: Longitude of the location
27    """
28    # First get the forecast grid endpoint
29    points_url = f"{NWS_API_BASE}/points/{latitude},{longitude}"
30    points_data = await make_nws_request(points_url)
31
32    if not points_data:
33        return "Unable to fetch forecast data for this location."
34
35    # Get the forecast URL from the points response
36    forecast_url = points_data["properties"]["forecast"]
37    forecast_data = await make_nws_request(forecast_url)
38
39    if not forecast_data:
40        return "Unable to fetch detailed forecast."
41
42    # Format the periods into a readable forecast
43    periods = forecast_data["properties"]["periods"]
44    forecasts = []
45    for period in periods[:5]:  # Only show next 5 periods
46        forecast = f"""
47{period['name']}:
48Temperature: {period['temperature']}°{period['temperatureUnit']}
49Wind: {period['windSpeed']} {period['windDirection']}
50Forecast: {period['detailedForecast']}
51"""
52        forecasts.append(forecast)
53
54    return "\n---\n".join(forecasts)
55

  1. 定义主函数,在云主机部署MCP Server,将以下代码复制到weather.py文件中,进行服务器部署。
1if __name__ == "__main__":
2    # Initialize and run the server
3    mcp.run(transport='stdio')
4

  1. 在终端输入以下命令,运行脚本,如果能查询到Server进程表示部署成功。
1uv run weather.py
2

3.3 Cline插件上配置MCP Server

  1. 配置Server。点击之前安装的Cline插件,随后点击上方MCP Server->Installed->Configure MCP Servers。

将以下代码替换到cline_mcp_settings.json文件中。

1{
2  "mcpServers": {
3    "weather": {
4      "disabled": false,
5      "timeout": 60,
6      "command": "uv",
7      "args": [
8        "--directory",
9        "/home/developer/IDEProjects/mcp-test/weather",
10        "run",
11        "weather.py"
12      ],
13      "transportType": "stdio"
14    }
15  }
16}
17
  1. 替换关键参数。args中的地址需要根据自身实际地址进行替换。 在终端输入pwd,获取路径,对args中的路径参数进行替换。
  2. 将json文件中的路径参数替换之后ctrl+s进行保存,可以看到,MCP Server提供两个工具,分别为get_alerts和get_forecast,至此MCP Server配置完成。

3.4 Cline插件调用MCP Server工具查询天气

  1. cline新建会话,点击Auto-approve,设置MCP服务开关配置。
  2. 选择Use MCP Servers,打开调用开关。再点击上放三角缩放页面。
  3. 由于本地搭建的Server服务使用的是美国天气服务API,所以这里我们提问:未来三天纽约天气怎么样?点击右侧三角符进行提问。 首次提问会询问经纬度坐标,选择默认坐标运行即可。稍等片刻后,返回纽约天气
  4. 在服务运行过程中可以看到成功调用本地MCP Server提供的工具,表示大模型可以成功自动调用MCP提供的工具,并能根据工具进行结果返回。 至此,基于华为开发者空间云主机搭建MCP Server服务到此结束。

基于华为开发者空间从0实现一个MCP Server》 是转载文章,点击查看原文


相关推荐


【Spring】Cookie和Session是什么
d***9352025/11/23

文章目录 回顾 Cookie理解 SessionCookie 和 Session 的区别 回顾 Cookie HTTP 协议自身是属于“无状态”协议 无状态:默认情况下,HTTP 协议的客户端和服务器之间的这次通信和下次通信之间没有直接的联系 但是在实际开发中,我们很多时候是需要知道请求之间的关联关系的 例如登录网站成功后,第二次访问的时候服务器就能知道该请求是否是已经登录过了 上述图片中的“令牌”通常就存储在 Cookie 字段中 比如去医院挂号: 看病之前先挂


Lua 的 dofile 函数
IMPYLH2025/11/21

Lua 的 dofile 函数 是用于加载并执行外部 Lua 脚本文件的核心函数之一。它的主要功能和工作原理如下: 基本功能 读取指定的 Lua 文件编译文件内容为字节码执行编译后的代码返回该文件中最后一个表达式的值 语法格式 dofile(filename) 其中 filename 是要加载的 Lua 文件路径(相对路径或绝对路径) 典型应用场景 模块化开发时加载子模块游戏开发中加载场景或关卡配置动态加载用户自定义脚本测试环境快速重载修改后的代码 与 require 的区别


Gemini 3 Pro 来了!一句话生成完整网站,AI编程能力断层领先
wwwzhouhui2025/11/19

前言 在AI大模型快速迭代的今天,各家厂商疯狂堆参数、拼算力,动不动就是参数翻倍,但日常用起来的感觉却大同小异。就在大家对"GPT-4.5级"、"性能提升30%"这些宣传话术感到麻木的时候,Google在2025年11月18日悄悄扔出了一个重磅炸弹——Gemini 3.0。 Gemini 3 Pro 是 Google DeepMind 推出的新一代旗舰模型,被官方定义为"世界上多模态理解能力最强的模型"。它不是简单的微调升级,而是从零开始在自家TPU芯片上训练的全新模型,采用稀疏混合专家架构(M


使用 Cursor & Claude 操作 Figma 画图
Keely402852025/11/18

版权声明:本文为博主原创文章,未经博主允许不得转载。 文章底部留言可联系作者。 一、背景 现在各种AI工具的普及让人眼花缭乱,大家都在拥抱AI,之前朋友推荐某音的一个小视频看到可以使用Cursor操作Figma自动画图感觉非常神奇,正好我 Claude和Cursor 都在使用,对有意思的工具做了一些尝试,现在总结下经验希望可以帮助大家。 二、Cursor 如何操作 Figma 1. 安装 Cursor Cursor 可以点击官网下载选择合适版本进行使用。新账号试用过后需要付费使用,具体使用方法


我在高职教STM32(新12)——STM32中断概览
南耿先生2025/11/17

新学期,又要给学生上 STM32 嵌入式课程了。这课上了多年了,一直用的都是标准库来开发,已经驾轻就熟了。人就是这样,有了自己熟悉的舒适圈,就很难做出改变,老师上课也是如此,排斥新课和不熟悉的内容。显然,STM32 的开发,HAL 库已是主流,自己其实也在使用,只不过更换库就意味着教学内容有很大变化,自己也就迟迟没有迈出调整这一步。现在,是时候做出变化了,笔者计划保持教学项目不变(图 1 所示),逐步将源码替换成 HAL 库。虽然不能一步到位,但会在备课期间逐步替换,自己就当再学习和巩固一遍。


openGauss实战:Python开发与AI向量数据库应用
倔强的石头_2025/11/16

引言 经过前两篇文章的铺垫,我们已经掌握了openGauss的部署安装和使用Data Studio进行可视化管理。现在,我们来到了本系列文章的终章,将目光聚焦于开发者最关心的环节——如何在应用程序中与openGauss进行交互,并探索其在AI领域的应用潜力。 本文将以目前最流行的编程语言之一Python为例,详细演示如何连接openGauss数据库,并围绕两个典型的业务场景——“用户管理系统”和“订单支付流程”,构建完整的CRUD(创建、读取、更新、删除)与事务处理代码示例。更进一步,我们将结合


🍵 Go Queryx 入门指南:让数据库操作像喝奶茶一样丝滑!
golang学习记2025/11/15

🎬 前言:为什么是 Queryx?—— 因为 bug 等不及你「运行时才发现」 想象一下这些经典场景: // 🚨 GORM 的“惊喜盲盒” db.Where("nmae = ?", "john").Find(&users) // 拼写错误?编译器:没问题 👌 // → 运行时:查不到数据?🤔 调试 2 小时:哦,`nmae` 少了个 `e` …… // 🧨 原生 SQL 的“类型彩票” rows, _ := db.Query("SELECT * FROM users WHERE


Python 编程实战 · 实用工具与库 — Flask 基础入门
程序员爱钓鱼2025/11/14

Flask 是 Python 生态中最灵活、最轻量的 Web 框架之一,非常适合快速构建接口、网站原型、后台服务等。它遵循 WSGI 标准,核心库极其简洁,但可以通过插件无限扩展。 1. Flask 基础概念 ✔ Flask 是什么? 一个 微框架(Micro Framework) 默认只提供核心组件:路由、请求处理、模板、调试器 需要什么功能就安装什么扩展(ORM、表单验证、JWT、数据库等) ✔ Flask 的优势 代码简洁、上手快 灵活度极高(不像 Django 那样有强约


😎 Node.js 应用多阶段构建 Dockerfile 详解
你的人类朋友2025/11/12

前言 🍃 你好啊,我是你的人类朋友!✨ 本文主要来一起阅读一个高效的 Node.js 应用 Dockerfile。 在开始分析这个 Dockerfile 之前,先问大家一个问题:为什么这个 Dockerfile 要分两个阶段来构建,而不是直接复制所有文件然后安装依赖? 读完本文后,你就能找到答案! 😎 小贴士:如果你不懂啥是两段构建,问题不大,后面有解释,可以继续看。 下面展示的是一个用于部署 Node.js 应用的 Dockerfile,让我们先看看完整代码: FROM node:18


测试自动化Replay:让数据库迁移测试回归真实场景的一把“利器”
我是杰尼2025/11/10

测试自动化Replay:让数据库迁移测试回归真实场景的一把“利器” 在当前数据库国产化的大趋势下,越来越多的企业开始从传统进口数据库向国产数据库进行替代。然而,真正影响迁移进度的往往不是数据迁移本身,而是 测试验证环节。 如果测试不能覆盖真实业务场景,迁移后的系统上线后很可能出现: 性能明显下降 并发冲突和慢查询频发 数据一致性异常难以定位 很多企业迁移项目延期 1~3 个月,根本原因都指向了同一个问题:测试不够真实。 那么,是否有办法把“生产环境正在发生的真实行为”,直接搬进测试环境中来复

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2025 聚合阅读