---
title: Assets
description: The five things an experiment can hand every agent in it.
---

An asset is attached to an **experiment**, so every agent in it gets the same
one — which is what keeps the comparison fair. Attaching nothing is a complete
experiment: the agent exactly as it ships.

Each kind lives on its own page under **Assets** in the sidebar, and each is the
same record with a different second line: a name, what it is for, and the one
string that makes it real.

## The five kinds

| Kind | What you give it | What actually happens |
|---|---|---|
| **MCP server** | a stdio command (`npx -y @acme/mcp-postgres`) or an HTTP/SSE URL | Written into `.mcp.json` in the workspace — the file Claude Code, Codex and cursor-agent all look for. For your own agent, the server's tools are injected into its tool list. |
| **Skill** | guidance, in prose | Installed as `.claude/skills/<name>/SKILL.md` where the agent will read it, and given to your own agent inside its brief. |
| **CLI** | an install command (`npm i -g @acme/cli`) | Run while the machine provisions, so the binary is on `PATH` before the first token. |
| **SDK** | a package spec (`@acme/sdk@^3`, or a pip package) | Installed into the project the task runs against. Node packages go into the workspace; Python packages into the user's own site-packages. |
| **Plugin** | a git source, or an install command | Cloned into `.claude/plugins/<name>/`, dependencies installed, and any command it provides linked onto `PATH` — without running the repository's own build. |

Whatever is attached, a summary is written to `CONTEXT.md` in the workspace and
appended to the agent's instructions, so it knows what it has been given rather
than having to discover it.

## Writing a skill

Write it the way you would brief a new engineer, not as a prompt:

```text title="House conventions"
Tests live beside the code they cover, named *.spec.ts.
Never add a bare timeout to a spec to make it pass — find the race.
Scripts go in scripts/ and are kebab-case.
```

Skills are the one kind that reaches every agent identically, because text
travels anywhere.

## What each kind means for your own agent

An agent connected with `redline dev` runs in **your** process, so some of these
cannot be installed underneath it. The builder says so inline when you have one
of your own agents selected.

| Kind | On a catalog agent | On your own agent |
|---|---|---|
| **Skill** | Written to disk and mentioned in the brief | Arrives as text in `task.prompt`. Nothing to do. |
| **MCP server** | Configured in `.mcp.json` | Injected into your framework's tool list automatically; or ask for it with `redlineTools(task)`. |
| **CLI** | Installed on the machine | **Not** installed on your computer. Reach the run's machine with `machine_run`, or call `installClis(task)` yourself. |
| **SDK package** | Installed in the workspace | Same — it is installed on the run's machine, not in your process. |
| **Plugin** | Cloned and linked on the machine | Same. |

> **Three of them need a computer**
>
> A CLI, an SDK package and a plugin have to *be* somewhere. When one of those
> is attached, a run by your own agent is given a machine too — see
> [Machines](/build/machines).

## Managing them

Each asset card shows what it is for, the string that makes it real, and how
many experiments have attached it. Deleting an asset does not touch the
experiments that already used it: what those runs were given is part of their
record.
