Contents

how to build a simple mcp tool server from scratch

link_to_page

Pre-assumption

This guide assumes that readers are familiar with Linux or MacOS command line interface (CLI) and what is a MCP server.

Brief introduction

This guide shows how to build a MCP server from scratch. This note is composed by three parts: UV introduction, Code development, and deployment.

UV introduction

UV is a rust based Python package and project manager. There are no differences between UV and other managers except UV is very fast. Also, MCP uses UVX, a UV tool for running python package, to run the server. So in this note, we’ll use UV to manage our project.

Installation

UV now can use PyPi for installation:

1
pip install uv

Change the source [optional]

Sometimes we need to change the source of UV because of the special network environment. Please consider add the following command to your environment.

1
export UV_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple

This command changes the source of UV from the official site to TUNA temporarily. If you want to persist your modification, please refer doc from tuna.

Python setup

For convenience, we use UV to setup our python interpreter.

1
uv python install

Then, we use the following command to setup a python project in a directory.

1
2
3
4
mkdir note # build a new directory for our code
uv init ./note # setup the direcory as our workspace
cd note # get into the workspace
uv venv # starts a new virtual environment

If success, there will be some new files generated by UV and the directory should be like this:

https://prod-files-secure.s3.us-west-2.amazonaws.com/9ae3228c-6982-46ec-8946-abb7d53f72af/7f0e8a0b-c4e1-4f01-9374-57601ba10ab2/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466YG6VHCJY%2F20250427%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20250427T065840Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEL3%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLXdlc3QtMiJIMEYCIQCOy8%2F9KyRMAj81rGVTD%2FZE3o5clwxkKuMbsT5pas3VHAIhAMfWV5BVm7l3wEXNUIbOVjpyZn3vOi91pe6cYgjPihzEKv8DCFYQABoMNjM3NDIzMTgzODA1IgxEEVexUq4gzpi%2Bd9kq3AP3fxksRZGHF7VC457v9akw1yq39Gjw1ct0qnMKE%2BCF%2FC%2BmSZ7WaljdXn5PNkxc2lK95bTscIofN0sOvcrELZf1DMlONQ7df%2F9xrrX4dGlDgtZGeoJTGvedIhIU14rOGmn9859hpifgJt5zoOCnNJArkp3%2F9mqzgPI1vKEDG6Rmv7yHSRhjUkWbc4y6eurzA%2Bu4lCnq4oF5BNgkwdwp%2FQyKLeZ2Sp4aoLKwnog2y%2BUPoSxKwS%2BzEPovkfSDM6Vayy6qOg3wgj9lHR%2Fb%2BAI%2FBjRagpV%2Fx8SOg%2FwtvJhis%2B2VF9MT9BlijzYqISzW8McABuP8bkIcYaPgYE%2F83ATpzN%2FYYdbbqNZO5lWM2Dv60glAtLXsPsRDKXOQtQeJ92s%2BKMWIcUl9RaVJpVsLOw1M1rU%2FBeEtWEZNV%2FvdPLFpxwur3kPw4VZEKqcaGhvFyhQCs0RptRjXjOKguxpUo1AV7gsyLv2Oibghq538rgdUnwhvaj6glxz8u%2Be0LapAjRLnFLNMvS4W%2Brb7wmH9LixCCRRCDSkXWDOSquTy5I5FTQvqq1POe3SbT1ZmgU1uRPuZdD%2FdV8DTrUi1QzSjWbQw5yKxPeXDNPXbO5%2FU3kMGgRZQRRcT5UZQHIJ6tjDSsTCa7bbABjqkAdutdJueHk%2Fjr2Zta9frEbcK1dGwYEtUdgSDfEmPdyAKFsQ6pEZ2VN4wFeSOthvmrsA%2BIdmkHgDgKaxwkWmJzfh47g9Xc9Qf1OpDC1LPo1beYjbh27tVh0RsiGLctJk411lAk1t3KwGZDwSHeIqLHRM0lrXSrtuXaW7YZR3kYaUj1HuXB4rPzYCm095foacDa77wQYFVfVSImPy6%2Ffl7qQu%2FXsld&X-Amz-Signature=a194b6f4d5563b7cd60e7f4c5028ad06245945990dd2458f65c79bf2b2a01baa&X-Amz-SignedHeaders=host&x-id=GetObject

Summary

We have installed the UV, set up a interpreter, and initialized a new workspace for our project. In the next step, we’ll go through the project and implement a very simple MCP server.

