Should it be a Skill or a Tool?
Make it a Skill when:- The capability can be expressed as instructions + shell commands + existing tools
- It wraps an external CLI or API that the agent can call via
terminalorweb_extract - It doesn’t need custom Python integration or API key management baked into the agent
- Examples: arXiv search, git workflows, Docker management, PDF processing, email via CLI tools
- It requires end-to-end integration with API keys, auth flows, or multi-component configuration
- It needs custom processing logic that must execute precisely every time
- It handles binary data, streaming, or real-time events
- Examples: browser automation, TTS, vision analysis
Skill Directory Structure
Bundled skills live inskills/ organized by category. Official optional skills use the same structure in optional-skills/:
SKILL.md Format
Platform-Specific Skills
Skills can restrict themselves to specific operating systems using theplatforms field:
skills_list(), and slash commands on incompatible platforms. If omitted or empty, the skill loads on all platforms (backward compatible).
Conditional Skill Activation
Skills can declare dependencies on specific tools or toolsets. This controls whether the skill appears in the system prompt for a given session.
Use case for
fallback_for_*: Create a skill that serves as a workaround when a primary tool isn’t available. For example, a duckduckgo-search skill with fallback_for_tools: [web_search] only shows when the web search tool (which requires an API key) is not configured.
Use case for requires_*: Create a skill that only makes sense when certain tools are present. For example, a web scraping workflow skill with requires_toolsets: [web] won’t clutter the prompt when web tools are disabled.
Environment Variable Requirements
Skills can declare environment variables they need. When a skill is loaded viaskill_view, its required vars are automatically registered for passthrough into sandboxed execution environments (terminal, execute_code).
name(required) — the environment variable nameprompt(optional) — prompt text when asking the user for the valuehelp(optional) — help text or URL for obtaining the valuerequired_for(optional) — describes which feature needs this variable
config.yaml:
skills/apple/ for examples of macOS-only skills.
Secure Setup on Load
Userequired_environment_variables when a skill needs an API key or token. Missing values do not hide the skill from discovery. Instead, Mibyan prompts for them securely when the skill is loaded in the local CLI.
prerequisites.env_vars remains supported as a backward-compatible alias.
Config Settings (config.yaml)
Skills can declare non-secret settings that are stored inconfig.yaml under the skills.config namespace. Unlike environment variables (which are secrets stored in .env), config settings are for paths, preferences, and other non-sensitive values.
key(required) — dotpath for the setting (e.g.,myplugin.path)description(required) — explains what the setting controlsdefault(optional) — default value if the user doesn’t configure itprompt(optional) — prompt text shown duringmibyan config migrate; falls back todescription
-
Storage: Values are written to
config.yamlunderskills.config.<key>: -
Discovery:
mibyan config migratescans all enabled skills, finds unconfigured settings, and prompts the user. Settings also appear inmibyan config showunder “Skill Settings.” -
Runtime injection: When a skill loads, its config values are resolved and appended to the skill message:
The agent sees the configured values without needing to read
config.yamlitself. -
Manual setup: Users can also set values directly:
Credential File Requirements (OAuth tokens, etc.)
Skills that use OAuth or file-based credentials can declare files that need to be mounted into remote sandboxes. This is for credentials stored as files (not env vars) — typically OAuth token files produced by a setup script.path(required) — file path relative to~/.mibyan/description(optional) — explains what the file is and how it’s created
setup_needed. Existing files are automatically:
- Mounted into Docker containers as read-only bind mounts
- Synced into Modal sandboxes (at creation + before each command, so mid-session OAuth works)
- Available on local backend without any special handling
skills/productivity/google-workspace/SKILL.md for a complete example using both.
Skill Guidelines
No External Dependencies
Prefer stdlib Python, curl, and existing Mibyan tools (web_extract, terminal, read_file). If a dependency is needed, document installation steps in the skill.
Progressive Disclosure
Put the most common workflow first. Edge cases and advanced usage go at the bottom. This keeps token usage low for common tasks.Include Helper Scripts
For XML/JSON parsing or complex logic, include helper scripts inscripts/ — don’t expect the LLM to write parsers inline every time.
Deliver media as documents ([[as_document]])
If your skill produces a high-resolution screenshot, chart, or any image where lossy preview compression would hurt — emit the literal directive [[as_document]] somewhere in the response (commonly the last line). The gateway strips the directive and delivers every extracted media path in that response as a downloadable file attachment instead of an inline image bubble. See Skill output and media delivery for the full semantics.
Referencing bundled scripts from SKILL.md
When a skill is loaded, the activation message exposes the absolute skill directory as[Skill directory: /abs/path] and also substitutes two template tokens anywhere in the SKILL.md body:
So a SKILL.md can tell the agent to run a bundled script directly with:
terminal tool with a ready-to-run command — no path math, no extra skill_view round-trip. Disable substitution globally with skills.template_vars: false in config.yaml.
Inline shell snippets (opt-in)
Skills can also embed inline shell snippets written as!`cmd` in the SKILL.md body. When enabled, each snippet’s stdout is inlined into the message before the agent reads it, so skills can inject dynamic context:
[inline-shell error: ...] marker instead of breaking the whole skill.
Test It
Run the skill and verify the agent follows the instructions correctly:Where Should the Skill Live?
Bundled skills (inskills/) ship with every Mibyan install. They should be broadly useful to most users:
- Document handling, web research, common dev workflows, system administration
- Used regularly by a wide range of people
optional-skills/ — it ships with the repo, is discoverable via mibyan skills browse (labeled “official”), and installs with built-in trust.
If your skill is specialized, community-contributed, or niche, it’s better suited for a Skills Hub — upload it to a registry and share it via mibyan skills install.
Blueprints: skills that are also automations
A blueprint is an ordinary skill that additionally declares a schedule in its frontmatter. Add ametadata.mibyan.blueprint block and the skill becomes a shareable, runnable automation:
mibyan skills publish for sharing. Nothing new to learn.
Installing a blueprint. When you install a skill that carries a blueprint: block, Mibyan registers it as a suggested cron job rather than scheduling it. Scheduling is opt-in — installing never silently creates a recurring job. You review and accept it via /suggestions:
mibyan cron create --skill <name> ...) can be exported back to a SKILL.md and published like any other skill, so an automation you tuned for yourself becomes a one-command install for someone else.
The blueprint layer adds no new object type, store, or transport — the blueprint is a skill, the schedule is a cron job, and sharing is the existing publish/tap/index path.
Suggested Cron Jobs
Mibyan can propose automations and let you accept them with one tap, instead of making you assemble cron jobs by hand. Every proposal flows through one surface — the/suggestions command — regardless of where it came from:
cron.jobs.create_job the cronjob_manage tool uses — there is no second job engine. Suggestions never auto-create jobs; acceptance is always explicit. Dismissed suggestions latch by a stable key so the same proposal is never re-offered. The pending list is capped so it never becomes a nag wall.
The important-mail monitor catalog entry is the poll→classify→surface pattern: it scores inbox items with a cheap classifier model (auxiliary.monitor in config.yaml) and delivers only the ones above an urgency threshold, staying silent otherwise.
Publishing Skills
To the Skills Hub
To a Custom Repository
Add your repo as a tap:Security Scanning
All hub-installed skills go through a security scanner that checks for:- Data exfiltration patterns
- Prompt injection attempts
- Destructive commands
- Shell injection
builtin— ships with Mibyan (always trusted)official— fromoptional-skills/in the repo (built-in trust, no third-party warning)trusted— from openai/skills, anthropics/skills, huggingface/skillscommunity— non-dangerous findings can be overridden with--force;dangerousverdicts remain blocked
- direct GitHub identifiers (for example
openai/skills/k8s) skills.shidentifiers (for exampleskills-sh/vercel-labs/json-render/json-render-react)- well-known endpoints served from
/.well-known/skills/index.json

