Build1 distinct publisher3 min readUpdated
An open-source Go project puts a JWT-checking gateway and a separate query adjudicator between agents and warehouses. The credential never reaches the model, and neither does the tenant argument.
The Engineer · Build desk

Compiled by The EngineerSomething wrong?How this is made
A developer writing on dev.to has published n0, an open-source Go platform that sits between AI agents and enterprise data, after concluding that the obvious design (hand the model a database URL, let it write SQL, return the rows) would have made a nice demo and a terrible system [1][2]. The interesting part is the failure analysis, not the repository: according to the author, the risk is not a stray DROP TABLE but a read-only account that scans half a warehouse, holds connections open, joins against a table it was never supposed to see, or returns far more data than the agent actually needs [3].
That is the sentence to take away from the post. Read-only is a control on writes, and nothing else on that list is a write. The author's second point is blunter: a database password is still a database password, even when it is hidden inside an agent configuration file [4]. Possession is the boundary, not the grant attached to it.
The division of labour is explicit. The agent gets a small set of tools, the gateway owns authentication and tenant context, and a separate query service decides whether the SQL is safe to execute [5]. The author's formulation: the agent decides what it wants to ask, the platform decides whether it is allowed to ask it and how the request is executed [6]. Behind the gateway sit a Meta Service holding workspaces, metadata, connections and schema, a Query Engine described as a SQL sandbox with asynchronous jobs and result lifecycle running over NATS JetStream, and a Connection Manager that talks to PostgreSQL, MySQL, ClickHouse and others [7].
The MCP server lives inside the gateway and, per the post, does not open a database connection, inspect credentials, or implement a second query executor; it translates MCP calls into the same internal clients used by the REST API [8]. The stated reason is that the author did not want security rules to slowly diverge between the API path and the AI path [9]. This is the durable bit. Two executors means two policy engines, and the second one is always the one nobody audits.
MCP itself gives a client a standard way to discover and call tools, but the author lists six questions it does not answer: who is calling, which tenant they belong to, which connection they can use, which tables are allowed, whether the query is safe and bounded, and where the result lives while the query runs [10][11]. Those are gateway concerns. The MCP endpoint goes through the same JWT middleware as the REST API, and the tenant ID used for internal requests comes from the verified JWT context rather than a tenant_id argument supplied by the agent, which the public tool does not accept at all [12][13]. Six tools are exposed today; there is no execute_sql_now, no tool that returns a connection string, and no tool that lets the model choose a different tenant [14][15].
Execution is asynchronous. submit_query takes a connection_id and SQL and returns a job_id with status pending; the agent then polls get_query_status and pages results through get_query_result, which the author argues fits analytical work better than holding one HTTP request open while a warehouse works [16][17][18]. Paging is also where over-fetching can be capped, since the platform, not the model, controls how much comes back.
Watch the adjudication layer. The post names the bounding question but describes the Query Engine only as a sandbox with async jobs and a result lifecycle, and the author says plainly that this is working software rather than a claim that every production concern has been solved [7][19]. Also watch the token model: $TOKEN can be a user JWT or an agent token issued by n0, and agent tokens are where scoping and revocation will either hold or quietly leak [20].
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
The problem was not only that a model might produce a DROP TABLE: a read-only user can still run a query that scans half a warehouse, hold connections open, join against a table it was never supposed to see, or return far more data than the agent actually needs.
The request path runs from the AI agent over MCP / Streamable HTTP to the Agent Gateway (JWT, tenant context, tool routing), then to a Meta Service (workspaces, metadata, connections, schema) backed by PostgreSQL and to a Query Engine (SQL sandbox, asynchronous jobs, result lifecycle) using NATS JetStream, then through a Connection Manager to PostgreSQL / MySQL / ClickHouse and others.
The MCP server lives in the Agent Gateway; it does not open a database connection, inspect credentials, or implement a second query executor, and it translates MCP calls into the same internal clients used by the REST API.
The author says reusing the same internal clients was intentional because he did not want security rules to slowly diverge between the API path and the AI path.
The current MCP server exposes six tools.
There is no execute_sql_now tool, no tool that returns a connection string, and no tool that lets the model choose a different tenant.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Detailed but wholly self-reported
The architectural and security claims are unusually specific for a blog post — an endpoint path, a JSON-RPC curl call, the literal submit_query response shape, Go registration and context-propagation snippets, and an enumerated sandbox policy — which makes the design internally checkable. But every claim traces to one first-person post by the project's own author, with no repository metrics, license statement, independent review or second source; the six advertised tool names are not even rendered in the captured body, which is truncated mid-sentence. Design intent is well evidenced; effectiveness is not.
No usage evidence disclosed
The supplied source discloses no deployments, users, contributors, repository stars, downloads, release tags, license or version — only that the project exists as working software. There is no basis to score adoption without inferring facts the material does not contain.
Claims slightly understated by the author
The rhetoric runs cooler than the substance. The author twice narrows his own claim — the project is working software rather than a solution to every production concern, and a query that passes checks is not declared 'safe' — and he keeps recommending read-only database roles and network boundaries as separate layers rather than presenting the gateway as sufficient. Against that, the total absence of adoption evidence prevents any strongly negative reading: the design argument is credible and modestly stated, but nothing external validates that it works at scale.
Author writing about his own project
The single source is a first-person post by the creator of n0, published on a developer-audience platform, describing and implicitly promoting his own open-source project. Selection and framing incentives are therefore high: the narrative arc runs from a discarded naive design to the author's architecture. Mitigating this, the post volunteers limitations and does not solicit funding, sell a hosted product, or claim benchmark wins in the supplied text.
Single self-published source, no adoption data
Confidence is capped by cluster shape: one publisher, one author, one article, with the body truncated and no independent corroboration. What the story asserts about its own design is internally consistent and code-backed, so descriptive claims can be relied on; claims about security effectiveness, durability or real-world use cannot be assessed at all from this material.
build
A system prompt is not a GRANT: read-only agents have to be enforced below the model1 distinct publisher
build
The Postgres MCP server in tens of thousands of installs stopped shipping in December 20241 distinct publisher
build
Rate limit your MCP servers, because a retrying agent turns one error into a billing incident1 distinct publisher
build
Your "Index Only Scan" Did 2,847 Heap Fetches: Covering Indexes Are a Vacuum Problem1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 17, 2026