Skip to main content
Glama

skill-mcp

An MCP server that serves a directory of Agent Skills. Point it at skills; it lists them, hands out their instructions and their bundled files, and runs only the scripts a skill declares.

It is a generic adapter, not a curated set: the skills are content it reads, and the same build serves whatever it is pointed at.

npx @chrischall/skill-mcp                       # serves the example skill bundled here
SKILLS_DIR=~/my-skills npx @chrischall/skill-mcp

The npm package is @chrischall/skill-mcp (unscoped skill-mcp is taken by someone else on npm). Everything else — the repo, the binary, the registry identity io.github.chrischall/skill-mcp — is unscoped.

What a skill is

A directory holding SKILL.md: YAML frontmatter (name, description, and optionally the mcp-host: block below) followed by instructions, plus whatever files those instructions refer to. Three layouts are found under each root:

<root>/SKILL.md              # the root IS one skill
<root>/<name>/SKILL.md       # a directory of skills
<root>/skills/<name>/SKILL.md

A skill is served under its DIRECTORY name, never under the name in its own frontmatter (a frontmatter name that disagrees is reported and otherwise ignored; where the root itself is the skill, the root directory names it). That is a security rule, not a tidiness one: the owner's grant names a skill, so a bundle that could choose its own name could claim its neighbour's and be handed the neighbour's granted script and granted variables. For the same reason, two directories that really do contribute one name — only possible across two roots — have both refused and reported, rather than one of them winning by scan order.

Related MCP server: MCP Skills Server

The tools

tool

arguments

returns

skill_list

every skill found: name, description, when to use it, file count, whether it declares runnable scripts and exactly which; plus problems, so an empty list is never a mystery

skill_load

name

the SKILL.md body verbatim, plus a manifest of the bundle's files. Referenced files are not inlined — that is what skill_file is for

skill_file

name, path

one file from that skill's directory: text, or base64 with its media type. At most 1 MiB, truncated: true rather than a silent cut

skill_run

name, script, args[], confirm

{exitCode, stdout, stderr, truncated, durationMs}

skill_file takes one path. The design of record specifies a paths[] batch (8 paths per call, 1 MiB per entry, 4 MiB per call, one bad path failing only its own slot); shipping the singular form is a deliberate deferral, not an oversight, and those three bounds are what a later batching change has to honour. Read the caps as bounds on this server's own heap: they cap the allocation, not only the answer, because a hosted child has a hard 256 MiB data limit and a bundle may be larger than that.

