SkillForge MCP
SkillForge MCP is a universal server that makes Markdown-defined skills (prompts, templates, scripts) available to any MCP-capable LLM tool, with lazy loading, hot-reloading, cross-format support, and security auditing.
List Skills (skills__list): Enumerate available skills with optional filtering by folder, search text, or source dialect (claude, codex, persona, custom).
Get a Skill (skills__get): Retrieve the full body and metadata of a specific named skill.
Invoke a Skill (skills__invoke): Execute a named skill through its assigned strategy (prompt, script, hybrid, or composite), wrapped in a decorator chain (Logging → Timeout → Cache). Optionally pass an input string. Composite skills include cycle detection.
Configure SkillForge (skills__configure): Manage persisted server configuration:
add_folder/remove_folder/list_folders— manage skill folders to scanset_blacklist/get_blacklist— manage excluded skill patterns (exact name, name-glob, or path-glob)reset— restore defaults
Reload Skills (skills__reload): Force a full rescan of all configured folders, returning a diff (added, removed, loaded, errors). Optionally validate a specific folder name.
Additional capabilities include:
Automated security auditing: Scans skills for unsafe patterns (e.g.,
shell=True,eval()) during loading, with a configurable allowlist.Version policy enforcement: Supports per-bundle version pins or latest-version resolution.
Script execution sandbox: Runs user-defined scripts in a best-effort sandboxed subprocess (with limitations on network egress and filesystem access).
Cross-tool compatibility: Auto-detects skill dialects from frontmatter.
Provides a universal skills MCP server that loads Markdown skills from folders, offering tools to list, get, invoke, configure, and reload skills for use with OpenAI Codex CLI.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@SkillForge MCPlist all available skills"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
SkillForge MCP
Universal Skills MCP server — load Markdown skills from arbitrary folders, lazy-by-design, cross-tool.
v1.15.0 — 5 MCP tools, one-command install across Claude Code / Codex CLI / Cursor / Hermes Agent, a server that exits when its client goes away (transport close / signals / dead parent), verified host entries that prefer a command over a path, terminal tools + folders + formats + skills + security + version-policy + config subcommands, partial single-folder reload, environment-first settings resolution with provenance, blacklist name-glob and path-glob patterns, config-driven skill format registry with directory-name derivation, context-aware security auto-audit (auditTarget) with an auditExceptions allowlist, per-bundle versionPolicy (pin / freeze) with highest-semver collision resolution, leveled stderr logger with --verbose / --quiet, candidate-aware skip lines, persistent on-disk registry index for fast warm starts, batch skills get, config live-reload, forward-compatible config schemas, global/project install scopes, Claude Code plugin packaging, 1146 tests, 10 sample skills, modular architecture (all source files ≤ 400 lines).
What it is
A standalone Model Context Protocol server that exposes Markdown-defined skills (prompts, templates, scripts) to any MCP-capable LLM tool — Claude Code, OpenAI Codex CLI, Cursor, Hermes Agent, or custom clients via @modelcontextprotocol/sdk.
One skill folder. One config file. Any tool can ask for any skill on demand.
Related MCP server: Friday MCP Server
Why it exists
Pain | Today | With SkillForge |
Auto-loading 122+ skills per session burns ~4880 tokens on init | Every Claude Code session pays the toll, most skills are never used | Lazy MCP discovery — pay only for |
Hardcoded paths ( | One folder, one tool, hardcoded | Multi-folder, per-project, priority-ordered, env override |
No cross-tool format | Each tool ships its own skill layout | Universal frontmatter parser auto-detects Claude / Codex / persona / custom dialects |
Skill execution = "just inline body in prompt" | No scripts, no caching, no timeouts, no composition | Strategy pattern (prompt / script / hybrid) + decorator chain (logging → timeout → cache) + composite skills with cycle detection |
One-command install
npm install -g @lyupro/skillforge-mcp
skillforge install --allAuto-detects Claude Code, Codex CLI, Cursor, and Hermes Agent on your machine and wires SkillForge into each. Supports --dry-run, --uninstall, and --force. Dry runs show only the skillforge entry by default; --show-full-config explicitly dumps complete host configs and may expose unrelated secrets.
Install globally first, then run the installer from that install. The entry it writes into each host config depends on where the installer itself lives:
How you run the installer | What lands in the host config | Cost |
Global install (above) |
| One process per session; survives package upgrades |
|
| An |
A one-shot npx run cannot write a path to itself — its files live in a temp directory that will be gone tomorrow — so it writes the npx form. That form works, but each session then costs two processes instead of one. The global route is the recommended one.
The short-command form is only written after the installer resolves skillforge-mcp on PATH (including Windows PATHEXT shims), probes that concrete path, and gets back this exact package version. Windows .cmd/.bat shims use a shell for this trusted resolved path; POSIX binaries do not. Anything else falls back to an absolute path to dist/cli/dispatcher.js and prints why.
By default the installer edits each host's global config. Pass --scope project to wire SkillForge into a repo-local config rooted at the current directory instead — .mcp.json (Claude Code), .codex/config.toml (Codex CLI), .cursor/mcp.json (Cursor), .hermes/config.yaml (Hermes Agent):
npx @lyupro/skillforge-mcp install --all --scope projectFull reference: docs/INSTALL_CLI.md.
Quick Start
Option 1 — Claude Code plugin (recommended)
SkillForge ships a Claude Code plugin manifest, so it installs through the native /plugins UI with a rich plugin card:
/plugin marketplace add lyupro/skillforge-mcp
/plugin install skillforgeOr install it directly:
claude plugin install skillforge@lyupro/skillforge-mcpRestart your Claude Code session. The five tools (skills__list, skills__get, skills__invoke, skills__configure, skills__reload) appear in the tool list.
Option 2 — npm
npm install -g @lyupro/skillforge-mcp
claude mcp add skillforge -- skillforge-mcp serveWorks for any MCP host that can spawn a stdio command (Claude Code, Codex CLI, Cursor). Or let the install CLI wire every detected host at once:
skillforge install --allnpx -y @lyupro/skillforge-mcp still works and needs nothing installed, which makes it right for a one-off trial — but it adds a wrapper process to every session. Prefer the global install for a setup you intend to keep.
Option 3 — local build
See Contributing.
After install, point SkillForge at your skill folder:
> use skills__configure with action="add_folder", folder="/abs/path/to/your/skills"
> use skills__listSee docs/INSTALL.md for Codex CLI, Cursor, Hermes Agent, and manual MCP-client setups.
Verify Installation
After the install step, run these three checks from inside any wired LLM tool session:
skills__list— returns an array of skill summaries (possibly empty if no skills folders are configured yet).skills__configurewithaction: "list_folders"— shows the resolved folder list with priorities andenabledflags.skills__reload— forces a fresh scan, returns{loaded, added, removed, errors}diff.
If any call fails with [skillforge] fatal: on stderr, the most likely cause is a corrupt config file or a missing folder path — the error message points at the offending file. Delete or fix ~/.lyupro/.skillforge/config.json and retry.
CLI commands
The skillforge / skillforge-mcp binary is a dispatcher — the first positional argument selects a subcommand. Run skillforge --help for the full list.
Command | Purpose |
| Run the stdio MCP server. Default when no command is given. |
| Wire SkillForge into Claude Code / Codex CLI / Cursor / Hermes Agent. Flags: |
| Reverse a previous install. Accepts the same |
| Print the 5 MCP tools the server exposes (name, description, parameters, example). Pass |
| Manage skill folders from the terminal — |
| Show which setting is in force and where it came from (environment > config file > built-in default), plus the config file path. Pass |
| Manage the skill format registry — |
| Inspect the skill registry from the terminal — |
| Manage security knobs from the terminal — |
| Manage per-bundle version pins from the terminal — |
| Update the CLI to the latest published npm version. Flags: |
| Print the package version. |
| Print combined usage. |
Inspect the MCP tools — skillforge tools
skillforge tools # human-readable reference
skillforge tools --json # machine-readable: { "tools": [ ... ] }Prints every MCP tool the server exposes (skills__list, skills__get, skills__invoke, skills__configure, skills__reload) with its description, parameters, and an example invocation — handy for confirming the surface without starting a session.
Inspect effective settings — skillforge config
skillforge config # human-readable values and provenance
skillforge config --json # machine-readable reportShows the effective value and source (env, config, or default) for every declared setting (metadataTtlMs, contentTtlMs, folders, hermesHome, and logLevel). The OVERRIDDEN column names the config value the environment displaced, or - when the sources agree. Folder paths are listed under the table rather than crammed into a cell. For example:
Config file: /home/me/.lyupro/.skillforge/config.json
SETTING VALUE SOURCE OVERRIDDEN
metadataTtlMs 0 env config value 300000
contentTtlMs 0 env config value 300000
folders 2 folder(s) config -
hermesHome /home/me/.hermes default -
logLevel info config -
folders:
/home/me/skills
/home/me/team-skillsInvalid setting values are reported on stderr and return exit code 1; unknown command arguments return exit code 2.
Manage skill folders from the terminal — skillforge folders
Folder management is also available from the shell, not just via the skills__configure MCP tool inside an LLM session:
skillforge folders list [--json] [--tag <name>] # print registered folders
skillforge folders add <path> [flags] # register a folder
skillforge folders remove <path|alias> # remove a folder entry
skillforge folders alias <path|alias> <name> # set or change a folder alias
skillforge folders rename <old-alias|path> <new-alias> # rename an existing alias
skillforge folders enable <path|alias> # re-activate a disabled folder
skillforge folders disable <path|alias> # deactivate a folder (kept in config)
skillforge folders reset --yes # reset folders to the default (empty) listadd flags:
--priority <n>— folder priority (default100; higher wins on name collisions).--alias <name>— a handle to address the folder without typing its full path (used byremove/enable/disable/rename). Lowercase letters/digits in segments joined by a single-,_, or/(e.g.lyupro/llm-skills); uppercase is auto-lowercased; doubled or leading/trailing separators are rejected. Unique across folders; matched case-insensitively.--tags <a,b,c>— comma-separated tags. Filter on them viafolders list --tag <name>or theskills__listfolderTagargument.--disabled— register the folder disabled.
skillforge folders add ~/.lyupro/skills --priority 50 --alias core --tags work,review
skillforge folders disable core # address it by alias, not by path
skillforge folders list --tag work # only folders tagged "work"alias is one unique handle per folder (addressing); tags are many shared labels (grouping and filtering) — see docs/CONFIGURATION.md for the full contrast.
reset requires --yes to apply — without it, the command prints what would change and makes no edits. All folders actions read and write the same persisted config (~/.lyupro/.skillforge/config.json) as the skills__configure MCP tool.
If you register a folder that already lives inside another tool's native skill store (a Claude Code plugin cache or a Gemini CLI extension), folders add prints a hint to disable the duplicate source so the same skills don't load twice. SkillForge only prints the hint — it never edits another tool's config.
Manage security settings from the terminal — skillforge security
All security knobs that previously required hand-editing config.json or the skills__configure MCP tool are now available from the shell:
# Audit exceptions — skills whose example code legitimately contains flagged patterns
skillforge security audit-exceptions list [--json]
skillforge security audit-exceptions add <skill-name>
skillforge security audit-exceptions remove <skill-name>
skillforge security audit-exceptions clear --yes
# Audit target — what to scan: fenced code blocks only (default) or the whole body
skillforge security audit-target # print current value
skillforge security audit-target scripts # scan only executable fenced blocks (default)
skillforge security audit-target all # scan the entire skill body
# Audit patterns — read-only view of the code-seeded regex patterns
skillforge security audit-patterns list [--json]
# Manual blacklist — exclude skills by name or glob pattern
skillforge security blacklist list [--json] # shows KIND for each entry
skillforge security blacklist add <pattern>
skillforge security blacklist remove <pattern>
skillforge security blacklist clear --yesBlacklist pattern kinds — entries are auto-classified by syntax:
Kind | Syntax | Example | Matches |
| plain name, no wildcards or |
| skill named exactly |
| contains |
| any skill whose name matches |
| contains |
| skill whose source path (relative to its folder root) matches the glob |
skillforge security blacklist add "wiki-*" # name-glob: all wiki-* skills
skillforge security blacklist add "**/agenthub/**" # path-glob: skills under any agenthub/ subtree
skillforge security blacklist add dangerous-skill # exact match (unchanged behaviour)
skillforge security blacklist list # shows KIND column for each entrylist accepts --json. add is idempotent — adding an existing pattern is a no-op. clear requires --yes. A reindex hint is printed after any mutation. All commands accept the global --verbose / --quiet flags.
Manage version pins from the terminal — skillforge version-policy
Per-bundle version policy (previously only settable via config.json hand-edits) is now a first-class CLI group:
skillforge version-policy list [--json] # show current policy map with kinds
skillforge version-policy set <bundle> 2.4.4 # pin bundle to an exact version
skillforge version-policy set <bundle> latest # restore highest-semver resolution
skillforge version-policy remove <bundle> # remove a single pin (reverts to latest)
skillforge version-policy clear --yes # wipe the entire policy mapWhen one recursive root holds two installed versions of a bundle, the highest semver wins by default (latest). Pin a bundle to freeze it against newer installs:
skillforge version-policy set apple-hig 1.3.2 # always use 1.3.2, ignore newer installs
skillforge version-policy set apple-hig latest # unpin, highest installed wins again
skillforge version-policy list # verify the current maplist accepts --json. clear requires --yes. A reindex hint is printed after any mutation.
Update the CLI — skillforge update
Check for and apply a newer published version without retyping the install command:
skillforge update # check, then install if a newer version exists
skillforge update --check # only report: "update available: X → Y" or "up to date"
skillforge update --dry-run # print the install command without running it
skillforge update --json # machine-readable: { current, latest, updateAvailable }
skillforge update --min-release-age 0 # install a just-published latest despite an npm cooldown
skillforge upgrade # alias of updateupdate reads its own package name and version from package.json, queries the npm registry for the latest published version, and compares the two. When a newer version exists, the default (no flags) applies it with npm install -g <name>@latest. --check (and --json) double as "what is the latest version on npm?" — they print it without installing.
Before running npm, update runs two pre-flight checks and surfaces problems rather than papering over them — it never escalates privileges or weakens a policy on your behalf:
Permissions (sudo). If the global prefix is root-owned (common on Linux:
/usr/lib/node_modules), the install would fail withEACCES.updatedetects the non-writable prefix up front, prints the exactsudo npm install -g <name>@latest, and exits — it never runssudofor you. To avoidsudofor good, use a user-owned prefix or a version manager:npm config set prefix ~/.npm-global # then add ~/.npm-global/bin to PATH # or use nvm / fnm / volta — global installs land in your home dir, no sudoCooldown (
min-release-age). npm ≥ 11.10.0 can enforce a supply-chain cooldown (min-release-age=<days>in.npmrc/npm config set) that refuses versions younger than N days. If your configured cooldown would block the latest,updatereports it and points to the opt-in — it never bypasses the cooldown silently:skillforge update --min-release-age 0 # opt in: install the fresh latest now--min-release-age <n>is forwarded straight to npm. (npm rejects combining it with--before, soupdatedoes not expose--before.)Fail-loud fallback. If an install still fails (e.g. an
EACCESthe pre-flight could not predict), the exact command is printed with asudohint and the process exits non-zero. Nothing is retried silently.--registry <url>overrides the registry base (defaulthttps://registry.npmjs.org) for private mirrors.
MCP tool surface
Tool | Purpose |
| Enumerate available skills (metadata only). Filters: |
| Fetch full SKILL.md body + metadata for one skill. |
| Execute a skill via its assigned strategy, wrapped in the decorator chain (Logging → Timeout → Cache). Composite skills ( |
| Manage configured folders + manual blacklist. Actions: |
| Rescan all configured folders, or pass optional |
Configure which folders to scan
Folder settings follow environment > config file > built-in default. When set, SKILLFORGE_FOLDERS replaces the persisted folder list in full:
# Windows (PowerShell)
$env:SKILLFORGE_FOLDERS = "C:\path\to\skills;C:\other\folder"
# macOS / Linux
export SKILLFORGE_FOLDERS=/home/me/skills:/home/me/team-skillsPath separator is platform-native (; on Windows, : elsewhere). Without the environment variable, use skills__configure to manage the persisted list; the built-in default applies only when neither source supplies one. If SKILLFORGE_FOLDERS is set, folder changes are still written to the config file but cannot affect the active list until the variable is unset. Run skillforge config to see the effective values, their sources, any overridden config value, and the config file path. See docs/CONFIGURATION.md.
For shared content across multiple tools, the convention is ~/.lyupro/skills/ (Lyu Pro brand shared content folder).
Persisted config + hot reload
Config file:
~/.lyupro/.skillforge/config.json(resolved cross-platform viaos.homedir()). Schema-validated via Zod; missing → schema defaults; corrupt JSON / schema → loud error with the file path.Merge order for folders:
SKILLFORGE_FOLDERSenv (when set) > persistedfolders[]withenabled: truesorted byprioritydesc > built-in default.Auto-audit:
security.autoAudit: true(default) scans skills on load againstsecurity.auditPatterns(default:shell=True,eval(,exec(,base64.b64decode).security.auditTarget: "scripts"audits fenced executable code and treats matches inside Python strings/comments or quoted search patterns passed to shell scanners as informational; malformed or ambiguous syntax fails closed.auditTarget: "all"preserves strict raw whole-body matching. Blocking matches are excluded and logged to stderr; informational notes appear only at debug level.security.auditExceptions: string[]remains a case-sensitive audit allowlist, and the manual blacklist always applies.Manual blacklist:
blacklist: string[]excludes skills by pattern (case-sensitive). Three kinds are auto-classified by syntax: a plain name is an exact match; an entry with*or?but no/is a name-glob matched against the skill name (e.g.wiki-*,*-draft); any entry containing/is a path-glob matched against the skill source path relative to its registered root folder (e.g.**/agenthub/**,internal/*/draft-*). Existing plain-name entries are unchanged. Short-circuits before the audit step.Version policy:
versionPolicy: { "<bundle>": "latest" | "<major.minor.patch>" }. When one recursive root holds two installed versions of a bundle, the highest semver wins by default (latest). Pin a bundle to an exact version, or pin it to its current version to freeze it against newer installs.Hot reload: chokidar watches all configured folders for
.mdadd/change/unlink events. Debounced batches invalidate the metadata cache so the nextskills__listre-scans. Folders mutated viaskills__configureauto-re-watch via the same diff path.
Server lifecycle
The server exits on its own when its client goes away. No cleanup script, no manual kill.
Transport closed → exit. MCP hosts shut a server down by closing its stdin. That, a
transport.onclose, SIGTERM, or SIGINT all route to the same bounded shutdown: stop the watchers, thenprocess.exit(0). Measured on Windows 11: 10 ms from stdin close to exit.Grace ceiling. Watcher teardown gets
lifecycle.shutdownGraceMs(default 2000) and no more. A watcher that hangs cannot keep the process alive — the ceiling timer isunref'd so it never holds the loop open itself.Parent died → exit. A supervisor tick (default every 30 s,
unref'd) checks whether the process that spawned this server still exists. This covers hosts killed hard enough that stdin never closes. It errs only toward staying alive: a reused PID reads as "parent alive", so it can miss a death but never kills a live session.Idle timeout — opt-in, off by default.
lifecycle.idleTimeoutMs: 0disables it. Set it above zero only if you want a server with no tool calls for that long to quit; a long session with no requests is normal.
Keys live under lifecycle in the config — see docs/CONFIGURATION.md. A regression guard (tests/integration/lifecycle-exit.test.ts) spawns the built server, closes the transport, and fails if the process is still alive.
Skill format
Any .md file with a YAML frontmatter block defining at least name::
---
name: apple-hig-check
description: Audit code against Apple Human Interface Guidelines.
tags: [ios, design]
---
You are an Apple HIG expert. When asked to review code...Optional camelCase fields validated by SkillMetadata: strategy (prompt / script / hybrid), allowScripts, allowNetwork, skills (composite — string[] of nested skill names invoked sequentially), timeoutMs, cacheable, cacheTtlMs, scripts (string[], single-entry — main.py / entry.sh / app.mjs). Anything else passes through to extra.
FormatDetector recognizes Claude (SKILL.md), Codex (AGENTS.md), persona-style (frontmatter has persona:), and generic-custom dialects automatically.
Full spec: docs/SKILL_FORMAT.md.
Architecture (one-liner)
MCP request → Tool handler → Registry lookup → DecoratorChain.wrap(strategy).invoke(skill, ctx) → Logging → Timeout → Cache → Strategy (Prompt / Script / Hybrid / Composite-resolver) → InvocationResult
Patterns used: Registry, Strategy, Factory, Adapter, Decorator (chain composition), Composite (sequential nested invocation), Observer (chokidar), Singleton.
Full design: docs/ARCHITECTURE.md.
Limitations
Read this before enabling scripts.
ScriptStrategy runs user-provided scripts in a SandboxRunner subprocess. The sandbox is best-effort env/cwd isolation, not an OS-grade jail. Node child_process cannot guarantee network isolation, filesystem confinement outside cwd, or CPU/memory limits — those require Docker/firecracker/gVisor (future enhancement).
Property | Enforced? | How |
| Yes | Subprocess receives only |
Temp | Yes | Fresh |
Abort signal | Yes |
|
stdout/stderr cap | Yes | Tail-truncate at 1 MB each. |
Network egress | No | Subprocess inherits host network stack. |
Filesystem reads outside | No | Subprocess has full OS user permissions. |
Filesystem writes outside | No | Same. |
CPU / memory limits | No | Only the timeout decorator wall-clock-kills runaways. |
Defence in depth layered on top:
Global gate —
config.security.allowScripts: falseby default.Per-skill opt-in —
metadata.allowScripts: truerequired per skill.Audit pattern scanner —
PatternScannerdetectsshell=True,eval(,exec(, base64 decode patterns in skill bodies before load.Manual blacklist — explicit skill names in
config.security.blacklist.
For production use with untrusted skill authors, run SkillForge inside Docker or another OS-level sandbox. Full threat model: docs/SECURITY.md.
Updating
Pick the block that matches how you installed.
# Installed as a Claude Code plugin
/plugin update skillforge
# Installed via the install CLI (global npm package)
npm install -g @lyupro/skillforge-mcp@latest
# host wiring already points at the global bin — restart the host session
# Installed as a bare MCP server (npx)
claude mcp remove skillforge
claude mcp add skillforge -- npx -y @lyupro/skillforge-mcp@latest
# Local-build install (git clone)
cd skillforge-mcp
git pull
pnpm install
pnpm buildThe wiring in Claude Code / Codex / Cursor / Hermes points at the same binary path — restarting the host session picks up the new build. Your persisted config at ~/.lyupro/.skillforge/config.json survives the upgrade.
Documentation
Doc | Audience |
First-time setup for Claude Code, Codex CLI, Cursor, manual MCP clients | |
Skill authors — full frontmatter spec, dialect detection, examples | |
Power users — folder management, blacklist, sandbox config, env overrides | |
Contributors — design patterns, module responsibilities, extension points | |
Security-conscious operators — threat model, audit checklist, sandbox limits, disclosure policy | |
Per-tool wiring guides (claude-code / codex / cursor / hermes / custom-llm-tools) | |
10 ready-to-use sample skills (prompt / script / hybrid examples) | |
Sample |
Contributing
Local build (for development or pre-publish testing):
git clone https://github.com/lyupro/skillforge-mcp.git
cd skillforge-mcp
pnpm install
pnpm build
# Wire into Claude Code using the absolute path
claude mcp add skillforge -- node /absolute/path/to/skillforge-mcp/dist/cli/dispatcher.js serveDevelopment commands:
pnpm install
pnpm dev # tsx watch src/cli/dispatcher.ts serve
pnpm test # vitest run
pnpm test:coverage # coverage report
pnpm lint # tsc --noEmit
pnpm check:size # file-size gate (≤400 lines per file)
pnpm build # emit dist/
pnpm smoke # post-build subprocess smoke testLicense
MIT — see LICENSE.
Author
lyupro — independent dev. Part of the Lyu Pro tooling portfolio.
Available Tools
5 toolsskills__configureConfigure SkillForgeB
Manage configured skill folders, blacklist, and reset to defaults. Mutates persisted config under defaultConfigPath().
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | ||
| folder | No | ||
| blacklist | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly states that the tool mutates persisted config under defaultConfigPath(), which is a key behavioral disclosure. However, it does not elaborate on side effects, reversibility, or error conditions, partially informing the agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise with two sentences that efficiently convey the core purpose and key behavioral trait. No unnecessary words or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, no annotations, and 0% schema parameter coverage, the description is too brief. It fails to explain the action enum values or how parameters interact, leaving the agent with insufficient context to use the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage and no elaboration in the description, the parameter semantics are underdefined. The description mentions 'folders' and 'blacklist' but does not map them to schema parameters or explain their usage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it manages configured skill folders, blacklist, and reset to defaults, which distinguishes it from sibling tools like skills__get or skills__invoke. It uses specific verbs and resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, nor does it explain the context for different actions. It merely states what it does without usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
skills__getGet skillB
Retrieve the full content (body + metadata) of a named skill.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description indicates a read operation (retrieve) but lacks explicit statements about safety, permissions, or side effects. Since no annotations are provided, the description carries the burden; however, for a simple retrieval, the minimal description is adequate but not thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, clear sentence that front-loads the key information. It is efficient and easy to parse, though slightly more detail could be added without harming conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no output schema), the description is minimally complete. It explains the return value (body + metadata) but omits context like how to obtain skill names or any relationship to sibling tools, which limits completeness for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no descriptions, and the tool description adds no meaning beyond stating that the parameter 'name' refers to a skill's name. With 0% schema coverage, the description should compensate by explaining what constitutes a valid name (e.g., format, where to obtain it), but it does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the verb 'Retrieve' and specifies the resource as 'full content (body + metadata) of a named skill.' This clearly distinguishes it from sibling tools like skills__list (which likely lists names only) and skills__configure/invoke/reload (which perform other actions).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives. For example, it does not explain that skills__get is for full details while skills__list is for summaries, nor does it mention any prerequisites like needing the skill name from prior listing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
skills__invokeInvoke skillC
Invoke a skill by name, forwarding optional input to the strategy.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| input | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries full responsibility for behavioral disclosure. It only mentions invocation and input forwarding, omitting side effects, error behavior, authorization needs, or whether it is read-only/destructive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence with no wasted words. It is concise and front-loaded, but additional structure (e.g., separating purpose and parameter notes) could improve clarity without harming conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations, output schema, and parameter context, the description is insufficient. It does not specify return values, error conditions, or when to prefer this over sibling tools, leaving the agent underinformed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description should compensate but only glosses over parameters (name, input). It does not explain what constitutes a valid name, the expected format of input, or any constraints beyond the schema's type/default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (invoke), the resource (skill), and the mechanism (by name, forwarding input). It distinguishes from siblings like `skills__list` or `skills__configure` which are different operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus its siblings, nor any conditions or prerequisites. The description implicitly suggests it is for executing a skill but lacks explicit usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
skills__listList skillsC
List available skills, optionally filtered by folder / search / source.
| Name | Required | Description | Default |
|---|---|---|---|
| folder | No | ||
| search | No | ||
| source | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so description must cover behavioral traits. It doesn't mention whether the operation is read-only, has side effects, requires authentication, or returns paginated results. 'List available skills' implies safe reading but is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, no wasted words. Clearly communicates the core function. Could be more informative without losing conciseness, but it is appropriately front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 3 optional parameters, no annotations, no output schema, and nearby siblings, the description is incomplete. It does not explain what 'available' means, the output format, or how filters interact. Leaves agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so description must compensate. It lists parameters (folder, search, source) but provides no details on their format, default behavior, or how they combine. The phrase 'optionally filtered' adds minimal value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it lists available skills with optional filtering, using specific verbs and resource. It distinguishes from siblings like skills__configure, skills__get, skills__invoke, skills__reload by focusing on listing rather than configuring, retrieving a single skill, invoking, or reloading.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool versus alternatives (e.g., when to use skills__get instead). Lacks context about prerequisites or scenarios where filtering would be appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
skills__reloadReload skillsA
Force a full rescan of all configured folders, returning the diff (added/removed) and any per-file errors. Pass an optional folder name to validate it is currently configured (the rescan itself remains global).
| Name | Required | Description | Default |
|---|---|---|---|
| folder | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the rescan is global and the folder parameter is for validation only, but does not mention potential side effects, auth needs, or performance impact. Since annotations are absent, more detail would be beneficial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no wasted words. The action and output are front-loaded. Efficient structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, it describes the return value (diff and errors). The single optional parameter is explained. Could mention synchronous/asynchronous nature, but overall fairly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has no description for the parameter; the description adds meaning by explaining the folder parameter is for validation and the rescan remains global. This compensates for the 0% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action (force a full rescan) and what it returns (diff and per-file errors). It distinguishes from siblings like skills__configure and skills__list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs alternatives like skills__get or skills__invoke. The description does not mention prerequisites or context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
5 tool updates
v1.0.0- First observed
skills__configure - First observed
skills__get - First observed
skills__invoke - First observed
skills__list - First observed
skills__reload
TDQS
Each tool serves a distinct purpose: configure manages settings, get retrieves skill content, invoke executes a skill, lists skills, and reload rescans folders. No overlap or ambiguity.
All tools use a consistent 'skills__verb' pattern with clear verbs (configure, get, invoke, list, reload) indicating actions on the skill resource.
5 tools is reasonable for a skill management server, covering core operations. Slightly low but appropriate for the focused domain.
Covers listing, reading, invoking, configuring settings, and rescanning. Missing explicit create/update/delete for individual skill content, but the configure and reload tools handle folder-level changes.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Personal assistant MCP server with search, execute, packages, jobs, secrets, and integrations.
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
MCP server for progressive tool usage at any scale (see https://klavis.ai)
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Related MCP Servers
- AlicenseNot gradedqualityNot gradedmaintenanceAn MCP server that transforms Claude-style skills and resources into callable tools for any MCP-compatible agent or client. It automatically discovers, exposes, and executes scripts from skills organized in local directories or packaged archives.-
- AlicenseBqualityDmaintenanceA standalone MCP server that enables research (web search, URL fetch, news), workspace management (file operations, command execution), and self-extension via markdown-based skills.21MIT
- AlicenseAqualityAmaintenanceA universal MCP server that enables any LLM or AI agent to access expert skills from your local filesystem.359838MIT
- AlicenseNot gradedqualityBmaintenanceA self-hostable MCP server that turns a folder of skills into callable tools via MCP and REST APIs.2MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/lyupro/skillforge-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server