Initialize MCP Server
When invoked, create a new MCP server project with proper structure.
Process
- •Ask: Python (FastMCP) or TypeScript (@modelcontextprotocol/sdk)?
- •Create project structure
- •Set up dependencies
- •Create basic server file
- •Add configuration files
Python (FastMCP) Setup
Option 1: Using uv (Recommended)
uv is the fastest Python package manager and the recommended way to create new MCP servers.
Quick Start
bash
# 1. Initialize project (creates pyproject.toml, .gitignore) uv init my-mcp-server cd my-mcp-server # 2. Add FastMCP and dev tools uv add fastmcp>=2.0 uv add --dev pytest>=8.0 ruff>=0.4 # 3. Create server file mkdir -p src/my_server
Project Structure
code
my-mcp-server/
├── pyproject.toml # Project config (auto-generated by uv init)
├── uv.lock # Reproducible dependency lock file
├── .gitignore # Python + uv ignores
├── README.md
├── src/
│ └── my_server/
│ ├── __init__.py
│ └── server.py
└── tests/
└── test_server.py
pyproject.toml (auto-generated by uv)
toml
[project]
name = "my-mcp-server"
version = "0.1.0"
requires-python = ">=3.11"
dependencies = [
"fastmcp>=2.0",
]
[project.optional-dependencies]
dev = [
"pytest>=8.0",
"ruff>=0.4",
]
[project.scripts]
my-mcp-server = "my_server.server:main"
src/my_server/server.py
python
from fastmcp import FastMCP
mcp = FastMCP(
name="my-mcp-server",
instructions="Describe what this server does and how to use it."
)
@mcp.tool
def hello(name: str) -> str:
"""Say hello to someone."""
return f"Hello, {name}!"
def main():
mcp.run()
if __name__ == "__main__":
main()
Option 2: Traditional pip (Still Supported)
Use the same pyproject.toml structure, but install with:
bash
python -m venv .venv source .venv/bin/activate # or .venv\Scripts\activate on Windows pip install -e ".[dev]"
TypeScript Setup
Project Structure
code
my-mcp-server/
├── package.json
├── tsconfig.json
├── README.md
├── src/
│ └── index.ts
└── tests/
└── server.test.ts
package.json
json
{
"name": "my-mcp-server",
"version": "0.1.0",
"type": "module",
"main": "dist/index.js",
"scripts": {
"build": "tsc",
"start": "node dist/index.js",
"dev": "tsx src/index.ts"
},
"dependencies": {
"@modelcontextprotocol/sdk": "^1.0.0",
"zod": "^3.25.0"
},
"devDependencies": {
"@types/node": "^20.0.0",
"typescript": "^5.0.0",
"tsx": "^4.0.0"
}
}
tsconfig.json
json
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"outDir": "dist",
"declaration": true
},
"include": ["src"]
}
index.ts
typescript
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import * as z from 'zod';
const server = new McpServer({
name: 'my-mcp-server',
version: '0.1.0'
});
server.registerTool(
'hello',
{
title: 'Hello',
description: 'Say hello to someone',
inputSchema: {
name: z.string().describe('Name to greet')
}
},
async ({ name }) => ({
content: [{ type: 'text', text: `Hello, ${name}!` }]
})
);
const transport = new StdioServerTransport();
await server.connect(transport);
After Scaffolding
Using uv (Recommended for Python)
- •
Install dependencies:
bashuv sync --dev
- •
Test the server:
bashuv run python -m my_server.server
- •
Generate lock file for reproducible deployments:
bashuv lock
- •
Add to Claude Desktop config to test
Using pip (Traditional Python)
- •
Install dependencies:
bashpip install -e ".[dev]"
- •
Test the server:
bashpython -m my_server.server
- •
Add to Claude Desktop config to test
Using npm (TypeScript)
- •
Install dependencies:
bashnpm install
- •
Test the server:
bashnpm run dev
- •
Add to Claude Desktop config to test