# Skills

Reuse one set of instructions as LLM system context and as MCP prompts.

A skill is a reusable set of instructions for AI - the steps to follow, the formats to keep to and the examples to work from - kept in the platform rather than hardcoded in services. One skill serves both directions of AI traffic:

- An [LLM connection](https://zato.io/docs/ai/llm/connections.html) call that names a skill sends its instructions as the system context of that call.
- An [MCP gateway](https://zato.io/docs/ai/mcp/index.html) with the skill on its list serves it as a [prompt](https://zato.io/docs/ai/mcp/prompts.html) of the same name, and MCP clients read it with `prompts/get`.

Skills are managed in the Dashboard under **AI** > **Agent skills**.

## Skill files {#skill-files}

Each skill is one directory under the server's `config/repo/skills`, with a `SKILL.md` file in it. The file starts with a short YAML header between two `---` lines that names the skill and says what it is for, and everything after the header is the instructions:

```markdown
---
name: support-agent
description: How to answer customer support questions
---

You are a support agent for an electronics retailer.

* Answer in the customer's language.
* Keep replies under three sentences.
* When you do not know, say so and point to support@example.com.
```

## Use a skill {#use-a-skill}

Name the skill's directory in an `invoke` or `chat` call:

```python
conn = self.llm['My OpenAI']

# One-shot, with the skill's instructions as the system context
response = conn.invoke(text, skill='support-agent')

# The same in a conversation - the instructions accompany every call
# and are never written into the chat's history
response = conn.chat(text, chat_id=chat_id, skill='support-agent')
```

Naming a skill that does not exist raises an exception - a call with a misspelt name is never sent to the provider without its instructions.

## Live edits {#live-edits}

A skill is read from disk on each call, never cached, so editing its `SKILL.md` - on the Dashboard's skills screen or in the file itself - changes the next call, with no restarts and no redeployments. Since skills are plain files in the server's repository, they version, diff and deploy like the rest of your configuration - the [GitOps](https://zato.io/docs/ai/enmasse.html) page shows skills alongside the rest of the AI configuration.

## See also {#see-also}

- [Invoking LLMs](https://zato.io/docs/ai/llm/invoke.html) - One-shot calls that send a skill as their system context
- [Multi-turn conversations](https://zato.io/docs/ai/llm/chat.html) - Skills that accompany every call of a conversation
- [MCP prompts](https://zato.io/docs/ai/mcp/prompts.html) - The same skills served to agents through a gateway
- [GitOps](https://zato.io/docs/ai/enmasse.html) - Skills versioned and deployed with the rest of the AI configuration
