# How Skill Documents Differ from Other Tool Descriptions in AI Agents

> Understand how skill documents differ from tool descriptions in AI agents. Learn about natural-language workflows and structured JSON-Schema metadata for agent capabilities.

- Repository: [Bojie Li/ai-agent-book](https://github.com/bojieli/ai-agent-book)
- Tags: deep-dive
- Published: 2026-08-26

---

**Skill documents encapsulate complete natural-language workflows that agents execute step-by-step using minimal general tools, while tool descriptions provide structured JSON-Schema metadata defining single atomic capabilities and precise invocation parameters.**

The `bojieli/ai-agent-book` repository establishes a clear architectural boundary between these two paradigms. Grasping how Skill documents differ from other tool descriptions enables developers to optimize token usage, implement appropriate security sandboxes, and design effective discovery mechanisms for AI-driven agents.

## Purpose and Granularity

**Skill documents** represent coarse-grained, complete workflows authored in plain natural language. According to the source code in [`book-en/chapter4.md`](https://github.com/bojieli/ai-agent-book/blob/main/book-en/chapter4.md), Skills are "Skill documents written in natural language … the Agent executes via a terminal or code interpreter" (lines 42-44). A single Skill may orchestrate multiple actions—such as building, packaging, and deploying an application—within one readable instruction block.

**Tool descriptions**, conversely, define fine-grained, single capabilities. Each tool performs one atomic operation (e.g., `web_search`, `run_bash`) and exposes a precise interface. As documented in [`book-en/chapter4.md`](https://github.com/bojieli/ai-agent-book/blob/main/book-en/chapter4.md) (lines 106-108), these follow a "Standardized tool description format" that tells the model exactly **when** and **how** to invoke the capability.

## Representation and Format

The structural differences between these artifacts are stark:

- **Skill documents** use plain natural-language instructions. For example, a Skill might read: "1. Run `npm run build` … 2. Run `docker build …`". The agent parses this text sequentially and maps steps to general execution tools.

- **Tool descriptions** employ strict JSON-Schema metadata. They declare the tool's name, description, parameters, type definitions, and usage examples. This structured approach enables the model to validate arguments and understand return types programmatically.

## Token Cost and Context Management

**Skill documents** implement a lazy-loading pattern that conserves context window space. The Skill body is **read only when needed**, meaning its tokens are not part of the static system prompt. This design keeps the agent's context light during routine operations, loading the full workflow only upon explicit invocation via functions like `load_skill()` implemented in [`chapter10/multi-role-transfer/skill_orchestrator.py`](https://github.com/bojieli/ai-agent-book/blob/main/chapter10/multi-role-transfer/skill_orchestrator.py).

**Tool descriptions** typically reside in the **static prompt** or an index loaded at startup. They occupy tokens upfront because the model must reference them continuously to decide which tool to call for each sub-task. This static presence enables rapid tool selection but increases baseline token consumption.

## Security and Risk Models

The security postures differ significantly due to executable content:

- **Skill documents** can include arbitrary code and multi-step commands, making them higher risk. The source code notes that "Skills are more dangerous than standard MCP tools" and consequently require execution within isolated sandboxes to prevent system compromise.

- **Tool descriptions** present static metadata rather than executable logic. The primary security concern shifts to "tool-description poisoning"—where malicious descriptions might trick the model into invoking tools incorrectly—rather than direct code execution risks.

## Discovery and Invocation Patterns

**Skill discovery** relies on high-level intent matching. The model must recognize that a Skill is relevant based on broad task descriptions. Consequently, Skill descriptions are intentionally abstract to aid discovery across diverse scenarios.

**Tool selection** operates through precise sub-task matching. The model compares the current objective against tool descriptions to find the exact capability required. Mismatches are typically resolved by refining the tool's JSON-Schema description rather than altering the agent's high-level logic.

## Implementation Examples

The repository provides concrete implementations illustrating both patterns.

### Skill Document Format

Found in [`chapter10/multi-role-transfer/skill_orchestrator.py`](https://github.com/bojieli/ai-agent-book/blob/main/chapter10/multi-role-transfer/skill_orchestrator.py) and related test files, Skill documents follow a natural-language markup:

```text
--- skill: deploy_app ---
1. Run `npm run build` to compile the project.
2. Run `docker build -t app:latest .` to create the container image.
3. Run `kubectl apply -f deploy.yaml` to deploy the service.
--- end ---

```

The agent loads this Skill using `load_skill("deploy_app")` and then issues each step to the generic `bash` tool, as verified in [`chapter10/multi-role-transfer/tests/test_skill_comparison.py`](https://github.com/bojieli/ai-agent-book/blob/main/chapter10/multi-role-transfer/tests/test_skill_comparison.py).

### Tool Description Format

Tool descriptions follow the standardized schema defined in the architecture documentation:

```json
{
  "name": "web_search",
  "description": "Search the web for up‑to‑date information.",
  "parameters": {
    "type": "object",
    "properties": {
      "query": {
        "type": "string",
        "description": "The search query."
      },
      "max_results": {
        "type": "integer",
        "default": 5,
        "description": "Maximum number of results to return."
      }
    },
    "required": ["query"]
  }
}

```

This metadata allows the agent to determine precisely *when* to call `web_search` and how to format its arguments, contrasting with the interpretive approach required for Skills.

## Key Source Files

Several files in the `bojieli/ai-agent-book` repository illuminate these distinctions:

- [`book-en/chapter4.md`](https://github.com/bojieli/ai-agent-book/blob/main/book-en/chapter4.md): Contains the conceptual comparison and formal definitions of Skills versus tool descriptions.
- [`chapter10/multi-role-transfer/skill_orchestrator.py`](https://github.com/bojieli/ai-agent-book/blob/main/chapter10/multi-role-transfer/skill_orchestrator.py): Implements the `load_skill` entry point for loading Skill documents.
- [`chapter10/multi-role-transfer/tests/test_skill_comparison.py`](https://github.com/bojieli/ai-agent-book/blob/main/chapter10/multi-role-transfer/tests/test_skill_comparison.py): Validates correct handling of Skill loading versus direct tool calls.
- [`chapter4/active-tool-selection/ARCHITECTURE.md`](https://github.com/bojieli/ai-agent-book/blob/main/chapter4/active-tool-selection/ARCHITECTURE.md): Describes vocabulary construction from tool descriptions, relevant to the fine-grained tool side of the architecture.

## Summary

Skill documents and tool descriptions serve complementary but architecturally distinct roles in AI agent systems:

- **Skill documents** provide high-level, natural-language workflows loaded on-demand to minimize token costs, requiring sandboxed execution due to arbitrary code risks.
- **Tool descriptions** offer low-level, JSON-Schema metadata for atomic operations, residing in static prompts to enable precise, immediate tool selection.
- Skills are discovered through broad intent matching, while tools are selected via specific sub-task alignment.
- The `load_skill()` function in [`skill_orchestrator.py`](https://github.com/bojieli/ai-agent-book/blob/main/skill_orchestrator.py) initiates Skill execution, whereas tool invocation relies on schema validation against the static tool index.

## Frequently Asked Questions

### When should I use a Skill document instead of a custom tool?

Use a **Skill document** when you need to encapsulate a multi-step workflow that spans several commands or requires complex sequencing (e.g., "build, test, and deploy"). Use a **custom tool** when defining a single, reusable atomic capability (e.g., "fetch weather data") that requires strict parameter validation via JSON-Schema.

### How does lazy loading of Skills affect agent performance?

Lazy loading keeps the initial context window small, reducing latency and costs during routine operations. However, loading a large Skill document incurs a one-time token cost when `load_skill()` is called. This trade-off optimizes for scenarios where specific complex workflows are needed infrequently.

### Why are Skills considered more dangerous than standard tools?

Skills contain arbitrary natural-language instructions that may include shell commands, code execution, or file system operations. Unlike tool descriptions, which are static metadata, Skills direct the agent to perform actions that could compromise the system if malicious. Therefore, Skills require sandboxed execution environments, whereas tool risks are limited to description poisoning or misuse.

### Can a Skill invoke other Skills or only base tools?

According to the architecture in [`skill_orchestrator.py`](https://github.com/bojieli/ai-agent-book/blob/main/skill_orchestrator.py), Skills typically execute via general-purpose tools like a bash executor or code interpreter. While a Skill could theoretically trigger another Skill by calling `load_skill()` recursively, the standard pattern uses Skills to orchestrate sequences of base tool calls rather than forming deep Skill hierarchies.