Each skill is also registered as an MCP prompt (its body is the message) and each bundled file as a resource (skill://<name>/<path>), because a client that supports those surfaces presents a skill better than a tool call does. It is a second door, never the only one: when this server runs on mcp-host and a registration narrows enabledTools, prompts/list and resources/list come back empty and the handshake stops advertising those capabilities — so the tools carry the whole experience.

Discovery reports, it never goes quiet

Anything that keeps a directory from being served comes back in skill_list's problems, with the path and the reason: no SKILL.md, frontmatter that will not parse, a name two directories both claim (both refused), a declared script that is not in the bundle, a symlink leading out of the root or out of a skill, a filename the read tools could not address. One bad skill costs itself and never the listing, and there is no third outcome where something is dropped in silence — a symlinked skill directory is served when it stays inside the root (so skills/foo -> ../shared/foo works) and reported when it does not.

The execution fence

skill_run executes third-party code. Every rule below narrows which code runs and what it is handed; each has its own test.

  • Only a script the skill DECLARES. Not "any file under scripts/", not "anything executable". An undeclared path is refused, saying it must be declared and listing the ones that are.

  • Only inside that skill's own directory. The path is checked as a string first (plain segments; no leading /, no . or .., no backslash, no percent escape, no NUL) and then again after resolution: the real path, with symlinks followed, must still be inside the skill's real directory, and it must be a regular file. Both checks, because a string check alone misses a symlink planted inside the bundle and a resolved check alone accepts shapes that should never have been joined. The same discipline governs skill_file: a read out of a skill directory is another skill's bundle at best.

  • An argv array, never a shell string. spawn with shell: false, no interpolation, no sh -c. Arguments are passed through verbatim.

  • An interpreter from a closed set, named by the declaration — never inferred from the extension and never taken from the file's own shebang, since a file that can choose its own interpreter has already chosen its own program. v1 runs node and nothing else (see What v1 cannot run).

  • Bounded, and the call always returns. A wall-clock timeout (60 s default, per-script override, hard 300 s ceiling), 1 MiB captured per stream with truncated: true rather than a silent cut, and one skill_run at a time. On timeout the process group is signalled, which reaches the script and any child that stayed in its group. It does not reach a grandchild that detached into a group of its own, and such a grandchild also holds the stdio pipes open — so the run settles on the process exiting plus a short drain, under a hard deadline, rather than on the pipes closing. That is what guarantees the tool call returns within its budget and frees the one-at-a-time lock; it is not a guarantee that a deliberately detached grandchild is dead. Bounding that is the tier's job (an unprivileged uid, prlimit NPROC, and a machine that stops), not this adapter's.

  • An env allowlist. A script gets PATH, HOME, LANG, TZ, TMPDIR, MCP_DATA_DIR when the host set one, and exactly the variables that script asked for and the owner granted — never this server's own environment. The fixed half mirrors mcp-host's INSTALL_ALLOWLIST (packages/runner-node/src/spawn-env.ts), for the reason that file gives: a host constant a hosted declaration cannot widen by one name.

  • A non-zero exit is a normal, reported outcome — exit code, stdout and stderr all come back. It is never an exception that loses the output.

  • skill_run is confirm-gated. Without confirm: true it starts no process and returns a dry-run preview of exactly what would run: the interpreter, the argv, the working directory, the timeout, and the names of the variables the script would be handed.

Why the confirm gate is blanket

The fleet convention gates mutating tools. Whether a given script mutates anything is something this server cannot know: it never reads a script, and it deliberately does not analyse one — a machine-generated verdict about somebody else's code gets trusted in a way an author's declaration does not. Unknown effects are therefore treated as mutating.

The obvious softening — let a skill mark a script read-only and skip the gate for it — is refused because it is circular: the same author wrote the script and the sentence describing it, so a self-declared "read-only" authorizes nothing. That leaves a blanket gate. Its cost is one extra round-trip on a read-only helper; its benefit is that the preview is the one place a caller sees the exact call before any of it happens.

What the fence does NOT buy

A declared script is still arbitrary code. These rules narrow which code runs and with what; none of them makes the code safe. A script you allow can read the whole skills tree, spend the machine's CPU, and send whatever it holds anywhere its network permits. skill_run's output caps are truncation, not confidentiality: nothing redacts a script's stdout, and nothing could.

This is not a sandbox. Run it against skills you have read, or run it somewhere that fences it — under mcp-host that means the isolated tier (fly-machine): a microVM per registration, an unprivileged uid, prlimit bounds, and nftables default-deny with a declared egress allowlist. This server is a narrowing on top of such a fence, not a replacement for one.

What v1 cannot run

The set of interpreters is node, one entry, and that is a measured decision rather than an oversight: mcp-host's runner image is Node + git + tar + util-linux + nftables, with no python3, curl or jq, while real skills are overwhelmingly Python (70 .py against 1 .js in anthropics/skills at 3b3fad96).

So a skill declaring a Python script is reported by skill_list under unavailableScripts, with the interpreter and this deployment's set named, and skill_run refuses it in the same words. Its instructions still serve — an instructions-only skill is a useful skill, and most published skills are exactly that. A pinned interpreter is a follow-up that arrives as a dependency, never as an image change.

The mcp-host: declaration block

Optional, inside SKILL.md's frontmatter:

---
name: weather
description: Forecasts and geocoding.
mcp-host:
  version: 1
  run:
    - script: scripts/forecast.js
      interpreter: node
      env: [WEATHER_API_KEY]     # variables this SCRIPT asks for
      timeout: 30                # seconds; clamped to 300
  env:                           # fields proposed for the SERVER's environment
    - name: WEATHER_API_KEY
      secret: true
  egress: [api.weather.example]  # hosts this skill reaches; a proposal
---

A declaration narrows; it never grants. The author of the scripts also wrote the block naming them, so nothing in it is an authorization — it says which files are entry points and what each wants. What makes a script runnable, and a variable reach it, is somebody else accepting it.

Read strictly: YAML 1.2 core schema, anchors and aliases refused, a 64 KiB cap, an unknown MAJOR version refused wholesale, unknown keys ignored and reported by name, and a block that does not parse reported with the parser's position rather than treated as absent. A broken block costs a skill its scripts, never its instructions, and never the rest of the listing.

Configuration

variable

meaning

MCP_SKILLS_PATH

:-separated slot roots, injected by mcp-host's runner. Wins over everything

SKILLS_DIR

the same thing for local use. Read only when MCP_SKILLS_PATH is unset

MCP_SKILL_RUN

optional JSON [{skill, script, env?}] — the owner's grant. Narrow-only

(neither set)

this package's own skills/ directory

MCP_SKILL_RUN deserves the emphasis. When it is present, what may run is the declaration intersected with it — a row naming a script the skill did not declare grants nothing (and is reported), and a row naming a variable the script did not ask for grants nothing. There is no spelling of it that makes something runnable which a skill did not declare, which is what makes it safe to read from an environment that also carries a registration's own variables.

When it is absent, the default depends on whether a host started this child, and the hosted half is fail-closed.

  • Hosted — any variable mcp-host's runner injects is present (MCP_SKILLS_PATH, MCP_HOST_METER_FILE, MCP_DATA_DIR, MCP_BLOB_BASE_URL): nothing is granted and nothing runs. Every skill's instructions and files are still served — that is a working, useful connector. The reason is that one child holds one environment holding every credential the owner set, so a skill whose frontmatter named its neighbour's variable would otherwise be handed the neighbour's credential with nobody having decided to give it. It deliberately does not key on MCP_SKILLS_PATH alone: mcp-host does not inject that variable yet, so today's only hosted channel is SKILLS_DIR in a registration's plain env, and that must not land on the open default. The marker check can only ever move the default in the fail-closed direction.

  • Standalone — no injected marker at all: the skill's own declaration stands. Nothing is injecting anything, and the person who pointed the server at a directory is the owner.

skill_list reports which case it is (grantFrom, plus a grantNote in the hosted one) and lists a skill's declared-but-ungranted scripts, so "nothing runs" is never indistinguishable from "nothing was declared".

Trust posture

  • This server's code is the operator's; the skills are yours. It reads a fixed set of directories handed to it, fetches nothing, installs nothing, and has no tool that takes a path outside a skill's own directory.

  • It vets nothing. There is no badge, no publisher allowlist, no scan. A skill's instructions and its scripts are exactly as trustworthy as whoever wrote them.

  • A read is treated as dangerously as an execution, because the directory it reads from sits beside everything else on the machine.

  • It caches nothing and stores nothing. The catalog is scanned once at boot and held in memory; no file is written anywhere.

Hosting on mcp-host

mint.yaml at the repo root says how this MCP wants to be registered. Four things it deliberately does not propose, because only a registration can decide them:

  • The runtime — and it could not, by rule. A manifest may never name one (docs/MINT-MANIFEST.md §5): which tier a registration lands on is decided by who is asking, not by the package, since a file that could ask for fly-shared would be a stranger's package requesting a seat on the operator's own machine. A hosted skill server belongs on the isolated tier (fly-machine) with a declared egress policy, and that is the registration's choice to make.

  • The skills themselves. They arrive as a pinned dependency (a github-archive naming a repository and an exact commit) and land in a read-only slot the runner names through MCP_SKILLS_PATH. This package cannot know which ones a given registration carries.

  • state.dataDir. The adapter needs no persistence. Turn it on when a registration's skills have scripts that need somewhere to write — the slot is read-only, so MCP_DATA_DIR (with it on) or TMPDIR (without) is where a script's output goes — and give the reason there.

  • The real egress allowlist. mint.yaml proposes allow: [], which is what the adapter itself needs: it reaches nothing. The hosts a registration needs are the ones its SKILLS declare, shown at the preview with who declared them and accepted by the owner. On the isolated tier a host that is not on the list appears either as an HTTP 403 from the loopback proxy or as a plain timeout — the two are indistinguishable from inside a script, so skill_run attaches a note saying so whenever a call fails on a machine that looks fenced.

Narrowing enabledTools to [skill_list, skill_load, skill_file] is the non-executable switch, enforced at the gateway rather than here — a stronger statement than this server refusing skill_run, and it costs the prompt and resource surfaces entirely.

Development

npm install
npm run build      # tsc → dist/, esbuild → dist/bundle.js
npm test           # tsc typecheck + vitest

This project was developed and is maintained by AI. Use at your own discretion.

Available Tools

4 tools
skill_fileA
Read-onlyIdempotent

Read files a skill bundles. Paths are relative to that skill's own directory; text comes back as text, anything else as base64 with its media type. Ask for every file you need in ONE call — a SKILL.md usually points at several.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe skill's name, exactly as skill_list reports it.
pathsYesUp to 8 paths relative to the skill's own directory, as skill_load lists them. Reading a SKILL.md's referenced files in one call costs one round trip instead of one each.

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as read-only and idempotent, and the description adds meaningful behavioral detail beyond that: text is returned as text, non-text as base64 with media type, and paths are resolved relative to the skill directory. This gives the agent a realistic model of what the tool will do and return.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each earning its place: the action, the path and response semantics, and the batching guidance. The most important operational detail — reading all files in one call — is clearly stated without padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, so the description correctly covers the return format (text vs. base64 with media type). It could additionally hint at error behavior for invalid paths or missing files, but given the strong schema coverage and read-only annotations, the practical guidance is largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with both parameters already well described, including path relativity and the 8-path maximum. The description mostly reinforces the same semantics and adds output-format context rather than new parameter meaning, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Read files a skill bundles,' with precise scoping to a skill's own directory. This clearly differentiates it from siblings like skill_list and skill_load, which enumerate or load skills rather than read their bundled files.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context for when to use the tool: whenever a skill's bundled files need to be read, and instructs the caller to request all needed files in one call. It does not explicitly state when not to use it or name alternatives, but the use case is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

skill_listA
Read-onlyIdempotent

List every Agent Skill this server found: name, description, when to use it, how many files it bundles, and the exact scripts (if any) that may be executed with skill_run. Also reports anything that could not be read, so an empty list is never a mystery.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the tool as readOnly and idempotent. The description adds meaningful transparency by disclosing that unreadable skills are reported, so an empty list is not misleading, and by naming the exact scripts that may be executed via skill_run.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, tightly packed with useful information. The core action and result contents are front-loaded, and the second sentence adds a valuable edge-case guarantee without redundant phrasing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter listing tool, the description fully covers what is returned and how failures are represented, while annotations cover the safety profile. No output schema exists, but the enumerated return fields are sufficient for an agent to understand the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and schema coverage is 100%, so parameter documentation is already complete. The description needs no additional parameter-level detail; the baseline for a no-parameter tool applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and resource ('every Agent Skill this server found'), and clarifies the contents of the listing: name, description, when to use, file count, and executable scripts. This clearly distinguishes it from the sibling tools skill_load, skill_file, and skill_run.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes it obvious that this tool is for enumeration/inspection, and it references skill_run as the mechanism for script execution. However, it does not explicitly state when to use this tool over alternatives or when not to use it, leaving the routing mostly implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

skill_loadA
Read-onlyIdempotent

Load one skill's SKILL.md instructions verbatim, plus a manifest of the files it bundles. Referenced files are NOT inlined — read them by name with skill_file.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe skill's name, exactly as skill_list reports it.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses behavioral traits beyond the annotations: it returns instructions verbatim, includes a manifest of bundled files, and does not inline referenced files. These details align with readOnlyHint and idempotentHint while providing actionable expectations the annotations alone don't convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no filler: the core action is stated first, and the important boundary condition (files are not inlined) follows immediately. Every word earns its place and the structure makes the key caveat highly visible.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one required parameter, no output schema, and read-only/idempotent annotations, the description fully covers what the tool returns and its key limitation. An agent has enough context to invoke it correctly and decide between skill_load and skill_file.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single parameter already has a clear description ('exactly as skill_list reports it'), so the tool description doesn't need to add much. The phrase 'one skill's' reinforces singular scope but adds no new semantic information beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action ('Load one skill's SKILL.md instructions verbatim') and resource (a skill plus its bundle manifest), and it explicitly differentiates the tool from skill_file by noting referenced files are not inlined. The purpose is immediately clear and distinct from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit routing guidance: use skill_load for the main SKILL.md and manifest, and switch to skill_file when you need referenced files by name. The parameter schema reinforces the workflow by saying the name must match exactly what skill_list reports, which tells the agent to list first if unsure.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

