---
title: Building with agents
tagline: Skills and CLIs
description: For agents with a shell, a skill plus a CLI beats a token-heavy MCP server. MCP remains the door for agents that cannot run a process.
---

For an agent that has a shell, a skill plus a CLI beats a token-heavy MCP server.
This site does not publish an MCP server. The pages, the skills, and the package
catalog are the surface an agent should read.

## The token tax

An MCP server places every tool schema into the model context on every request.
The agent pays that cost whether it calls the tools or not. A wide server is a
standing charge on the whole conversation.

A skill is knowledge the agent loads when the task matches. Until then it is a
name in an index. After it loads, the agent acts with tools it already has: a
shell, an editor, and `dotnet`.

## The shell is the dividing line

The dividing line is whether the consuming agent has a shell. A live HTTP API
does not move that line. A shell can call the API.

Agents with a shell — Claude Code, Cursor, a person at a terminal — can run a
CLI. For them, a CLI plus a skill is the smaller and simpler path, including
when the work is a live API. Put a CLI in front of the API and a skill beside
it that says when to run the CLI.

Agents without a shell — a hosted or sandboxed assistant that can only emit
tool calls — have one door. A tool-call protocol is that door. MCP is the
right fallback there.

When a [TimeWarp.Nuru](/packages/timewarp.nuru/) app must speak that protocol,
[TimeWarp.Nuru.McpHost](/packages/timewarp.nuru.mcphost/) serves the same routes
as MCP tools (`myapp mcp`, or `WithNuruTools` inside an existing host). The
separate [TimeWarp.Nuru.Mcp](/packages/timewarp.nuru.mcp/) package is frozen and
is outside the Nuru 3.0 line. Its answers do not match current Nuru. Use the
skill.

## The skill drives the CLI

The Nuru skill published here is [tw-nuru](/skills/tw-nuru/). Every skill on
this site is on the [skills index](/skills/). Install it with
[TimeWarp.Skills](/packages/timewarp.skills/):

```sh
dnx TimeWarp.Skills -- add tw-nuru https://timewarp.software/
```

The skill stays out of the prompt until the task is about a Nuru CLI. It then
tells the agent to discover routes from the binary and to run them:

```sh
myapp --capabilities
myapp add 15 25
```

`--capabilities` prints the route catalog: command names, parameters, options,
and return types. The agent reads that catalog when it needs a command. It does
not carry every schema on every turn. Structured input uses the same binder
through `--json-args`. The [tw-nuru skill](/skills/tw-nuru/SKILL.md) documents
that binder next to the endpoint DSL. `add 15 25` is the calculator quick start
on the [TimeWarp.Nuru](/packages/timewarp.nuru/) package page.

## Where Nuru is headed

Nuru routes are source-generated and compile to Native AOT. The product
direction is to read an HTTP API's OpenAPI document, generate that AOT CLI, and
ship the binary with a skill. The agent learns the API when the skill loads,
then calls it through the shell, with no idle token tax.

That OpenAPI generator is the direction. It is not a package on this site
today. The pattern you can use today is the skill plus `--capabilities` above.

## Start here

- [Skills index](/skills/) — install any skill with `dnx TimeWarp.Skills`
- [tw-nuru](/skills/tw-nuru/) — the skill that drives a Nuru CLI ([SKILL.md](/skills/tw-nuru/SKILL.md))
- [TimeWarp.Nuru](/packages/timewarp.nuru/) — the CLI framework
- [TimeWarp.Nuru.McpHost](/packages/timewarp.nuru.mcphost/) — the same routes as MCP tools, for a caller with no shell
- This page as [markdown](/agents/index.md)

This page is free. A tip, when tips are enabled, happens only at [`/api/tip`](/tip/).