Code development

In this section, we’ll start implementing a very simple MCP server. We’ll start with going through our workspace, install some dependencies, implement some code, and debug the code.

Workspace go through

We can see our project structure in here. There are some files in this workspace which is generated by UV. But do not worry about it. We only need to take care about three files: main.py, README.md, and pyproject.toml.

  • The main.py file is the place where the code will be executed and is the place we’ll focus on in this section.
  • The README.md is the place you might want to write something.
  • The pyproject.toml is the file we manage our project when packaging, which will be introduced later.

Dependencies installation

In this project, we mainly use FastMCP for developing our server. You can find information about the python package here. In a short, FastMCP is a simple yet very useful tool for us to implement MCP servers using python. The installation command using UV is demonstrated as below.

1
uv pip install fastmcp

Implement code

After we have installed the FastMCP, we then can implement our code like the following.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
from fastmcp import FastMCP  # Import the FastMCP class from the fastmcp module

# Create a FastMCP server instance with the name "note"
server = FastMCP("note")

# Register a tool/endpoint named "hello_world" using the @server.tool() decorator
@server.tool()
def hello_world():
    return "Hello World"  # The function returns "Hello World" when called

def main():
    server.run()

# Standard Python idiom to check if the script is being run directly
if __name__ == "__main__":
    main()  # Start the FastMCP server

How to run the code

In our terminal, we can run our code by using fastmcp commands.

1
2
3
# in our project directory
source .venv/bin/activate #activate the virtual environment we built
fastmcp dev main.py # run the code in development code

if it goes well, you’ll see some information in your terminal.

https://prod-files-secure.s3.us-west-2.amazonaws.com/9ae3228c-6982-46ec-8946-abb7d53f72af/1daf1736-35f7-48c2-9156-c98068ca2637/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466YG6VHCJY%2F20250427%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20250427T065840Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEL3%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLXdlc3QtMiJIMEYCIQCOy8%2F9KyRMAj81rGVTD%2FZE3o5clwxkKuMbsT5pas3VHAIhAMfWV5BVm7l3wEXNUIbOVjpyZn3vOi91pe6cYgjPihzEKv8DCFYQABoMNjM3NDIzMTgzODA1IgxEEVexUq4gzpi%2Bd9kq3AP3fxksRZGHF7VC457v9akw1yq39Gjw1ct0qnMKE%2BCF%2FC%2BmSZ7WaljdXn5PNkxc2lK95bTscIofN0sOvcrELZf1DMlONQ7df%2F9xrrX4dGlDgtZGeoJTGvedIhIU14rOGmn9859hpifgJt5zoOCnNJArkp3%2F9mqzgPI1vKEDG6Rmv7yHSRhjUkWbc4y6eurzA%2Bu4lCnq4oF5BNgkwdwp%2FQyKLeZ2Sp4aoLKwnog2y%2BUPoSxKwS%2BzEPovkfSDM6Vayy6qOg3wgj9lHR%2Fb%2BAI%2FBjRagpV%2Fx8SOg%2FwtvJhis%2B2VF9MT9BlijzYqISzW8McABuP8bkIcYaPgYE%2F83ATpzN%2FYYdbbqNZO5lWM2Dv60glAtLXsPsRDKXOQtQeJ92s%2BKMWIcUl9RaVJpVsLOw1M1rU%2FBeEtWEZNV%2FvdPLFpxwur3kPw4VZEKqcaGhvFyhQCs0RptRjXjOKguxpUo1AV7gsyLv2Oibghq538rgdUnwhvaj6glxz8u%2Be0LapAjRLnFLNMvS4W%2Brb7wmH9LixCCRRCDSkXWDOSquTy5I5FTQvqq1POe3SbT1ZmgU1uRPuZdD%2FdV8DTrUi1QzSjWbQw5yKxPeXDNPXbO5%2FU3kMGgRZQRRcT5UZQHIJ6tjDSsTCa7bbABjqkAdutdJueHk%2Fjr2Zta9frEbcK1dGwYEtUdgSDfEmPdyAKFsQ6pEZ2VN4wFeSOthvmrsA%2BIdmkHgDgKaxwkWmJzfh47g9Xc9Qf1OpDC1LPo1beYjbh27tVh0RsiGLctJk411lAk1t3KwGZDwSHeIqLHRM0lrXSrtuXaW7YZR3kYaUj1HuXB4rPzYCm095foacDa77wQYFVfVSImPy6%2Ffl7qQu%2FXsld&X-Amz-Signature=fbc5bd840b74c01534a0d0ef7ea5287521844fa5bd5d57e8483abf2d1f39c044&X-Amz-SignedHeaders=host&x-id=GetObject