skill_runA
Destructive

Execute a script the skill DECLARES as runnable, with an argument array. Returns the exit code and the captured output; a non-zero exit is a normal, reported outcome. Mutating: call it once without confirm to see exactly what would run, then again with confirm: true.

ParametersJSON Schema
NameRequiredDescriptionDefault
argsNoArguments passed as an argv array. There is no shell: nothing here is interpreted.
nameYesThe skill's name, exactly as skill_list reports it.
scriptYesThe exact script path skill_list reports for this skill.
confirmNoMust be true to proceed. Without this, the tool returns a preview.

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes beyond the annotations by explaining the preview-then-confirm mutation workflow, the return of exit code and captured output, and the important behavioral note that a non-zero exit is a normal, reported outcome rather than an error. These details are not visible in annotations alone and materially help the agent use the tool correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact sentences, each earning its place: purpose, return behavior, and the confirm workflow. The most important operational guidance is front-loaded, with no repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no output schema, the description covers the essential operational context: it explains what is executed, what is returned, how to interpret exit codes, and how to safely run via the confirm flow. The remaining details are already captured in the input schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters well. The description adds no significant parameter semantics beyond what the schema provides, such as the fact that args is an array. Baseline 3 is appropriate given complete schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Execute a script the skill DECLARES as runnable, with an argument array.' This clearly distinguishes skill_run from its siblings (skill_list, skill_load, skill_file) by focusing on execution of declared runnable scripts rather than listing, loading, or file operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit context for use: preview first without confirm, then execute with confirm: true. It also notes that non-zero exits are normal outcomes, which guides interpretation. It does not explicitly name when not to use the tool or the alternatives, but the workflow guidance is clear and actionable.

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.

  1. 4 tool updatesv0.1.0
    • First observedskill_file
    • First observedskill_list
    • First observedskill_load
    • First observedskill_run

TDQS

A4.5/5.0
Disambiguation5/5

Each tool has a clearly distinct role: listing skills, loading a skill's instructions, reading bundled files, and executing declared scripts. No two tools overlap in purpose, and the descriptions reinforce the boundaries.

Naming Consistency4/5

All tools share the skill_ prefix and use lowercase_snake_case, which is predictable. However, skill_file uses a noun suffix while the others use action verbs, creating a minor pattern deviation.

Tool Count5/5

Four tools is a tight, well-scoped set for a skill management server. Each tool covers a necessary part of the workflow without redundancy or bloat.

Completeness5/5

The tool surface covers the full skill lifecycle from an agent's perspective: discover skills, load instructions, read referenced files, and execute runnable scripts. No obvious dead ends or missing operations are apparent.

Maintenance

ActivityMaintained
ResponsivenessNo issues

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

Related MCP Servers

  • A
    license
    A
    quality
    C
    maintenance
    Converts AI Skills (following Claude Skills format) into MCP server resources, enabling LLM applications to discover, access, and utilize self-contained skill directories through the Model Context Protocol. Provides tools to list available skills, retrieve skill details and content, and read supporting files with security protections.
    3
    27
    Apache 2.0
  • A
    license
    Not graded
    quality
    C
    maintenance
    Serves SKILL.md-based skills as MCP resources and tools over streamable HTTP, enabling remote discovery and retrieval of skill files with full YAML frontmatter parsing.
    Apache 2.0

Latest Blog Posts

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/chrischall/skill-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server