Sep 16, 2026
别再把 skill 复制进每个代理了:用 MagicSkills 共享一个技能池
北京大学 Narwhal-Lab 出品的 308 星本地优先技能基础设施层——技能只装一次,按代理组合各自的技能集合,同步进 AGENTS.md 或作为一个工具暴露。
同一个 SKILL.md 目录被复制进 Claude Code 的文件夹、Cursor 的文件夹、Codex 的文件夹——三周之后,这几份副本已经悄悄分叉了。MagicSkills 是北京大学 Narwhal-Lab 的 308 星项目,用一个共享的本地优先技能池取代了这种复制。
为什么这个 Skill 重要
MagicSkills 把自己描述为「面向多代理项目的本地优先技能基础设施」。你不需要按项目散落技能目录,而是维护一个池子,并从中构建命名的 Skills 集合——每个代理只看到自己需要的那部分子集,并按照该运行时实际消费技能的方式暴露出来。
对象模型分三层:Skill(一个具体的技能目录)、Skills(一个可操作的集合)、REGISTRY(持久层,把命名集合跨运行保存到 ~/.magicskills/collections.json——保存的是路径和描述,不是技能内容的副本)。
覆盖面按运行时拆分。会读 AGENTS.md 的代理应用——README 点名了 Claude Code、Cursor、Windsurf、Aider 和 Codex——通过把集合同步进该文件来使用技能。而通过工具或函数集成的代理框架——AutoGen、CrewAI、LangChain、LangGraph、Haystack、Semantic Kernel、smolagents 和 LlamaIndex——则通过统一的工具接口调用同一个集合。
安装
MagicSkills 已上架 PyPI,需要 Python 3.10 至 3.13,外加 Git(用于从远程仓库安装技能):
pip install MagicSkills
magicskills -h
或从源码安装:
git clone https://github.com/Narwhal-Lab/MagicSkills.git
cd MagicSkills
python -m pip install -e .
magicskills -h
实战流程:一个技能池,按代理同步
面向会读 AGENTS.md 的代理,推荐流程是安装、组合、同步。先把技能装进共享池——来源可以是 GitHub 仓库或本地目录:
# 从远程仓库安装
magicskills install anthropics/skills -t ~/allskills
# 从本地目录安装(本仓库自带的模板技能)
magicskills install skill_template -t ~/allskills
开箱即用支持四个标准位置:当前项目的 ./.claude/skills/、--global 对应的 ~/.claude/skills/、--universal 对应的 ./.agent/skills/,以及 --global --universal 对应的 ~/.agent/skills/——也可以用 -t 指定任意路径。README 推荐使用一个共享根目录(例如 ~/allskills),让所有代理复用同一个池子。
然后为某个代理组合一个命名集合:
magicskills addskills agent1_skills --skill-list pdf docx --agent-md-path /agent_workdir/AGENTS.md
再同步它:
magicskills syncskills agent1_skills
syncskills 有两种模式。none 保留标准的 <usage> + <available_skills> 结构,适合能直接使用 AGENTS.md 中技能信息列表的代理;cli_description 只写入带 CLI 指引的 <usage>,适合必须通过 magicskills skill-tool 使用的代理。如果目标文件已有技能区块会被替换,没有则追加。
实战流程:把同一个集合暴露给框架
对于完全不读 AGENTS.md 的框架,CLI 以工具风格派发 list、read、exec:
magicskills skill-tool listskill --name agent1_skills
magicskills skill-tool readskill --name agent1_skills --arg pdf
magicskills skill-tool execskill --name agent1_skills --arg "echo hello"
在 Python 侧,通过注册表复用 CLI 创建的集合,包成一个 @tool 交给框架:
import json
from langchain_core.tools import tool
from magicskills import REGISTRY
agent1_skills = REGISTRY.get_skills("agent1_skills")
@tool("_skill_tool", description=agent1_skills.tool_description)
def _skill_tool(action: str, arg: str = "") -> str:
return json.dumps(agent1_skills.skill_tool(action, arg), ensure_ascii=False)
你也可以直接在内存中构建临时的 Skills(...) 对象而不注册它——适合不该被持久化的一次性组合。
使用技巧
- 两个技能同名时,别再传名字,改传显式路径——
magicskills readskill ./skills/demo/SKILL.md。名字图方便,路径消歧义。 execskill在当前进程工作目录中执行命令,而不是在技能目录里——命令依赖位置时就自己cd。uploadskill通过自动化的 fork、push 和 PR 流程把本地技能提交到 MagicSkills 仓库,其他人就能用install装回去。magicskills -h加上doc/cli.md里的完整命令参考覆盖了其余命令,从showskill到deleteskills。
什么时候不该用它
如果你只在一个项目里跑一个代理,普通的技能目录已经够用——技能池、集合和注册表是为多代理场景准备的架构。整套东西是 Python CLI 加本地文件,完全无法调用 CLI、也读不了同步后的 AGENTS.md 的运行时不适用。远程安装依赖 Git,纯离线环境从 GitHub 拉取也就无从谈起。
查看排行榜了解更多 skill。