Skip to main content
Glama
euclidtools

Euclid

by euclidtools
README.md
# Euclid

> _"What is asserted without proof can be dismissed without proof, but what is proved, endures."_
> In the spirit of Euclid of Alexandria

Twenty-three centuries ago, Euclid of Alexandria looked at the mathematics of his time, a tangle of folklore, intuition, and "trust me", and said: _no more_. He built geometry from the ground up on axioms and proofs. If something was true, you could _show_ it was true. No hand-waving. No guessing.

Large language models have the same problem Euclid's contemporaries did. They don't calculate. They _predict_. When you ask an LLM "what's 247 x 389?", it pattern-matches against its training data and guesses what the answer probably looks like. Sometimes right, sometimes wrong. You'd never know the difference.

**Deterministic computation tools for AI agents.**

Euclid is a hosted [MCP server](https://modelcontextprotocol.io) that gives any AI agent access to real, deterministic computation engines. What is self-evident should not be guessed, and arithmetic is about as self-evident as it gets.

---

## Quick Start

### Claude Code

```bash
claude mcp add euclid --transport http https://mcp.euclidtools.com
```

### Claude Desktop

Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or `%APPDATA%\Claude\claude_desktop_config.json` (Windows):

```json
{
  "mcpServers": {
    "euclid": {
      "url": "https://mcp.euclidtools.com"
    }
  }
}
```

### Cursor

Add to `.cursor/mcp.json` in your project root (or `~/.cursor/mcp.json` globally):

```json
{
  "mcpServers": {
    "euclid": {
      "url": "https://mcp.euclidtools.com"
    }
  }
}
```

### Windsurf

Add to `~/.windsurf/mcp.json`:

```json
{
  "mcpServers": {
    "euclid": {
      "url": "https://mcp.euclidtools.com"
    }
  }
}
```

### VS Code (Copilot)

Add to `.vscode/mcp.json` in your project:

```json
{
  "servers": {
    "euclid": {
      "type": "http",
      "url": "https://mcp.euclidtools.com"
    }
  }
}
```

### Other MCP Clients

Any MCP client that supports HTTP transport will work. Point it at:

```
https://mcp.euclidtools.com
```

Authentication is handled automatically via OAuth 2.1. Your client will prompt you to sign in on first connection.

---

## Verify It Works

After connecting, ask your AI agent:

> "What is 247 times 389?"

If Euclid is working, the agent will call the `calculate` tool instead of predicting the answer. You'll see the tool call in the response. The correct answer is **96,083**, and unlike mental math, it's guaranteed.

---

## The Problem

LLMs are non-deterministic. Every token they produce is a _prediction_, including math:

- `247 × 389` → the model _predicts_ `96,083` (sometimes it gets `96,183` or `95,983`)
- `sin(47.3°) × cos(12.1°)` → the model _predicts_ something close-ish
- `15% of $8,472.50` → the model _predicts_ a dollar amount

Sometimes the predictions are correct. Sometimes they're subtly wrong. The problem is you can never be sure which is which.

**Euclid makes this a non-issue.** When an AI agent has Euclid available, it sends expressions to a real computation engine and returns the computed result. Deterministic. Correct. Every time.

Think of it like what `grep` did for AI code search. A simple, proven tool that gives the model a capability it fundamentally lacks.

---

## Why Not Just Use Code Execution?

Many LLM environments have code execution tools (Python sandboxes, etc.) that can do math. The difference:

|                     | Code Execution                     | Euclid                                     |
| ------------------- | ---------------------------------- | ------------------------------------------ |
| **Overhead**        | Spins up a sandbox/interpreter     | Near-zero: evaluates an expression string  |
| **Latency**         | Hundreds of ms to seconds          | Single-digit ms                            |
| **Availability**    | Varies by client                   | Any MCP client                             |
| **Model behavior**  | Model writes _code_ that does math | Model writes a _math expression_           |
| **Failure modes**   | Syntax errors, runtime exceptions  | Clear error with hint and examples         |
| **Token cost**      | Code generation is verbose         | Expression strings are minimal             |

---

## Enforce Deterministic Computation

Installing Euclid gives your AI access to a calculator. But access alone isn't enough: the AI needs to be **instructed** to reach for it. Without an explicit directive, models will still predict math from training data by default.

Add the following to your project's AI instruction file. Pre-built versions are in the [`rules/`](rules/) directory:

| File | For |
|------|-----|
| [`rules/CLAUDE.md`](rules/CLAUDE.md) | Claude Code |
| [`rules/AGENTS.md`](rules/AGENTS.md) | OpenAI Codex |
| [`rules/.cursorrules`](rules/.cursorrules) | Cursor |
| [`rules/.windsurfrules`](rules/.windsurfrules) | Windsurf |

The content is identical. Copy the one that matches your IDE into your project root, or append it to your existing instruction file.

<details>
<summary>Preview the instruction block</summary>

```markdown
## Deterministic Computation (Euclid)

**NEVER predict, guess, or mentally compute numerical results.** LLMs produce answers by
pattern-matching against training data, sometimes right, sometimes subtly wrong, and
there is no way to tell which. Always use Euclid's MCP tools instead.

| Tool         | When to Use                                                                                                                            |
| ------------ | -------------------------------------------------------------------------------------------------------------------------------------- |
| `calculate`  | Arithmetic, percentages, margins, exponents, trig, logarithms, factorials. Any expression with a numerical answer                     |
| `convert`    | Unit conversions: m² to acres, km to miles, L/hr to gal/hr, °C to °F, bytes to kB, etc.                                               |
| `statistics` | Mean, median, mode, std deviation, variance, percentile, min, max, sum. Plus t-test, z-test, chi-squared, confidence intervals, correlation |
| `datetime`   | Date differences, add/subtract time, business days, age, day of week, quarter, leap year. Any calendar arithmetic                     |
| `encode`     | Base64, hex, URL, HTML encoding/decoding; SHA-256/512, SHA-1, MD5 hashing; HMAC signatures; JWT decoding                               |
| `finance`    | Loan payments, amortization, present/future value, NPV, IRR, CAGR, margin/markup, compound interest. Any financial formula             |
| `regex`      | Pattern testing, text extraction, match-all, replace, split. Execute patterns, never predict whether they match                        |
| `color`      | Color conversion (hex, RGB, HSL, etc.), contrast ratios, WCAG accessibility, lighten/darken, palette generation                        |
| `validate`   | Email, URL, UUID, credit card (Luhn check), IPv4, IPv6, IBAN. Structural validation with check digits                                  |
| `geo`        | Distances (Haversine/Vincenty), bearings, midpoints, destination points, polygon area, point-in-polygon, coordinate conversions        |

This applies everywhere, not just code. Analytics, business metrics, growth rates,
marketing numbers, cost calculations, date arithmetic, financial projections during
conversation. If there is a number to compute, a date to calculate, or data to
encode, hash, or validate, use Euclid. No exceptions.
```

</details>

**Why this matters:** LLMs will confidently produce incorrect arithmetic with no indication anything is wrong. A model that returns `247 × 389 = 96,183` looks just as confident as one that returns the correct `96,083`. The only way to guarantee correctness is to compute, not predict.

---

## Tools

Euclid has 10 tools.

### `calculate`

Evaluates mathematical expressions deterministically.

```
calculate("(245 * 389) + (12^3 / 7)")  → 95,551.857...
calculate("sqrt(144)")                  → 12
calculate("sin(45 deg)")                → 0.707...
calculate("10!")                         → 3,628,800
calculate("e^(i * pi) + 1")            → 0  (Euler's identity)
```

Supports: arithmetic, order of operations, exponents, roots, trigonometry, logarithms, factorials, constants (pi, e, phi), complex numbers, Unicode math symbols (×, ÷, √, π, ², ³).

### `convert`

Converts between units deterministically.

```
convert(100, "fahrenheit", "celsius")   → 37.778
convert(5, "km", "miles")              → 3.107
convert(1024, "bytes", "kB")           → 1.024
convert(60, "mph", "km/h")             → 96.561
```

Supports: length, mass, volume, temperature, area, speed, time, data, and 100+ units. Natural language aliases (e.g. "celsius", "miles per hour") are normalized automatically.

### `statistics`

Statistical calculations, both descriptive and inferential.

```
statistics("mean", [23, 45, 12, 67, 34])          → 36.2
statistics("std", [23, 45, 12, 67, 34])            → 21.159
statistics("z_test_proportion", { ... })            → { significant: true, p_value: 0.023 }
statistics("confidence_interval", { data: [...] })  → { lower: 28.1, upper: 44.3 }
```

Descriptive: mean, median, mode, std, variance, min, max, sum, percentile.
Inferential: z-test, t-test, chi-squared, confidence intervals, correlation, normal CDF/inverse.

### `datetime`

Deterministic date and time arithmetic.

```
datetime("difference", { from: "2026-01-01", to: "2026-03-15", unit: "days" })  → 73
datetime("add", { date: "2026-01-01", amount: 90, unit: "days" })               → "2026-04-01"
datetime("age", { birthDate: "1990-06-15", asOf: "2026-03-21" })                → 35
datetime("business_days", { from: "2026-01-01", to: "2026-01-31" })             → 22
```

9 operations: difference, add, subtract, business_days, days_in_month, age, quarter, day_of_week, is_leap_year.

### `encode`

Deterministic encoding, decoding, hashing, and JWT inspection.

```
encode("base64_encode", { input: "hello world" })               → "aGVsbG8gd29ybGQ="
encode("sha256", { input: "hello world" })                      → "b94d27b9..."
encode("hmac", { input: "data", key: "secret", algorithm: "sha256" }) → "1b779..."
encode("jwt_decode", { input: "eyJhbGci..." })                  → { header, payload, signature }
```

16 operations: base64, base64url, hex, url, html (encode/decode), sha256, sha512, sha1, md5, hmac, jwt_decode.

### `finance`

Financial calculations using arbitrary-precision decimal arithmetic.

```
finance("loan_payment", { principal: 350000, rate: 6.5, periods: 360 })   → $2,212.24/mo
finance("irr", { cashflows: [-100000, 30000, 35000, 40000, 45000] })      → 17.094%
finance("compound_growth", { start_value: 2.1M, end_value: 4.8M, periods: 4 }) → 22.958% CAGR
```

16 operations: loan_payment, amortization, present_value, future_value, periods, interest_rate, npv, irr, roi, markup, margin, discount, percentage_change, compound_growth, simple_interest, compound_interest.

### `color`

Color conversion, accessibility checks, and palette generation.

```
color("convert", { color: "#FF6B35", to_space: "hsl" })
color("contrast_ratio", { foreground: "#FFFFFF", background: "#2563EB" })  → "4.62:1"
color("wcag_level", { foreground: "#FFFFFF", background: "#2563EB" })      → "AA"
color("analogous", { color: "#2563EB", count: 5 })
```

14 operations across conversion, accessibility (WCAG), manipulation, and palette generation. 8 color spaces: hex, rgb, hsl, hsv, cmyk, lab, oklab, oklch.

### `regex`

Safe regex execution (guaranteed linear-time, no ReDoS).

```
regex("test", { pattern: "^\\d{3}-\\d{4}$", subject: "555-1234" })     → true
regex("matchAll", { pattern: "\\d+", subject: "abc 123 def 456" })     → ["123", "456"]
regex("replace", { pattern: "\\s+", subject: "a  b  c", replacement: " " }) → "a b c"
```

6 operations: test, match, matchAll, replace, split, escape.

### `validate`

Structural validation with check digits.

```
validate("email", { input: "user@example.com" })        → { valid: true }
validate("credit_card", { input: "4111111111111111" })   → { valid: true, type: "Visa" }
validate("iban", { input: "GB82WEST12345698765432" })    → { valid: true }
```

Formats: email, url, uuid, credit_card (Luhn), ipv4, ipv6, iban.

### `geo`

Geospatial calculations.

```
geo("distance", { from: [lat, lon], to: [lat, lon] })        → km (Haversine or Vincenty)
geo("bearing", { from: [lat, lon], to: [lat, lon] })         → degrees
geo("point_in_polygon", { point: [lat, lon], polygon: [...] }) → true/false
```

Distance, area, midpoint, bearing, destination point, point-in-polygon, coordinate conversions.

---

## Pricing

Every account starts with **1,000 free tool calls**. No credit card required.

After that, top up credits at [app.euclidtools.com](https://app.euclidtools.com).

---

## Philosophy

Everything an LLM produces is a prediction. For creative writing and reasoning, that's fine. For math, it's a problem.

The solution isn't to make models better at predicting math. It's to give them a calculator.

This is part of a broader principle: **wherever a model does something predictive that should be deterministic, give it a deterministic tool.** Math is the most obvious case, but the same logic applies to unit conversions, date arithmetic, regex evaluation, encoding, and more.

---

## License

The Euclid MCP server is proprietary software. This repository contains connection instructions, skills, and documentation for integration purposes.

All rights reserved. See [LICENSE](LICENSE) for details.

---

<p align="center">
  <i>Euclid of Alexandria formalized mathematical proof 2,300 years ago.<br>
  We're just giving his tools to the machines.</i>
</p>