Boyce
Deterministic SQL compiler for AI agents. Your agent stops guessing SQL.
Ask AI about Boyce
Powered by Claude Β· Grounded in docs
I know everything about Boyce. Ask me about installation, configuration, usage, or troubleshooting.
0/500
Reviews
Documentation
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:
| Layer | What it does |
|---|---|
| SQL Compiler | ask_boyce β NL β StructuredFilter β deterministic SQL. Zero LLM in the SQL builder. Same inputs, same SQL, byte-for-byte, every time. |
| Database Inspector | query_database / profile_data β Live Postgres/Redshift adapters let your agent see real schema and real data distributions before writing a single filter. |
| Query Verification | Pre-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+
pip install boyce
# With live Postgres/Redshift adapter (enables EXPLAIN pre-flight + column profiling)
pip install "boyce[postgres]"
# uv (recommended)
uv pip install boyce
uv pip install "boyce[postgres]"
From source:
git clone https://github.com/boyce-io/boyce
uv pip install -e "boyce/"
Quickstart
After installing, run boyce init to configure your MCP host automatically:
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:
./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:
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):
{
"mcpServers": {
"boyce": {
"command": "boyce",
"env": {
"BOYCE_DB_URL": "postgresql://user:pass@host:5432/db"
}
}
}
}
Cursor (.cursor/mcp.json in project root):
{
"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:
{
"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
| Variable | When needed | Example | Purpose |
|---|---|---|---|
BOYCE_PROVIDER | Path 2 only (CLI/HTTP/non-MCP) | anthropic | LiteLLM provider name |
BOYCE_MODEL | Path 2 only (CLI/HTTP/non-MCP) | claude-sonnet-4-6 | Model ID passed to LiteLLM |
ANTHROPIC_API_KEY | When using Anthropic | sk-ant-... | Anthropic credentials |
OPENAI_API_KEY | When using OpenAI | sk-... | OpenAI credentials |
BOYCE_DB_URL | Optional (either path) | postgresql://user:pass@host:5432/db | asyncpg DSN β enables EXPLAIN pre-flight + live query tools |
BOYCE_HTTP_TOKEN | Path 2 HTTP API only | my-secret-token | Bearer token for boyce serve --http |
BOYCE_STATEMENT_TIMEOUT_MS | Optional | 30000 | Per-statement timeout in ms (default: 30s) |
MCP Tools
| Tool | Description |
|---|---|
ingest_source | Parse a SemanticSnapshot from dbt manifest, dbt project, LookML, DDL, SQLite, Django, SQLAlchemy, Prisma, CSV, or Parquet. |
ingest_definition | Store a certified business definition β injected automatically at query time. |
get_schema | Return full schema context + StructuredFilter format docs. Used by MCP hosts so the host LLM can construct queries without a Boyce API key. |
ask_boyce | Full NL β SQL pipeline: query planner (LiteLLM) β deterministic kernel β NULL trap check β EXPLAIN pre-flight. |
validate_sql | Validate hand-written SQL β EXPLAIN pre-flight, Redshift lint, NULL risk β without executing. |
query_database | Execute a read-only SELECT against the live database. Write operations rejected at two independent layers. |
profile_data | Null %, distinct count, min/max for any column β surface data quality issues before they affect query results. |
check_health | Operational 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
# Scan a single file
boyce scan demo/magic_moment/manifest.json
# Scan a directory (auto-detects all parseable sources)
boyce scan ./my-project/ -v
# Save snapshots for MCP server use
boyce scan ./my-project/ --save
10 parsers: dbt manifest, dbt project, LookML, SQLite, DDL, CSV, Parquet, Django, SQLAlchemy, Prisma.
Verify the Install
# Unit tests β no DB required, runs in ~4 seconds
python 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:
{
"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
| Capability | Status |
|---|---|
| NL β SQL (deterministic kernel) | Operational |
| SemanticGraph (join resolution) | Operational |
| 10 source parsers | Operational |
Scan CLI (boyce scan) | Operational |
| PostgresAdapter (read-only) | Operational |
| EXPLAIN pre-flight validation | Operational |
| NULL Trap detection | Operational |
| Redshift 1.0 safety linting | Operational |
| Snapshot persistence across restarts | Operational |
| Audit logging (append-only JSONL) | Operational |
Business definitions (ingest_definition) | Operational |
DSN persistence (ConnectionStore) | Operational |
Environment diagnostics (boyce doctor / check_health) | Operational |
| Multi-snapshot merge | Planned |
Support
- Troubleshooting guide: docs/troubleshooting.md
- Local LLM setup (Ollama/vLLM): docs/local-llm-setup.md
- Bug reports: GitHub Issues
- Setup help: GitHub Issues
- Email: will@convergentmethods.com β for issues involving credentials or sensitive config
Copyright 2026 Convergent Methods, LLC. MIT License.
