Skip to main content

MCP Server with FastMCP

This guide explains the new FastMCP-based implementation of the Sunholo VAC MCP server, which provides a simpler and more Pythonic way to expose VAC functionality via the Model Context Protocol.

What's Changed​

The Sunholo MCP implementation now uses FastMCP, which provides:

  • 70% less boilerplate code compared to the standard MCP SDK
  • Automatic schema generation from Python type hints
  • Decorator-based tool registration for cleaner code
  • Built-in transport handling for both stdio and HTTP
  • Better async support and error handling

Key Benefits​

Before (Standard MCP SDK)​

# ~266 lines of complex setup code
class VACMCPServer:
def _setup_handlers(self):
@self.server.list_tools()
async def list_tools() -> List[Tool]:
tools = [
Tool(
name="vac_stream",
description="Stream responses...",
inputSchema={
"type": "object",
"properties": {
# 30+ lines of manual schema definition
}
}
)
]

After (FastMCP)​

# ~150 lines of clean, readable code
from fastmcp import FastMCP

mcp = FastMCP("sunholo-vac-server")

@mcp.tool
async def vac_stream(
vector_name: str,
user_input: str,
chat_history: List[Dict[str, str]] = None
) -> str:
"""Stream responses from a Sunholo VAC."""
# Direct implementation - schema auto-generated from type hints

Usage​

The FastMCP implementation is now the default. When you enable MCP server in your VAC:

from sunholo.agents.fastapi import VACRoutesFastAPI

vac_routes = VACRoutesFastAPI(
app,
stream_interpreter=your_interpreter,
enable_mcp_server=True # Uses FastMCP automatically
)

Available Tools​

The FastMCP implementation exposes the same tools with improved definitions:

vac_stream​

Streams responses from a Sunholo VAC with automatic type validation.

@mcp.tool
async def vac_stream(
vector_name: str, # Required: VAC name
user_input: str, # Required: User's question
chat_history: List = None, # Optional: Conversation history
stream_wait_time: float = 7, # Optional: Chunk wait time
stream_timeout: float = 120 # Optional: Total timeout
) -> str:

vac_query​

Non-streaming VAC queries (when vac_interpreter is provided).

@mcp.tool
async def vac_query(
vector_name: str,
user_input: str,
chat_history: List = None
) -> str:

CLI Commands​

The CLI now uses FastMCP for both server and bridge modes:

MCP Server (stdio mode for Claude Desktop)​

sunholo mcp server

HTTP Server Mode​

sunholo mcp bridge http://127.0.0.1:8000/mcp

FastMCP handles the transport layer automatically, eliminating the need for a separate stdio-to-HTTP bridge in many cases.

Claude Desktop Configuration​

The configuration remains the same, but the underlying implementation is now more robust:

{
"mcpServers": {
"sunholo-vac": {
"command": "sunholo",
"args": ["mcp", "server"]
}
}
}

Testing Your MCP Server​

Quick Test​

# Run the example
python examples/mcp_fastmcp_example.py

# In another terminal, test the MCP endpoint
curl http://localhost:8000/mcp

Test Tool Execution​

from fastmcp import FastMCP

# The server automatically validates inputs
# Invalid types or missing required fields will raise clear errors

Migration Notes​

If you have existing code using the old MCP implementation:

  1. No code changes required - The interface remains the same
  2. Better error messages - FastMCP provides clearer validation errors
  3. Improved performance - Less overhead from manual schema handling
  4. Simplified debugging - Cleaner stack traces and error messages

Advanced Features​

Custom Transport Configuration​

# FastMCP supports multiple transports
mcp.run(transport="http", port=8000) # HTTP mode
mcp.run(transport="stdio") # stdio mode (default)

Type-Safe Tool Definitions​

from typing import Optional, List, Dict

@mcp.tool
async def advanced_vac_tool(
required_param: str,
optional_param: Optional[int] = None,
list_param: List[str] = None,
dict_param: Dict[str, Any] = None
) -> Dict[str, Any]:
"""
FastMCP automatically generates the correct schema
from these type hints - no manual definition needed!
"""
return {"result": "processed"}

Troubleshooting​

ImportError for FastMCP​

Ensure FastMCP is installed:

pip install fastmcp>=2.12.0

Tool Not Appearing in Claude​

FastMCP tools are registered at module import time. Ensure your interpreter functions are defined before creating the VACMCPServer instance.

Type Validation Errors​

FastMCP validates all inputs against the type hints. Ensure your tool functions have proper type annotations.

Performance Improvements​

The FastMCP implementation provides:

  • Faster startup - Less initialization overhead
  • Lower memory usage - No redundant schema storage
  • Better async performance - Optimized for async/await patterns
  • Reduced latency - Direct tool invocation without intermediate layers

See Also​

Sunholo Multivac

Get in touch to see if we can help with your GenAI project.

Contact us

Other Links

Sunholo Multivac - GenAIOps

Copyright ©

Holosun ApS 2026