I Still Prefer MCP Over Skills
- title
- I Still Prefer MCP Over Skills
- type
- summary
- summary
- Mohl on why MCP is for service access and Skills are for knowledge โ the hybrid pattern
- tags
- llm, mcp, agent, architecture
- sources
- mcp-vs-skills
- created
- 2026-04-10
- updated
- 2026-05-03
David Mohl's April 2026 post draws a clean line between two mechanisms for extending LLM capabilities โ MCP (Model Context Protocol) and Skills (markdown-file-based instruction injection) โ and argues the industry is using skills where MCP belongs.
The distinction he proposes is simple: skills are for knowledge, MCP is for access. A skill teaches the LLM how to use a tool that's already present โ git, curl, gcloud, an internal CLI. It codifies workflow conventions, documents quirks, and prevents the model from re-discovering the same pitfalls every session. An MCP server gives the LLM a live connection to a service โ calendar, browser, database, search index โ through a typed tool interface with proper authentication.
Why the distinction matters
When a skill's instructions start with "install this CLI first," Mohl argues, the skill is doing MCP's job poorly. The failure modes compound:
Portability breaks down. Skills that depend on local CLIs only work in compute environments โ Claude Code, Codex, Perplexity Computer. Standard Claude, ChatGPT, and mobile clients can't execute them. A remote MCP server is just a URL; it works everywhere a client can make HTTP requests.
Deployment fragments. Each skill-as-service needs its own binary, its own install path (npm, brew, pip, go install), its own secret management (.env files, environment variables, ephemeral credentials). MCP centralizes this: the server handles authentication (OAuth for remote, process-level for local) and the client only knows the endpoint.
Updates become manual. Change a skill and every user needs to pull the new markdown. Change an MCP server and every connected client gets the update on the next call. Remote MCP's update semantics are the same as a web API's โ which is the point.
Context bloat. A skill loads its full SKILL.md into the context window โ instructions, examples, edge cases, everything, regardless of whether the model needs all of it right now. MCP exposes typed tool signatures (name, description, input schema) that the client can present selectively. The full documentation of how a tool behaves goes in the server, not in the model's context.
Where skills still win
Skills are the right choice when there's nothing to connect to. Teaching the model that your team's deploy command is just deploy staging and that it requires a clean git state โ that's knowledge, not a service. Documenting that a specific MCP server uses YYYY-MM-DD date formats and caps search results at 50 โ also knowledge. Standardizing org jargon so the model doesn't confuse "release" (marketing event) with "release" (git tag) โ knowledge.
Mohl's framing: skills are cheat sheets, not connectors. The cheat sheet can annotate an MCP by documenting its behavioral quirks, but it shouldn't replace the MCP by wrapping a CLI that does what a server should.
The hybrid pattern
In practice, Mohl runs both. MCP servers handle live service control (DEVONthink via a local MCP, microfn and Kikuyo via remote MCPs, MCP Nest for tunneling local MCPs to remote clients). Skills document how those MCPs behave โ parameter gotchas, format requirements, non-obvious tool names. The layering is clean: the MCP provides the capability, the skill teaches the model to use the capability well.
How this maps to the wiki's agent tooling
This Second Brain uses Claude Code skills heavily โ /ingest, /query, /lint, /webfetch are all skill files that inject instructions into the conversation. By Mohl's taxonomy, these are knowledge-layer skills (they teach the model a workflow using tools it already has โ Read, Write, Glob, Grep, WebFetch). No CLI to install, no service to connect to. That's the correct use of skills.
The Telegram integration, by contrast, is an MCP server โ it gives Claude a live connection to the Telegram Bot API through typed tools (reply, react, edit_message). Mohl would call this the correct use of MCP. If instead someone had built "a Telegram skill" that documented how to curl the Bot API, that would be skills doing MCP's job badly.
botctl has its own SKILL.md system with three-level hierarchical lookup and on-demand loading โ structurally the same as Claude Code's skills, with the same knowledge-layer purpose. Mohl's context-bloat concern about loading full skill files is mitigated in botctl by the on-demand fetch (Claude asks for a skill when it needs it, rather than front-loading everything). Claude Code's skill system works the same way.
build-your-own-openclaw covers skill extension in Phase 1 (step 2) as the mechanism for teaching an agent new capabilities without code changes. Mohl would say that's correct for knowledge injection; for service access, the tutorial's Phase 2 (event architecture, multi-channel) is where MCP-like patterns should take over.
cli-anything is the hybrid pattern shipped end-to-end: HKUDS's plugin generates both halves at once for any GUI app โ a Python Click CLI that calls the real backend (capability layer) and a SKILL.md derived from the CLI's own Click decorators (knowledge layer). The constraint is that "service" is a local subprocess, so this only works for compute-equipped agent harnesses; it doesn't solve Mohl's portability argument for mobile or web clients, which would still need a remote MCP.
The terminology proposal โ renaming skills to LLM_MANUAL.md and MCP to "Connectors" โ hasn't gained traction, but the underlying distinction (manual vs connector, knowledge vs access) is sharp enough to be useful regardless of naming.