kcp-harness
An MCP compliance proxy that enforces deterministic knowledge governance for AI agents, routing tool calls through a 14-gate planner and generating audit logs, budget ledgers, and approval tickets.
README
kcp-harness
๐งพ See it run โ interactive KCP playground ยท read the reveal
Deterministic knowledge governance for any AI agent.
Your agent can read every file in your project. Can it prove why it read what it read?
KCP Harness is an MCP compliance proxy that sits between an AI coding agent and its tools. It intercepts knowledge-related calls, routes them through the kcp-agent deterministic planner (14-gate cascade, no LLM), and produces compliance artifacts โ decision traces, audit logs, budget ledgers โ as a side effect of normal agent operation.
The agent can't bypass governance because it only talks to the proxy's MCP interface. The proxy decides what knowledge is accessible, tracks spend, and logs every decision. Fail-closed: if the harness can't verify a request, the agent gets nothing.
Agent (Claude Code / Cursor / Copilot / Windsurf / Cline / Crush / OpenClaw / ...)
โ
โ MCP tool call
v
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ kcp-harness โ
โ โ
โ classify โ govern (14 gates) โ execute โ audit โ
โ โ
โ Side outputs: โ
โ ยท Decision traces (per-request, deterministic) โ
โ ยท Audit log (append-only JSONL) โ
โ ยท Budget ledger (itemized, ceiling-enforced) โ
โ ยท Temporal drift (plan validity over time) โ
โ ยท Approval tickets (named-human sign-off, durable) โ
โ ยท Confidence verdicts (post-synthesis gate) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
v
Knowledge manifests (knowledge.yaml)
Why
Enterprises need agents that are defensible โ auditable, reproducible, budget-controlled, temporally pinned. Today's agents can't prove why they read what they read. The harness adds a compliance layer without replacing the agent.
| What you keep | What the harness adds |
|---|---|
| Your agent (Claude Code, Cursor, Copilot, ...) | Deterministic knowledge selection |
| Your workflow (coding, reviewing, shipping) | Decision traces (14 gates per unit) |
| Your tools (MCP servers, shell, browser) | Budget enforcement (ceiling, per-currency) |
| Temporal governance (drift detection) | |
| Append-only audit log | |
| Replay / cross-examination | |
| Human-approval gates (named reviewer + policy citation) | |
| Confidence gating (post-synthesis, route-to-human) |
You sell the compliance layer. The agents are pluggable.
Install
npm install -g kcp-harness
Or use without installing:
npx kcp-harness --help
Native executables
Pre-built binaries (no Node/Deno required) for Linux x64/arm64, macOS x64/arm64, and Windows x64 โ grab them from a release. To build one yourself:
npm ci && npm run build
deno compile --allow-read --allow-env --allow-net --allow-run \
--node-modules-dir=auto --output kcp-harness dist/cli.js
Quick start
1. Initialize
kcp-harness init # creates harness.yaml
2. Generate agent integration
kcp-harness integrate claude-code # or: pi, cursor, copilot, windsurf, cline, continue, crush, openclaw
3. Start coding
Your agent now routes knowledge access through the harness. Every decision is logged.
Supported agents
| Agent | Config | Integration |
|---|---|---|
| Claude Code | .mcp.json + PreToolUse hooks |
kcp-harness integrate claude-code |
| Cursor | .cursor/mcp.json + .mdc rules |
kcp-harness integrate cursor |
| GitHub Copilot | .vscode/mcp.json (uses "servers" key) |
kcp-harness integrate copilot |
| Windsurf | global config + .windsurfrules |
kcp-harness integrate windsurf |
| Cline | MCP settings + .clinerules |
kcp-harness integrate cline |
| Continue | .continue/mcpServers/*.yaml |
kcp-harness integrate continue |
| Crush | crush.json + PrepareStep |
kcp-harness integrate crush |
| OpenClaw | openclaw.json + plugin hooks |
kcp-harness integrate openclaw |
| Pi | .pi/mcp.json + project skills |
kcp-harness integrate pi |
Each agent has its own MCP config format, rules file, and quirks. The integrate command handles
them all โ one governance layer, any agent.
How it works
Every tool call flows through a five-stage pipeline:
1. RECEIVE MCP JSON-RPC request from agent
2. CLASSIFY Knowledge-navigation or pass-through?
3. GOVERN 14-gate cascade (audience โ temporal โ budget โ ...)
4. EXECUTE Call downstream tool / return content
5. AUDIT Log decision to append-only audit log
Classifier
The classifier examines each tool call and determines whether it targets governed knowledge.
Read("docs/api.md") where docs/ is governed? Route through the planner. Read("package.json")
where package.json isn't governed? Pass through. KCP tools (kcp_plan, kcp_load) are always
governed.
Governor
Two automated modes, plus a human gate that outranks both:
- Plan-first (fast path) โ the agent calls
kcp_planfirst. The harness caches the approved plan. Subsequent reads are checked against the cached plan โ no re-planning. - Auto-plan (fallback) โ the agent reads a governed path without planning. The harness runs
the planner automatically. Slower, but governance is enforced even for agents that don't know
about
kcp_plan. - Human approval โ calls matching a
governance.approvalsrule are held for a named reviewer (pending), no matter what the automated paths would decide. Tickets survive restarts and resolve via thekcp-harness approvalsCLI (or any customApprovalProviderchannel). Resolutions require a named reviewer and a policy citation.
The 14-gate cascade
Every knowledge unit is evaluated through 14 deterministic gates, in order:
audience โ not_for โ temporal โ deprecated โ supersession โ relevance โ
skill_eligibility โ attestation โ payment โ access โ strict โ max_units โ
money_budget โ context_budget
A unit must pass all gates. The gate that blocks it is recorded in the decision trace. Same inputs โ same plan. No model involved.
For the skill_eligibility gate's subject matter โ governed kind: skill units โ the
authoring conventions, linter, and conformance vectors live in
Cantara/kcp-skill.
MCP tools
Once connected, agents can use these governance tools:
| Tool | Description |
|---|---|
kcp_plan |
Deterministic load plan โ which units, in what order, which skipped and why |
kcp_load |
Plan + load eligible unit content |
kcp_trace |
Full 14-gate decision trace |
kcp_validate |
Lint a knowledge.yaml |
harness_status |
Current governance state |
harness_session |
Approved plans + known units for this session |
harness_budget |
Itemized spend tracking |
harness_temporal_check |
Plan drift detection |
harness_approvals |
Human-approval tickets (pending / approved / dismissed / expired) |
harness_assess |
Confidence-gate a synthesized answer before acting on it |
Compliance artifacts
Audit log
Append-only JSONL. Every decision โ governed or pass-through โ is logged with sequence number, timestamp, tool, targets, and governance decision:
cat .kcp-harness/audit.jsonl | jq 'select(.governed == true)'
Budget ledger
Append-only itemized spend tracking. Per-currency running totals. Ceiling enforcement โ a load that would exceed the budget is rejected atomically (no partial loads).
Temporal governance
Plans are registered with a temporal watcher. On subsequent calls, the watcher re-evaluates against the current time. If units have drifted (expired, newly valid), the harness emits a drift event. Long-running sessions stay honest.
Approval tickets
Calls matching an approval rule open a durable ticket
(pending_review โ approved | dismissed | expired). The ticket store survives restarts โ
sessions are ephemeral, human review is not. Every resolution records who approved,
when, and which policy it satisfies โ evidence generated at approval time, never
reconstructed from logs.
Confidence verdicts
harness_assess runs kcp-agent's post-synthesis
assess() over a synthesized answer before it may be acted on. The planner gates loading,
grounding gates asserting, this gates acting. Below-threshold verdicts on routed configs
open an approval ticket with the full verdict embedded as evidence.
Configuration
# harness.yaml
version: "1.0"
governance:
domains:
- manifest: "./knowledge.yaml"
paths: ["docs/", "src/"]
policy:
fail_closed: true
audit_all: true
max_units: 5
budget:
amount: 1.00
currency: USDC
confidence: # optional post-synthesis gate (harness_assess)
threshold: 0.7
severity: critical
route_to_role: account-owner
approvals: # optional human-approval gates
provider: file
rules:
- match: { tools: [Write, Edit], paths: [records/] }
required_role: account-owner
expires_after: 72h
policy_ref: POL-7.2
audit:
path: ".kcp-harness/audit.jsonl"
CLI
kcp-harness serve [--config harness.yaml] Start the MCP proxy
kcp-harness init Create a harness.yaml template
kcp-harness check [--config harness.yaml] Validate configuration
kcp-harness integrate <agent> [options] Generate agent integration files
kcp-harness integrate --list List supported agents
kcp-harness export [options] Export compliance evidence (SOC 2 / ISO 27001)
kcp-harness dashboard [options] Launch the live compliance dashboard
kcp-harness approvals list [--state s] List human-approval tickets
kcp-harness approvals approve <id> --reviewer <name> --policy-ref <ref>
kcp-harness approvals dismiss <id> --reviewer <name> --policy-ref <ref>
Library
import { classify, govern, BudgetLedger, TemporalWatch } from "kcp-harness";
import { generate, listAgents } from "kcp-harness";
// Classify a tool call
const result = classify("Read", { file_path: "docs/api.md" }, governedDomains);
// Generate integration files
const output = generate("claude-code", { manifest: "./knowledge.yaml", paths: ["docs/"] });
Architecture
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Layer 3: Integration Packages โ
โ Agent-specific configs + rules files โ
โ (claude-code, cursor, copilot, ...) โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Layer 2: KCP Compliance Harness โ โ THIS
โ MCP proxy โ deterministic governance โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Layer 1: kcp-agent (planner core) โ
โ 14-gate cascade, decision traces โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Forking agents puts you in competition. A harness puts you in composition.
Tests
npm test # 314 tests across 20 test files
Covers the classifier, governor (incl. approval precedence), approval state machine + providers, confidence-gate wiring, proxy, audit, budget ledger, temporal watch, evidence export, dashboard, and all agent integrations.
License
Apache-2.0 ยท By eXOReaction AS, hosted under Cantara.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.