New here? Start with the Getting Started Guide.
Scaffold, test, and publish Model Context Protocol (MCP) servers in seconds.
Building MCP servers involves too much boilerplate. Every new server needs the same JSON-RPC handling, tool definitions, resource handlers, Dockerfile, tests, and packaging config. You end up copying from old projects, fixing import paths, and wasting time on plumbing instead of building.
MCP Forge fixes this. One command generates a complete, ready-to-develop MCP server project. Another command tests it. Another validates compliance. Another publishes it.
- ποΈ Scaffold full MCP server projects from templates in one command
- π§ͺ Test servers with a built-in MCP test harness (JSON-RPC over stdio)
- π Validate server compliance against the MCP specification
- π¦ Publish to PyPI with a single command
- π¨ Jinja2-powered scaffolding with clean, extensible templates
- π³ Dockerfile included in every generated project
- β‘ Zero config needed for standard MCP servers
pip install mcp-server-forgemcp-forge new my-server --tools weather,calculatorThat's it. You now have a complete, runnable MCP server:
my-server/
βββ Dockerfile
βββ README.md
βββ pyproject.toml
βββ .gitignore
βββ src/
β βββ my_server/
β βββ __init__.py
β βββ server.py
β βββ tools.py
β βββ resources.py
βββ tests/
βββ test_my_server.py
cd my-server
pip install -e .
mcp-forge test --cmd 'python -m my_server.server'ββββββββββββββββββββββββββββββββββββββββββββββββββββ
β MCP Forge Test Results β
ββββββββββββββββ¬βββββββββ¬βββββββββββββββββββββββββββ€
β Test β Status β Details β
ββββββββββββββββΌβββββββββΌβββββββββββββββββββββββββββ€
β server_start β PASS β Server started β
β initialize β PASS β initialize response valid β
β tools/list β PASS β Found 2 tools β
β tools/call β PASS β Called 'weather' OK β
β ping β PASS β Ping OK β
β unknown β PASS β Correctly returned error β
β server_stop β PASS β Server stopped cleanly β
ββββββββββββββββ΄βββββββββ΄βββββββββββββββββββββββββββ€
β 7/7 passed All tests passed! β
ββββββββββββββββββββββββββββββββββββββββββββββββββββ
mcp-forge validate ./my-servermcp-forge publish ./my-server
mcp-forge publish ./my-server --repository testpypi --dry-runThe new command generates a complete MCP server with:
- A fully functional
server.pywith JSON-RPC request routing - Tool definitions and handlers in
tools.py - Resource handlers in
resources.py - A
pyproject.tomlconfigured with hatchling - A
Dockerfilefor containerized deployment - A
README.mdwith usage instructions - Basic tests and
.gitignore
mcp-forge new my-server \
--tools weather,calculator,search \
--resources "file://data,http://api" \
--description "My awesome MCP server" \
--author "Your Name" \
--output-dir ./projectsMCP Forge uses Jinja2 templates internally. Each generated file comes from a template in the templates/ directory:
| Template | Generates |
|---|---|
server.py.j2 |
Main server with JSON-RPC routing |
tools.py.j2 |
Tool definitions and handlers |
resources.py.j2 |
Resource definitions and handlers |
project_pyproject.toml.j2 |
Package configuration |
project_readme.md.j2 |
Project README |
dockerfile.j2 |
Docker container config |
init.py.j2 |
Package init file |
The built-in test harness starts your MCP server as a subprocess and sends JSON-RPC requests over stdio, validating:
- Server startup and clean shutdown
- initialize response with protocol version, capabilities, and server info
- tools/list returns valid tool definitions
- tools/call executes a tool and returns content
- ping responds correctly
- Unknown methods return proper JSON-RPC errors
The validate command checks your project for:
- Required file structure (
src/,pyproject.toml,server.py,tools.py) - Tool definitions match the MCP schema (name, description, inputSchema)
- Initialize responses include all required fields
- Tool results contain valid content arrays
The publish command wraps build and twine for a smooth publishing experience:
# Build and publish to PyPI
mcp-forge publish .
# Dry run (build only)
mcp-forge publish . --dry-run
# Publish to TestPyPI
mcp-forge publish . --repository testpypiMake sure you have build and twine installed:
pip install mcp-server-forge[publish]The scaffolding uses Jinja2 templates internally. To customize the generated code, fork the repo and modify the templates in src/mcp_forge/templates/. The Jinja2 context includes:
project_name- the project name as givenpkg_name- Python package name (snake_case)title- human readable titledescription- project descriptionauthor- author nametools- list of tool namesresources- list of resource URI patterns
git clone https://github.com/manasvardhan/mcp-forge.git
cd mcp-forge
pip install -e ".[dev]"
pytestMIT License. See LICENSE for details.
Built with π¨ by Manas Vardhan