Skip to main content
Glama

MCP Learning Project 2025 ๐Ÿš€

Python MCP FastMCP UV License

A hands-on project to demonstrate building and deploying Model Context Protocol (MCP) servers. Learn how to create custom MCP tools, configure them for AI assistants, and integrate them with Claude Desktop, Continue, and other MCP-compatible applications.

๐ŸŽฏ What You'll Learn

  • ๐Ÿ› ๏ธ Build custom MCP servers from scratch

  • ๐Ÿ”Œ Integrate MCP tools with AI assistants

  • ๐Ÿงช Test and debug using MCP Inspector and MCP Studio

  • ๐Ÿ“ฆ Manage dependencies with UV or pip

  • ๐Ÿš€ Deploy production-ready MCP servers

  • ๐ŸŽจ Create type-safe tools with Pydantic

  • ๐ŸŒ Use streamable HTTP transport for advanced scenarios

๐Ÿ—๏ธ Tech Stack

Category

Technology

Purpose

Language

Python 3.13+

Core programming language

Protocol

MCP (Model Context Protocol)

Standardized AI-tool communication

Framework

FastMCP

Rapid MCP server development

Package Manager

UV or pip + venv

Dependency management

Validation

Pydantic

Data validation and type safety

Server

Uvicorn

ASGI server for MCP

Testing

MCP Inspector & MCP Studio

Interactive testing and debugging

๐Ÿ“‹ Prerequisites

Before diving in, make sure you have:

  • โœ… Python 3.13+ installed on your system

  • โœ… UV (recommended) or pip + venv for package management

  • โœ… VS Code (optional but recommended for MCP configuration)

  • โœ… Git for version control

  • โœ… Terminal access (PowerShell, CMD, or Bash)

๐Ÿš€ Installation

1. Install UV:

# Windows (PowerShell) powershell -c "irm https://astral.sh/uv/install.ps1 | iex"

2. Initialize project:

# Create new project uv init learn-mcp-2025 cd learn-mcp-2025 # Or in existing directory uv init

3. Add MCP dependencies:

# Add MCP with CLI tools uv add "mcp[cli]" # This creates/updates: # - pyproject.toml # - uv.lock

4. Install all dependencies:

uv sync

1. Navigate to project:

cd learn-mcp-2025

2. Create virtual environment:

python -m venv .venv

3. Activate virtual environment:

# Windows (PowerShell) .venv\Scripts\Activate.ps1 # Windows (CMD) .venv\Scripts\activate.bat

4. Install dependencies:

# From requirements.txt pip install -r requirements.txt # Or install package in editable mode pip install -e .

Generated Files

UV

pip + venv

pyproject.toml - Project metadata and dependencies

requirements.txt - Pinned dependencies

uv.lock - Locked dependency versions

.venv/ - Virtual environment directory

โš™๏ธ MCP Server Configuration

To integrate your MCP server with AI clients (like Claude Desktop), create a configuration file:

Create .vscode/mcp.json

{ "servers": { "weather-service": { "command": "python", "args": ["weather.py"], "env": {} } } }

Multi-Server Configuration

{ "servers": { "weather-service": { "command": "python", "args": ["weather.py"], "env": {} }, "winget-mcp": { "type": "stdio", "command": "C:\\Users\\YourUser\\AppData\\Local\\Microsoft\\WindowsApps\\...\\WindowsPackageManagerMCPServer.exe" } } }

Configuration Options

Field

Description

Example

command

Executable to run

python, node, uv

args

Arguments passed to command

["weather.py"], ["run", "server.py"]

env

Environment variables

{"API_KEY": "value"}

type

Communication type

stdio (default)

๐ŸŽฎ Running the MCP Server

Method 1: Quick Testing โšก (Direct Function Call)

Test individual functions without starting the full MCP server:

uv run python -c "from weather import get_weather; print(get_weather('London'))"

Output:

The current weather in London is sunny with a temperature of 25ยฐC.
# Activate venv first .venv\Scripts\Activate.ps1 # Then run python -c "from weather import get_weather; print(get_weather('London'))"

Output:

The current weather in London is sunny with a temperature of 25ยฐC.

When to use:

  • โœ… Fast iteration during development

  • โœ… Unit testing individual tools

  • โœ… Debugging function logic

  • โŒ Won't work with MCP clients

Method 2: Production Mode ๐Ÿš€ (Full MCP Server)

Run as a complete MCP server for AI assistant integration:

# Start MCP server uv run python weather.py # The server will start and listen for MCP requests
# Activate venv first .venv\Scripts\Activate.ps1 # Start MCP server python weather.py

