Convert agents to skills. Decompose agent sprawl into reusable primitives.
Skillify is an open-source CLI that takes an agent manifest (Microsoft Copilot Studio, Microsoft Agent Framework, Microsoft Foundry, MCP, or generic YAML/JSON) and produces:
- An agent-ness score — pure skill / skill bundle / true agent
- A decomposition plan — every distinct capability + the personality shell (if any)
- Native-format output — Claude Skills (
SKILL.md), Copilot Studio Skills manifest, Foundry Toolbox entries, MCP tool descriptors - A migration plan in Markdown — the artifact a human reads to do the actual migration
It exists because the industry has converged (Anthropic Oct 2025, Microsoft Power Platform Dec 2025, Foundry Mar 2026) on skills + tools + a thin orchestrator as the right primitive — but no tool exists to classify and convert the thousands of agents enterprises already built.
A typical 2025 enterprise has 200-500 declarative agents. Most are skills pretending to be agents — single prompts with a handful of connector calls, paying Copilot-credit overhead for what should be a Claude Skill or an MCP tool. A few are actual agents — state machines, planners, persistent memory.
Skillify tells you which is which, and converts it accordingly.
| If your agent is... | Skillify produces... |
|---|---|
| A single prompt + 2-4 connector calls | A SKILL.md you can invoke from any personal agent at need |
| A composite orchestration graph with state | The same graph wrapped as a Skill Bundle, with each leaf node exposed as an MCP tool |
| A real state-machine planner | A recommendation: keep as agent. Skillify extracts the leaf skills + tools anyway, so the orchestrator's dependencies are reusable elsewhere. |
- Python 3.9+
- (Optional) An OpenAI-compatible LLM endpoint for LLM-assisted decomposition. Supports Anthropic, OpenAI, Ollama, Foundry Local, Kimi-K2.6, anything that exposes the
/v1/chat/completionsshape. - No LLM? Skillify's deterministic fallback decomposer still works.
git clone https://github.com/Novesai/skillify.git
cd skillify
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt(Will be on PyPI as pip install skillify once v0.2 ships.)
cp .env.example .envEdit .env:
OPENAI_API_KEY=sk-...
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=gpt-4oUsing Ollama locally? Set:
OPENAI_API_KEY=ollama
OPENAI_BASE_URL=http://localhost:11434/v1
OPENAI_MODEL=qwen2.5:14bUsing Anthropic directly?
OPENAI_API_KEY=sk-ant-...
OPENAI_BASE_URL=https://api.anthropic.com/v1
OPENAI_MODEL=claude-sonnet-4-6No LLM? Skip the file. Skillify falls back to a deterministic heuristic decomposer.
# Full migration pipeline
skillify migrate examples/copilot_triage_agent.yaml
# Just classify (no LLM, deterministic)
skillify assess examples/copilot_triage_agent.yaml
# Just parse → JSON view of the IR
skillify parse examples/copilot_triage_agent.yaml --output ir.json
# Just decompose
skillify decompose examples/copilot_triage_agent.yamlOutput lands in ./skillify-out/<agent-name>/:
skillify-out/copilot-triage-agent/
├── MIGRATION.md # human-readable migration plan
├── claude-skills/
│ ├── email-triage/
│ │ ├── SKILL.md
│ │ └── scripts/main.py
│ └── escalation-router/
│ ├── SKILL.md
│ └── scripts/main.py
├── copilot-skills-manifest.json
├── foundry-toolbox-entries.yaml
├── mcp-tools.json
└── ir.json # the intermediate representation
cat skillify-out/copilot-triage-agent/MIGRATION.mdYou'll see the agent-ness score, the rationale, the proposed skills with their I/O, and a recommended target format for each.
| Command | Purpose | LLM required? |
|---|---|---|
skillify parse <path> |
Parse a manifest, emit the IR as JSON | No |
skillify assess <path> |
Run the agent-ness scorer, print verdict + signal breakdown | No |
skillify decompose <path> |
Decompose into skills + tools | Falls back to heuristic if no LLM |
skillify migrate <path> |
Full pipeline: parse → decompose → score → write everything | Falls back to heuristic if no LLM |
skillify explain <path> |
(v0.2) Interactive rationale viewer | No |
| Flag | Purpose |
|---|---|
--output-dir <dir> |
Where to write outputs (default ./skillify-out/) |
--target <format> |
Restrict output formats (e.g., claude_skill, copilot_skill, mcp, migration_plan). Default: all. |
--no-llm |
Force deterministic decomposer, even if OPENAI_API_KEY is set |
--json |
Emit machine-readable JSON instead of pretty text |
--verbose |
Print every step |
Every signal in the agent-ness rubric is a simple bucket on the IR:
| Signal | Pure Skill | Bundle | True Agent |
|---|---|---|---|
| Distinct capabilities (decomposer output) | 1 | 2-3 | ≥4 |
| Unique tool families | 1-2 | 3-6 | ≥7 |
| Has explicit orchestration | no | soft | yes |
| Has persistent memory | no | working only | long-term or episodic |
| Instructions complexity (chars × tools) | <2k | 2k-10k | >10k |
| Identity vs capability separation | no | soft | yes |
The score is deterministic. The same IR always produces the same score. We never score with an LLM; we only decompose with one. That keeps the rubric explainable and reproducible.
The rubric is intentionally transparent. Every assessment prints the rationale[] so you can see exactly which bucket each signal landed in. If you disagree with a bucket, that's a parser bug or a rubric bug — file an issue, please.
| Format | Parser | Ship |
|---|---|---|
Microsoft Copilot Studio (*.csdl.yaml, *.csdl.json, *.json) |
parsers/copilot_studio.py |
v0.1 ✅ |
| Generic YAML / JSON (catch-all) | parsers/generic.py |
v0.1 ✅ |
| Microsoft Agent Framework (MAF) | parsers/maf.py |
v0.2 |
| Microsoft Foundry YAML | parsers/foundry.py |
v0.2 |
| MCP server descriptor | parsers/mcp.py |
v0.2 |
Adding a new format is a single PR. See docs/adding-a-parser.md →
| Format | Module | Notes |
|---|---|---|
Claude Skills (SKILL.md + scripts/) |
formatters/claude_skill.py |
Per Anthropic Skills spec |
| Copilot Studio Skills manifest | formatters/copilot_skill.py |
JSON, written for manual upload |
| Foundry Toolbox entries | formatters/foundry_toolbox.py |
YAML entries |
| MCP tool descriptors | formatters/mcp.py |
JSON |
| Migration Plan | formatters/migration_plan.py |
Always emitted |
Skillify is a library, not just a CLI.
from skillify.parsers import parse_manifest
from skillify.decomposer import decompose
from skillify.scorer import score
from skillify.formatters import write_all
ir = parse_manifest("agent.yaml")
plan = decompose(ir) # uses LLM if configured, else heuristic
verdict = score(ir, plan)
write_all(ir, plan, verdict, output_dir="./out")Every public function takes and returns Pydantic models. The IR is the contract.
We welcome parsers. The clearest contribution path:
- Open an issue describing the manifest format with a sample.
- Skim
docs/adding-a-parser.mdand copyskillify/parsers/generic.pyas a template. - Submit a PR with parser + ≥5 tests + a sample manifest in
examples/.
Contributing guide → · All Novesai contribution rules →
| Version | Status | What ships |
|---|---|---|
| v0.1 | In progress (this repo) | Copilot Studio + generic YAML/JSON parsers; Claude Skills + Copilot Skills + Foundry Toolbox + MCP formatters; deterministic scorer; heuristic + LLM decomposers |
| v0.2 | Planned | MAF + Foundry + MCP parsers; explain command |
| v0.3 | Planned | diff command; CI integration |
Full RFC → for the strategic argument, the rubric derivation, and the long-term positioning.
| Project | What it does |
|---|---|
| ai-business-plan-generator | Generate an 8-section consulting-grade business plan PDF, locally |
| skillify (this) | Decompose agent manifests into reusable skills + tools |
| Project Cortex (in development) | Shared agent context + Company Brain |
| Project Watchdog (in development) | Zero-trust security for AI agents |
| Project Aegis (in development) | AI compliance / governance |
| Project Prism (in development) | AI FinOps / cost-quality benchmarking |
All MIT. All built on the same principle: open-source core, managed-service tier.
MIT — see LICENSE and DISCLAIMER.md.