Skip to main content
Glama
bagasta

FastMCP Server

by bagasta

FastMCP Server

Production-ready Model Context Protocol server built on top of FastMCP. It exposes a set of demo tools (calculator, web search, web fetch) and ships with a Playground UI for interactive testing.

Features

  • ๐Ÿš€ Powered by FastMCP's high-level MCP abstractions

  • ๐Ÿ”ง Decorator-based tool registration with automatic schema generation

  • ๐Ÿงช Comprehensive pytest suite with in-memory FastMCP client tests

  • ๐Ÿ–ฅ๏ธ Web playground for exercising tools without writing a client

  • ๐Ÿงพ PDF generation from HTML/Markdown templates with pluggable rendering engines

  • โš™๏ธ Environment-driven configuration for tool toggles and timeouts

Related MCP server: MCP Server Client Demo

Quick Start

  1. Install dependencies

    pip install -r requirements.txt
  2. Configure environment

    cp .env.example .env
    # Edit .env to suit your environment
  3. Run the MCP server (choose either command)

    # Using Python directly
    python -m src.server
    
    # Or via the FastMCP CLI (adds uvicorn/stdio helpers)
    fastmcp run src/server.py
  4. Launch the Playground UI (optional)

    python start_playground.py
    # Open http://localhost:8080

LangChain SSE Verification

export MCP_BEARER_TOKEN=jango
fastmcp run src/server.py --transport sse --host 0.0.0.0 --port 8080

In another terminal:

# Stream the MCP handshake and keep-alive frames
curl -N -H "Authorization: Bearer jango" http://localhost:8080/mcp/stream | head

# Invoke the calculator tool over HTTP
curl -X POST http://localhost:8080/tools/calculator/call \
  -H "Authorization: Bearer jango" \
  -H "Content-Type: application/json" \
  -d '{"arguments":{"expression":"6*7"}}'

The SSE stream should emit data: {...} frames for the initialize result, the tools/list payload, and periodic ping messages. The calculator call should return JSON containing "result": "42".

Adding New Tools

Tools are plain Python functions decorated with @mcp.tool. Schemas are inferred from type hints and default values.

# src/server.py
from fastmcp import Context
from src.server import mcp

@mcp.tool(name="greet", description="Return a friendly greeting")
def greet(name: str, excited: bool = False) -> str:
    message = f"Hello, {name}!"
    return message.upper() if excited else message

Set MCP_ENABLED_TOOLS_CONFIG in .env to control which tools are registered at import time.

PDF Generation Tool

The pdf.generate tool renders PDF documents from HTML or Markdown templates:

  • Provide a template string and optional variables (dict or JSON string) for templating via Jinja2.

  • Pick content_type="markdown" to auto-convert Markdown into HTML before rendering.

  • Choose a rendering engine with the engine parameter:

    • weasyprint (default) โ€” install with pip install weasyprint and ensure Cairo/Pango system libraries are available.

    • wkhtmltopdf โ€” install with pip install pdfkit and the wkhtmltopdf binary on your PATH.

  • Set output_format="base64" to receive the PDF bytes inline, or "path" with output_path to write to disk (defaults to playground/generated_pdfs/).

Markdown support relies on the markdown package (pip install markdown). If an engine dependency is missing, the tool returns a helpful error message instead of failing silently.

Testing

pytest tests/

Documentation

  • how-to-use.md โ€” end-to-end usage guide

  • docs/ โ€” extended documentation on configuration, deployment, testing, and the playground

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers