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-mcplocally 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
-
Health check
curl -v http://localhost:8080/health # Expect: OK
-
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-Idfrom 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/initializedMCP 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"}'
- List tools -
tools/list
-
tools/listonce 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.
- Call a tool (e.g.
add) -tools/call
-
tools/callTo 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.14
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| calculator_mcp_rubens-0.0.14.tar.gz | 12.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| calculator_mcp_rubens-0.0.14-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 28.7 kB
Release files / calculator_mcp_rubens-0.0.14.tar.gz
| Download URL | calculator_mcp_rubens-0.0.14.tar.gz |
|---|---|
| Size | 12.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f3d5098d2410e4b2ed138270b296023dbd8c5ec68ae5c1d145cd5515b0030014
|
|
BLAKE2b-256 checksum How to use checksums |
567c161aa3e2e7da8ffc3f3ec683aac60ada7c6009360d5c6f19c677925f14f0
|
| 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.14-py3-none-any.whl
| Download URL | calculator_mcp_rubens-0.0.14-py3-none-any.whl |
|---|---|
| Size | 16.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
a783105303aa5420ec44f37805c04a00afa96f32e135eeb16d564fd9fda30bb0
|
|
BLAKE2b-256 checksum How to use checksums |
e0e45ea76475740819c6c94299f2f6119b7436125959c4f05801a8d00e6042bf
|
| 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
|