lazy-calculator
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@lazy-calculatorWhat is 2 + 2?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
𦄠Lazy Calculator MCP Server
A Model Context Protocol (MCP) server that creates a hilariously wrong calculator - it always doubles the actual answer! Built as a learning exercise for understanding MCP server implementation with Claude Desktop.
š Table of Contents
Related MCP server: Calculator MCP Server
šÆ Overview
The Lazy Calculator is an MCP server that:
Parses natural language math questions
Calculates the correct answer
Returns double the actual result (because it's "lazy")
Demonstrates proper MCP server implementation patterns
Example Usage
Input: "What is 5 + 5?"
Output: "The answer is 20 (definitely not 10... wink)"
š What You'll Learn
This repository demonstrates:
MCP Server Implementation - Using the standard MCP SDK (not FastMCP)
Python Virtual Environments - Required for macOS due to system Python restrictions
Safe Math Expression Evaluation - Using Python's AST module
Natural Language Processing - Basic pattern matching for math questions
Claude Desktop Integration - Proper configuration and debugging
š¦ Prerequisites
System Requirements
macOS (tested) or Linux/Windows (may need path adjustments)
Python 3.8+ (Python 3.13 tested)
Claude Desktop app installed
Homebrew (for macOS users)
Required Software
# Check Python version
python3 --version
# Install Python via Homebrew if needed (macOS)
brew install python@3.13š Installation
Step 1: Clone the Repository
git clone https://github.com/YOUR_USERNAME/lazy-calculator-mcp.git
cd lazy-calculator-mcpStep 2: Create Virtual Environment
# Create virtual environment (REQUIRED on macOS)
python3 -m venv mcp_venv
# Activate the virtual environment
source mcp_venv/bin/activate
# Install dependencies
pip install mcpStep 3: Make Scripts Executable
chmod +x lazy_calculator_server.py
chmod +x run_lazy_calculator.shStep 4: Update the Wrapper Script
Edit run_lazy_calculator.sh and update the path to match your installation:
#!/bin/bash
cd "/path/to/your/lazy-calculator-mcp" # UPDATE THIS PATH
source mcp_venv/bin/activate
exec python lazy_calculator_server.pyāļø Claude Desktop Configuration
Configuration File Location
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%\Claude\claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
Add to Configuration
{
"mcpServers": {
"lazy-calculator": {
"command": "/path/to/your/lazy-calculator-mcp/run_lazy_calculator.sh",
"args": [],
"env": {}
}
}
}ā ļø IMPORTANT: Update the path to match where you cloned this repository!
Restart Claude Desktop
After updating the configuration, completely quit and restart Claude Desktop.
š Troubleshooting Guide
Critical Log File Locations
When debugging MCP servers with Claude Desktop, these are the essential files:
1. Main Application Log
# macOS
~/Library/Logs/Claude/main.log
# View recent entries
tail -f ~/Library/Logs/Claude/main.log2. MCP Server Specific Log
# macOS - Each MCP server gets its own log
~/Library/Logs/Claude/mcp-server-lazy-calculator.log
# Monitor in real-time
tail -f ~/Library/Logs/Claude/mcp-server-lazy-calculator.log3. Configuration File
# View current configuration
cat ~/Library/Application\ Support/Claude/claude_desktop_config.json
# Edit configuration
nano ~/Library/Application\ Support/Claude/claude_desktop_config.jsonCommon Error Messages & Solutions
Error: "spawn python ENOENT"
Problem: System can't find python command
Solution: Use python3 or full path /opt/homebrew/bin/python3
Error: "ModuleNotFoundError: No module named 'mcp'"
Problem: MCP not installed or wrong Python environment Solution: Ensure virtual environment is activated and mcp is installed
Error: "unhandled errors in a TaskGroup"
Problem: FastMCP compatibility issue or missing initialization parameters
Solution: Use standard MCP SDK with proper capabilities field
Error: "Extension lazy-calculator not found in installed extensions"
Problem: Normal warning - custom servers aren't "extensions" Solution: This can be safely ignored
Testing Your Server Manually
# Test the server directly
cd /path/to/lazy-calculator-mcp
source mcp_venv/bin/activate
echo '{"jsonrpc": "2.0", "method": "initialize", "params": {"protocolVersion": "2025-06-18", "capabilities": {}, "clientInfo": {"name": "test", "version": "1.0"}}, "id": 1}' | python lazy_calculator_server.pyExpected response:
{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2025-06-18","capabilities":{"tools":{}},"serverInfo":{"name":"lazy-calculator","version":"1.0.0"}}}š ļø Developer Cheat Sheet
Quick Commands for Claude Code Assistance
When working with Claude Code to debug MCP servers, provide these paths:
## Paths for Claude Code Debugging
### View MCP Server Log
/Users/YOUR_USERNAME/Library/Logs/Claude/mcp-server-lazy-calculator.log
### View Main Application Log
/Users/YOUR_USERNAME/Library/Logs/Claude/main.log
### Edit Configuration
/Users/YOUR_USERNAME/Library/Application Support/Claude/claude_desktop_config.json
### Server Location
/path/to/your/lazy-calculator-mcp/lazy_calculator_server.pyDebugging Workflow
Check if server is listed in Claude Desktop
Look for "lazy-calculator" in the MCP servers section
Monitor logs during connection
# Terminal 1: Watch main log tail -f ~/Library/Logs/Claude/main.log | grep lazy-calculator # Terminal 2: Watch server log tail -f ~/Library/Logs/Claude/mcp-server-lazy-calculator.logTest server independently
cd /path/to/lazy-calculator-mcp ./run_lazy_calculator.sh # Should run without errors
šļø Architecture Deep Dive
File Structure
lazy-calculator-mcp/
āāā lazy_calculator_server.py # Main MCP server implementation
āāā run_lazy_calculator.sh # Wrapper script for virtual environment
āāā requirements.txt # Python dependencies (just 'mcp')
āāā mcp_venv/ # Virtual environment (created during setup)
āāā README.md # This fileKey Components
1. Server Initialization
from mcp.server import Server
from mcp.server.models import InitializationOptions
from mcp.types import ServerCapabilities
server = Server("lazy-calculator")
# Critical: Must include capabilities field
InitializationOptions(
server_name="lazy-calculator",
server_version="1.0.0",
capabilities=ServerCapabilities(tools={})
)2. Tool Registration
@server.list_tools()
async def handle_list_tools() -> list[Tool]:
return [Tool(...)]
@server.call_tool()
async def handle_call_tool(name: str, arguments: dict) -> list[TextContent]:
# Handle tool execution3. Safe Math Evaluation
Uses Python's
astmodule for safe expression parsingNo
eval()orexec()- prevents code injectionWhitelist of allowed operations and functions
4. Natural Language Processing
Regex-based pattern matching
Word-to-number conversion
Operation keyword detection
MCP Protocol Flow
Initialize ā Server receives protocol version and capabilities
List Tools ā Server returns available tools
Call Tool ā Server executes requested tool with arguments
Return Result ā Server sends formatted response
š Common Issues & Solutions
Issue 1: Python Path Problems on macOS
The Journey:
macOS uses system Python which is protected
pip installfails with "externally-managed-environment"Must use virtual environments
Solution: Always use virtual environment with full path in wrapper script
Issue 2: FastMCP vs Standard MCP
The Journey:
FastMCP has simpler syntax but caused "TaskGroup" errors
Standard MCP requires more boilerplate but is more stable
Solution: Use standard MCP SDK with proper initialization
Issue 3: Configuration Not Taking Effect
The Journey:
Claude Desktop caches configurations
Hot-reload doesn't always work
Solution: Completely quit Claude Desktop (Cmd+Q) and restart
Issue 4: Server Connects but Immediately Disconnects
The Journey:
Missing required fields in initialization
Incorrect protocol version
Solution:
Ensure capabilities field is included in InitializationOptions
š Lessons Learned
Always use virtual environments on macOS - System Python is protected
Log files are your best friend - Check both main.log and server-specific logs
Test servers independently first - Use echo/pipe to test before Claude Desktop
FastMCP isn't always faster to implement - Standard SDK is more reliable
Wrapper scripts solve environment issues - Activate venv before running Python
Configuration requires full restart - Claude Desktop doesn't hot-reload MCP servers
š¤ Contributing
Feel free to submit issues and enhancement requests!
š License
MIT License - See LICENSE file for details
š Acknowledgments
Built while learning MCP with Claude Code
Thanks to Anthropic for the MCP protocol
Inspired by the need to understand MCP server implementation
Remember: This calculator is intentionally wrong! It's a learning tool, not for actual calculations. š¦„
Quick Start for Claude Code Users
If you're using Claude Code to work with this repository:
Clone the repo
Tell Claude Code these paths:
Config: ~/Library/Application Support/Claude/claude_desktop_config.json Logs: ~/Library/Logs/Claude/mcp-server-lazy-calculator.logLet Claude Code handle the debugging!
This server cannot be deployed
Maintenance
Related MCP Connectors
A simple MCP server built with FastMCP and python
Related MCP Servers
- AlicenseCqualityDmaintenanceA vulnerable MCP server implementation that demonstrates how poor coding practices can lead to security issues like Remote Code Execution, designed for educational purposes to add numbers.12MIT
- FlicenseNot gradedqualityDmaintenanceA simple MCP server that provides basic calculator functionality for performing mathematical operations. Built with FastMCP and demonstrates fundamental MCP server implementation patterns.-
- FlicenseNot gradedqualityDmaintenanceA simple educational MCP server providing basic math operations, string manipulation, and greeting functionality. Demonstrates how to implement MCP tools for learning purposes.-
- AlicenseNot gradedqualityDmaintenanceA simple MCP server that provides calculator tools for basic arithmetic operations with zero-division protection.27 npmISC