tiny-mcp-server
README.md
# tiny-mcp-server
**The fastest, smallest way to build Model Context Protocol (MCP) servers in Python. Zero dependencies. MIT.**
`tiny-mcp-server` is a single-file Python framework for building [Model Context Protocol](https://modelcontextprotocol.io) servers. No external dependencies, no boilerplate â just decorate a function with `@tool` and you're shipping an MCP server.
## Features
- ðŠķ **One-file, zero-dependency** â pure Python stdlib, drop it in any project
- ðŠ **`@tool` decorator** â turn any function into an MCP tool with one line
- ð **Multiple transports** â `stdio` (for desktop MCP clients) and `sse` (for web/remote)
- ïŋ― **Automatic JSON Schema generation** â type hints + docstrings become tool schemas
- ïŋ―ïļ **Built-in logging and error handling** â never crash on a malformed payload
- ïŋ―ïļ **MIT licensed** â use it anywhere
## Install
Pick whichever is easiest:
```bash
# Option 1 â pip (when published)
pip install tiny-mcp-server
# Option 2 â curl a single file and import it
curl -O https://raw.githubusercontent.com/hussain-alsaibai/tiny-mcp-server/main/tiny_mcp_server.py
# Option 3 â vendor it
cp tiny_mcp_server.py your_project/
```
## Quick Start
Here's a complete MCP server with two tools â under 20 lines:
```python
from tiny_mcp_server import Server, tool
app = Server("hello-world")
@app.tool
def add(a: int, b: int) -> int:
"""Add two numbers together."""
return a + b
@app.tool
def greet(name: str = "World") -> str:
"""Greet someone by name."""
return f"Hello, {name}!"
if __name__ == "__main__":
app.run("stdio") # or "sse" for HTTP transport
```
The `add` tool's auto-generated JSON Schema:
```json
{
"name": "add",
"description": "Add two numbers together.",
"inputSchema": {
"type": "object",
"properties": {
"a": {"type": "integer"},
"b": {"type": "integer"}
},
"required": ["a", "b"]
}
}
```
## Transports
### stdio (default â for Claude Desktop, Cursor, etc.)
```python
app.run("stdio")
```
The server reads JSON-RPC messages from stdin and writes responses to stdout. This is the transport used by every desktop MCP client.
### SSE (HTTP â for web clients)
```python
app.run("sse", host="127.0.0.1", port=8000)
```
Exposes a Server-Sent Events endpoint at `/sse` and a POST endpoint at `/messages`. Great for running an MCP server as a local microservice.
## API Reference
### `Server(name: str)`
```python
app = Server("my-server")
```
### `@app.tool`
```python
@app.tool(name="optional-name", description="optional-desc")
def my_tool(arg: str, count: int = 1) -> str:
"""Tool description (used as fallback if description not provided)."""
return arg * count
```
- `name` â defaults to the function name
- `description` â defaults to the function's docstring
- Arguments are inferred from the signature; types from annotations
- Default values become optional in the schema
### `app.run(transport: str, **kwargs)`
- `"stdio"` â no extra args
- `"sse"` â `host` (default `127.0.0.1`), `port` (default `8000`)
## Examples
See [`examples/hello_world.py`](examples/hello_world.py) for a runnable demo.
## License
MIT ÂĐ hussain-alsaibai
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues