Boyce

io.github.boyce-ioPublished by GitHub account boyce-iov0.1.1Updated Oct 24, 2026

Deterministic SQL compiler for AI agents. Your agent stops guessing SQL.

Overview

AI-generated overview

A local MCP server that gives an AI assistant structured database context and a deterministic SQL compiler, so it can generate and check SQL instead of guessing

What you can do
Ingest schema and semantic context from dbt, LookML, DDL, SQLite, Django, SQLAlchemy, Prisma, CSV or Parquet sources, and store certified business definitions used at query time. Retrieve full schema context and the StructuredFilter format so the host model can build queries itself. Turn a natural-language request into a deterministic SQL statement, with NULL-risk checks and EXPLAIN pre-flight. Validate hand-written SQL without executing it, including Redshift linting. Run read-only SELECT queries and profile columns for null rate, distinct count and min/max. Check database connectivity, snapshot freshness and environment health.
When to use it
Useful when an assistant writes SQL against Postgres, Redshift, DuckDB or BigQuery and you want it to work from real schema and join information rather than guesses. Also suited to teams that want repeatable, byte-identical SQL output and a pre-flight check before queries reach a live database.
Requirements
Python 3.10+ and a local install of the boyce package (pip or uv); the postgres extra enables live adapters. A BOYCE_DB_URL connection string is optional and enables live querying, profiling and EXPLAIN pre-flight. MCP hosts using their own model need no LLM key; CLI or HTTP use requires BOYCE_PROVIDER and a provider key such as ANTHROPIC_API_KEY or OPENAI_API_KEY. Desktop MCP hosts only.
Before you install
BOYCE_DB_URL contains database credentials and is written into host config files by the setup wizard. Live query tools run against your real database, though writes are rejected and a statement timeout applies. If you configure a built-in planner, provider API keys such as ANTHROPIC_API_KEY or OPENAI_API_KEY are stored in the environment and requests go to that provider. Schema and business definitions are held in memory per session.

Installation

In SourceWeft

  1. Open Boyce in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

Boyce: Semantic Protocol & Safety Layer for Agentic Database Workflows

The semantic safety layer for agentic database workflows. Boyce connects LLMs to live database context with built-in safety rails.

Named for Raymond F. Boyce, co-inventor of SQL (1974) and co-author of Boyce-Codd Normal Form (BCNF).

AI agents querying databases without proper context generate unreliable SQL — working from incomplete schemas, inferring column names, guessing join paths. Boyce gives agents the structured database intelligence they need to generate correct, safe SQL every time — through three interconnected systems:

LayerWhat it does
SQL Compilerask_boyce — NL → StructuredFilter → deterministic SQL. Zero LLM in the SQL builder. Same inputs, same SQL, byte-for-byte, every time.
Database Inspectorquery_database / profile_data — Live Postgres/Redshift adapters let your agent see real schema and real data distributions before writing a single filter.
Query VerificationPre-flight EXPLAIN loops on every generated query. Bad SQL is caught at planning time, not at 2am in your on-call rotation.

Why does this matter? → The Null Trap: Your AI Agent's SQL Is Correct. The Answer Is Still Wrong.


Install

Requires Python 3.10+

bash
pip install boyce
# With live Postgres/Redshift adapter (enables EXPLAIN pre-flight + column profiling)pip install "boyce[postgres]"
bash
# uv (recommended)uv pip install boyceuv pip install "boyce[postgres]"

From source:

bash
git clone https://github.com/boyce-io/boyceuv pip install -e "boyce/"

Quickstart

After installing, run boyce init to configure your MCP host automatically:

bash
boyce init

The wizard detects Claude Desktop, Cursor, Claude Code, and JetBrains (DataGrip, IntelliJ, etc.), and writes the correct config block for each.

Developing from source? The repo includes a setup script:

bash
./quickstart.sh   # detects uv or python, installs package, writes .env template

Configure Your MCP Host

The fastest path is boyce init — it detects your MCP host and writes the config automatically:

bash
boyce init

Or configure manually. There are two setup paths depending on your host:


Path 1 — MCP Hosts (No LLM key required)

If you're using Claude Desktop, Cursor, Claude Code, Codex, Cline, Windsurf, JetBrains (DataGrip, IntelliJ), or any MCP-compatible host, you do not need to configure an LLM provider for Boyce. The host's own model handles reasoning — Boyce supplies the schema context and deterministic SQL compiler via get_schema and ask_boyce. Only BOYCE_DB_URL is needed (and even that is optional).

Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):

json
{  "mcpServers": {    "boyce": {      "command": "boyce",      "env": {        "BOYCE_DB_URL": "postgresql://user:pass@host:5432/db"      }    }  }}

Cursor (.cursor/mcp.json in project root):

json
{  "mcpServers": {    "boyce": {      "command": "boyce",      "env": {        "BOYCE_DB_URL": "postgresql://user:pass@host:5432/db"      }    }  }}

Path 2 — With Boyce's Built-in NL→SQL

If you're using the CLI (boyce ask), HTTP API, or a non-MCP client (e.g., the VS Code extension), configure Boyce's internal query planner with your LLM provider:

json
{  "mcpServers": {    "boyce": {      "command": "boyce",      "env": {        "BOYCE_PROVIDER": "anthropic",        "BOYCE_MODEL": "claude-sonnet-4-6",        "ANTHROPIC_API_KEY": "sk-ant-...",        "BOYCE_DB_URL": "postgresql://user:pass@host:5432/db"      }    }  }}

Boyce supports any LLM provider available through LiteLLM: Anthropic, OpenAI, Ollama (local), vLLM (local), Azure, Bedrock, Vertex, Mistral, and more.


BOYCE_DB_URL is optional on both paths. Without it, Boyce runs in schema-only mode — SQL generation still works; EXPLAIN pre-flight and live query tools return "status": "unchecked".


Environment Variables

VariableWhen neededExamplePurpose
BOYCE_PROVIDERPath 2 only (CLI/HTTP/non-MCP)anthropicLiteLLM provider name
BOYCE_MODELPath 2 only (CLI/HTTP/non-MCP)claude-sonnet-4-6Model ID passed to LiteLLM
ANTHROPIC_API_KEYWhen using Anthropicsk-ant-...Anthropic credentials
OPENAI_API_KEYWhen using OpenAIsk-...OpenAI credentials
BOYCE_DB_URLOptional (either path)postgresql://user:pass@host:5432/dbasyncpg DSN — enables EXPLAIN pre-flight + live query tools
BOYCE_HTTP_TOKENPath 2 HTTP API onlymy-secret-tokenBearer token for boyce serve --http
BOYCE_STATEMENT_TIMEOUT_MSOptional30000Per-statement timeout in ms (default: 30s)

MCP Tools

ToolDescription
ingest_sourceParse a SemanticSnapshot from dbt manifest, dbt project, LookML, DDL, SQLite, Django, SQLAlchemy, Prisma, CSV, or Parquet.
ingest_definitionStore a certified business definition — injected automatically at query time.
get_schemaReturn full schema context + StructuredFilter format docs. Used by MCP hosts so the host LLM can construct queries without a Boyce API key.
ask_boyceFull NL → SQL pipeline: query planner (LiteLLM) → deterministic kernel → NULL trap check → EXPLAIN pre-flight.
validate_sqlValidate hand-written SQL — EXPLAIN pre-flight, Redshift lint, NULL risk — without executing.
query_databaseExecute a read-only SELECT against the live database. Write operations rejected at two independent layers.
profile_dataNull %, distinct count, min/max for any column — surface data quality issues before they affect query results.
check_healthOperational health check — DB connectivity, snapshot freshness, actionable fix commands. Call when queries fail unexpectedly.

Architecture

SemanticSnapshot (JSON)        │        ▼  ingest_source ┌─────────────────────────────────────────────┐ │          SemanticGraph (NetworkX)            │  ← in-memory, loaded per session │  nodes = entities (tables/views/dbt models) │ │  edges = joins  (weighted by confidence)    │ └─────────────────────────────────────────────┘        │                         │        ▼  ask_boyce              ▼  (internal)  QueryPlanner                 Dijkstra  (LiteLLM)                    join resolver  NL → StructuredFilter             │        │                           │        └──────────┬────────────────┘                   ▼           kernel.process_request()          ← ZERO LLM HERE           SQLBuilder (dialect-aware)                   │                   ▼           EXPLAIN pre-flight                ← Query Verification           (PostgresAdapter)                   │                   ▼            SQL + validation result

Dialect support: redshift, postgres, duckdb, bigquery

Redshift safety rails (safety.py): Automatic linting for LATERAL, JSONB, REGEXP_COUNT, lookahead regex patterns, and numeric cast rewrites for Redshift 1.0 (PG 8.0.2).


Scan CLI

bash
# Scan a single fileboyce scan demo/magic_moment/manifest.json
# Scan a directory (auto-detects all parseable sources)boyce scan ./my-project/ -v
# Save snapshots for MCP server useboyce scan ./my-project/ --save

10 parsers: dbt manifest, dbt project, LookML, SQLite, DDL, CSV, Parquet, Django, SQLAlchemy, Prisma.


Verify the Install

bash
# Unit tests — no DB required, runs in ~4 secondspython boyce/tests/verify_eyes.py
# Expected output:# Ran 15 tests in 3.5s# OK# ✅  All checks passed.

SemanticSnapshot Format

The ingest_source tool accepts a SemanticSnapshot JSON dict. Minimal example:

json
{  "snapshot_id": "<sha256>",  "source_system": "dbt",  "entities": {    "entity:orders": {      "id": "entity:orders",      "name": "orders",      "schema": "public",      "fields": ["field:orders:order_id", "field:orders:revenue"]    }  },  "fields": {    "field:orders:order_id": {      "id": "field:orders:order_id",      "entity_id": "entity:orders",      "name": "order_id",      "field_type": "ID",      "data_type": "INTEGER"    }  },  "joins": []}

See boyce/tests/live_fire/mock_snapshot.json for a complete field/entity example.


Project Layout

boyce/                          ← PRIMARY — headless FastMCP server + pip package├── boyce/│   ├── server.py               ← MCP entry point (8 tools)│   ├── kernel.py               ← Deterministic SQL kernel│   ├── graph.py                ← SemanticGraph (NetworkX)│   ├── safety.py               ← Redshift compatibility rails│   ├── types.py                ← Protocol contract (Pydantic)│   ├── scan.py                 ← Scan CLI (boyce scan)│   ├── connections.py          ← DSN persistence (ConnectionStore)│   ├── doctor.py               ← Environment diagnostics (boyce doctor)│   ├── sql/                    ← SQLBuilder, dialect layer, join resolver│   ├── parsers/                ← 10 parsers (dbt, lookml, ddl, sqlite, csv, etc.)│   ├── planner/                ← QueryPlanner (LiteLLM → StructuredFilter)│   └── adapters/               ← PostgresAdapter (Eyes)└── tests/    ├── verify_eyes.py          ← 15-test suite, no DB required    ├── test_parsers.py         ← Parser tests (all 10 parsers)    ├── test_scan.py            ← Scan CLI tests    └── live_fire/              ← Docker Compose integration tests

Status

CapabilityStatus
NL → SQL (deterministic kernel)Operational
SemanticGraph (join resolution)Operational
10 source parsersOperational
Scan CLI (boyce scan)Operational
PostgresAdapter (read-only)Operational
EXPLAIN pre-flight validationOperational
NULL Trap detectionOperational
Redshift 1.0 safety lintingOperational
Snapshot persistence across restartsOperational
Audit logging (append-only JSONL)Operational
Business definitions (ingest_definition)Operational
DSN persistence (ConnectionStore)Operational
Environment diagnostics (boyce doctor / check_health)Operational
Multi-snapshot mergePlanned

Support


Copyright 2026 Convergent Methods, LLC. MIT License.

Source: README.md at commit 9aad343

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v0.1.1LatestSep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts