MCP Server 发布最佳实践
原文链接:MCP Server 发布最佳实践
项目结构
以下是一个标准的 Python 包代码结构示例,结合 uv 的项目管理方式
your-package-name/
├── pyproject.toml # 项目元数据(必填)
├── .python-version # 指定 Python 版本(可选)
├── src/ # 包代码目录(推荐布局)
│ └── your_package/
│ ├── __init__.py # 初始化模块
│ └── core.py # 核心功能代码
├── tests/ # 测试目录(可选)
│ ├── __init__.py
│ └── test_core.py
├── README.md # 项目说明
├── LICENSE # 开源协议
└── examples/ # 使用示例(可选)
└── demo.py
pyproject.toml
[build-system]
requires = ["setuptools>=61.0"]
build-backend = "setuptools.build_meta"
[project]
name = "your-package-name"
version = "0.1.0"
authors = [
{name = "Your Name", email = "you@example.com"},
]
description = "A brief description of your package"
readme = "README.md"
requires-python = ">=3.8"
classifiers = [
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
]
[project.urls]
Homepage = "https://github.com/yourusername/your-package"
# 依赖声明
[project.dependencies]
requests = "^2.31.0" # 示例依赖
# 开发依赖(可选)
[project.optional-dependencies]
dev = [
"pytest>=7.0",
"ruff>=0.5.4",
]
模块代码(src/your_package/core.py)
"""核心功能模块"""
def greet(name: str) -> str:
"""返回问候语"""
return f"Hello, {name}!"
构建和发布
在项目根目录下执行
uv build # 构建,完成后会生成目录 dist,下面放着压缩包
uv publish dist/* # 需要输入密码
twine upload dist/* # 或者使用这个命令,配置 ~/.pypirc后不需要手动输入密码
创建 ~/.pypirc,内容如下
[distutils]
index-servers =
pypi
[pypi]
repository = https://upload.pypi.org/legacy/
username = __token__
password = ****
https://pypi.org/manage/account 获取 API token


使用
上传到 pypi 上后,就可以在 MCP Client 上使用了
{
"mcpServers": {
"mcp-server-name": {
"command": "uvx",
"args": [
"mcp-server-name"
]
}
}
常见问题
发布后清理缓存
uv cache clean
强制升级/重新下载
上传的文件名已经存在
Error: This filename has already been used, use a different version.
使用 --verbose 选项来获取更详细的错误信息
twine upload --verbose dist/*
如果当前目录下不存在该文件,但是还是提示文件名已经被使用。PyPI 服务器可能存在缓存,导致它仍然认为该文件名已被使用。有时候服务器的缓存需要一些时间来更新,你可以等待几个小时之后再尝试上传。
引用同级目录包,提示包不存在
如果引用同目录的包时,需要在前面加上 "."
因为在 Python 3 中,为了避免隐式相对导入带来的一些问题,它默认使用绝对导入。如果你想要进行相对导入,就需要显式地使用 . 或 .. 来指明相对路径。这里的 . 代表当前包,.. 代表上一级包。
避免命名冲突:使用显式相对导入可以避免命名冲突。假如你的项目中有一个模块名和 Python 标准库或者第三方库中的模块名相同,使用绝对导入可能会导入到错误的模块。而使用显式相对导入可以确保你导入的是当前包内的模块。
需要注意,显式相对导入只能在包内部使用。也就是说,只有当你的代码位于一个包中(即包含 __init__.py 文件的目录)时,才能够使用相对导入。如果你尝试在脚本文件(非包内模块)中使用相对导入,就会引发 ImportError

最后给如果需要购买服务器的,可以使用这里的优惠码,可以享受8折优惠
MCP Server 发布最佳实践的更多相关文章
- 阿里巴巴发布最佳实践 | 阿里巴巴DevOps实践指南
编者按:本文源自阿里云云效团队出品的<阿里巴巴DevOps实践指南>,扫描上方二维码或前往:https://developer.aliyun.com/topic/devops,下载完整版电 ...
- SQL Server集成服务最佳实践:语句优化
SQL Server集成服务(SQL Server Integration Services,SSIS)在其前辈DTS(Data Transformation Services,数据转换服务) ...
- HTTP/2之服务器推送(Server Push)最佳实践
商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. WeTest 导读 HTTP/1.X出色地满足互联网的普遍访问需求,但随着互联网的不断发展,其性能越来越成为瓶颈.IETF在2015 ...
- SQL Server SA 最佳实践(也许不仅仅是翻译)
老实说,本文主要部分是翻译的,并且由于英语水平的问题,我没有完全翻译,有些我觉得不重要的就跳过了,目前看来应该八九不离十,或者说不会影响最终效果,对于英语水平好的读者,可以自行查看原文.但这一年里面我 ...
- 【译】索引进阶(十七): SQL SERVER索引最佳实践
[译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正] 原文链接:传送门. 在本章我们给出一些建议:贯穿本系列我们提取出了十四条基本指南,这些基本的指南将会帮助你为你的数据库创建最佳的索引 ...
- SQL Server CDC最佳实践
企业核心业务系统oltp的数据需要通过ETL同步到数据仓库,原始的ETL流程通过定制化从SQL Server中进行数据抽取,经过生产环境的监控,发现ETL过程的query会对生产系统造成额外负载.于是 ...
- 清除系统日志及数据库(sql server)日志最佳实践
在一个项目中遇到的问题:系统日志过大,后来用delete语句删除了(相当的慢),结果数据库日志又变成很大了(差不多10G),所以又得把数据库日志删除. 方法: --备份系统中的部份日志--SELECT ...
- Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践(二)
Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践(一) 接上一篇 3. Nginx配置反向代理 3.1 cnetos 安装nginx 首先,我们需要在服务器上安装N ...
- Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践(一)
环境 本地 win7 服务器:Virtual Box 上的Centos ssh工具: Xshell 文件传输: xftp 1.在本地创建asp.net core应用发布 1.1 使用Vs2017 新建 ...
- Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践
原文:Asp.NetCore程序发布到CentOs(含安装部署netcore)--最佳实践 环境 本地 win7 服务器:Virtual Box 上的Centos ssh工具: Xshell 文件传输 ...
随机推荐
- Nginx配置HTTPS认证
概述 什么是https? 可以阅读这篇文章:https://www.cnblogs.com/huangSir-devops/p/18806406 在生产环境中,网站的访问一般都是使用https加密的, ...
- Shell常用指令操作
sed命令 替换目录下所有文件的某个字符串 sed -i 's/test/yuhaohao/g' `grep -lr yuhaohao *` export 函数到外部使用 functon test() ...
- Python 潮流周刊#106:PEP-734 正式接纳,多解释器时代来临(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 400+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- 干货|三个维度详解 Taier 本地调试原理和实践
在平时和开发者们交流的过程中,发现许多开发朋友尤其是新入门 Taier 的开发者,对于本地调试都有着诸多的不理解和问题.本文就大家平时问的最多的三个问题,服务编译,配置&本地运行,如何在 Ta ...
- async与defer的区别
`async` 和 `defer` 是两种不同的JavaScript特性,它们的主要区别在于它们的执行顺序和时间点. `async` 意味着函数或代码块会被异步执行.当浏览器遇到带有 `async` ...
- MongoDB入门实战教程(13)
MongoDB的一大特色就在于其原生的横向扩展能力,具体体现就是分片集.本篇,我们来了解一下MongoDB分片集的机制及其原理. 1 为什么要分片? 我们都知道,在关系型数据库如MySQL中,当数据量 ...
- C# HttpListener 的使用方法
关于监听回调两次的原因,可能是因为重新监听导致的,所以查到微软上面的解析是说 BeginGetContext方法开始异步 (非阻塞) 调用以接收传入的客户端请求. 在调用此方法之前,必须调用 Star ...
- 485转lora、232转lora
lora物联网网关ZLAN9743可以实现RS232/485/422/以太网转 LoRa功能 是一款高性价比远距离无线通讯方案.LoRa和GPRS.4G方案相比它无需入网月租费,和Wifi.Zigbe ...
- CF576A Vasya and Petyas Game 题解
CF576A Vasya and Petya's Game 数论思维题. 根据唯一分解定理,可以知道,如果一个数的各个质因数的数量确定了,这个数也就确定了. 每次询问的中,如果 \(x\) 是 \(y ...
- 渐入佳境--从零开始建设k8s监控之pushgateway(四)
前言 书接上文,prometheus默认是采取pull的方式获取数据,但是有些情况我们依然希望能够主动推数据给prometheus pushgateway就像是一个提供监控数据的静态节点,promet ...