创建你的第一个MCP服务

如何使用 FastAPI 构建 MCP 服务器 哎呀,各位算法界的小伙伴们!今天咱们要聊聊一个超酷的话题——MCP 协议!你可能已经听说了,Anthropic 推出了这个新玩意儿,目的是让 AI 代理和你的应用程序之间的对话变得更顺畅、更清晰。不过别担心,为你的 Python 应用程序搭建一个这样的服务器并不复杂,甚至可以说简单到让你怀疑人生!想象一下,AI 就像你的私人助理,而 MCP 就是它和你家大门之间的钥匙。让 AI 去操心那些繁琐的逻辑吧,咱就负责躺平享受成果。不管你是想连数据库还是接 API,MCP 都能帮你搞定。 阅读详情

创建你的第一个MCP服务

Model Context Protocol (MCP) 中国天气查询服务创建教程

什么是 Model Context Protocol (MCP)

Model Context Protocol (MCP) 是一种开放标准协议,允许大型语言模型(LLM)如 Claude 与外部系统和数据源进行交互。通过 MCP,Claude 可以:

  • 访问实时信息和数据
  • 执行特定的计算和操作
  • 调用专业工具和 API
  • 为用户提供更准确、更及时的回答

MCP 赋予 AI 以"工具使用"能力,使其突破固有知识库的限制,能够获取最新信息并执行具体任务,大大提升了 AI 的实用性。

MCP 的工作原理

MCP 的核心是一套简单但强大的通信协议:

  1. 工具注册:开发者定义工具,描述其功能和参数
  2. 工具调用:Claude 确定需要使用工具并发出请求
  3. 工具执行:MCP 服务器接收请求,执行操作,返回结果
  4. 结果解析:Claude 解析结果并将其整合到回答中

整个过程对用户来说是无缝的,用户只需提出问题,MCP 在后台自动处理工具调用。

创建中国天气查询 MCP 服务教程

Git 地址 : https://github.com/lovelyqun/MCP/tree/main/weather-mcp

下面我们将一步一步创建一个中国天气查询 MCP 服务。

第一步:环境准备

首先,确保你的系统安装了 Node.js 和 npm。然后创建项目:

mkdir weather-mcp
cd weather-mcp
npm init -y

第二步:安装依赖

编辑 package.json 文件,添加必要的依赖:

{
  "name": "weather-mcp-node",
  "version": "1.0.0",
  "description": "基于Node.js的中国天气查询MCP服务",
  "main": "weather.js",
  "type": "module",
  "scripts": {
    "start": "node weather.js",
    "test:weather": "echo '{\"name\":\"get_china_weather\",\"parameters\":{\"city\":\"北京\"}}' | node weather.js"
  },
  "keywords": ["mcp", "weather", "claude", "china"],
  "author": "",
  "license": "MIT",
  "dependencies": {
    "@modelcontextprotocol/sdk": "^1.11.2",
    "moment": "^2.30.1",
    "zod": "^3.22.4"
  }
}

然后安装依赖:

npm install

第三步:实现 MCP 服务

创建 weather.js 文件,作为我们的主程序:

// 导入所需模块
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import moment from 'moment';
import { z } from 'zod';

// 提供的城市和省份映射(简化版,实际可以包含更多城市)
const CITY_PROVINCE = {
  "北京": "北京市",
  "上海": "上海市",
  "广州": "广东省",
  "深圳": "广东省",
  "杭州": "浙江省",
  "南京": "江苏省"
};

// 城市地理信息(经纬度)
const CITY_LOCATIONS = {
  "北京": {"lat": 39.9042, "lon": 116.4074},
  "上海": {"lat": 31.2304, "lon": 121.4737},
  "广州": {"lat": 23.1291, "lon": 113.2644},
  "深圳": {"lat": 22.5431, "lon": 114.0579},
  "杭州": {"lat": 30.2741, "lon": 120.1551},
  "南京": {"lat": 32.0584, "lon": 118.7965}
};

// 初始化MCP服务器
const server = new McpServer({
  name: "china_weather",
  version: "1.0.0",
  capabilities: {
    tools: {}
  }
});

// 辅助函数:获取当前季节
function getSeason() {
  const month = moment().month() + 1;
  if ([3, 4, 5].includes(month)) return "春季";
  else if ([6, 7, 8].includes(month)) return "夏季";
  else if ([9, 10, 11].includes(month)) return "秋季";
  else return "冬季";
}

