创建你的第一个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主机集成测试 扩展建议:包括权限控制、日志记录和功能扩展方向 该 阅读详情

相关推荐

Quartus安装Altera USB-Blaster安装驱动程序出现问题(代码39)的解决办法

Quartus安装Altera USB-Blaster安装驱动程序出现问题(代码39)的解决办法

MCU_HOT的博客 1万+

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

tewa-707e光猫超级密码获取方法

这款光猫很魔性,没有WIFI,没有USB接口,没有Telnet,试了很多方法去获取超级密码都不行。解密时可能会报错,可能是文件后面部分不晓得是咋拼接过来的,用AES解密时分组数据有问题。3、这个文件是用AES加密了的,直接打开是乱码,所以得用AES解密,key为16个字节的 x00。打开解出来的文件,然后搜索 telecomadmin,就可以发现超级密码了。参考资料里面的光猫不是同一款,但解密的方法基本相同的。

shaowl111的专栏 1万+

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

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

wuchsh123的专栏 1084

解决VMware与Hyper-V/Device Guard冲突的实用指南

本文详细解析了VMware与Hyper-V/Device Guard冲突的根源,并提供了三种实用的解决方案:彻底关闭相关功能、通过启动配置实现选择性引导,以及使用VMware Workstation Pro的Hyper-V兼容模式。指南包含清晰的诊断步骤、操作命令和避坑建议,帮助用户根据自身需求灵活选择,实现虚拟化环境的稳定运行或高效共存。

weixin_29306317的博客 684

Bulk / Smart-seq2数据分析一般流程

Bulk RNA-seq(RNA-Seq of bulk samples)是一种RNA-Seq技术应用,它是通过将整个组织或细胞群体的RNA提取并混合,进行高通量测序来分析基因表达的技术。转录本定量结果可以用于后续的差异表达分析和聚类分析。功能注释和富集分析:对差异表达基因进行功能注释和富集分析,以帮助理解差异表达基因的功能和调控网络,从而获得对研究样品的更深入的理解。数据可视化:最后,将聚类分析的结果进行可视化,可以使用常见的数据可视化工具,如ggplot2、Plotly等,来帮助用户更好地理解数据。

weixin_54519672的博客 5348

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

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

刘大大AI的博客 3729

如何导入su_利用GIS快速生成SU场地模型

01|前言:进入2021年了,希望大家也是一个新的开始。告诫自己多写文章多更新,多读点书多旅行。然而元旦由于出去玩了4天,积累了一些事情要处理,一直没有时间好好写点东西。今天给大家带来的分享主题叫“利用GIS快速生成SU场地模型”。相关的视频方法其实B站上也有,但我相信视频很多人都不会看,我自己也是。直接给大家上操作流程。主要的操作步骤是【获取场地的矢量shp文件】—【导入ArcScen...

weixin_33806859的博客 9813

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

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

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

500道C++面试高频题解析(附答案、实战示例与进阶追问)

本文提供500道C++面试高频题的详细解析,涵盖基础概念到进阶应用,包括面向对象编程、内存管理、现代C++特性、并发编程等核心考点。每道题配有实战示例和进阶追问,帮助开发者突破八股文局限,掌握解决实际问题的能力,适合准备C++技术面试的工程师系统复习。

weixin_29002595的博客 311

2026年全球VCSEL芯片竞争格局揭秘:美欧亚“三足鼎立”,中国军团强势崛起

全球VCSEL芯片市场迎来爆发期,预计2032年规模将达110亿元。美国Lumentum、Coherent等巨头主导消费电子和光通信领域,欧洲ams-OSRAM、TRUMPF则在车规级高功率VCSEL占据优势。中国企业如长光华芯、纵慧芯光加速追赶,实现从3D传感向激光雷达的技术跨越。行业未来聚焦高功率、多结阵列化发展,自动驾驶和AI算力需求将推动市场持续增长,但面临技术壁垒、供应链依赖等挑战。国际巨头与中国厂商将在这一光芯片赛道展开激烈竞争。

致力于lidar应用开发 782

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

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

wcx18526659867的博客 747

基于Simulink的电机功率因数校正仿真

PF=SP​=视在功率有功功率​=cosϕ⋅Irms​I1​​(非正弦时)位移因数(cosϕ):基波电压电流相位差畸变因数(I1​/Irms​):谐波导致电流有效值增大本文带你完成了电机系统功率因数校正的Simulink仿真,实现了:✅ 理解了低功率因数的成因与危害✅ 搭建了无PFC、无源PFC、有源PFC三种对比模型✅ 掌握了Vienna整流器建模与dq解耦控制方法✅ 实现了PF与THD的自动计算与评估✅ 验证了有源PFC在PF、THD、稳定性上的全面优势。

amy_mhd的博客 154

创建你的第一个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

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

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

EmeraldEagle36的博客 606

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

在 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、付费专栏及课程。

余额充值