When to use:

  • โœ… Integration with AI assistants (Claude, Continue, etc.)

  • โœ… Production deployments

  • โœ… Multi-tool servers

  • โœ… Standardized MCP protocol communication

Method 3: MCP Inspector ๐Ÿ” (Development & Debugging)

Use the MCP Inspector to interactively test your server with a web UI:

With UV:

# Start MCP dev mode uv run mcp dev <your-server.py>

With pip + venv:

# Activate venv first .venv\Scripts\Activate.ps1 # Start MCP dev mode mcp dev <your-server.py>

Features:

  • Terminal-based debugging

  • Log output in console

  • Quick server validation

  • โŒ No web UI

With UV:

# No installation needed - npx downloads temporarily npx @modelcontextprotocol/inspector uv run <your-server.py>

With pip + venv:

# Activate venv first .venv\Scripts\Activate.ps1 # Run inspector with Python npx @modelcontextprotocol/inspector python <your-server.py>

Features:

  • โœ… Interactive web UI

  • โœ… Visual tool explorer

  • โœ… Request/response inspection

  • โœ… Real-time testing

  • โœ… Always latest version

MCP Inspector Features:

  • ๐Ÿ” Interactive tool testing in browser

  • ๐Ÿ“Š Request/response inspection

  • ๐Ÿ› Real-time debugging

  • ๐Ÿ“ Schema validation

  • ๐ŸŽจ Visual interface for all MCP tools

Access Inspector:

Open browser: http://localhost:5173

Example with weather.py:

$ npx @modelcontextprotocol/inspector uv run weather.py MCP Inspector running at http://localhost:5173 Server: Weather Service Tools available: get_weather

Method 4: Python Client ๐Ÿ (Programmatic Access)

Use Python code to connect to MCP servers programmatically:

Example 1: Connect to Weather Service (Python Server)

# Run the weather client python client.py

Example 2: Connect to Airbnb Service (Node.js Server)

# Run the Airbnb client (connects to Node.js server via npx) python client_airbnb.py

Client Features:

  • ๐Ÿ“ก Programmatic MCP server connections

  • ๐Ÿ”„ Async/await communication patterns

  • ๐ŸŒ Cross-language support (Python โ†” Node.js)

  • ๐Ÿ› ๏ธ Direct tool invocation from code

  • ๐Ÿ“‹ Dynamic tool discovery with list_tools()

When to use:

  • โœ… Building MCP-powered applications

  • โœ… Automating tool calls in scripts

  • โœ… Testing server integrations

  • โœ… Creating custom MCP workflows

  • โœ… Connecting to third-party MCP servers

Method 5: MCP Studio ๐Ÿ› ๏ธ (Advanced Testing & Streamable Transport)

MCP Studio provides advanced debugging capabilities, especially for streamable HTTP transports and complex server integrations.

Setup MCP Studio

1. Install MCP Studio:

npm install -g @modelcontextprotocol/studio

2. Configure Remote Server in

{ "servers": { "remote-example": { "command": "npx", "args": ["mcp-remote", "http://127.0.0.1:8000"] } } }

3. Run Streamable Server:

# Start the streamable server on HTTP transport uv run python sample_mcp_streamable_server.py # Server runs on http://127.0.0.1:8000 (or configured port)

4. Connect with MCP Studio:

# Launch MCP Studio and connect to remote server mcp-studio --remote http://127.0.0.1:8000

MCP Studio Benefits:

  • Visual Debugging: Interactive UI for tool calls and responses

  • Streamable Transport Support: Handles HTTP/SSE connections for streamable servers

  • Real-time Monitoring: Live logs and error tracking

  • Multi-Server Testing: Test multiple servers simultaneously

  • Integration Testing: Simulate AI assistant interactions

When to use MCP Studio:

  • โœ… Testing streamable HTTP servers

  • โœ… Complex multi-tool integrations

  • โœ… Production-like testing scenarios

  • โœ… Debugging connection issues

๐Ÿ“ Project Structure

learn-mcp-2025/ โ”œโ”€โ”€ .github/ โ”‚ โ”œโ”€โ”€ copilot-instructions.md # AI agent development guidelines โ”‚ โ””โ”€โ”€ prompts/ # Reusable prompt templates โ”œโ”€โ”€ .vscode/ โ”‚ โ””โ”€โ”€ mcp.json # MCP server configuration for VS Code/AI assistants โ”œโ”€โ”€ .venv/ # Virtual environment (pip only) โ”‚ โ”œโ”€โ”€ MCP Servers (Tools for AI Assistants) โ”œโ”€โ”€ weather__mcp_server.py # ๐Ÿ”ง Weather service tools โ”œโ”€โ”€ crypto_mcp_server.py # ๐Ÿ”ง Cryptocurrency price tools โ”œโ”€โ”€ local_notes_mcp_server.py # ๐Ÿ”ง Local notes management (add/get) โ”œโ”€โ”€ screenshot_tool.py # ๐Ÿ”ง Screenshot capture tool โ”œโ”€โ”€ pydantic_schema_person_server.py # ๐Ÿ”ง Person data schema & processing โ”œโ”€โ”€ resources_mcp_server.py # ๐Ÿ”ง Resource management (coffee inventory) โ”œโ”€โ”€ websearch_mcp_server.py # ๐Ÿ”ง Web search functionality โ”œโ”€โ”€ sample_mcp_streamable_server.py # ๐Ÿ”ง Streamable HTTP transport example โ”‚ โ”œโ”€โ”€ MCP Clients (Test & Integration) โ”œโ”€โ”€ weather_mcp_client.py # ๐Ÿ”Œ Client for weather server โ”œโ”€โ”€ airbnb_mcp_client.py # ๐Ÿ”Œ Client for Airbnb server (Node.js) โ”œโ”€โ”€ resources_mcp_client.py # ๐Ÿ”Œ Client for resources server โ”‚ โ”œโ”€โ”€ Configuration & Dependencies โ”œโ”€โ”€ pyproject.toml # Project metadata & dependencies (UV) โ”œโ”€โ”€ requirements.txt # Pinned dependencies (pip) โ”œโ”€โ”€ uv.lock # Locked dependency versions (UV) โ”œโ”€โ”€ .python-version # Python version specification โ”œโ”€โ”€ .gitignore # Git ignore rules โ”œโ”€โ”€ notes.txt # Data file for local_notes_mcp_server โ”œโ”€โ”€ log.txt # Log file for person data โ””โ”€โ”€ README.md # This file

Key Files Explained

File

Type

Purpose

weather__mcp_server.py

MCP Server

Weather service with mock weather data tools

crypto_mcp_server.py

MCP Server

Cryptocurrency price lookup tools

local_notes_mcp_server.py

MCP Server

File-based notes management (add/get)

screenshot_tool.py

MCP Server

Screenshot capture using Pillow

pydantic_schema_person_server.py

MCP Server

Person data schema & processing with validation

resources_mcp_server.py

MCP Server

Resource management (coffee inventory example)

websearch_mcp_server.py

MCP Server

Web search functionality

sample_mcp_streamable_server.py

MCP Server

Streamable HTTP transport example

weather_mcp_client.py

MCP Client

Python client connecting to weather server

airbnb_mcp_client.py

MCP Client

Python client connecting to Node.js Airbnb server

resources_mcp_client.py

MCP Client

Python client for resources server

pyproject.toml

Config

Modern Python project configuration (PEP 621)

requirements.txt

Config

Traditional pip dependency list (auto-generated)

uv.lock

Config

UV's deterministic dependency lock file

.vscode/mcp.json

Config

MCP server registry for VS Code/Claude Desktop

๐Ÿ“š Quick Command Reference

UV Commands ๐Ÿ”ฎ

Command

Description

uv init

Initialize new Python project

uv add <package>

Add dependency to project

uv remove <package>

Remove dependency

uv sync

Install/sync all dependencies

uv run <command>

Run command in project environment

uv pip list

List installed packages

uv pip show <package>

Show package details

uv lock

Update lock file

uv python install <ver>

Install Python version

uv python list

List available Python versions

pip + venv Commands ๐Ÿ

Command

Description

python -m venv .venv

Create virtual environment

.venv\Scripts\Activate.ps1

Activate venv (PowerShell)

.venv\Scripts\activate.bat

Activate venv (CMD)

pip install -r requirements.txt

Install dependencies

pip install -e .

Install package in editable mode

pip install <package>

Install single package

pip uninstall <package>

Remove package

pip list

List installed packages

pip show <package>

Show package details

pip freeze > requirements.txt

Export dependencies

deactivate

Deactivate virtual environment

MCP Commands ๐Ÿ”ง

Command

Description

mcp dev <file>

Start MCP Inspector for development

mcp --version

Check MCP CLI version

python <file>.py

Start MCP server in production

npx @modelcontextprotocol/inspector uv run <file>

