Skip to main content

Overview

Coral is split into seven crates. The two entry points, the CLI and the MCP server, share the same runtime through coral-client and coral-app.

Request flow

A query follows this path:
  1. Entry point: a user runs coral sql or an agent calls the sql MCP tool
  2. Bootstrap: the caller decides whether to start a local coral-app server or dial an existing endpoint
  3. coral-client: connects to that endpoint and sends the request over gRPC
  4. coral-app: loads installed sources from local state, delegates spec validation to coral-spec, and hands validated specs to coral-engine
  5. coral-engine: compiles specs into DataFusion table providers, registers them in a session, and executes SQL
  6. Result: Arrow record batches flow back through gRPC to the client, which formats them as table or JSON output (CLI) or structured MCP tool results (MCP)

Crates

coral-cli

The user-facing command-line interface.
OwnsDetails
Command parsingcoral sql, coral source, coral onboard, coral mcp-stdio
Interactive promptsVariables and secrets during source add
Output formattingTable and JSON via coral-client helpers
Intentionally thin at the binary boundary — main.rs is a small wrapper, bootstrap.rs owns CLI bootstrap, and lib.rs owns shared command parsing and dispatch for Coral binaries. Query/result helpers stay in coral-client. For black-box CLI tests, contributors can enable the CORAL_ENDPOINT bootstrap override with cargo nextest run --locked -p coral-cli --features cli-test-server.

coral-client

Shared client library used by both coral-cli and coral-mcp.
OwnsDetails
Endpoint dialingAppClient::connect(endpoint) builds typed gRPC clients for an existing endpoint
Explicit local bootstraplocal::{ServerBuilder, ServerMode, RunningServer} for callers that need local server control
Result decodingArrow IPC → record batches
Error decodingDecodes AIP-193 ErrorInfo from tonic::Status details (status_error.rs)
Formatting helpersformat_batches_table, format_batches_json

coral-app

The local server and core orchestrator.
OwnsDetails
Server bootstrapIn-process gRPC server lifecycle (bootstrap/)
Source managementInstall, add from file, list, validate, remove (sources/)
Workspace stateConfig, secrets, and workspace layout (state/, storage/)
Feedback persistenceWorkspace-scoped blocked-agent feedback reports (feedback/)
Query orchestrationLoads sources, builds the engine, executes SQL (query/)
Catalog discoveryLists/searches/describes query-visible tables and columns (catalog/)
This is the largest crate. It ties coral-spec and coral-engine together and manages all persistent local state.

coral-spec

Source spec parsing and validation.
OwnsDetails
YAML parsingDeserializes source specs into typed Rust structs
ValidationStructural invariants, required fields, backend-specific rules (validate.rs)
Input discoveryExtracts required variables and secrets from specs (inputs.rs)
Backend-specific modelsHTTP, MCP, and file spec shapes (backends/)
Produces a validated spec model that coral-engine consumes. No runtime or I/O, pure data transformation.

coral-engine

Query execution engine.
OwnsDetails
Backend compilationTurns validated specs into DataFusion TableProvider implementations (backends/)
Runtime registryRegisters table providers into a DataFusion session (runtime/)
Query contractsEngine-facing types for catalog and query results (contracts/)
Backend implementationsHTTP, MCP, and native file backends (backends/http, backends/mcp, backends/file)

coral-mcp

The MCP stdio server.
OwnsDetails
MCP protocolTool and resource handlers via the rmcp SDK (server.rs)
Surface shapingTool/resource/error helpers split across surface/{mod,tools,resources,errors}.rs; discovery semantics come from coral-app
Toolssql, list_catalog, search_catalog, describe_table, list_columns, optional feedback
Resourcescoral://guide, coral://tables
Uses coral-client to reach coral-app, same transport as the CLI.

coral-api

The shared gRPC contract.
OwnsDetails
Protobuf definitionsproto/coral/v1/query.proto, sources.proto, catalog.proto, resources.proto
Generated bindingsTonic-generated Rust types and service traits
All inter-crate communication between coral-client and coral-app goes through these generated types.

Dependency graph

coral-spec and coral-engine do not depend on each other. coral-app is the integration point that connects them.

Key design choices

  • Local gRPC server. The CLI and MCP server don’t embed the engine directly, they go through a local gRPC server managed by coral-app. This keeps the engine lifecycle in one place and makes the client/server boundary explicit.
  • Spec vs engine separation. coral-spec is pure validation (no I/O, no runtime). coral-engine is pure execution (no YAML parsing, no persistence). coral-app bridges the two.