# Agent Skill



Skills are folders of instructions, scripts, and resources that agents can discover and use. Upload skills as ZIP files containing a `SKILL.md` with name and description.

<Note>
  Skills can also be auto-generated by the skill memory pipeline. See [Skill Memory Quickstart](/learn/quick).
</Note>

<CardGroup cols="2">
  <Card title="Sandbox with Skills" icon="terminal" href="/tool/bash_tools#mounting-agent-skills">
    Mount skills in sandbox
  </Card>

  <Card title="Skill Content Tools" icon="wand-magic-sparkles" href="/tool/skill_tools">
    Read skill files without sandbox
  </Card>
</CardGroup>

Where to Find Skills [#where-to-find-skills]

<CardGroup cols="2">
  <Card title="Agent Skills Directory" icon="sparkles" href="https://agentskills.io/home">
    Browse community skills in the open format
  </Card>

  <Card title="Anthropic Skills" icon="github" href="https://github.com/anthropics/skills/tree/main/skills">
    Pre-built skills from Anthropic
  </Card>
</CardGroup>

Skill ZIP Structure [#skill-zip-structure]

```
my-skill.zip
├── SKILL.md          # Required: name, description, instructions
├── scripts/          # Optional: executable scripts
│   └── extract.py
└── resources/        # Optional: data files, templates
    └── template.json
```

The `SKILL.md` file must include frontmatter with name and description:

```markdown
---
name: data-extraction
description: Extract structured data from documents
---

# Data Extraction Skill
Instructions for the agent...
```

Quick Start [#quick-start]

<Steps>
  <Step title="Upload a skill">
    <CodeGroup>
      ```python title="Python"
      import os
      from acontext import AcontextClient, FileUpload

      client = AcontextClient(api_key=os.getenv("ACONTEXT_API_KEY"))

      with open("my-skill.zip", "rb") as f:
          skill = client.skills.create(
              file=FileUpload(filename="my-skill.zip", content=f.read()),
              meta={"version": "1.0"}
          )
      print(f"Created: {skill.name} ({skill.id})")
      ```

      ```typescript title="TypeScript"
      import { AcontextClient, FileUpload } from '@acontext/acontext';
      import * as fs from 'fs';

      const client = new AcontextClient({
          apiKey: process.env.ACONTEXT_API_KEY,
      });

      const fileContent = fs.readFileSync("my-skill.zip");
      const skill = await client.skills.create({
          file: new FileUpload({ filename: "my-skill.zip", content: fileContent }),
          meta: { version: "1.0" },
      });
      console.log(`Created: ${skill.name} (${skill.id})`);
      ```
    </CodeGroup>
  </Step>

  <Step title="Browse catalog">
    <CodeGroup>
      ```python title="Python"
      catalog = client.skills.list_catalog()
      for item in catalog.items:
          print(f"{item.name}: {item.description}")
      ```

      ```typescript title="TypeScript"
      const catalog = await client.skills.listCatalog();
      for (const item of catalog.items) {
          console.log(`${item.name}: ${item.description}`);
      }
      ```
    </CodeGroup>
  </Step>

  <Step title="Get skill details">
    <CodeGroup>
      ```python title="Python"
      skill = client.skills.get(skill_id)
      for file_info in skill.file_index:
          print(f"{file_info.path} ({file_info.mime})")
      ```

      ```typescript title="TypeScript"
      const skillDetails = await client.skills.get(skillId);
      for (const fileInfo of skillDetails.fileIndex || []) {
          console.log(`${fileInfo.path} (${fileInfo.mime})`);
      }
      ```
    </CodeGroup>
  </Step>

  <Step title="Read files">
    <CodeGroup>
      ```python title="Python"
      result = client.skills.get_file(skill_id=skill.id, file_path="SKILL.md")
      print(result.content.raw)

      # Binary files return a URL instead
      result = client.skills.get_file(skill_id=skill.id, file_path="images/diagram.png")
      print(result.url)
      ```

      ```typescript title="TypeScript"
      const fileResult = await client.skills.getFile({ skillId: skill.id, filePath: "SKILL.md" });
      console.log(fileResult.content?.raw);

      // Binary files return a URL instead
      const imageResult = await client.skills.getFile({ skillId: skill.id, filePath: "images/diagram.png" });
      console.log(imageResult.url);
      ```
    </CodeGroup>
  </Step>

  <Step title="Delete skill">
    <CodeGroup>
      ```python title="Python"
      client.skills.delete(skill.id)
      ```

      ```typescript title="TypeScript"
      await client.skills.delete(skill.id);
      ```
    </CodeGroup>
  </Step>
</Steps>

Disk Storage [#disk-storage]

Each skill stores its files on an internal [Disk](/store/disk). The `disk_id` is returned when you create or get a skill.

<CodeGroup>
  ```python title="Python"
  skill = client.skills.get(skill_id)
  print(skill.disk_id)  # UUID of the backing Disk
  ```

  ```typescript title="TypeScript"
  const skill = await client.skills.get(skillId);
  console.log(skill.diskId); // UUID of the backing Disk
  ```
</CodeGroup>

Next Steps [#next-steps]

<CardGroup cols="2">
  <Card title="Sandbox" icon="terminal" href="/store/sandbox">
    Execute skill scripts
  </Card>

  <Card title="Skill Tools" icon="wand-magic-sparkles" href="/tool/skill_tools">
    Agent skill reading tools
  </Card>
</CardGroup>
