What is HCP?
An open standard for installing a capability into any agent harness, as a portable pack that a runtime can authorise, sandbox, and execute.
Harness Context Protocol (HCP) is an open standard for installing capabilities into agent harnesses.
A harness is whatever drives an agent: a coding assistant, a chat product, an automation runner, a TypeScript tool loop. A capability is something the agent should be able to do in the world: plan a route, list a mailbox, send a transfer. Today each harness has its own way of adding capabilities: a config file, an MCP server, a table of setup steps pasted into an instructions file. HCP replaces that with one portable unit, the Harness Pack, and a small set of rules for what a runtime does with it.
Skills tell an agent how to behave. MCP carries tool calls between a model and a server. HCP installs the capability itself: versioned, authorised, and the same command whether a human types it, an agent calls it, or a UI button fires it.
The unit: a Harness Pack
A pack is a directory containing three files.
| File | Role | What you write |
|---|---|---|
surface.json | Manifest | Pack id, adapter kind, Binding mode, and 5 to 12 named commands |
policy.json | Policy | One row per command and per trigger: read or write, which land it touches, whether it needs confirmation |
HARNESS.md | Skill | One screen that teaches the hot path and the anti-patterns |
Those three files are the authoring surface. A pack contains no secrets, no user allow-lists, no tenant ids, and no server. It describes a CLI or API that already exists and declares what it may do.
{
"id": "transit",
"kind": "wrap",
"cliBin": "transit",
"binding": { "mode": "public" },
"verbs": {
"plan": {
"description": "Time-first options between two places.",
"cli": ["transit", "plan", "{{from}}", "{{to}}"]
}
}
}Two loops on one pack
Every pack participates in two directions, and HCP keeps them isolated.
- Execute is inbound. Someone asks the pack to do something by running a named
command. Commands have a twin face: a CLI form (
transit plan A B --json) and a JSON form ({ "pack_id": "transit", "verb_key": "plan", "args": {…} }). Both are the same command under the same Policy. - Sense is outbound. The pack may announce that the world changed (a new message arrived, a credential went stale). Triggers are declared in the same Policy file, delivered only under an explicit grant, and can never mint credentials or spend money.
A recorded trigger may lead an Invoker to run Execute; that Execute still has to pass the inbound pipeline under its own grants. See Architecture.
What HCP enables
- Wrap a domain CLI in an afternoon. Describe the commands you already ship, add a policy row for each, and the same binary is available to a terminal, an agent, and a product UI as one command.
- Give an agent a discovery surface without a hand-built tool catalog. A public
pack with
find,plan,show,status,followneeds no login and no secrets. - Gate a write so it fails closed. A transfer without an explicit
confirmis refused before any adapter runs, whoever or whatever asked. - Announce change safely. A pack can raise
new_itemorbinding.degradedinto a runtime sink without gaining the ability to act. - Adopt natively in hosts.
hcp adopt cursororhcp adopt opencodegenerates host-native surfaces from the activated packs, without bridging through MCP.
Why it matters, by role
- Pack authors publish one folder, and any runtime that speaks HCP can activate it. You do not maintain a Skill, an MCP server, and a private connector schema for the same CLI.
- Runtime and harness builders activate packs instead of hand-registering tools. Availability is four observable flags (installed, activated, connected, executable), and every denial has a reason.
- Operators and end users get one Policy and one Binding regardless of invoker. Secrets never live in Skills, manifests, or host configs. Packs stay valid if the transport or UI changes.
Where it sits
| Standard | Layer | Unit |
|---|---|---|
| Agent Skills | Teaching | SKILL.md |
| MCP | Model ↔ tool transport | MCP server |
| Agent Plugins | Packaging Skills + MCP servers for clients | Plugin directory |
| A2UI | Agent → declarative UI | UI messages |
| HCP | Installable capability with Policy, Binding, and Sense | Harness Pack |
HCP does not replace any of these. It covers the step none of them address: getting a capability installed into a harness, with authorisation, credentials, sandboxing, and an outbound loop. Full comparison: Landscape.
Status
HCP/1 is implemented by the reference TypeScript runtime and CLI. HCP/1.1 (wrap
hardening, installer commands, land local) is accepted and shipping. The normative
text lives in the protocol repository; this site is its public projection. See
Versioning and the
Specification.