v0.4 ships the MCP gatewayread the changelog

Integration code
that ships before the docs do.

BridgeFill is a schema-grounded code generator for the messy seam between APIs. Publish your OpenAPI once. Every consumer — humans, Claude Code, Cursor, the agent you haven't shipped yet — gets typed, tested, semver-aware client code on demand.

4,200+schemas registered
17language targets
< 900 msmedian gen time
bridgefill · agent.tslive
schema · stripe@2024-11-20typescript · zod · 184 lines✓ validated

the integration handshake is broken

You publish docs. They read docs. They mis-read docs. Then everyone files a ticket.

01

Schemas drift the second you ship.

Your OpenAPI lives in a repo. The SDK lives in another. Postman lives somewhere a senior engineer left in 2022.

02

LLMs hallucinate your endpoints.

Copilot writes POST /v1/charge. It should be /v1/charges. Six minutes of debugging, every time.

03

Breaking changes are a group text.

You bumped a field from required to optional. Three downstream teams find out in production.

how it works

One schema in.
Every integration out.

PROVIDER
1You publish.

Push your OpenAPI / GraphQL / Proto to the registry. BridgeFill diffs against the last version, bumps semver, fingerprints every operation.

$bridgefill publish./openapi.yaml
stripe@2024-11-20+ 4 ops~ 1 breaking
grounded LLMno hallucinated endpoints.
no out-of-date params.
CONSUMER · OR · AGENT
2They request.

From a CLI, your IDE, or an agent calling the MCP server: describe the integration in plain language. Get back compiled, tested, typed code.

$bridgefill gen"charge a saved card, retry once"
→ chargeWithRetry()✓ types pass✓ contract tested

interactive

The output isn't a snippet.
It's the whole client.

Switch language. Switch file. Every byte is grounded in the schema you published. Nothing in here is invented.

bridgefill / stripe-client / client.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import { z } from 3;
import { auth } from 4;
import type { Charge, Customer, PaymentMethod } from 5;

const BASE = "https:0

1
export class Stripe {
  constructor(private readonly key: string) {}

  async createCustomer(input: Partial<Customer>): Promise<Customer> {
    return request(6, { method: 7, body: input, key: this.key });
  }

  async attachPaymentMethod(pmId: string, customerId: string): Promise<PaymentMethod> {
    return request(8, {
      method: 9,
      body: { customer: customerId },
      key: this.key,
    });
  }

  2
  async chargeWithRetry(args: { amount: number; customer: string; pm: string }): Promise<Charge> {
    const idemKey = crypto.randomUUID();
    for (let attempt = 0; attempt < 2; attempt++) {
      try {
        return await request(10, {
          method: 11,
          key: this.key,
          idempotency: idemKey,
          body: {
            amount: args.amount,
            currency: 12,
            customer: args.customer,
            payment_method: args.pm,
            confirm: true,
          },
        });
      } catch (err) {
        if (attempt === 1 || !isRetryable(err)) throw err;
      }
    }
    throw new Error(13);
  }
}
tsc · 0 errorseslint · 0 warningscontract · stripe@2024-11-20generated 14s ago

live demo · powered by gpt-5.4-mini

Describe an integration.
Get the code.

This box is talking to a real model, grounded with a real Stripe schema fingerprint. Try something specific.

Hit Generate to ground a prompt against a live schema. The output is real code — copy it into your project.

try: "webhook handler with signature verification"try: "refund half of a charge if it's older than 7 days"try: "paginate every invoice for a customer"

features

Boring infra,
obsessively built.

Schema diffing & semver

Every publish is diffed against the last. Breaking changes auto-bump the major. Additive changes are minor. No more "wait did we ship that?"

Grounded generation

The LLM only sees operations that exist. Endpoints are constrained. Param names come from the schema. Hallucinations are categorically impossible.

Compile gate

Generated code runs through tsc, mypy, go vet, cargo check before it's handed back. If it doesn't type, you don't see it.

Replayable history

Every schema version is addressable forever. Re-generate against stripe@2023-08-16 for a legacy worker — no babysitting required.

MCP-native

Claude Code, Cursor, Zed, and your own agents speak to BridgeFill over the Model Context Protocol. 13 tools, one tool call away from a real integration.

Dev-time, not runtime

BridgeFill is not a proxy. It generates code into your repo. No new hop, no extra latency, no third-party in your hot path. Yours to own.

model context protocol

13 tools your agent
already knows how to call.

schema.publishschema.diffschema.listschema.fetchgen.clientgen.snippetgen.testgen.mockvalidate.payloadvalidate.contracttrace.lastErrorenv.bindenv.rotate

built for the agents you actually use

Claude CodeMCP server, native
Cursorextension & MCP
Zedlanguage server hook
Your agentHTTP, gRPC, MCP

pricing

Free until it matters.
Then honest.

hobby$0
  • 3 schemas
  • 200 generations / mo
  • community MCP
  • public registry
Start free
most teams
team$24/dev/mo
  • unlimited schemas
  • unlimited generations
  • private registry & SSO
  • contract diffing in CI
  • priority MCP gateway
Start 14-day trial
enterprisetalk
  • self-host or VPC
  • BYO model (openai, anthropic, oss)
  • audit logs, SOC 2
  • schema lifecycle SLAs
Email founders

Stop reading docs.
Start shipping integrations.

npm-style CLI, 60 seconds to first integration, no credit card.

$npxbridgefill init