Skip to main content

License: MIT AI Assisted

Calculator MCP Server

calculator-mcp is a small Streamable HTTP MCP (Model Context Protocol) server that exposes 16 arithmetic operations as callable tools for an AI LLM (Large Language Model) to consume. It contains no math of its own — every tool is a thin synchronous wrapper that logs its arguments and delegates to an open-source shared math calculator calculator-lib-rubens PyPI library package.

Features

16 calculator tools available via MCP based on JSON-RPC 2.0 messages:

Two-operand operations: add, subtract, multiply, divide, power, nth_root, modulo, floor_divide

Single-operand operations: sqrt, absolute, floor, ceil, log10, ln, exp

Rounding: round_number (with configurable decimal places)

AI Disclaimer

This project includes code and documentation created with the assistance of AI tools. For details on usage, limits, and review practices, please see the AI Disclaimer.

Prerequisites

  • Python 3.14+
  • pip 26.2+
  • curl 8.7+

Installation and Usage

IMPORTANT: It is recommended that you run pip uninstall to remove any previously installed versions of this software from your local machine. The application's release versioning was recently reset and to re-start again at version 0.0.1.

  • Uninstall earlier possible installed release:

    pip uninstall calculator-mcp-rubens
    # recommend to purge the cache as well
    pip cache purge
    

Installation

The calculator-mcp can be installed by running pip install calculator-mcp-rubens. It requires python 3.14+ and pip to run.

  • To install locally into the user's home environment run command below

    # install "calculator-mcp" and depdencies into user local pip environment
    # NOTE: use --no-cache-dir to avoid issues with earlier version in cache
    pip --no-cache-dir install -U --user calculator-mcp-rubens --verbose
    
  • Confirm installed version with most recently released GitHub version at calculator-mcp/releases

    # install "calculator-mcp" and depdencies into user local pip environment
    pip show calculator-mcp-rubens
    

Usage

Running the MCP Server

  • Launch calculator-mcp locally with sensible defaults:

    # Launches the Streamable HTTP MCP server locally at:
    # http://0.0.0.0:8080/mcp
    # The "0.0.0.0" is used because this application is meant to run from
    # within a Docker container, which requires the wildcard address, or
    # INADDR_ANY, to accept HTTP connections from outside the container.
    calculator-mcp
    

Exercise the MCP Server Endpoints

  1. Health check

    curl -v http://localhost:8080/health
    # Expect: OK
    
  2. Initialize MCP session

The MCP endpoint requires a session, established via initialize first. Run these in order:

  • a) Store JSON below in a local file /tmp/initialize.json:

    # remove indentation spaces when copying/pasting this command to the shell
    cat > /tmp/initialize.json <<EOF
    {
      "jsonrpc": "2.0",
      "id": 1,
      "method": "initialize",
      "params": {
        "protocolVersion": "2025-06-18",
        "capabilities": {},
        "clientInfo": {
          "name": "curl-test",
          "version": "1.0"
        }
      }
    }
    EOF
    
  • b) MCP client initializes session — grab the Mcp-Session-Id from the response headers

    # Look for the "mcp-session-id: <SID>" header in the output
    curl -i http://localhost:8080/mcp \
    -H "Content-Type: application/json" \
    -H "Accept: application/json, text/event-stream" \
    -d @/tmp/initialize.json
    
  • c) notifications/initialized MCP client sends the required "initialized" notification (use the SID from step b)

    SID="<paste-mcp-session-id-here>"
    # Expect "202 Accepted" response
    curl -v http://localhost:8080/mcp \
    -H "Content-Type: application/json" \
    -H "Accept: application/json, text/event-stream" \
    -H "Mcp-Session-Id: $SID" \
    -d '{"jsonrpc":"2.0","method":"notifications/initialized"}'
    
  1. List tools - tools/list
  • tools/list once you have initialized your MCP session, list all the tools:

    curl -s http://localhost:8080/mcp \
    -H "Content-Type: application/json" \
    -H "Accept: application/json, text/event-stream" \
    -H "Mcp-Session-Id: $SID" \
    -d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'
    

This returns all 16 tools: add, subtract, multiply, divide, power, nth_root, modulo, floor_divide, sqrt, absolute, floor, ceil, log10, ln, exp, round_number.

  1. Call a tool (e.g. add) - tools/call
  • tools/call To call one of the tools (e.g., add)

    curl -s http://localhost:8080/mcp \
      -H "Content-Type: application/json" \
      -H "Accept: application/json, text/event-stream" \
      -H "Mcp-Session-Id: $SID" \
      -d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"add","arguments":{"a":2,"b":3}}}'
    

Returns {"result": 5.0} in structuredContent. Swap name and arguments to call any other tool, e.g. {"name": "divide", "arguments": {"a": 15, "b": 4}} or {"name": "sqrt", "arguments": {"a": 16}}.

Note: the same Mcp-Session-Id must be reused across steps b, c, 3, and 4 — the server ties the session to that ID.

Configuration

The server ships with a default config.yaml bundled inside the package. To override it, set the CALCULATOR_MCP_CONFIG environment variable to the absolute path of your custom configuration file:

export CALCULATOR_MCP_CONFIG=/path/to/your/config.yaml