Interactive MCP testing

mcp-studio --remote <url>

Advanced MCP Studio testing

๐Ÿ’ก Development Examples

Example 1: Adding a New Weather Tool ๐ŸŒค๏ธ

Edit weather.py:

from mcp.server.fastmcp import FastMCP mcp = FastMCP("Weather Service") @mcp.tool() def get_weather(location: str) -> str: """Get current weather for a location.""" return f"The current weather in {location} is sunny with a temperature of 25ยฐC." @mcp.tool() def get_forecast(location: str, days: int = 7) -> str: """Get weather forecast for the next N days.""" return f"Forecast for {location} for the next {days} days: Mostly sunny" @mcp.tool() def get_temperature(location: str, unit: str = "celsius") -> str: """Get current temperature in specified unit.""" temp = 25 if unit == "celsius" else 77 return f"Temperature in {location}: {temp}ยฐ{unit[0].upper()}" if __name__ == "__main__": mcp.run()

Example 2: Testing New Tools โœ…

# Test with UV uv run python -c "from weather import get_forecast; print(get_forecast('Paris', 5))" # Test with pip/venv python -c "from weather import get_forecast; print(get_forecast('Paris', 5))"

Example 3: Adding Type Safety ๐Ÿ”’

from typing import Literal from mcp.server.fastmcp import FastMCP mcp = FastMCP("Weather Service") @mcp.tool() def get_temperature( location: str, unit: Literal["celsius", "fahrenheit"] = "celsius" ) -> str: """Get temperature with validated unit parameter.""" temp = 25 if unit == "celsius" else 77 return f"Temperature in {location}: {temp}ยฐ{unit[0].upper()}"

Example 4: Building a Python MCP Client ๐Ÿ”Œ

# client.py from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client import asyncio server_params = StdioServerParameters( command="uv", args=["run", "weather.py"] ) async def main(): async with stdio_client(server_params) as (read, write): async with ClientSession(read, write) as session: await session.initialize() # Call a tool result = await session.call_tool( "get_weather", arguments={"location": "Tokyo"} ) print(result) # List all available tools tools = await session.list_tools() print(f"Available tools: {tools}") if __name__ == "__main__": asyncio.run(main())

Example 5: Cross-Language MCP Integration ๐ŸŒ

Connect Python client to Node.js MCP server:

# client_airbnb.py server_params = StdioServerParameters( command="npx", args=["-y", "@openbnb/mcp-server-airbnb"] ) async def main(): async with stdio_client(server_params) as (read, write): async with ClientSession(read, write) as session: await session.initialize() # Discover tools from Node.js server tools = await session.list_tools() print(f"Airbnb MCP Tools: {tools}")

Example 6: Streamable HTTP Transport ๐ŸŒ

For advanced scenarios requiring HTTP-based communication:

# sample_mcp_streamable_server.py from mcp.server.fastmcp import FastMCP mcp = FastMCP("Streamable MCP Server") @mcp.tool() def greet(name: str) -> str: """Greets the user with their name.""" return f"Hello, {name}! Hope you're having a great day! ๐Ÿ˜Š" if __name__ == "__main__": # Use streamable HTTP transport for advanced scenarios mcp.run(transport="streamable-http")

Testing Streamable Servers:

# Start server uv run python sample_mcp_streamable_server.py # Test with MCP Studio (in another terminal) mcp-studio --remote http://127.0.0.1:8000

Example 7: Debugging & Verification ๐Ÿ›

# List all tools in your server uv run python -c "from weather import mcp; print(mcp.list_tools())" # Check Python version uv run python --version # Verify MCP package uv pip show mcp # Test imports uv run python -c "from weather import mcp; print('MCP initialized successfully')" # Run client tests python client.py python client_airbnb.py

๐Ÿค Contributing

This is a learning project! Feel free to:

  • ๐Ÿ› Report bugs or issues

  • ๐Ÿ’ก Suggest new MCP tools

  • ๐Ÿ“ Improve documentation

  • ๐Ÿ”€ Submit pull requests

๐Ÿ“„ License

This project is for learning purposes.


Built with โค๏ธ for learning MCP

โญ Star this repo if you found it helpful!

๐Ÿ™ GitHub โ€ข ๐Ÿ“š MCP Docs โ€ข ๐Ÿ”ง FastMCP

A
security โ€“ no known vulnerabilities
F
license - not found
A
quality - confirmed to work

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/sritajkumarpatel/learn_mcp_2025'

If you have feedback or need assistance with the MCP directory API, please join our Discord server