One SQL interface for APIs.
Connect the APIs, files, MCPs and databases your team already uses. Pawrly gives them table names, columns, and joins, so people and agents can ask one SQL question instead of stitching together data from multiple sources.
Local SQL runtime over your APIs, files and MCPs for Agents
-- two live APIs, joined in one statementSELECT c.email, c.name, i.last_seen_atFROM stripe.customers cJOIN intercom.contacts i ON i.email = c.emailWHERE c.delinquent = falseORDER BY i.last_seen_at ASCOne interface over the data your work already lives in
Describe each source once.
Query it as SQL forever.
Add the source to pawrly.yaml, give the fields clear names, and query it like a table. The next person, script, or agent uses the same names without learning another API.
version: 1name: my-workspacesecrets: - kind: env sources: - name: stripe kind: http config: base_url: https://api.stripe.com auth: type: header headers: - name: Authorization bearer: ${secret:STRIPE_API_KEY} tables: - name: customers endpoint: /v1/customers response: path: $.data schema: - { name: email, type: varchar } - { name: balance, type: bigint }The vendor already wrote the contract. Point an http source at an OpenAPI 3.0 spec and Pawrly synthesizes one typed table per GET — no hand-written schema needed.
pawrly sql " SELECT email, balance FROM stripe.customers WHERE delinquent = true"Run the query from the CLI, an MCP client, or a long-running pawrly serve process. The interface stays the same, so a query that works locally is the same query an agent can use later.
Query the data where it already lives.
Bring Stripe, Postgres, CSVs, Snowflake, Linear, and internal MCP tools and APIs into the same SQL question. Pawrly handles the source details so the query can focus on the answer.
APIs
tableGive Pawrly an endpoint or OpenAPI spec, then read the response as rows and columns.
Files & object storage
tableRead Parquet, CSV, and JSON from disk or a bucket without loading them into a warehouse first.
MCP servers
tableConnect to MCP servers like Linear, GitHub, Notion, and internal tools and query their outputs as rows.
Databases
tableJoin operational tables with APIs, files, and warehouse data from the same query.
Warehouses & lakehouses
tableUse existing warehouse and lakehouse data beside live sources, without building a pipeline first.
Stop making agents write glue code.
When an agent needs customer context, it should ask for the answer, not write a mini integration. Pawrly keeps the source setup in one place and gives the agent approved tables to query.
One place to ask
Instead of handing an agent a different tool for every system, give it approved tables it can query with SQL.
Same names every time
Sources are declared once. Every agent sees the same tables and columns, and every query can be logged, replayed, and reviewed.
Works with MCP
Connect Pawrly to Claude Desktop, Cursor, Codex, or other MCP clients, and let those clients query the same workspace.
pawrly mcp-stdio --config ./pawrly.yaml“Find paying customers support hasn't heard from in a month.”
Pawrly turns that into a join across Stripe and Intercom. The agent asks for the customers, Pawrly handles the source details, and the query is there to review afterward.
Answers you can review.
Give important fields approved names, define which joins are allowed, and keep required filters attached to the data. Agents get useful access without direct access to every system.
Bad joins fail loudly
If a join would double-count a metric, Pawrly stops the query instead of returning a polished wrong answer.
Access rules travel with the data
Required filters are applied every time, whether the query comes from a person, script, or agent.
Rules are visible up front
Agents can inspect the available tables, fields, joins, and required filters before they write a query.
Why we're building Pawrly
One binary. One config. Every source.
Start with one config file, then query APIs, files, MCP tools, and databases from the same command. Add MCP when you want agents to use that same workspace.