Skip to main content
Glama

Kiln

An AI-native SDLC tool that keeps a knowledge graph linking intent → requirement → blueprint → work order, and hands coding agents fully-contextualized work orders over MCP. A coding agent calls get_work_order and receives the whole chain — plus lineage up to root intent — in a single call, then reports status back to the same store the human works in.

The system is a set of TypeScript packages (core, agents, mcp-server, cli) plus a Tauri + React desktop app (apps/desktop). See docs/ for the design (PRD, blueprint, CONNECTING, authoring-methodology).

Requirements

  • Node 22.5+ (uses the built-in node:sqlite). On Node 22.x this needs the --experimental-sqlite flag; the test runner and package scripts set it for you. On Node 24+ node:sqlite is stable and the flag is unnecessary.

  • pnpm.

Quickstart

pnpm install
pnpm -r build
pnpm -r test

# Seed a demo chain (artifact → requirement → blueprint → ready work order)
# The store defaults to ~/.kiln/kiln.db everywhere (CLI, MCP server, desktop app);
# set KILN_DB_PATH to an absolute path to use a different file.
pnpm -C packages/mcp-server seed

# Serve it to coding agents over MCP
KILN_MCP_TOKEN=choose-a-secret pnpm -C packages/mcp-server start

Then register with Claude Code and run the loop — full steps in docs/CONNECTING.md.

Layout

packages/core/src/
├─ domain/         types.ts · edits.ts (EditOp/Suggestion) · schemas.ts (Zod input)
├─ db/             connect.ts  (node:sqlite, lazy-loaded; pragmas, schema DDL)
├─ store/          store.ts (interface) · sqlite-store.ts (impl) · *.test.ts
├─ graph/          context.ts (context assembly) · tree.ts (featureTree) · *.test.ts
├─ edits/          apply.ts (applyOp/applySuggestion + revisions) · *.test.ts
├─ transitions.ts  work-order status lifecycle (shared by MCP bridge + app)
└─ errors.ts

packages/mcp-server/src/
├─ index.ts        CLI entry (env config, HTTP listener)
├─ server.ts       streamable-HTTP wiring + bearer-auth gate
├─ tools.ts        the three MCP tools over Store
├─ auth.ts         bearer-token check (constant-time)
├─ seed.ts         demo-chain seeder (also a CLI)
└─ *.test.ts

The one thing this proves

A coding agent can call get_work_order and receive the whole work_order --implements--> blueprint --details--> requirement --references--> artifact chain in a single MCP call, then report status back to the same store the human works in. Missing links yield typed partials, never throws.

Design notes

  • Everything goes through Store. No consumer imports the driver or writes SQL — all dialect-specific SQL (FTS5, the recursive CTE) is confined to SqliteStore. That's what keeps a future PostgresStore (for the hosted tier) a drop-in. The MCP server obeys the same rule: it only sees the Store interface.

  • Two processes, one file. The app and the MCP server share the SQLite file; WAL + busy_timeout make that safe.

  • Driver choice. The scaffold uses Node's built-in node:sqlite (zero native build). better-sqlite3 is a drop-in alternative — same API shape — if you prefer no experimental flag; the swap is confined to db/connect.ts.

  • Status lifecycle is enforced server-side: draft→ready→in_progress→done, plus any→cancelled. Invalid transitions return a tool error listing the allowed next states.

  • IDs are crypto.randomUUID(). Swap for ULID if you want lexicographically sortable ids.

  • Structured edits are modeled (EditOp/Suggestion) and applied via applySuggestion (core/src/edits): accepted ops apply atomically and append a revision. Anchors must match exactly once; an empty insert anchor appends.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/danielyayla/kiln'

If you have feedback or need assistance with the MCP directory API, please join our Discord server