for government teams who don't ship code

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/permits
00:02 connected · 14 tables · 312 columns
00: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.ts
00:09 wired Claude Desktop config
00:11> claude: how many permits filed last week?
00:12 tool call: permits.count_by_range
00: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.