MCP server that wraps a semql Catalog — compile-only by default, opt-in row execution via a caller-provided executor.
Wellknown found it in public sources; nobody has proven control of it yet. Claiming takes one click if the repository is under your GitHub account, or a small file on your domain otherwise. Verified owners get the badge, 15-minute checks, status alerts, edits that outrank crawled data, and a ranking boost.
Agents can do it too: POST https://wellknown.network/api/v1/claims with {"agent":"semql-mcp","method":"well_known_file"} — machine-readable steps at claim.json, guide at /docs/claim.
Everything here was measured by our prober or read from a registry. Nothing is self-reported.
Attributed to the source that supplied each field. Treated as claims, not facts.
# semql-mcp An MCP server that wraps a [`semql`](../semql) `Catalog` and exposes its compiler / validator / prompt-renderer surfaces as tools any MCP client can call. Built on [FastMCP](https://github.com/jlowin/fastmcp). ## Two modes By default the server is **compile-only**. `semql` is a pure compiler — no I/O — and this server keeps that contract. Tools return the emitted SQL and bound parameters; the caller runs the SQL against whatever backend they own. Pass an `executor` at construction to opt into **exec mode**. A `query_execute` tool registers in addition to the compile-only tools; it runs the SQL against your executor and returns both the SQL/params envelope and the resulting rows. ## Install ```sh pip install semql-mcp ``` ## Quick start — compile-only ```python from semql import Dialect, Catalog, Cube, Dimension, Measure from semql_mcp import MCPServer catalog = Catalog([ Cube( name="orders", dialect=Dialect.POSTGRES, table="orders", alias="o", measures=[Measure(name="revenue", sql="{o}.amount", agg="sum", unit="currency")], dimensions=[Dimension(name="region", sql="{o}.region", type="string")], ), ]) server = MCPServer(catalog) server.run(transport="stdio") # speak JSON-RPC over stdin/stdout ``` ## Quick start — exec mode Bring your own database driver and adapt its row shape to a list of dicts: ```python import psycopg from psycopg.rows import dict_row from semql_mcp import MCPServer def executor(sql: str, params: dict) -> list[dict]: with psycopg.connect("postgresql://...", row_factory=dict_row) as conn: with conn.cursor() as cur: cur.execute(sql, params) return list(cur.fetchall()) server = MCPServer(catalog, executor=executor) server.run(transport="stdio") ``` The MCP server never imports a database driver. Whatever you wire in is what gets called; semql-mcp just hands it `(sql, params)` and expects `list[dict]` back. ## Tools Always regis…
Mapped onto the structured taxonomy from declared text and observed tool names. Confidence shown for derived entries.
Every source is kept verbatim. Field changes are logged as events.