MCP笔记:UVX和NPX
mcp server大多使用python和typescript编写,对应的启动命令分别为uvx和npx,下面将分别具体介绍一下这两种指令。熟悉指令的基础知识,有利于我们安装和调试mcp server
示例1:
{"mcpServers": {"fetch": {"command": "uvx","args": ["mcp-server-fetch"]}}
}
示例2:
{"mcpServers": {"amap-maps": {"command": "npx","args": ["-y","@amap/amap-maps-mcp-server"],"env": {"AMAP_MAPS_API_KEY": "api_key"}}}
}
1、UVX
uvx:UV运行Python包提供的命令。它是uv tool run的简写。
UV是由Astral开发的新一代Python包和项目管理工具。使用Rust编写,速度比pip快10-100倍!它是一体化工具:整合包管理(替代pip)、虚拟环境管理(替代venv)、依赖锁定(替代pip-tools)、Python版本管理(替代pyenv)、脚本运行(替代pipx)等功能。
1.1、UV核心优势
- 极速安装:比pip快10-100倍(上图为安装Polars项目依赖的性能对比)
- 统一工具链:一个工具替代pip、pip-tools、pipx、poetry、pyenv、virtualenv等
- 全面的项目管理:支持依赖管理、环境隔离、锁文件
- Python版本管理:安装和管理不同版本的Python
- 工具运行和安装:可以直接运行和安装Python应用
- 脚本支持:运行单文件脚本、支持内联依赖元数据
- 兼容pip:提供pip兼容接口,无需改变现有工作流
- 跨平台支持:支持macOS、Linux和Windows
1.2、快速安装
UV的安装非常简单,有多种方式可供选择:
方法1:独立安装脚本
macOS/Linux:
curl -LsSf https://astral.sh/uv/install.sh | sh
Windows:
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
方法2:使用pip安装
pip install uv
方法3:Homebrew安装(macOS)
brew install uv
安装完成后,你可以通过在命令行输入uv --version
来验证是否安装成功。
1.3、uv基本用法
1.3.1、创建项目
使用UV创建一个新项目
uv init uv_demo
这个命令会初始化一个新项目,并创建必要的文件结构,包括:
- .gitignore:Git忽略文件
- .python-version:Python版本信息
- main.py:主程序文件
- pyproject.toml:项目配置文件
- README.md:项目说明文件
1.3.2、创建虚拟环境
我是在conda创建的虚拟环境中安装了uv,你可以继续使用uv创建应用的虚拟环境。
cd uv_demo
uv venv
这个命令会在项目目录下创建一个.venv目录,包含虚拟环境。要激活虚拟环境,使用:
# Linux/macOS
source .venv/bin/activate# Windows
.venv\Scripts\activate
1.3.3、安装依赖包
uv安装依赖包非常简单且迅速:
uv add numpy pandas
这个命令会安装最新版本的numpy和pandas,并自动更新pyproject.toml文件中的依赖信息
1.3.4、运行Python脚本
使用UV运行Python脚本:
uv run main.py
这个命令会在虚拟环境中运行main.py文件
1.3.5、依赖锁定
生成锁文件,确保项目依赖版本的一致性:
uv lock
这会创建一个uv.lock
文件,详细记录所有依赖的精确版本和来源。
1.4、高级功能
1.4.1、Python版本管理
UV可以管理多个Python版本:
# 安装特定Python版本
uv python install 3.10 3.11 3.12# 创建特定Python版本的虚拟环境
uv venv --python 3.11
1.4.2、工具管理
像pipx一样,UV可以运行和安装Python工具
# 在临时环境中运行工具
uvx pycowsay 'Hello UV!'# 安装工具
uv tool install ruff
1.4.3、单文件脚本支持
UV支持带有内联依赖元数据的单文件脚本:
# /// [uv]
# dependencies = ["requests"]
# ///import requests
print(requests.get("https://astral.sh").status_code)
然后直接运行:
uv run example.py
UV会自动处理依赖并在隔离环境中运行脚本
1.4.4、pip兼容接口
UV提供了pip兼容的接口,可直接替代pip命令:
# 编译依赖
uv pip compile requirements.in --output-file requirements.txt# 安装锁定依赖
uv pip sync requirements.txt
1.5、UV命令速查表
命令 | 描述 |
uv init <项目名> | 创建新项目 |
uv venv | 创建虚拟环境 |
uv add <包名> | 添加依赖 |
uv remove <包名> | 移除依赖 |
uv run <脚本> | 运行脚本 |
uv lock | 生成锁文件 |
uv sync | 同步环境与依赖 |
uv python install <版本> | 安装python版本 |
uv tool install <工具> | 安装Python工具 |
uvx <工具>[参数] | 运行Python工具 |
2、npx
npx是npm包管理器自5.2.0版本起内置的工具,全称为“Node Package Execute”,核心功能是临时执行Node.js模块命令。它简化了命令行工具的调用流程,无需预先全局或本地安装依赖包即可直接运行特定命令,尤其适合一次性或实验性操作。
npm的核心操作是包的安装与管理(install
、uninstall
等),而npx专注于“按需执行”。npm负责持久化依赖管理,npx负责临时或一次性操作的轻量化执行。
主要优势包括:
- 临时安装可执行依赖包:无需全局安装,避免环境污染
- 自动执行依赖包命令:安装完成后自动运行
- 自动加载 node_modules 中的依赖:无需手动指定
$PATH
- 可执行特定版本的命令:便于测试不同版本
- 支持执行 GitHub 代码仓库:扩展了使用场景
2.1、npx基本用法
2.1.1、执行本地依赖包命令
若项目中已安装某个包(如knex),可直接运行其命令:
npx knex migrate:latest
无需全局安装knex,也无需手动配置package.json的scripts
2.1.2、临时安装并运行包
运行未安装的包(执行后自动删除):
npx create-react-app my-app # 临时安装 create-react-app 并执行
2.1.3、指定版本运行
运行特定版本的包:
npx eslint@7.0.0 --version # 使用 7.0.0 版本的 ESLint
2.1.4、执行远程代码
直接运行GitHub仓库中的代码:
npx https://gist.github.com/user/test # 执行远程脚本
2.1.5、交互式命令模式
进入包的交互式环境(如node REPL):
npx node@14 # 临时使用 Node.js 14 版本
2.2、npx使用示例
传统方式:先全局安装脚手架工具,再使用
# 安装
npm install fast-create-app -g
# 使用
fast-create-app create-app test
传统方式的缺点:
- 全局污染:全局安装的包会影响整个系统环境
- 版本冲突:不同项目可能需要同一工具的不同版本
- 权限问题:全局安装通常需要管理员权限
- 更新困难:全局包不会随项目依赖自动更新
- 存储占用:长期积累大量不再使用的全局包
npx 方式:一步到位,无需全局安装
npx fast-create-app create-app test
npx 的优势:
- 按需临时安装,用完即删
- 自动使用最新版本的包
- 可同时使用不同版本的工具
- 不需要额外的管理员权限
通过 npx,开发者可以更灵活地使用 npm 生态中的工具,无需担心全局环境污染,特别适合尝试新工具、执行一次性命令和管理多版本依赖的场景。
2.3、npx原理
npx 的工作原理可以概括为以下几个步骤:
1、查找执行路径:当执行 npx xxx
命令时,npx 会按照以下顺序查找可执行文件:
- 首先检查
$PATH
环境变量中是否存在该命令- 然后查找当前项目的
node_modules/.bin
目录- 如果都没找到,则临时从 npm registry 安装该包
2、临时安装机制:若需要临时安装,从 npm 仓库下载包到临时目录(通常位于 ~/.npm/_npx
)。命令执行完成后,临时安装的包会被自动删除,不会留下任何痕迹。
3、缓存机制:频繁使用的包会被缓存,避免重复下载。
2.4、npx执行优先级机制
当执行命令时,npx遵循三级查找逻辑
1、本地项目依赖:优先在当前项目的node_modules/.bin目录中查找目标命令,适配项目级工具调用(如项目内配置的ESLint、Jest等)。
2、全局安装包:若本地未找到,检查用户全局安装的npm包(通过npm install -g
安装的模块)。
3、临时下载执行:若前两步均未找到,npx会自动从npm仓库下载目标包到临时目录,执行完成后立即清理,避免磁盘空间浪费。