for government teams who don't ship codeBuild an MCP server
Build an MCP server
without writing one.
Paste a connection string or drop a file and the agent ships a working MCP server your Claude Desktop can call.
$
↵to shipno signup to previewread-only by default
agent.loglive
00:01> postgres://readonly@dept-records.gov:5432/permits00:02✓ connected · 14 tables · 312 columns00:05✓ inferred 9 safe read tools, 2 search tools✓permits-mcp/package.json✓permits-mcp/tsconfig.json✓permits-mcp/src/server.ts✓permits-mcp/src/db.ts✓permits-mcp/src/tools/index.ts00:09✓ wired Claude Desktop config00:11> claude: how many permits filed last week?00:12→ tool call: permits.count_by_range00:121,284 permits · 71% residential>
acceptspostgres://mysql://https://api/*.pdf*.csvs3://
One paste turns into a working MCP your AI clients can call.
You own the server. It's a Node repo, not a wrapper.
We hand you a clean Node project under MIT. Read it, fork it, deploy it to your own infra. No hidden runtime, no per-call billing on the protocol.
// permits-mcp/src/server.ts
import { Server } from "@modelcontextprotocol/sdk/server";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio";
import { db } from "./db";
const server = new Server(
{ name: "permits-mcp", version: "1.0.0" },
{ capabilities: { tools: {} } },
);
server.tool("permits.count_by_range", {
input: { from: "string", to: "string" },
handler: async ({ from, to }) => {
const rows = await db.query(
"select count(*)::int as n from permits where filed_at between $1 and $2",
[from, to],
);
return { count: rows[0].n };
},
});
await server.connect(new StdioServerTransport());
Start with one database.
One connection string. Ten minutes. A server your team actually owns.