从0到1开发一个自己的工具 MCP 并发布到 test PyPi(Python个人版)

目录

  • 1. 我理解的 MCP
  • 2. 写一个自己的MCP然后发布到 PyPi 上,包括加法工具和获取当前 ip 工具
    • 2.1 先碎碎念一下 uv
    • 2.2 初始化项目(全程在 cmd 下运行命令)
    • 2.3 添加 mcp 依赖
    • 2.4 添加 server.py,先把加法功能添加上
    • 2.5 运行并测试加法功能
    • 2.6 再添加获取当前本地 ip 功能并测试
  • 3. 打包发布到 test PyPi
  • 4. 测试已发布的包
  • 5. MCP 的一些资源

1. 我理解的 MCP

  • 官方的套词就不说了,到处都是,这里说说个人的理解,仅供参考
  • 目前 AI 的能力在一点一点的进步,但是 AI 的世界和真实的世界还是隔着十万八千里,AI 知道时间是什么,但是不知道现在几点;AI 的知识库停留到它训练的那一刻,它不知道最新的工具文档和代码包;AI 知道怎么开车,但是它看不到路,摸不到方向盘,踩不了刹车。
  • 大家发现没有,这里面 AI 缺了什么能力?对,缺乏和真实世界产生联系的能力。而 MCP 就是用来做这个的,让 AI 可以跟真实世界发生联系,来回互动。这个我个人觉得就是 MCP 最大的意义。
  • 有了 MCP,当你问 AI 现在几点,它就不会再乱编了,会去调用时间 MCP,获取真实的时间;有了 MCP,当你问 AI 一个最新出炉的技术文档,它也不会再乱编了,会去调用网络查询 MCP,获得最新的内容,整理后发给你;有了 MCP,它就可以开车,只要你把看路的能力,转动方向盘的能力,刹车的能力给它,它就能开,能转弯,能刹车。

2. 写一个自己的MCP然后发布到 PyPi 上,包括加法工具和获取当前 ip 工具

官方 Python SDK 地址

2.1 先碎碎念一下 uv

  • 官方的 Python SDK 使用的是 Python 一个新的包管理工具,uv,已经写了一篇前置文章把 uv 的简单使用刷了一下,快速用 uv 模拟发布一个 Python 依赖包到 TestPyPI 上,以及常用命令
  • 为什么要模拟发布呢,因为 MCP 这东西太新了,要求的 Python 版本是3.10起步,而我本地是3.9,不想不敢升级,印象中之前升级遇到坑,有一些老 Python 项目无法兼容3.10,似乎3.10删了一些东西,无法理解,不向下兼容,坑死了。
  • 拉回来,其实一开始是陷入了牛角尖,一直在琢磨如何测试 MCP 的效果,也是因为第一次接触 MCP,对这个东西的运行机制不了解,虽然它一出来的时候就关注到了,但是网上的 MCP 例子,都是什么操控数据库啦,操控 git 啦,操控聊天工具啦,其实都没有什么本质上的提效(针对程序员来说),就一直没有试用。
  • 这一次正正经经的试用,起因其实是 Augment,太好用了,但也太慢了,不可能一直盯着它看进度,就想着做一个通知类的 MCP,让 Augment 在运行结束后通知一下我,这样可以把正在摸鱼的我拉回电脑前。
  • 接下来我们来尝试开发一个简单的 MCP,就叫 mcp-scoful-demo,功能包括加法、获取当前本地 ip 地址

2.2 初始化项目(全程在 cmd 下运行命令)

uv init --lib mcp-scoful-demo # 初始化
cd mcp-scoful-demo # 进入初始化的目录

2.3 添加 mcp 依赖

uv add "mcp[cli]"

2.4 添加 server.py,先把加法功能添加上

  • mcp-scoful-demo目录下,找到src/mcp-scoful-demo,添加server.py,内容如下:
cd src
cd mcp-scoful-demo
code server.py #假设你本地已经安装了 vs code
  • 把下面的代码复制进 server.py
# server.py
from mcp.server.fastmcp import FastMCP# Create an MCP server
mcp = FastMCP("mcp-scoful-demo")# 不是老说 AI 不会计算吗?那我们直接给 Ai 安排上加法功能,让 AI 再也不会算错了 hh
# Add an addition tool
@mcp.tool()
def add(a: int, b: int) -> int:"""Add two numbers"""return a + b

2.5 运行并测试加法功能

uv run mcp dev server.py
  • 上面这个命令运行成功后,会自动出这样的链接
    在这里插入图片描述
  • 按住 Ctrl 键,点击 http://127.0.0.1:6274,会跳转浏览器,打开这样一个界面,这个是官方出的基于 Node 的一个测试工具,可以测试本地开发的或者已经发布出去了的 MCP,使用上面的命令是直接指定要运行我们开发的 MCP,如果单纯只是想运行起来这个inspector工具,可以使用命令:npx @modelcontextprotocol/inspector
    在这里插入图片描述
  • 啥都不用管,CommandArguments已经自动配好了,直接点Connect,出现下面这样Connected,就表示连上了我们开发的 mcp 了,如果报错了,Connected 下面会出红色的日志,但其实没卵用,有个坑是,在 server.py 里使用 print 打印,这里是不显示的,必须引入 logging,然后使用 logging.error(),内容才会在这里显示。另外 MCP 开发目前我还没找到断点 debug 的方式,如果知道的大佬,麻烦评论一下。
    在这里插入图片描述
  • 接下来获取一下我们开发的加法功能
    在这里插入图片描述
    在这里插入图片描述
  • 测试一下加法功能
    在这里插入图片描述
  • 当当当,一个简单的 MCP 就这样做好了,是不是好简单?!

2.6 再添加获取当前本地 ip 功能并测试

  • 在代码最后加上
# 获取当前本地 ip 地址
import httpx
@mcp.tool()
async def fetch_current_ip() -> str:"""fetch current ip"""async with httpx.AsyncClient() as client:response = await client.get(f"https://ipinfo.io/ip")return response.text
  • inspector 里重启一下 MCP,因为修改代码了
    在这里插入图片描述
  • 按照之前的步骤,List tools,选择新的 Tool,再 Run Tool
    在这里插入图片描述
  • done,又搞定一个 tool

3. 打包发布到 test PyPi

  • 修改 __init__.py

    • 清空原来的内容
    • 修改内容如下:
      from .server import servedef main():# Call serve functionserve()if __name__ == "__main__":main()
      
  • 修改 pyproject.toml

    • 在最后追加内容
      [[tool.uv.index]]
      name = "testpypi"
      url = "https://test.pypi.org/simple/"
      publish-url = "https://test.pypi.org/legacy/"
      explicit = true[project.scripts]
      mcp-scoful-demo = "mcp_scoful_demo:main"
      
  • 发布到 test PyPi,按照下面的命令依次运行,具体详细说明请看《快速用 uv 模拟发布一个 Python 依赖包到 TestPyPI 上,以及常用命令》

    • uv sync
    • uv lock
    • uv build
    • uv publish --index testpypi # 这个就是发布命令,如果是发生产,不用–index
    • 结果如下:
      在这里插入图片描述

4. 测试已发布的包

  • 等待5-10分钟,需要同步一下
  • 使用命令:npx @modelcontextprotocol/inspector,打开 inspector
    在这里插入图片描述
  • 一样点击跳浏览器,然后在Command里输入:uvx --default-index https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ mcp-scoful-demo,(PS:这里可以指定版本号,mcp-scoful-demo==0.1.1,另外如果是发布到生产环境,格式是:uvx mcp-scoful-demo),确保Arguments里没内容,然后切换 Tools 标签,点击 List Tools,随便选一个工具,Run Tool
    在这里插入图片描述

5. MCP 的一些资源

  • 官方的开源组织 Model Context Protocol
  • 官方文档
  • 几个社区 MCP 库(老实说,都没啥意思,对程序员写码有用的没几个)
    • https://mcp.so/
    • https://cursor.directory/
    • https://www.pulsemcp.com/
    • https://glama.ai/mcp/servers

over, enjoy!!!
如对您有帮助,感谢投喂!
微信感谢投喂版

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/84913.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ缓存详解:由来、发展、核心场景与实战应用

一、RabbitMQ的由来与发展历程 1.1 RabbitMQ的诞生背景 RabbitMQ诞生于金融行业的需求,最初由Rabbit Technologies Ltd开发,后被SpringSource收购,最终成为Pivotal的一部分。它的设计初衷是为了解决分布式系统中消息可靠传输的问题。在早期金融交易系统中,系统间的通信需…

机器学习与深度学习18-线性代数01

目录 前文回顾1.特征向量和特征值2.矩阵与模型3.内积和外积4.向量的范数5.正交矩阵 前文回顾 上一篇文章地址:链接 1.特征向量和特征值 在机器学习中,特征向量和特征值是用于描述数据集中的特征或变量之间关系的重要概念。它们在降维技术(…

如何让 VS Code 仅通过滚轮放大字体,而不缩放整个界面?

在 VS Code 中,默认情况下使用 Ctrl滚轮(Windows/Linux)或 Cmd滚轮(Mac)会同时缩放整个界面(包括 UI 元素和编辑器字体)。如果你希望仅放大编辑器字体而不影响界面缩放,可以通过以下…

Vue3中v-bind指令用法详解

在 Vue 3 中&#xff0c;v-bind 是一个核心指令&#xff0c;用于动态绑定 HTML 属性或组件的 props 到 Vue 实例的数据。以下是详细讲解&#xff1a; 一、基础用法 1. 绑定单个属性 vue 复制 下载 <template><!-- 绑定 img 的 src 属性 --><img v-bind:src…

算法题(169):最大子段和(分治思想)

审题&#xff1a; 本题需要我们找到区间的最大子段和并输出结果 思路&#xff1a; 方法一&#xff1a;分治思想 我们可以把给定区间平均分成两部分&#xff0c;然后获取左段区间的最大子段和&#xff0c;右段区间的最大子段和&#xff0c;以及跨区间的最大子段和。最后比较出他…

Linux 线程深度解析:从内存管理到线程控制的核心机制

文章目录 引言一、Linux 线程概念1.1 什么是线程1.2 分页式存储管理1.2.1 虚拟地址和页表的由来1.2.2 物理内存管理struct page 的主要用途 1.2.3 页表1.2.4 页目录结构1.2.5 两级页表的地址转换1.2.6 缺页异常 1.3 线程的优点1.4 线程缺点1.5 线程异常1.6 线程用途 二、Linux进…

玩转计算机视觉——按照配置部署paddleOCR(英伟达环境与昇腾300IDUO环境)

英伟达环境安装 创建虚拟环境 conda create -n paddleOCR python3.10 -y conda activate paddleOCRconda install jupyterlab -y conda install ipykernel -y python -m ipykernel install --user --name paddleOCR --display-name "paddle OCR"下载PaddleOCR的GPU…

Java机器学习全攻略:从基础原理到实战案例详解

在当今AI驱动的技术浪潮中,机器学习已成为Java开发者必须掌握的核心技能之一。本文将系统性地介绍Java机器学习的原理基础、常用框架,并通过多个实战案例展示如何在实际项目中应用这些技术。无论你是刚接触机器学习的Java开发者,还是希望巩固基础的中级工程师,这篇文章都将…

eBPF 技术详解及其在网络安全领域的应用与挑战

摘要 eBPF&#xff08;extended Berkeley Packet Filter&#xff09;是 Linux 内核中的一项革命性技术&#xff0c;它允许用户在不修改内核代码或加载内核模块的情况下&#xff0c;安全、高效地运行自定义程序。eBPF 的出现极大地扩展了 Linux 内核的可编程性&#xff0c;使其…

error:MISCONF Redis is configured to save RDB snapshots

一、背景 在使用redis异步驱动方式下&#xff0c;执行hset指令时&#xff0c;报错 redisAsyncCommand((redisAsyncContext *)c, dumpReply, "hset role:10001", "hset role:10001 name %s age %d sex %s", "mark", 31, "male");二、原…

Android-Mod-Menu 使用教程

目录 简介前提条件安装步骤1. 下载和解压项目2. 配置 Android Studio3. 安装到设备 修改游戏 APK1. 确定游戏主活动2. 集成模组菜单方法 1&#xff1a;通过服务启动&#xff08;推荐&#xff09;方法 2&#xff1a;通过活动启动&#xff08;仅在游戏检测模组时使用&#xff09;…

SpringBoot 自动化部署实战:从环境搭建到 CI/CD 全流程

SpringBoot 自动化部署全流程实战 一、环境准备&#xff08;开发侧&#xff09; 基础工具链安装&#xff1a; # JDK 17 brew install openjdk17 # Maven 构建工具 brew install maven # Docker 环境 brew install --cask docker项目配置验证&#xff1a; <!-- pom.xml 关…

Flutter动画与交互:打造流畅用户体验的完整指南

在移动应用开发中&#xff0c;流畅的动画和自然的交互是提升用户体验的关键因素。Flutter作为Google推出的跨平台UI工具包&#xff0c;提供了一套强大而灵活的动画系统&#xff0c;使开发者能够轻松创建专业级的动画效果。本文将深入探讨Flutter中的动画与交互技术&#xff0c;…

山东大学软件学院项目实训:基于大模型的模拟面试系统项目总结(九)

在山东大学软件学院的项目实训中&#xff0c;团队成员们围绕基于大模型的模拟面试系统展开了一系列开发与优化工作。以下是本周项目的核心进展与成果总结。 前端界面优化与 Bug 修复&#xff08;吴尤&#xff09; Logo 显示问题修复 在项目开发过程中&#xff0c;团队发现项…

14.vue.js的watch()的注意事项(1)

一、 Q &#xff1a;因为 state 有内部的属性 也就是id。 因为要追逐id。所以要写函数&#xff1f;而不能直接监听state。 只监听state &#xff0c;监听不到id的变化吗&#xff1f; A&#xff1a; 为什么监听 state 不等于监听 state.id&#xff1f; 在 Vue 3 中&#xff0…

强化学习入门:价值、回报、策略概念详解

前言 最近想开一个关于强化学习专栏&#xff0c;因为DeepSeek-R1很火&#xff0c;但本人对于LLM连门都没入。因此&#xff0c;只是记录一些类似的读书笔记&#xff0c;内容不深&#xff0c;大多数只是一些概念的东西&#xff0c;数学公式也不会太多&#xff0c;还望读者多多指教…

基于“数智立体化三维架构”框架的医疗数智化机制研究

1 研究背景与框架基础 当前,全球医疗服务体系正经历深刻的数智化转型浪潮,人工智能、大数据、云计算等新一代信息技术与医疗健康领域的融合不断深入,催生了医疗服务模式的革命性变化。在我国,数智化技术已成为提升基层卫生服务质量、促进医疗服务公平可及、增进百姓健康福…

OpenCV CUDA模块图像变形------对图像进行旋转操作函数rotate()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 该函数用于对图像进行 GPU 加速的旋转操作&#xff0c;支持指定旋转角度、缩放中心偏移和插值方法。是 OpenCV CUDA 模块中用于图像旋转的核心函…

【面板数据】中国与世界各国新能源汽车进出口数据-分类别与不分类别(2017-2024年)

新能源汽车作为中国制造高质量发展的重要代表&#xff0c;其进出口数据不仅反映了我国技术实力与产业格局的变化&#xff0c;也是理解全球绿色交通趋势、制定国家战略决策的重要依据。目前国内主流定义判断标准主要参考中国工信部于2009年发布的《新能源汽车生产企业及产品准入…

亚马逊云服务器(AWS)会限制用户使用吗?深度解读AWS资源政策

一、AWS的资源逻辑&#xff1a;为什么说"不限速"&#xff1f; AWS采用"按需分配"的资源配置模式&#xff0c;其核心限制并非来自人为设定&#xff0c;而是取决于&#xff1a; 实例类型配置&#xff08;如t2.micro默认CPU积分制&#xff09; 账户服务配额…