mcp-server-demo
This project is a step-by-step guide to setting up and testing a Model Context Protocol (MCP) server using Python. It highlights the use of tools like MCP Inspector and Claude Desktop to inspect and verify server functionality.
MCP Server Demo
Prerequisites
- uv - An extremely fast Python package and project manager, written in Rust.
Overview
This guide walks through creating a simple Model Context Protocol (MCP) server and testing it with both the MCP Inspector and Claude Desktop. The content is based on the modelcontextprotocol/python-sdk README, with additional notes for clarity.
Steps to Create an MCP Server
1. Environment Setup
uv init mcp-server-demo
cd mcp-server-demo
# Specify Python version
echo "3.12" > .python-version
# Install Python before creating a new virtual environment
uv venv
# Activate virtual environment
source .venv/bin/activate.fish
# Verify virtual environment (check if using the correct Python environment)
which python
path/to/mcp-server-demo/.venv/bin/python
# Install MCP dependencies (added to pyproject.toml)
uv add "mcp[cli]"
# Verify MCP dependencies were installed correctly
uv tree
Resolved 28 packages in 3ms
mcp-server-demo v0.1.0
└── mcp[cli] v1.6.0
├── ...
2. Creating a Simple MCP Server
# server.py
from mcp.server.fastmcp import FastMCP
# Create an MCP server
mcp = FastMCP("Demo")
# Add an addition tool
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + b
# Add a dynamic greeting resource
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""Get a personalized greeting"""
return f"Hello, {name}!"
3. Testing with MCP Inspector
Launch MCP Inspector
uv run mcp dev server.py
Starting MCP inspector...
⚙️ Proxy server listening on port 6277
Testing the add
Tool
- Open the MCP Inspector
- Click "Connect"
- Click the "Tools" tab
- Click "List Tools" inside the "Tools" tab
Testing the get_greeting
Resource
- Open the MCP Inspector
- Click "Connect"
- Click "Resources" Tab
- Click "List Templates"
- Find "get_greeting"
- Type a name (e.g., "John")
- Click "Read Resources"
Example response:
{
"contents": [
{
"uri": "greeting://John",
"mimeType": "text/plain",
"text": "Hello, John!"
}
]
}
4. Testing with Claude Desktop
Install the MCP Server in Claude Desktop
uv run mcp install server.py
[/dd/MM/YY HH:MM:SS] INFO Added server 'Demo' to Claude config claude.py:129
INFO Successfully installed Demo in Claude app cli.py:467
Verify Configuration
# For macOS/Linux
cat ~/Library/Application\ Support/Claude/claude_desktop_config.json
Example configuration:
{
"mcpServers": {
"Demo": {
"command": "/absolute/path/to/uv",
"args": [
"run",
"--with",
"mcp[cli]",
"mcp",
"run",
"/absolute/path/to/mcp-server-demo/server.py"
]
}
}
}
Note: After executing uv run mcp install server.py
, the command is set as just "uv" in the configuration, but it requires an absolute path to work properly.
Using Claude Desktop with MCP
Checking Server Status
The Claude.app interface provides basic server status information:
- Click the connect icon to view:
- Connected servers
- Available prompts and resources
- Click the hammer icon to view:
- Tools made available to the mode
Type in Claude Desktop:
Please use the add tool to sum 10 and 20
Using the get_greeting
Resource
Note: There appears to be an issue retrieving resources from Claude Desktop. This section needs further investigation.
FAQ
How does Claude Desktop select which MCP server tools to use?
- Claude connects to all configured MCP servers but selects tools based on the content of the user's query
- If the question content is not suitable for using tools, the tools will not be used