Adapter Catalog
Mimic ships 9 API mock adapters and 4 database adapters today, with 100+ more on the roadmap. Every adapter is open source (Apache 2.0) and community-contributable.
Database Adapters
| Adapter | Package | Status | What it does |
|---|---|---|---|
| PostgreSQL | @mimicai/adapter-postgres | Shipped | Seeds tables via COPY FROM STDIN, FK-aware ordering |
| MongoDB | @mimicai/adapter-mongodb | Shipped | Seeds collections with embedded documents |
| MySQL | @mimicai/adapter-mysql | Shipped | Seeds tables with relational integrity |
| SQLite | @mimicai/adapter-sqlite | Shipped | File-based database seeding, WAL mode support |
| Pinecone | @mimicai/adapter-pinecone | Planned | Seeds vector embeddings for RAG testing |
| Redis | @mimicai/adapter-redis | Planned | Seeds key-value pairs, sorted sets, streams |
API Mock Adapters
9 adapters shipped: All adapters below are published packages with full mock route coverage, MCP server support, and a standalone MCP binary (src/bin/mcp.ts). Each is built on @mimicai/adapter-sdk.
| Adapter | Package | Routes | Status | Description |
|---|---|---|---|---|
| Stripe | @mimicai/adapter-stripe | 616 | Shipped | Full v1 + v2 coverage: customers, payment intents, charges, refunds, subscriptions, invoices, products, prices, balance, billing meters, event destinations |
| Plaid | @mimicai/adapter-plaid | 10 | Shipped | Accounts, transactions, identity, auth, balance, institutions, link tokens |
| Paddle | @mimicai/adapter-paddle | 83 | Shipped | Subscriptions, products, prices, transactions, customers, discounts, adjustments |
| Chargebee | @mimicai/adapter-chargebee | 55 | Shipped | Subscriptions, customers, invoices, plans, addons, credit notes, payment sources |
| GoCardless | @mimicai/adapter-gocardless | 45 | Shipped | Mandates, payments, customers, subscriptions, bank accounts, refunds |
| Lemon Squeezy | @mimicai/adapter-lemonsqueezy | 50 | Shipped | Products, variants, orders, subscriptions, customers, discounts, license keys |
| Recurly | @mimicai/adapter-recurly | 47 | Shipped | Accounts, subscriptions, invoices, transactions, plans, coupons, credit adjustments |
| RevenueCat | @mimicai/adapter-revenuecat | 42 | Shipped | Subscribers, entitlements, offerings, products, purchases, receipts |
| Zuora | @mimicai/adapter-zuora | 54 | Shipped | Accounts, subscriptions, invoices, payments, products, rate plans, usage records |
Fintech / Payments — shipped
Fintech / Payments — planned
Communication — Roadmap
CRM — Roadmap (7 adapters)
Ticketing — Roadmap (8 adapters)
Project Management — Roadmap (8 adapters)
Calendar / Scheduling — Roadmap (6 adapters)
Adapter SDK
The @mimicai/adapter-sdk package provides the base classes and utilities for building API mock adapters. It re-exports core types and adds test helpers, format helpers, and two abstract base classes.
$ npm install @mimicai/adapter-sdk
Base Classes
| Class | When to use | What it provides |
|---|---|---|
BaseApiMockAdapter | Simple adapters with hand-written routes | Adapter lifecycle defaults (init, apply, clean, healthcheck, dispose) |
OpenApiMockAdapter | Recommended. Adapters built from an OpenAPI spec via codegen | Everything in Base, plus automatic CRUD scaffolding (list/create/retrieve/update/delete), cursor pagination, override system, seeding from ExpandedData, and default factories |
OpenApiMockAdapter is the standard path for new adapters. Given an OpenAPI spec, a codegen script generates routes, schemas, and resource specs. The base class auto-handles CRUD for every route — you only write custom "override" handlers for state-machine endpoints (e.g., confirm, capture, cancel).
Exports
| Export | Type | Description |
|---|---|---|
BaseApiMockAdapter | Abstract class | Low-level base. Provides lifecycle defaults. Extend directly only for non-OpenAPI adapters. |
OpenApiMockAdapter | Abstract class | OpenAPI-driven base. Auto-scaffolds CRUD routes from generated route definitions, handles pagination, seeding, and the override system. |
buildTestServer(adapter, seedData?) | Function | Spins up an in-memory Fastify instance with your adapter routes loaded. Returns { server, stateStore, close } — use server.inject() for in-process requests. |
MockServer | Class | The HTTP server used by mimic host. Use directly in integration tests to run a full mock server. |
StateStore | Class | In-memory key-value store shared across routes for mutation tracking (e.g. created/updated resources) |
generateId | Function | Generate prefixed IDs matching real platform formats (e.g. cus_xxx, pi_xxx) |
unixNow, toDateStr, capitalize | Utilities | Formatting helpers for response generation |
Methods to implement
| Method | Required | Description |
|---|---|---|
registerRoutes(server, data, stateStore) | Yes | Mount Fastify routes. For OpenApiMockAdapter, call this.mountOverrides(store) then this.registerGeneratedRoutes(server, data, store, ns). |
resolvePersona(req) | Yes | Extract persona ID from the incoming request (auth header, body field, or query param) |
getEndpoints() | Yes | Return EndpointDefinition[]. For OpenApiMockAdapter, just call this.endpointsFromRoutes(). |
registerMcpTools(mcpServer, mockBaseUrl) | No | Register MCP tools on the MCP server pointed at your mock API URL. Required if you want mcp: true in mimic.json to expose tools to agents. |
Build an Adapter
Adapters are built from OpenAPI specs using a codegen-driven pipeline. A codegen script reads the spec and generates route definitions, schema defaults, and resource metadata. The OpenApiMockAdapter base class auto-scaffolds CRUD for every generated route — you only write custom handlers for state-machine endpoints.
Pipeline overview
OpenAPI spec (.json)
↓
Codegen script (pnpm generate)
↓
src/generated/
├── routes.ts ← HTTP route definitions (method, path, operation type)
├── resource-specs.ts ← Field metadata for data generation
├── schemas.ts ← Default factory functions (one per resource)
└── meta.ts ← Spec version + timestamp
↓
Adapter class (extends OpenApiMockAdapter)
├── CRUD scaffolding ← Automatic from generated routes
├── Override handlers ← State machines, computed endpoints
├── MCP tools ← AI agent access
└── Error helpers ← Platform-specific error format
Package structure
packages/adapters/adapter-{name}/
├── adapter.json ← Identity: id, basePath, versions, spec URL
├── {name}-spec.json ← OpenAPI spec (gitignored, download from source)
├── scripts/
│ └── {name}-codegen.ts ← Reads spec → generates TypeScript files
├── src/
│ ├── index.ts ← Public exports + AdapterManifest
│ ├── adapter-meta.ts ← Loads adapter.json at runtime
│ ├── config.ts ← Zod config schema
│ ├── {name}-adapter.ts ← Adapter class
│ ├── {name}-errors.ts ← Platform-specific error builders
│ ├── mcp.ts ← MCP tool registration
│ ├── bin/mcp.ts ← Standalone MCP binary
│ ├── generated/ ← Auto-generated (never hand-edit)
│ │ ├── routes.ts
│ │ ├── resource-specs.ts
│ │ ├── schemas.ts
│ │ └── meta.ts
│ ├── overrides/ ← Custom route handlers
│ └── __tests__/
└── package.json ← Scripts: build, generate, test
Step 1: adapter.json
{
"id": "my-platform",
"name": "My Platform API",
"description": "My Platform mock adapter",
"type": "api-mock",
"basePath": "/my-platform",
"versions": ["2025-01-01", "2026-01-01"],
"specUrl": "https://example.com/openapi/spec.json",
"specFile": "my-platform-spec.json",
"mcp": {
"serverName": "mimic-my-platform",
"serverVersion": "0.5.0",
"description": "Mimic MCP server for My Platform"
}
}
| Field | Purpose |
|---|---|
id | Unique identifier. Used as StateStore namespace prefix ({id}:{resource}) |
basePath | URL prefix for all routes (e.g., /my-platform). Routes become /{basePath}/v1/{path} |
versions | API versions this adapter supports |
specFile | OpenAPI spec filename (gitignored — download from specUrl) |
mcp | MCP server metadata for Claude/AI tool registration |
Step 2: Codegen script
The codegen script reads the OpenAPI spec and generates four TypeScript files. Each API has different conventions, so the codegen is adapter-specific.
$ pnpm --filter @mimicai/adapter-my-platform generate
The script must:
- Extract resources from OpenAPI schemas (via
x-resourceId, tags, or schema names) - Extract routes from paths, converting
{param}to:paramfor Fastify - Detect operation type for each route:
list,create,retrieve,update,delete, oraction - Map fields with semantic metadata: ID prefixes, timestamps, amount formats, enums, refs
- Generate default factories — one function per resource that returns a spec-faithful default object
Key codegen concerns:
- Multi-version paths: Use
path.replace(/^\/v\d+\//, '')to strip version prefixes generically - ID prefixes: Usually not in the spec — hardcode a
ID_PREFIXESmap (e.g.,customer: 'cus_') - Volume hints: Classify resources as
entity(main objects) orreference(supporting data) for blueprint generation - Field overrides: Some spec defaults are wrong for mock data (e.g., payment_intent status should default to
requires_payment_method, notcanceled)
Step 3: Generated files
All generated files go in src/generated/ with the banner // !! AUTO-GENERATED — do not edit.
| File | Exports | Used by |
|---|---|---|
routes.ts | GENERATED_ROUTES: GeneratedRoute[] | OpenApiMockAdapter CRUD scaffolding, endpoint listing |
resource-specs.ts | AdapterResourceSpecs | Blueprint engine for data generation |
schemas.ts | SCHEMA_DEFAULTS: Record<string, DefaultFactory> | Create handlers and seeding |
meta.ts | Spec version + timestamp | Informational |
Each DefaultFactory returns a full object with spec-faithful defaults, merging any overrides:
export function defaultCustomer(overrides = {}) {
return {
id: generateId("cus_", 14),
object: "customer",
created: unixNow(),
email: null,
metadata: {},
// ... every field from the schema
...overrides,
};
}
Step 4: Adapter class
import { OpenApiMockAdapter } from '@mimicai/adapter-sdk';
import meta from './adapter-meta.js';
import { myPlatformResourceSpecs } from './generated/resource-specs.js';
import { SCHEMA_DEFAULTS } from './generated/schemas.js';
import { GENERATED_ROUTES } from './generated/routes.js';
function ns(resource: string): string {
return `myplatform:${resource}`;
}
export class MyPlatformAdapter extends OpenApiMockAdapter {
readonly id = meta.id;
readonly name = meta.name;
readonly basePath = meta.basePath;
readonly versions = meta.versions;
readonly resourceSpecs = myPlatformResourceSpecs;
protected readonly generatedRoutes = GENERATED_ROUTES;
protected readonly defaultFactories = SCHEMA_DEFAULTS;
async registerRoutes(server, data, store) {
this.mountOverrides(store); // Override handlers FIRST
await this.registerGeneratedRoutes(server, data, store, ns); // CRUD scaffolding
}
getEndpoints() { return this.endpointsFromRoutes(); }
resolvePersona(req) {
// Match platform auth pattern (API key, Bearer token, etc.)
const auth = req.headers.authorization;
if (!auth) return null;
const match = auth.match(/^Bearer\s+test_([a-z0-9-]+)_/);
return match ? match[1] : null;
}
private mountOverrides(store) {
// Register state-machine handlers BEFORE registerGeneratedRoutes()
this.registerOverride('POST', '/my-platform/v1/orders/:order/confirm',
orderOverrides.buildConfirmHandler(store));
}
}
Step 5: Override handlers
Overrides replace auto-generated CRUD for endpoints that need custom logic — state transitions, cross-resource side effects, computed responses, or singletons.
| Use case | Example |
|---|---|
| State machine transition | POST /orders/:id/confirm (draft → confirmed) |
| Cross-resource side effect | Creating a refund updates charge.amount_refunded |
| Computed response | GET /balance computed from charges − refunds |
| Singleton resource | GET /account (no ID param, not a list) |
| Non-standard create | Subscription create converts items array to list format |
| Non-standard delete | Subscription delete returns updated object, not deleted stub |
export function buildConfirmHandler(store: StateStore): OverrideHandler {
return async (req, reply) => {
const { order } = req.params as { order: string };
const existing = store.get('myplatform:orders', order);
if (!existing) return reply.code(404).send(notFoundError(order));
if (existing.status !== 'draft')
return reply.code(400).send(stateError(`Cannot confirm: ${existing.status}`));
const updated = { ...existing, status: 'confirmed', confirmed_at: unixNow() };
store.set('myplatform:orders', order, updated);
return reply.code(200).send(updated);
};
}
What you get for free from OpenApiMockAdapter
| Operation | Auto-generated behavior |
|---|---|
| List (GET /resource) | Cursor pagination (starting_after, ending_before, limit), query filtering by declared params |
| Create (POST /resource) | Uses DefaultFactory, generates ID + timestamp, merges request body |
| Retrieve (GET /resource/:id) | Lookup by idParam, 404 with platform error format if missing |
| Update (POST /resource/:id) | Fetch + merge body (deep-merges metadata) |
| Delete (DELETE /resource/:id) | Remove from store, return { id, object, deleted: true } |
| Action (POST /resource/:id/verb) | Returns 501 unless overridden |
| Seeding | Maps ExpandedData.apiResponses into StateStore, enriches with factories |
| Endpoints | endpointsFromRoutes() builds EndpointDefinition[] from generated routes |
You can customize behavior by overriding protected methods: wrapList(), paginate(), mergeUpdate(), deleteResponse(), notFoundError(), parseBody().
Build workflow
# Download the OpenAPI spec (gitignored)
$ curl -o packages/adapters/adapter-{name}/{name}-spec.json {SPEC_URL}
# Generate routes, schemas, resource-specs from the spec
$ pnpm --filter @mimicai/adapter-{name} generate
# Build
$ pnpm --filter @mimicai/adapter-{name} build
# Test
$ pnpm --filter @mimicai/adapter-{name} test
Key guidelines
- Match real response shapes exactly — agents are trained on real API docs
- Match real ID formats — Stripe uses
cus_xxx, Jira usesMIM-1, Notion uses UUIDs - Match real error formats — Stripe wraps in
{"error": {...}}, Jira uses{"errorMessages": [...]} - Use path param names from generated routes — these may differ from the spec docs (e.g., Stripe uses
:intentnot:payment_intent) - Register overrides BEFORE
registerGeneratedRoutes()— the base class checks the override map and skips CRUD for matched routes - Rebuild adapter-sdk after changing the base class —
pnpm --filter @mimicai/adapter-sdk build
Submission checklist
- Extends
OpenApiMockAdapterfrom@mimicai/adapter-sdk adapter.jsonwith id, basePath, versions, specUrl, specFile, mcp config- Codegen script reads spec and generates
routes.ts,resource-specs.ts,schemas.ts,meta.ts resolvePersona()matches platform auth pattern- Override handlers for state-machine and computed endpoints
- Platform-specific error helpers matching real error format
registerMcpTools()registers tools for key endpoints- Tests cover CRUD, overrides, and seeding using
buildTestServer - TypeScript strict mode, no untyped
any
PRs are reviewed within 48 hours.