// 辅助函数:生成随机整数
function getRandomInt(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

// 为城市生成模拟天气数据
function generateWeatherData(city) {
  if (!CITY_PROVINCE[city]) return null;
  
  const season = getSeason();
  const today = moment();
  const forecastData = [];
  
  // 根据季节设定温度范围
  let tempRange;
  switch (season) {
    case "春季": tempRange = [15, 25]; break;
    case "夏季": tempRange = [25, 35]; break;
    case "秋季": tempRange = [15, 25]; break;
    case "冬季": tempRange = [0, 15]; break;
  }
  
  // 设定可能的天气类型
  const weatherTypes = ["晴", "多云", "小雨", "阴"];
  
  // 生成5天的天气数据
  for (let i = 0; i < 5; i++) {
    const date = moment(today).add(i, 'days');
    const dateStr = date.format('YYYY-MM-DD');
    const weekDay = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"][date.day()];
    
    const weatherType = weatherTypes[Math.floor(Math.random() * weatherTypes.length)];
    const tempHigh = getRandomInt(tempRange[0], tempRange[1]);
    const tempLow = getRandomInt(tempRange[0], tempHigh - 2);
    
    forecastData.push({
      date: dateStr,
      week: weekDay,
      weather: weatherType,
      temp_day: tempHigh,
      temp_night: tempLow,
      wind_direction: "东南风",
      wind_power: `${getRandomInt(1, 5)}级`
    });
  }
  
  return {
    city: city,
    province: CITY_PROVINCE[city],
    data: forecastData
  };
}

// 将天气数据格式化为可读字符串
function formatChinaWeather(data) {
  if (!data) return "无法获取天气数据。";
  
  const city = data.city || "未知城市";
  const province = data.province || "";
  const forecasts = [];
  
  for (const day of data.data) {
    const dayInfo = `
日期: ${day.date} ${day.week}
天气: ${day.weather}
温度: ${day.temp_day}°C ~ ${day.temp_night}°C
风力: ${day.wind_direction} ${day.wind_power}
`;
    forecasts.push(dayInfo);
  }
  
  const header = province ? `📍 ${province} ${city}` : `📍 ${city}`;
  return `${header}\n\n` + forecasts.join("\n---\n");
}

// 注册天气查询工具
server.tool(
  "get_china_weather",
  "查询中国城市的天气预报。",
  {
    city: z.string().describe('中国城市名称(例如"北京"、"上海"、"广州")')
  },
  async ({ city }) => {
    const weatherData = generateWeatherData(city);
    
    if (!weatherData) {
      return {
        content: [{
          type: "text",
          text: `无法获取${city}的天气信息。请提供准确的中国城市名称(如北京、上海、广州等)。`
        }]
      };
    }
    
    const result = formatChinaWeather(weatherData);
    return {
      content: [{
        type: "text",
        text: result
      }]
    };
  }
);

// 注册城市信息查询工具
server.tool(
  "get_china_city_info",
  "获取中国城市的基本信息和地理位置。",
  {
    city: z.string().describe('中国城市名称(例如"北京"、"上海"、"广州")')
  },
  async ({ city }) => {
    if (!CITY_PROVINCE[city]) {
      return {
        content: [{
          type: "text",
          text: `未找到城市:${city}。请提供准确的中国城市名称(如北京、上海、广州等)。`
        }]
      };
    }
    
    const province = CITY_PROVINCE[city];
    const location = CITY_LOCATIONS[city];
    
    const result = `
📍 ${city}
所在地区: ${province}
经度: ${location.lon}
纬度: ${location.lat}
`;
    return {
      content: [{
        type: "text",
        text: result
      }]
    };
  }
);

// 运行服务器
async function main() {
  const transport = new StdioServerTransport();
  await server.connect(transport);
  console.error("中国天气MCP服务器已启动,使用stdio传输...");
}

main().catch(error => {
  console.error("服务器运行错误:", error);
  process.exit(1);
});

第四步:创建配置文件

为了在 Cursor 或 Claude Desktop 中使用,创建一个 config-example.json 文件:

{
  "mcpServers": {
    "china_weather": {
      "command": "npm",
      "args": [
        "start",
        "--prefix",
        "/Users/你的用户名/路径/到/weather-mcp"
      ],
      "env": {}
    }
  }
}

第五步:测试服务

运行服务进行测试:

npm start

或使用预定义的测试命令:

npm run test:weather

第六步:与 Cursor 集成

  1. 打开 Cursor 应用
  2. 进入设置 (Settings)
  3. 找到 MCP 设置部分
  4. 添加新的 MCP 服务,名称为 “china_weather”
  5. 设置命令为: npm start --prefix /你的完整路径/weather-mcp
  6. 保存设置

第七步:使用 MCP 工具

在 Cursor 中,可以直接调用天气查询工具:

请问今天北京的天气怎么样?

Claude 会自动调用我们的 MCP 服务,并返回格式化的天气信息。

MCP 设计最佳实践

创建高质量的 MCP 服务,应当遵循以下最佳实践:

  1. 简洁明了的工具描述:确保描述清晰表达工具的功能和用途
  2. 严格的参数验证:使用 zod 等库验证输入参数
  3. 友好的错误处理:提供有意义的错误信息
  4. 合理的功能拆分:每个工具只做一件事,功能不要过于复杂
  5. 优雅的响应格式:返回结构化且易读的数据
  6. 高效的执行性能:避免不必要的延迟
  7. 良好的文档:提供详细的安装和使用说明

扩展和优化

可以考虑对天气服务进行以下扩展:

  1. 接入真实的天气 API(如和风天气、高德天气等)
  2. 增加更多功能,如空气质量指数查询
  3. 支持更多城市和地区
  4. 添加历史天气数据查询
  5. 增加可视化内容(如天气图标)

结语

MCP 为 AI 提供了与外部世界交互的能力,大大拓展了 Claude 等大型语言模型的应用场景。通过本教程,你不仅学会了如何创建一个基本的 MCP 服务,还了解了 MCP 的工作原理和设计理念。

希望这个中国天气查询服务能为你提供实用的功能,同时也作为你开发更多 MCP 工具的起点。随着 MCP 生态的不断发展,我们期待看到更多创新的应用出现。

构建你的第一个MCP服务器:一步步实现简单MCP服务器 本文介绍了如何构建一个基于模型上下文协议(MCP)的文件系统服务器,实现AI与外部数据源的集成。主要内容包括: MCP协议概述:类似HTTP的统一接口,支持通过JSON-RPC 2.0实现AI与外部资源的交互 开发环境配置:Python 3.10+环境搭建,使用uv包管理工具 服务器实现:基于FastMCP框架开发,包含列出目录文件和读取文件内容两个核心功能 运行与测试:通过stdio传输方式启动服务器,并与Claude Desktop等MCP主机集成测试 扩展建议:包括权限控制、日志记录和功能扩展方向 该 阅读详情

相关推荐

如何修复Windows卡在“正在准备Windows”的问题?这里有详细步骤

如何修复Windows卡在“正在准备Windows”的问题?这里有详细步骤。

wyxtx的博客 5661

MCP Server开发并使用自定义天气查询工具查询城市天气

1.本地安装node.js环境 2.本地创建mcp文件夹,搭建mcp环境 在文件夹下cmd执行npm init -y初始化npm项目 3.创建weather-server.js文件,代码如下 4.服务启动 5.添加本地MCP服务配置,绑定本地地址 6.配置cline Act Mode选择Qwen 模型 7.验证 查询北京今天天气 查询武汉今天天气

闰土的博客 1049

哨兵一号数据snap预处理_利用SNAP软件进行Sentinel-1A卫星微波影像的预处理

利用SNAP软件对雷达影像进行预处理,主要包括热噪声去除、轨道文件校正、辐射定标、滤波校正、多普勒地形校正,最终获得入射角和后向散射信息。数据:本次实验所用数据为哨兵一号(Sentinel-1A)干涉宽幅模式(Interferometric Wideswath,IW)下经过多视处理和地距转换的GRD格式产品一般处理流程如下:0 SNAP软件安装软件安装:安装成功后打开SNAP后如图所示:1 数据...

weixin_30000407的博客 1万+

在 Java 中创建你的第一个Model Context Protocol (MCP) 服务器

我是一名有十年以上经验的Java老码农,曾经沉迷于代码的世界,也曾在传统业务系统中摸爬滚打。现在你应该能在 Claude Desktop 的界面中看到你的 MCP 服务器,以及它所提供的工具。也许是连接你的 CRM 系统的接口、通往内部知识库的网关,或者是操作企业数据的智能工具?这个公众号,记录的不是鸡汤,也不是“割韭菜”的教程,而是我一个程序员真实的思考、学习、实战经验,以及从困惑到突破的全过程。Claude 会请求使用相应的工具,从你的 MCP 服务器中检索课程信息,并将其包含在回复中。

wuchsh123的专栏 1084

工控安全政策系列导读:国际标准IEC 62443标准系列

IEC 62443由ANSI/ISA提出,被ISO/IEC采纳,所以该标准会以不同的名字出现,包括:ANSI/ISA-99,ISA-99,ISA 62443,ISO/IEC 62443,ISO 62443,IEC 62443。其中IEC 62443-2-1已等同采纳为国标,于2016年10月发布,标准编号为GB/T 33007。 IEC 62443是在国...

weixin_34132768的博客 2622

ROS2节点通信实战:用C++手写一个‘智能小车’控制模型(附完整代码)

本文详细介绍了如何使用ROS2和C++构建一个智能小车控制模型,涵盖运动控制节点、电池管理服务、参数动态配置和Rviz可视化等核心功能。通过实战项目演示ROS2节点通信机制,帮助开发者快速掌握机器人开发的关键技术,并提供了完整的代码实现和系统集成方案。

weixin_30607029的博客 261

小白必读:手把手教你创建第一个MCP服务【附常用的MCP网站】

最近阅读了不少MCP教程,发现许多文章只提供概念和演示示例,却缺少环境配置、编辑器设置等关键步骤。看完后仍然不知从何入手,也不清楚如何开发自己的MCP服务。希望这篇文章能帮助你从0到1入门搭建本地的MCP服务,后续我们解锁更高阶的课程。

刘大大AI的博客 3731

PX4开发环境搭建(Ubuntu1804+QGC+Qt Creator )

文章目录前言一、安装环境二、PX4环境搭建1. 在虚拟机中安装Ubuntu2. 安装PX4环境(1)下载PX4源码:(2) 安装工具链(3) jMAVSim仿真(4) 编译验证三、安装QGC四、安装Qt Creator 前言 在这之前作者完全没接触过PX4,安装过程遇到了很多坑,而且每安装下载一个东西都要等好久,出现问题又要重新开始,前后折腾了四天才弄好,希望此文对大家有所帮助。 一、安装环境 ...

Beyonderwei的博客 9021

MCP(一):创建你的第一个MCP服务(0->1)

本文介绍了如何从零开始创建第一个MCP服务项目。教程分为环境配置和MCP客户端实现两部分:环境配置包括初始化项目、创建虚拟环境、安装依赖及设置OpenAI API密钥;MCP客户端部分详细讲解了通过Python代码实现与MCP服务器的连接、工具调用和基于大模型的查询处理流程。核心功能是通过OpenAI的function calling机制,动态调用服务器端工具并整合结果,实现智能问答交互。项目示例展示了如何将MCP框架与OpenAI API结合,构建一个支持工具扩展的智能对话系统。

新人制作,若有问题,请私聊我,或评论区 1140

使用 Python 和蒙特卡罗计算未来股价走势以及历史波动率和隐含波动率

蒙特卡罗模拟等工具使投资者能够洞察一系列潜在的未来。这远离了单纯的猜测,迈向了明智的、数据驱动的决策。

探索人工智能领域 707

浪涌抗扰度部分解读

8.3 测试仪器: 8.3.1浪涌发生器(对于连接到对称通信线的接口采用10/700us的组合波发生器;对于其他情况采用1.2/50us(8/20us)组合波发生器,输出极性正负可调、移相范围0-360°可调,最大重复率至少每分钟1次,开路输出电压0.5-4kV,电源线的话有效效输出阻抗为2Ω,通信线的话有效输出阻抗为40Ω) 8.3.2 耦合/去耦网络 8.3.3 参考接地平板 8...

喵叫兽的博客 2503

Java 从零开始:用 Spring Boot 创建你的第一个 MCP 服务

本文面向 Java 初学者,手把手讲解如何使用 Spring Boot 创建一个简单的 MCP(Model Context Protocol)服务器。包含完整代码、配置说明及接入 Claude Desktop 的部署流程,让 AI 能调用你自己编写的工具。

wcx18526659867的博客 748

踩遍Windows所有坑:Codex CLI桌面端+命令行双环境安装避坑实战

Windows下装Codex CLI的坑,本质上都是Windows本身的路径、环境变量、权限、编码这些历史遗留问题,和工具本身关系不大。只要避开中文路径、正确配置PATH、注意终端环境差异,其实安装非常简单。这套双环境方案配好之后,桌面端适合可视化调试、多会话管理,终端适合嵌入编辑器、脚本调用,一套配置两边通用,体验还是很流畅的。按照上面的流程走,基本不会出大问题,就算出问题也能在排查表里找到对应解法。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 298

创建你的第一个MCP服务:用TaoToken统一Key打通本地工具链

用不到80行Python代码创建第一个MCP服务,查询本地SQLite表结构并接入Cline。通过TaoToken统一Key管理多个MCP工具的模型鉴权,避免重复配置。含可复制代码与401、local proxy failed等报错排查。详见 https://taotoken.net/?utm_source=taotoken_aicg_blog_end

weixin_35705784的博客 184

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Spring MCP零基础入门:5分钟创建你的第一个微服务通信

Spring MCP是Spring生态中用于微服务通信的轻量级协议,特点是对新手友好、配置简单。相比其他方案,它隐藏了复杂的底层细节,让开发者能更专注于业务逻辑。

EmeraldEagle36的博客 606

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java 从零开始:用 Spring Boot 创建你的第一个 MCP 服务并接入 TaoToken

用 Spring Boot 从零搭建 Java MCP 服务,通过 @Tool 注解暴露取时间、整数求和两个工具,打包 JAR 后接入 TaoToken 统一 Key 通道验证连通性。含 pom 配置、工具类、MCP 注册与 401、路径拼接等常见报错排查,官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 可获取 Key 与文档。

weixin_35749786的博客 6

在 Java 中创建你的第一个 Model Context Protocol (MCP) 服务器:从零到可运行

用 Spring Boot + Maven 从零搭建 Java MCP 服务器,注册课程查询工具并跑通 stdio 与 SSE 传输。文中给出完整 pom 依赖、@Tool 注册代码与 MCP Inspector 联调步骤,配合 TaoToken 官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 获取 Key,即可让 AI 客户端直接调用你的 Java 业务工具。

weixin_32445049的博客 190

在 Java 中创建你的第一个 Model Context Protocol (MCP) 服务器:Spring Boot + TaoToken 配置骨架

用 Spring Boot 搭建 Java MCP 服务器,从 pom.xml 依赖、application.yml 配置到 @Tool 工具类一次跑通。文中给出 STDIO 模式关键配置与 JSON-RPC 验证命令,并接入 TaoToken 统一管理模型 Key 与 API 通道,官网 https://taotoken.net/?utm_source=taotoken_aicg_blog_end 可注册获取。

weixin_42612804的博客 11

智能体的Hello World——构建第一个MCP

《智能体开发指南:基于国产大模型的MCP实践》摘要 本教程介绍如何通过Model Context Protocol(MCP)开发智能体应用,完全基于国产大模型实现。MCP作为标准化协议,包含Host/Client/Server三层架构,支持Stdio和HTTP两种通信方式,提供Tools、Resources、Prompts三大核心功能。教程通过两个案例演示:1)基础计算器服务,展示工具/资源/提示的注册与调用;2)Arxiv论文查询服务,实现关键词搜索并返回最新论文。配套代码提供本地测试方案,开发者可通过P

guopeiAI 659

MCP 实战第一课:让 DeepSeek 接管你的电脑

MCP 作为 AI 与外部工具交互的标准协议,极大提升了自动化能力。掌握 MCP 的基本原理和配置方法,可以帮助你高效利用 AI 进行开发和数据处理。

weixin_72959097的博客 3410

AIGC入门,程序员的第一个MCP例子

本文展示了一个基于MCP协议的时间查询服务器示例。该Python脚本提供了四个主要功能:1)获取指定时区的当前时间并可自定义格式;2)查询特定时区的详细信息;3)列出常用时区可按地区过滤;4)计算两个时区之间的时间差。服务器通过标准输入/输出(stdio)方式运行,使用pytz库处理时区转换,并提供了清晰的错误处理机制。每个功能都定义了输入参数模式,支持默认值设置,确保接口的易用性。

明月专栏 954

MCP快速入门实战案例

5分钟搭建第一个MCP Server 二、5分钟搭建第一个MCP Server 示例:创建一个天气查询服务 定义工具描述符() 实现Server逻辑(Python示例) 启动并测试 三、连接AI模型实战(以Claude为例) 配置MCP Host 用户交互示例

漫谈网络 921
上一篇: 「10秒魔法」轻松捕获消失元素!揭秘让隐藏DOM现形的黑科技
下一篇: MCP SDK:让 AI 轻松调用外部服务的神奇桥梁
wakangda
博客等级 码龄8年 445粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值