Writing and uploading skills
Write a skill on the web, package it as .zip/.skill, attached files, naming rules and every size limit.
A skill is made of instructions (the body of a SKILL.md file) and, optionally, attached files: reference docs, forms and sample data the AI pulls when it needs them. There are two ways to get one in: write it straight on the web, or upload a package.
Way 1: Write it on the web
Open a server → the Skills tab → hit New skill.
Fill in Skill name.
Letters, digits, dashes and underscores only; 2–100 characters; the first character has to be a letter or a digit. This is the name the AI sees when it lists skills. Valid examples:
weekly-report,quy_trinh_sales,SOP2024.Fill in Description (optional, up to 500 characters) with one sentence that tells the AI when to reach for this skill.
Write the Instructions and hit Create.
This is exactly what the AI reads and follows, so write it the way you'd brief a new hire: context, steps, examples, and what not to do.
After that, open the skill to edit it in the Editor. The editor counts lines and characters, flags Unsaved changes, saves fast with Ctrl + S (macOS: ⌘ + S) and stops you leaving the page while changes are still unsaved.
Way 2: Upload a package
A package is a .zip or a .skill file (a .skill file really is just a ZIP). Hit Upload a package on the Skills tab.
The package must contain `SKILL.md`. The system looks for SKILL.md at the shallowest level (case doesn't matter) and treats the folder holding it as the root, so both layouts below give exactly the same result:
weekly-report.zip weekly-report.zip
└─ weekly-report/ ├─ SKILL.md
├─ SKILL.md └─ references/
└─ references/ └─ guide.md
└─ guide.mdEvery other text file becomes an attached file, keeping its relative path (references/guide.md). The AI reads them with the get_skill_file tool.
The top of SKILL.md can carry a frontmatter block that declares a name and a description. The system reads exactly two fields, name and description, one line each:
---
name: weekly-report
description: How to write the weekly report for the Sales team
---
# Weekly report
When you are asked to write the weekly report, follow these steps...The name field is only used when creating a skill and you left Skill name empty. On an update, the skill name stays as it is.
Updating with a package: read this part carefully
Uploading a package again REPLACES EVERYTHING
Open the skill → hit Replace package. The instructions are overwritten, and every attached file missing from the new package is deleted. If you want to keep a file, it has to be in the new package.
To change or add exactly one file without touching the others, use the Add file button on the Attached files card. That one only ever adds, and overwrites by name.
| What you do | Old files missing from this upload |
|---|---|
| Replace package (uploading a package to update) | deleted |
| Add file (one single file) | kept |
| Uploading a package to create a new skill | nothing to lose |
Attached files
Text files only, meaning Markdown, JSON, CSV, txt, YAML… Binary files (images, fonts, PDFs, Excel) are skipped and reported back to you in the yellow Some files were skipped card.
File names may include subfolders (references/guide.md), under these rules:
- 200 characters total at most, and 6 segments deep at most (5 folder levels plus the file name).
- Each segment starts with a letter or a digit, then letters, digits, dots, underscores and dashes.
- No accented characters, no spaces, no
.., no backslashes. - No segment may start with a dot, so
.env,.gitignoreand the.git/folder are all rejected. __MACOSXand.DS_Storeare dropped outright, so you don't have to clean them out first.
The size limits
| What | Limit | What happens if you go over |
|---|---|---|
| Each file inside a package | 2 MB | that file is skipped, the rest still goes up |
| All attached files of one skill | 20 MB | error, nothing is saved |
SKILL.md content | 2,000,000 characters | error, nothing is saved |
| Skills per server | 50 | error, no new skill |
| Attached files per skill | no limit | size is the only cap |
| The whole package on upload | 8 MB | error straight away |
| Entries in one ZIP file | 1,000 | the whole package is refused |
How a skill reaches the AI
You hit Save and that's it. There's no review step and no publish step. The very next call from anyone allowed to read that server gets the new version.
There are no drafts
The skill you're editing is the skill your whole team is using right now. For a big change, consider making a separate server scoped to your own department, trying it there, and only then copying it across to the main one.
Skill content always reaches the AI wrapped in a frame that demands it apply the content and never reveal it verbatim. That's the strongest fence anyone can build, but once content sits inside a user's chat window nothing is absolute, so don't put real secrets (passwords, API keys, personal data) in a skill.
Seeing how much a skill gets used
Open a skill and the Usage card shows Reads, last 30 days. Hit See who read it to jump into the logs, already filtered to that skill.
