MCPサーバ(Model Context Protocol server)をPythonでつくってPyPIに公開する
MCPサーバをPythonで作って、PyPIに公開する手順をまとめました。
これでuvxでサーバを呼び出せるようになります。
TypeScript npm版の手順も記載しました。
プロジェクトの作成
create-mcp-server を使うと、Resources, Tools, Promptsのサンプルが実装されているテンプレートを簡単に作成できます。
作りを見てみるとResources, Tools, Promptsそれぞれで、 定義を公開する用のデコレータと実際の処理を実装する用のデコレータをつけた関数を用意してあげれば良いみたいです。
uvx create-mcp-server
Creating a new MCP server project using uv.
This will set up a Python project with MCP dependency.
Let's begin!
Project name (required): sample-project
Project description [A MCP server project]:
Project version [0.1.0]:
Project will be created at: path\to\sample-project
Is this correct? [Y/n]:
起動の確認
uv syncで環境を更新して、 npx @modelcontextprotocol/inspector を実行するとブラウザが立ち上がり、動作を確認できます。
cd path\to\sample-project
uv sync --dev --all-extras
npx @modelcontextprotocol/inspector uv run sample-project
後はsrc内にあるコードを書き換えてコーディングです。
Claude DesktopやClineから参照する場合の設定は以下の通りです。 ローカルで動かすだけならここまででも大丈夫です。
"sample-project": {
"command": "uv",
"args": [
"--directory",
"path\\to\\sample-project",
"run",
"sample-project"
]
}
run
の後の名称はpyproject.toml
で定義している[project.scripts]
のコマンドが呼ばれているようです。
[project.scripts]
sample-project = "sample_project:main"
テストと公開の準備
uvを使ってPyPIテスト環境に公開する手順と同様です。
まずテストやPyPIの公開で使うためのパッケージを先に追加しておきます。
uv add --dev pytest pytest-cov pytest-asyncio black ruff mypy build twine hatch
テストは以下で実施できます。
uv run pytest
uv run pytest --cov=sample-project tests/
コードのチェックは必要に応じて以下で行います。
uv run black .
uv run ruff check .
uv run mypy src/sample-project
PyPIへの公開
PyPI · The Python Package Indexにアカウントを作ってトークンを発行しておきます。 後は「uv publish」でPyPIへの公開が完了です。
uv sync
uv build
uv publish --token YOUR_TOKEN
uvxでの動作確認
ここまでの手順に問題がなければ以下でMCPサーバの動作が確認できます。
npx @modelcontextprotocol/inspector uvx sample-project
クライアントでの設定は以下のようになります。
"sample-project": {
"command": "uvx",
"args": [
"sample-project"
]
}
実際のサンプル
以下コードのサンプルです。
補足
テスト用のPyPIでも以下で動きそうなものなのですがだめでした。
npx @modelcontextprotocol/inspector uvx --index-url https://test.pypi.org/simple/ sample-project
どうも必要なライブラリがtest.pypi.orgの方にはないらしいです。
× No solution found when resolving tool dependencies:
╰─▶ Because only mcp==0.8.0.dev0 is available and sample-project==0.1.0 depends on mcp>=1.2.0,
we can conclude that sample-project==0.1.0 cannot be used.
And because only sample-project==0.1.0 is available and you require sample-project,
we can conclude that your requirements are unsatisfiable.