Skip to main content
Glama
AmirNaghibi

mcpserve

by AmirNaghibi

mcpserve

Minimal, decorator-based framework for building Model Context Protocol (MCP) servers in Python.

Zero required dependencies. Define tools and resources with simple decorators, and mcpserve handles the JSON-RPC protocol, parameter inference, and stdio transport.

Why?

MCP is the emerging standard for connecting AI assistants to external tools and data. But building an MCP server from scratch means implementing JSON-RPC 2.0 framing, capability negotiation, schema generation, and error handling. mcpserve handles all of that so you can focus on your tool logic.

  • Decorator-based@server.tool() and @server.resource() are all you need

  • Type inference — parameter types and optionality are inferred from Python type hints

  • Async-ready — supports both sync and async tool handlers

  • Zero dependencies — stdlib only for the core library (asyncio + json)

  • MCP 2024-11-05 — implements the latest protocol version

Related MCP server: mcp-stdio

Architecture

graph LR
    subgraph "AI Assistant"
        A[LLM Client]
    end

    subgraph "mcpserve"
        B[Stdio Transport] --> C[JSON-RPC Router]
        C --> D[Method Dispatcher]
        D --> E[tools/list]
        D --> F[tools/call]
        D --> G[resources/list]
        D --> H[resources/read]
    end

    subgraph "Your Code"
        I["@server.tool()"]
        J["@server.resource()"]
    end

    A <-->|"stdin/stdout"| B
    F --> I
    H --> J

Quick Start

from mcpserve import Server

server = Server(name="my-tools", version="1.0.0")

@server.tool()
def add(a: int, b: int) -> str:
    """Add two numbers together."""
    return str(a + b)

@server.tool()
def search(query: str, limit: int = 10) -> str:
    """Search for documents matching a query."""
    # Your logic here
    return f"Found {limit} results for: {query}"

@server.resource(uri="status://health", name="Health Check")
def health():
    """Server health status."""
    return "ok"

if __name__ == "__main__":
    server.run()

That's it. Run your server, point an MCP client at it, and your tools are available to the AI.

Installation

pip install mcpserve

Or from source:

git clone https://github.com/AmirNaghibi/mcpserve.git
cd mcpserve
pip install -e .

Usage with Claude Desktop

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "my-tools": {
      "command": "python",
      "args": ["/path/to/your/server.py"]
    }
  }
}

Features

Tool Registration

Parameters are automatically inferred from type hints:

@server.tool()
def fetch_url(url: str, timeout: int = 30, follow_redirects: bool = True) -> str:
    """Fetch content from a URL."""
    # url: required string
    # timeout: optional integer, default 30
    # follow_redirects: optional boolean, default True
    ...

Supported types: str, int, float, bool, list, dict

Async Tools

@server.tool()
async def slow_operation(input: str) -> str:
    """An async tool that does something time-consuming."""
    await asyncio.sleep(1)
    return f"Processed: {input}"

Resources

Expose data that the AI can read without calling a tool:

@server.resource(uri="docs://readme", name="README", mime_type="text/markdown")
def readme():
    with open("README.md") as f:
        return f.read()

Structured Results

Return rich results when plain text isn't enough:

from mcpserve import ToolResult

@server.tool()
def query_db(sql: str) -> ToolResult:
    try:
        rows = db.execute(sql)
        return ToolResult.json(rows)
    except Exception as e:
        return ToolResult.error(f"Query failed: {e}")

Custom Tool Names

@server.tool(name="web_search", description="Search the internet")
def my_internal_function(query: str) -> str:
    ...

Request Flow

sequenceDiagram
    participant Client as AI Client
    participant Transport as Stdio Transport
    participant Router as JSON-RPC Router
    participant Handler as Tool Handler

    Client->>Transport: {"jsonrpc":"2.0","id":1,"method":"initialize"}
    Transport->>Router: parse + validate
    Router-->>Transport: capabilities response
    Transport-->>Client: {"jsonrpc":"2.0","id":1,"result":{...}}

    Client->>Transport: {"method":"tools/call","params":{"name":"add","arguments":{"a":2,"b":3}}}
    Transport->>Router: parse
    Router->>Handler: dispatch(add, {a:2, b:3})
    Handler-->>Router: "5"
    Router-->>Transport: ToolResult
    Transport-->>Client: {"result":{"content":[{"type":"text","text":"5"}]}}

API Reference

Server(name, version)

Create a new MCP server.

@server.tool(name=None, description=None)

Register a function as a tool. Name defaults to the function name, description defaults to the docstring.

@server.resource(uri, name=None, description=None, mime_type="text/plain")

Register a function as a resource. The function is called when the client reads the resource URI.

ToolResult.text(str) / ToolResult.error(str) / ToolResult.json(data)

Factory methods for creating tool results.

server.run()

Start the server on stdio transport.

Running Tests

pip install -e ".[dev]"
pytest tests/ -v

License

MIT

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A universal framework for creating and deploying custom Model Context Protocol (MCP) tool servers with decorator-based tool registration, supporting multiple transports and automatic JSON schema generation for AI assistants.
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    A minimal, zero-dependency MCP server that enables defining and running tools over stdio transport, without extra features like HTTP or resources.
    15
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables building lightweight MCP servers where Rust handles transport, routing, and schema validation while Python defines tool behavior using type hints, with support for stdio and HTTP transports.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    A FastAPI-style framework for building MCP servers in Python, enabling declarative tool definitions with automatic schema validation and multiple transport options.
    MIT

View all related MCP servers

Related MCP Connectors

  • Markdown-first MCP server for Notion API with 8 composite tools and 39 actions.

  • An MCP server that let you interact with Cycloid.io Internal Development Portal and Platform

  • MCP server for Clipkit — gives AI agents a video toolbox via the Clipkit schema.

View all MCP Connectors

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/AmirNaghibi/mcpserve'

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