The information is telling you that the inspector server is running in port 6274 and you can access to the inspector server using the URL link it provides. The inspector server is a tool for us to verify our code. We’ll not spend too much time to introduce.

You’ll see the screen once you access to the inspector server. And click the connect button on the left side.

https://prod-files-secure.s3.us-west-2.amazonaws.com/9ae3228c-6982-46ec-8946-abb7d53f72af/2ace1a7c-a49b-49f6-a297-fa126365c60a/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466YG6VHCJY%2F20250427%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20250427T065840Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEL3%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLXdlc3QtMiJIMEYCIQCOy8%2F9KyRMAj81rGVTD%2FZE3o5clwxkKuMbsT5pas3VHAIhAMfWV5BVm7l3wEXNUIbOVjpyZn3vOi91pe6cYgjPihzEKv8DCFYQABoMNjM3NDIzMTgzODA1IgxEEVexUq4gzpi%2Bd9kq3AP3fxksRZGHF7VC457v9akw1yq39Gjw1ct0qnMKE%2BCF%2FC%2BmSZ7WaljdXn5PNkxc2lK95bTscIofN0sOvcrELZf1DMlONQ7df%2F9xrrX4dGlDgtZGeoJTGvedIhIU14rOGmn9859hpifgJt5zoOCnNJArkp3%2F9mqzgPI1vKEDG6Rmv7yHSRhjUkWbc4y6eurzA%2Bu4lCnq4oF5BNgkwdwp%2FQyKLeZ2Sp4aoLKwnog2y%2BUPoSxKwS%2BzEPovkfSDM6Vayy6qOg3wgj9lHR%2Fb%2BAI%2FBjRagpV%2Fx8SOg%2FwtvJhis%2B2VF9MT9BlijzYqISzW8McABuP8bkIcYaPgYE%2F83ATpzN%2FYYdbbqNZO5lWM2Dv60glAtLXsPsRDKXOQtQeJ92s%2BKMWIcUl9RaVJpVsLOw1M1rU%2FBeEtWEZNV%2FvdPLFpxwur3kPw4VZEKqcaGhvFyhQCs0RptRjXjOKguxpUo1AV7gsyLv2Oibghq538rgdUnwhvaj6glxz8u%2Be0LapAjRLnFLNMvS4W%2Brb7wmH9LixCCRRCDSkXWDOSquTy5I5FTQvqq1POe3SbT1ZmgU1uRPuZdD%2FdV8DTrUi1QzSjWbQw5yKxPeXDNPXbO5%2FU3kMGgRZQRRcT5UZQHIJ6tjDSsTCa7bbABjqkAdutdJueHk%2Fjr2Zta9frEbcK1dGwYEtUdgSDfEmPdyAKFsQ6pEZ2VN4wFeSOthvmrsA%2BIdmkHgDgKaxwkWmJzfh47g9Xc9Qf1OpDC1LPo1beYjbh27tVh0RsiGLctJk411lAk1t3KwGZDwSHeIqLHRM0lrXSrtuXaW7YZR3kYaUj1HuXB4rPzYCm095foacDa77wQYFVfVSImPy6%2Ffl7qQu%2FXsld&X-Amz-Signature=8f050653a59c741b0106b6566e300c8c810f2068dda5d5e62847e805d14b13e2&X-Amz-SignedHeaders=host&x-id=GetObject

After connection is established, your screen will be like this.

https://prod-files-secure.s3.us-west-2.amazonaws.com/9ae3228c-6982-46ec-8946-abb7d53f72af/63247ba5-0aa1-47c6-bb5e-d878adca18c9/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466YG6VHCJY%2F20250427%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20250427T065840Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEL3%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLXdlc3QtMiJIMEYCIQCOy8%2F9KyRMAj81rGVTD%2FZE3o5clwxkKuMbsT5pas3VHAIhAMfWV5BVm7l3wEXNUIbOVjpyZn3vOi91pe6cYgjPihzEKv8DCFYQABoMNjM3NDIzMTgzODA1IgxEEVexUq4gzpi%2Bd9kq3AP3fxksRZGHF7VC457v9akw1yq39Gjw1ct0qnMKE%2BCF%2FC%2BmSZ7WaljdXn5PNkxc2lK95bTscIofN0sOvcrELZf1DMlONQ7df%2F9xrrX4dGlDgtZGeoJTGvedIhIU14rOGmn9859hpifgJt5zoOCnNJArkp3%2F9mqzgPI1vKEDG6Rmv7yHSRhjUkWbc4y6eurzA%2Bu4lCnq4oF5BNgkwdwp%2FQyKLeZ2Sp4aoLKwnog2y%2BUPoSxKwS%2BzEPovkfSDM6Vayy6qOg3wgj9lHR%2Fb%2BAI%2FBjRagpV%2Fx8SOg%2FwtvJhis%2B2VF9MT9BlijzYqISzW8McABuP8bkIcYaPgYE%2F83ATpzN%2FYYdbbqNZO5lWM2Dv60glAtLXsPsRDKXOQtQeJ92s%2BKMWIcUl9RaVJpVsLOw1M1rU%2FBeEtWEZNV%2FvdPLFpxwur3kPw4VZEKqcaGhvFyhQCs0RptRjXjOKguxpUo1AV7gsyLv2Oibghq538rgdUnwhvaj6glxz8u%2Be0LapAjRLnFLNMvS4W%2Brb7wmH9LixCCRRCDSkXWDOSquTy5I5FTQvqq1POe3SbT1ZmgU1uRPuZdD%2FdV8DTrUi1QzSjWbQw5yKxPeXDNPXbO5%2FU3kMGgRZQRRcT5UZQHIJ6tjDSsTCa7bbABjqkAdutdJueHk%2Fjr2Zta9frEbcK1dGwYEtUdgSDfEmPdyAKFsQ6pEZ2VN4wFeSOthvmrsA%2BIdmkHgDgKaxwkWmJzfh47g9Xc9Qf1OpDC1LPo1beYjbh27tVh0RsiGLctJk411lAk1t3KwGZDwSHeIqLHRM0lrXSrtuXaW7YZR3kYaUj1HuXB4rPzYCm095foacDa77wQYFVfVSImPy6%2Ffl7qQu%2FXsld&X-Amz-Signature=d3f2fac11fe8e9f0118943ea8fbc2839ee5d8e8363fd4deec4a34ce4c7b9ec92&X-Amz-SignedHeaders=host&x-id=GetObject

We’ll first click Tools button and choose List Tools to check the tools we implement. And run the tool.

https://prod-files-secure.s3.us-west-2.amazonaws.com/9ae3228c-6982-46ec-8946-abb7d53f72af/dd91f8d0-b87a-419a-aec0-ceb20c207b9a/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466YG6VHCJY%2F20250427%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20250427T065840Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEL3%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLXdlc3QtMiJIMEYCIQCOy8%2F9KyRMAj81rGVTD%2FZE3o5clwxkKuMbsT5pas3VHAIhAMfWV5BVm7l3wEXNUIbOVjpyZn3vOi91pe6cYgjPihzEKv8DCFYQABoMNjM3NDIzMTgzODA1IgxEEVexUq4gzpi%2Bd9kq3AP3fxksRZGHF7VC457v9akw1yq39Gjw1ct0qnMKE%2BCF%2FC%2BmSZ7WaljdXn5PNkxc2lK95bTscIofN0sOvcrELZf1DMlONQ7df%2F9xrrX4dGlDgtZGeoJTGvedIhIU14rOGmn9859hpifgJt5zoOCnNJArkp3%2F9mqzgPI1vKEDG6Rmv7yHSRhjUkWbc4y6eurzA%2Bu4lCnq4oF5BNgkwdwp%2FQyKLeZ2Sp4aoLKwnog2y%2BUPoSxKwS%2BzEPovkfSDM6Vayy6qOg3wgj9lHR%2Fb%2BAI%2FBjRagpV%2Fx8SOg%2FwtvJhis%2B2VF9MT9BlijzYqISzW8McABuP8bkIcYaPgYE%2F83ATpzN%2FYYdbbqNZO5lWM2Dv60glAtLXsPsRDKXOQtQeJ92s%2BKMWIcUl9RaVJpVsLOw1M1rU%2FBeEtWEZNV%2FvdPLFpxwur3kPw4VZEKqcaGhvFyhQCs0RptRjXjOKguxpUo1AV7gsyLv2Oibghq538rgdUnwhvaj6glxz8u%2Be0LapAjRLnFLNMvS4W%2Brb7wmH9LixCCRRCDSkXWDOSquTy5I5FTQvqq1POe3SbT1ZmgU1uRPuZdD%2FdV8DTrUi1QzSjWbQw5yKxPeXDNPXbO5%2FU3kMGgRZQRRcT5UZQHIJ6tjDSsTCa7bbABjqkAdutdJueHk%2Fjr2Zta9frEbcK1dGwYEtUdgSDfEmPdyAKFsQ6pEZ2VN4wFeSOthvmrsA%2BIdmkHgDgKaxwkWmJzfh47g9Xc9Qf1OpDC1LPo1beYjbh27tVh0RsiGLctJk411lAk1t3KwGZDwSHeIqLHRM0lrXSrtuXaW7YZR3kYaUj1HuXB4rPzYCm095foacDa77wQYFVfVSImPy6%2Ffl7qQu%2FXsld&X-Amz-Signature=39ae20f3cfbcfc04df18c9f2b78a5ad5583fbf272bd2113ae3d7be80d7caf865&X-Amz-SignedHeaders=host&x-id=GetObject

If the tool is executed successfully, you’ll see the result in the following screen. Then you have successfully run a mcp tool.

https://prod-files-secure.s3.us-west-2.amazonaws.com/9ae3228c-6982-46ec-8946-abb7d53f72af/70e0fd59-96fd-4056-9142-dc77071a18bf/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466YG6VHCJY%2F20250427%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20250427T065840Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEL3%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLXdlc3QtMiJIMEYCIQCOy8%2F9KyRMAj81rGVTD%2FZE3o5clwxkKuMbsT5pas3VHAIhAMfWV5BVm7l3wEXNUIbOVjpyZn3vOi91pe6cYgjPihzEKv8DCFYQABoMNjM3NDIzMTgzODA1IgxEEVexUq4gzpi%2Bd9kq3AP3fxksRZGHF7VC457v9akw1yq39Gjw1ct0qnMKE%2BCF%2FC%2BmSZ7WaljdXn5PNkxc2lK95bTscIofN0sOvcrELZf1DMlONQ7df%2F9xrrX4dGlDgtZGeoJTGvedIhIU14rOGmn9859hpifgJt5zoOCnNJArkp3%2F9mqzgPI1vKEDG6Rmv7yHSRhjUkWbc4y6eurzA%2Bu4lCnq4oF5BNgkwdwp%2FQyKLeZ2Sp4aoLKwnog2y%2BUPoSxKwS%2BzEPovkfSDM6Vayy6qOg3wgj9lHR%2Fb%2BAI%2FBjRagpV%2Fx8SOg%2FwtvJhis%2B2VF9MT9BlijzYqISzW8McABuP8bkIcYaPgYE%2F83ATpzN%2FYYdbbqNZO5lWM2Dv60glAtLXsPsRDKXOQtQeJ92s%2BKMWIcUl9RaVJpVsLOw1M1rU%2FBeEtWEZNV%2FvdPLFpxwur3kPw4VZEKqcaGhvFyhQCs0RptRjXjOKguxpUo1AV7gsyLv2Oibghq538rgdUnwhvaj6glxz8u%2Be0LapAjRLnFLNMvS4W%2Brb7wmH9LixCCRRCDSkXWDOSquTy5I5FTQvqq1POe3SbT1ZmgU1uRPuZdD%2FdV8DTrUi1QzSjWbQw5yKxPeXDNPXbO5%2FU3kMGgRZQRRcT5UZQHIJ6tjDSsTCa7bbABjqkAdutdJueHk%2Fjr2Zta9frEbcK1dGwYEtUdgSDfEmPdyAKFsQ6pEZ2VN4wFeSOthvmrsA%2BIdmkHgDgKaxwkWmJzfh47g9Xc9Qf1OpDC1LPo1beYjbh27tVh0RsiGLctJk411lAk1t3KwGZDwSHeIqLHRM0lrXSrtuXaW7YZR3kYaUj1HuXB4rPzYCm095foacDa77wQYFVfVSImPy6%2Ffl7qQu%2FXsld&X-Amz-Signature=064efa4873f923482368f25e5b268756879bc2b0c09d312d7b752d50e0533481&X-Amz-SignedHeaders=host&x-id=GetObject

Debug the code

I, personally, recommend to use various of tests like UT, AT, or regression tests to test your code locally. Because it is much more convenient for us to use.

Some suggestions:

  1. Write detailed comment for the tool we implement, it’ll help LLM to understand the function it can use.
  2. Add type expectations to your function inputs and outputs. It’ll avoid some mistakes from input side.

Summary

In this section, we have gone through our project, implemented some code, and run it using MCP inspector.

Package deployment

In this section, we can deploy our mcp server for LLM to use. We’ll need to update the pyproject.toml we mentioned before to package our code.

update executable information

In our project, we add the following lines to our pyproject.toml:

1
2
[project.scripts]
note = "main:main"  # Executes the `main()` function in `main.py`

Add dependencies information

we need to include dependencies in our package, we can use the following command to add the package we use to the pyproject.toml

1
uv add fastmcp

Of course it looks uncomfortable if we have many packages we need to depend. We also can use other tools to do this.

deploy your code

we use the following commands packaging our code and run it.

1
2
3
uv build --wheel # packaging your code into wheel
uv install ${PATHTOYOURPACKAGE} # install the packaged code
uvx --python=$(which python) ${PACKAGE} # run the package using specific python interpreter

If all goes well, you’ll see the following information in the CLI. It tells you that your MCP server is running.

https://prod-files-secure.s3.us-west-2.amazonaws.com/9ae3228c-6982-46ec-8946-abb7d53f72af/129cc91e-3fce-4702-9189-a7d04991a5d4/image.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=ASIAZI2LB466YG6VHCJY%2F20250427%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20250427T065840Z&X-Amz-Expires=3600&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEL3%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLXdlc3QtMiJIMEYCIQCOy8%2F9KyRMAj81rGVTD%2FZE3o5clwxkKuMbsT5pas3VHAIhAMfWV5BVm7l3wEXNUIbOVjpyZn3vOi91pe6cYgjPihzEKv8DCFYQABoMNjM3NDIzMTgzODA1IgxEEVexUq4gzpi%2Bd9kq3AP3fxksRZGHF7VC457v9akw1yq39Gjw1ct0qnMKE%2BCF%2FC%2BmSZ7WaljdXn5PNkxc2lK95bTscIofN0sOvcrELZf1DMlONQ7df%2F9xrrX4dGlDgtZGeoJTGvedIhIU14rOGmn9859hpifgJt5zoOCnNJArkp3%2F9mqzgPI1vKEDG6Rmv7yHSRhjUkWbc4y6eurzA%2Bu4lCnq4oF5BNgkwdwp%2FQyKLeZ2Sp4aoLKwnog2y%2BUPoSxKwS%2BzEPovkfSDM6Vayy6qOg3wgj9lHR%2Fb%2BAI%2FBjRagpV%2Fx8SOg%2FwtvJhis%2B2VF9MT9BlijzYqISzW8McABuP8bkIcYaPgYE%2F83ATpzN%2FYYdbbqNZO5lWM2Dv60glAtLXsPsRDKXOQtQeJ92s%2BKMWIcUl9RaVJpVsLOw1M1rU%2FBeEtWEZNV%2FvdPLFpxwur3kPw4VZEKqcaGhvFyhQCs0RptRjXjOKguxpUo1AV7gsyLv2Oibghq538rgdUnwhvaj6glxz8u%2Be0LapAjRLnFLNMvS4W%2Brb7wmH9LixCCRRCDSkXWDOSquTy5I5FTQvqq1POe3SbT1ZmgU1uRPuZdD%2FdV8DTrUi1QzSjWbQw5yKxPeXDNPXbO5%2FU3kMGgRZQRRcT5UZQHIJ6tjDSsTCa7bbABjqkAdutdJueHk%2Fjr2Zta9frEbcK1dGwYEtUdgSDfEmPdyAKFsQ6pEZ2VN4wFeSOthvmrsA%2BIdmkHgDgKaxwkWmJzfh47g9Xc9Qf1OpDC1LPo1beYjbh27tVh0RsiGLctJk411lAk1t3KwGZDwSHeIqLHRM0lrXSrtuXaW7YZR3kYaUj1HuXB4rPzYCm095foacDa77wQYFVfVSImPy6%2Ffl7qQu%2FXsld&X-Amz-Signature=776693e6a62f135d56336ab4fd35058beb644e25d974812c0666354b863df4ae&X-Amz-SignedHeaders=host&x-id=GetObject