Project Files
README.md
A 1:1 clone of Claude's internal skill system, built as an LM Studio plugin.
Claude reads a list of available skills at the start of every context, then uses a view tool to read the relevant SKILL.md file before working on tasks that skill covers. This plugin replicates that system exactly for LM Studio.
1. Prompt Preprocessor
Before every message, the plugin scans the skills directory and injects an <available_skills> block into the prompt. The model sees this and knows which skills exist, their descriptions, and their file paths - exactly like Claude's system prompt injection.
2. Tools
| Tool | Purpose |
|---|---|
list_skills | List all available skills with names and descriptions. With a query, scores and ranks skills by relevance using BM25-inspired search across name, tags, description, and SKILL.md body content. |
read_skill_file | Read any file within a skill directory (defaults to SKILL.md). Accepts either a skill name or an absolute path. |
list_skill_files | Explore the full file tree of a skill directory. Accepts either a skill name or an absolute path. |
3. Explicit Skill Activation
You can activate a skill directly from your message using /skill-name notation:
Any token matching /[a-z][a-z0-9._-]* (regex) is treated as an explicit activation. The preprocessor resolves it before the request reaches the model:
SKILL.md body is expanded inline into a <skill_context> block - the model does not need to call read_skill_file for it.Multiple activations in one message are supported (/skill-a and /skill-b are both expanded). Explicit activation takes priority over auto-inject; the <available_skills> block is not appended on the same turn.
4. Persistent Settings
LM Studio does not save plugin settings across new chats. This plugin solves that by writing settings to ~/.lmstudio/plugin-data/lms-skills/settings.json - the skills path and all configuration survive chat resets when only skillsPath field set as default.
A skill is any subdirectory inside your skills folder that contains a SKILL.md file.
skill.json (optional)Place a skill.json in any skill directory to override its display name and description:
If absent, the plugin uses the directory name and extracts the description from the first paragraph of SKILL.md.
| Setting | Default | Description |
|---|---|---|
| Auto-Inject Skills List | On | Injects skills block into every prompt |
| Max Skills in Context | 15 | Max skills listed in each injected block |
| Skills Directory Path | (empty) | Custom path to skills directory |
~/.lmstudio/skills on first run)default - resets the saved path back to ~/.lmstudio/skillsSettings (including the skills path) are written to disk and survive new chat sessions.
The default path ~/.lmstudio/skills resolves to:
| Platform | Path |
|---|---|
| Windows | C:\Users\<you>\.lmstudio\skills |
| macOS | /Users/<you>/.lmstudio/skills |
| Linux | /home/<you>/.lmstudio/skills |
<available_skills> blockread_skill_file("skill-name") ā receives full content/skill-name)/skill-name anywhere in their message (prompt)SKILL.md into a <skill_context> block - no tool call neededlist_skills to locate it before proceedingThe data-analysis skill ships with three Python scripts in scripts/ that use only the Python standard library (no pandas dependency):
| Script | Purpose |
|---|---|
profile.py | Full dataset profile: types, nulls, stats, top values |
correlations.py | Pearson + Spearman correlation matrix with tie handling |
time_series.py | Date-aware trend analysis, resampling, rolling averages |
For larger datasets (>100k rows), pandas is recommended for better performance.
list_skillsSKILL.mdSKILL.md may reference other files ā model calls list_skill_files then read_skill_file with specific path/bug-fix there is a null pointer error in this function: ā¦
use /git-commit to push my changes
/docx write a report summarising the findings
~/.lmstudio/skills/ <- default skills directory
āāā docx/
ā āāā SKILL.md <- entry point (required)
ā āāā scripts/
ā ā āāā helper.py
ā āāā templates/
ā āāā base.docx
āāā pptx/
ā āāā SKILL.md
ā āāā editing.md
āāā my-custom-skill/
āāā SKILL.md
āāā skill.json <- optional: override name/description
{
"name": "My Custom Skill",
"description": "Use this skill when the user asks to do X, Y, or Z.",
"tags": [
"data analysis",
"csv",
"statistics",
"charts",
"visualisation",
"pandas",
"trends",
"dataset"
]
}
cd lms-plugin-skills
bun install
lms dev