When CALCULATOR_MCP_CONFIG is not set, the bundled default is used automatically.

The configuration file has three sections. The logging section controls Python logging via dictConfig. The default configuration logs calculator_mcp messages at DEBUG level to stderr.

# =============================================================================
# Server Configuration
# =============================================================================
server:
    # the home page of this project
    homepage: "https://github.com/rubensgomes-org/calculator-mcp"
    # MCP transport: "stdio" or "http"
    # http: for web services using the Streamable HTTP protocol
    transport: "http"
    # Host IP address for the HTTP/MCP server.
    # The "0.0.0.0" is used because this application is meant to run from
    # within a Docker container, which requires the wildcard address or
    # NADDR_ANY to accept HTTP connections
    # from outside the Docker container.
    # Use 127.0.0.1 to restrict the server to localhost only.
    host: "0.0.0.0"
    #host: "127.0.0.1"
    # Port for the HTTP/MCP server, defaults to:
    port: 8080
    #port: 9090
    # timeout in seconds
    timeout: 10

# =============================================================================
# Client Configuration
# =============================================================================
client:
    # the URL the client should use when the server transport is "http"
    #    is_oauth: false
    #    url: "http://127.0.0.1:8080/mcp"
    is_oauth: true
    url: "https://rubens-calculator-mcp.fastmcp.app/mcp"
    # location to store OAuth token
    token_dir: "~/.fastmcp"
    # fixed port for the OAuth callback server
    callback_port: 10000

# =============================================================================
# Logging Configuration
# =============================================================================
logging:
    version: 1
    disable_existing_loggers: false
    formatters:
        standard:
            format: "%(asctime)s [%(levelname)s] %(name)s: %(message)s"
    handlers:
        console:
            class: logging.StreamHandler
            formatter: standard
            stream: ext://sys.stderr
    loggers:
        calculator_mcp:
            level: DEBUG
            handlers:
                - console
            propagate: false
        # MCP protocol tracing — set to DEBUG to see full JSON-RPC messages
        mcp.client.streamable_http:
            level: INFO
            handlers:
                - console
            propagate: false
        # HTTP request/response summaries — set to DEBUG for detail
        httpx:
            level: DEBUG
            handlers:
                - console
            propagate: false
        # HTTP wire-level tracing (headers, TCP) — set to DEBUG for detail
        httpcore:
            level: INFO
            handlers:
                - console
            propagate: false
        # Server: inbound JSON-RPC messages — set to DEBUG to see parsed requests
        mcp.server.lowlevel.server:
            level: INFO
            handlers:
                - console
            propagate: false
        # Server: StreamableHTTP transport — set to DEBUG for method-level tracing
        mcp.server.streamable_http:
            level: INFO
            handlers:
                - console
            propagate: false
        # Server: session/transport lifecycle — set to DEBUG for session details
        mcp.server.streamable_http_manager:
            level: INFO
            handlers:
                - console
            propagate: false
        # Server: HTTP request lines (method, path, status)
        uvicorn.access:
            level: INFO
            handlers:
                - console
            propagate: false
    root:
        level: WARNING
        handlers:
            - console

License

The project is licensed under MIT License.


Author: Rubens Gomes

Release files for calculator-mcp-rubens 0.0.13

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for calculator-mcp-rubens 0.0.13
File Size Uploaded
calculator_mcp_rubens-0.0.13.tar.gz 12.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for calculator-mcp-rubens 0.0.13
File Interpreter ABI Platform
calculator_mcp_rubens-0.0.13-py3-none-any.whl Python 3 none any Details

Total release size: 28.7 kB

Release files / calculator_mcp_rubens-0.0.13.tar.gz

Download URL calculator_mcp_rubens-0.0.13.tar.gz
Size 12.5 kB
Tags Source
SHA-256 checksum
How to use checksums
023c6a0c9506369b91bf314fdc6fe08998c225c8a4a120dac52700e691feb516
BLAKE2b-256 checksum
How to use checksums
321421f20414859cd6e4e9d7b88dc8e79360f3960017e8b81dad03fe1b14f2fc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.4.3 CPython/3.14.7 Linux/6.17.0-1022-azure

Release files / calculator_mcp_rubens-0.0.13-py3-none-any.whl

Download URL calculator_mcp_rubens-0.0.13-py3-none-any.whl
Size 16.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5ce44f4712a27f2d15d83f690c0e9bf96b1a91dc5b912971ee16f11999f8a97a
BLAKE2b-256 checksum
How to use checksums
c0b22359eac867d35e2bb413c9421aab23f1a23521d640db8f040b030722c666
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/2.4.3 CPython/3.14.7 Linux/6.17.0-1022-azure

Release history Release notifications | RSS feed

0.0.21

2 release files

0.0.20

2 release files

0.0.19

2 release files

0.0.18

2 release files

0.0.17

2 release files

0.0.16

2 release files

0.0.15

2 release files

0.0.14

2 release files

This release

0.0.13 This release

2 release files

0.0.12

2 release files

0.0.11

2 release files

0.0.10

2 release files

0.0.9

2 release files

0.0.8

2 release files

0.0.7

2 release files

0.0.6

2 release files

0.0.5

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page