Three words that agent builders constantly use as if they were interchangeable — tools, the Model Context Protocol, and Agent Skills — are actually three different layers of an agent system, not three competing answers to the same question. This paper draws the boundary: what each one is, who executes what, how they stack together, and when to reach for which. Every claim is cited to the official documentation.
"Should I build this as a tool, an MCP server, or a skill?" is one of the most common questions in agent engineering — and it is slightly malformed, because the three are not alternatives. They sit at different layers. The cleanest way to tell them apart is to notice that each one answers a different question.
Sources, in order: tools — platform.claude.com · How tool use works (“The model never executes anything on its own. It emits a structured request, your code (or Anthropic's servers) runs the operation”). MCP — modelcontextprotocol.io · Introduction (“MCP is an open-source standard for connecting AI applications to external systems”). Skills — anthropic.com · Equipping agents for the real world with Agent Skills (“Building a skill for an agent is like putting together an onboarding guide for a new hire”).
Picture the running agent as three concentric concerns. At the center is execution — the model emitting a call and something running it (tools). Around that is connection — how external capabilities reach the model in the first place (MCP is one standardized option). Wrapping both is direction — the procedural knowledge that decides which capabilities to use, in what order, to finish a real task (skills). Each layer is independent: you can have tools with no MCP and no skills, MCP with no skills, or a skill that orchestrates tools delivered over MCP.
A language model can only read and emit tokens; it cannot query a database or send an email. A tool is the convention by which the model emits a structured request to run a named function with named arguments — and the application, not the model, runs it. As Anthropic puts it, “Tool use is a contract between your application and the model… The model never executes anything on its own. It emits a structured request, your code (or Anthropic's servers) runs the operation, and the result flows back into the conversation.” Google states the same plainly: “The Model doesn't execute the function itself. It's your application's responsibility.”
Sources: platform.claude.com · How tool use works · platform.openai.com · Function calling · ai.google.dev · Function calling.
1 · DeclareA tool is defined by three things: a name, a natural-language description, and a JSON-Schema for its inputs (Anthropic calls the field input_schema; OpenAI and Google call it parameters). All three major providers converge on exactly this primitive.
{
"name": "get_weather",
"description": "Get the current weather in a given location",
"input_schema": {
"type": "object",
"properties": {
"location": { "type": "string", "description": "City and state, e.g. San Francisco, CA" }
},
"required": ["location"]
}
}
name / description / input_schema). OpenAI and Gemini use parameters for the same JSON-Schema role.When the model decides a tool is needed, it returns a structured call — a tool name plus JSON arguments. Anthropic signals this with stop_reason: "tool_use"; OpenAI returns the call(s) in a tool_calls array on the assistant message. It does not run anything.
Your application parses the arguments, runs the real function, and sends the result back as a new message; the model then continues or calls another tool. Anthropic's documented loop: send tools + message → model returns tool_use → execute and format tool_result → send back → repeat while stop_reason is "tool_use".
Anthropic splits tools into client tools (you run them) and server tools like web_search, web_fetch, and code_execution (Anthropic runs them). OpenAI similarly has function tools vs. built-in tools.
Every tool definition is injected into a special system prompt and consumes input tokens on each request — names, descriptions, and schemas all count. Both Anthropic and OpenAI provide “tool search” to defer rarely used tools precisely because definitions sit in context.
One tool = one capability. Tools don't carry multi-step procedure; a long workflow encoded in a tool description is a warning sign. That's what skills are for.
MCP is “an open-source standard for connecting AI applications to external systems.” Its own analogy: “Think of MCP like a USB-C port for AI applications. Just as USB-C provides a standardized way to connect electronic devices, MCP provides a standardized way to connect AI applications to external systems.” Crucially, MCP is not a capability — it is the connective layer that carries capabilities. The spec is explicit that it “focuses solely on the protocol for context exchange—it does not dictate how AI applications use LLMs or manage the provided context.”
Sources: modelcontextprotocol.io · Introduction (definition + USB-C analogy) · modelcontextprotocol.io · Architecture (“focuses solely on the protocol for context exchange”) · anthropic.com · Introducing the Model Context Protocol.
Architecture · host / client / serverMCP follows a client-host-server architecture. The host is the AI application coordinating everything; it creates one client per server, and each client communicates exclusively with that server; each server exposes capabilities. Servers can be local subprocesses or remote services. Revision 2026-07-28 has no protocol-level sessions.
An MCP server can offer three things, distinguished by who controls them:
// Server primitives (modelcontextprotocol.io)
"tools": Functions for the AI model to execute // model-controlled
"resources": Context and data for the user or model // application-controlled
"prompts": Templated messages and workflows // user-controlled
Note the nesting that often causes confusion: a “tool” is one of MCP's primitives. An MCP server is, among other things, a delivery mechanism for tools. MCP didn't replace tools; it standardized how they (and resources and prompts) are discovered and called.
Mechanics · JSON-RPC, request metadata, transportsMessages are JSON-RPC 2.0. Revision 2026-07-28 removes the initialize handshake and protocol-level sessions: every request carries its protocol version and client capabilities in _meta, and servers implement server/discover. Operations include tools/list and tools/call (plus resources/list and prompts/list). The two current transports are stdio (server as a subprocess) and POST-only Streamable HTTP; the older HTTP+SSE transport remains only during its formal deprecation window. Authorization is optional, but when used with Streamable HTTP the specification defines an OAuth 2.1 profile.
“MCP standardizes how to integrate additional context and tools into the ecosystem of AI applications” — explicitly inspired by the Language Server Protocol. Build a server once, use it across many MCP-compatible hosts.
The specification is date-versioned; the current revision is 2026-07-28 (succeeding 2025-11-25). The version travels in per-request _meta and, for Streamable HTTP, the MCP-Protocol-Version header.
When a server needs elicitation, sampling, or roots input, it returns an MRTR input_required result and the client retries the original operation. Direct server-to-client requests are no longer part of the core request flow.
“Agent Skills are modular capabilities that extend Claude's functionality. Each Skill packages instructions, metadata, and optional resources (scripts, templates) that Claude uses automatically when relevant.” Where a tool is one callable function and MCP is the connection, a skill is procedural knowledge: the workflows, context, and best practices that “transform general-purpose agents into specialists.” Anthropic's mental model is an onboarding guide for a new hire — you're not giving the agent a new hand, you're teaching it how to do the job.
Sources: platform.claude.com · Agent Skills · Overview · anthropic.com · Equipping agents for the real world with Agent Skills · anthropic.com · Introducing Agent Skills.
Structure · a SKILL.md and its bundleAt its simplest, a skill is a directory containing a SKILL.md file that must begin with YAML frontmatter carrying two required fields, name and description, followed by the instructions. It can bundle additional markdown, reference files, and executable scripts.
pdf-skill/
├── SKILL.md # required: frontmatter + instructions
├── FORMS.md # additional instructions, loaded as needed
├── REFERENCE.md # detailed reference, loaded as needed
└── scripts/
└── fill_form.py # run via bash; code never enters context
# SKILL.md frontmatter:
---
name: pdf-processing
description: Extract text and tables from PDF files, fill forms, merge documents.
Use when working with PDF files or when the user mentions PDFs or forms.
---
Skills stay cheap because the agent loads them in stages — “progressive disclosure: Claude loads information in stages as needed, rather than consuming context upfront.” The documented three levels:
| Level | When loaded | Token cost | Content |
|---|---|---|---|
| 1 · Metadata | Always, at startup | ~100 tokens / skill | name + description from frontmatter |
| 2 · Instructions | When the skill is triggered | Under 5k tokens | The SKILL.md body |
| 3+ · Resources | As needed | Effectively unlimited | Bundled files & scripts (run via bash, not loaded into context) |
A skill can include code for the agent to execute as a tool at its discretion. When a bundled script runs, “the script's code never loads into the context window. Only the script's output… consumes tokens.” This provides determinism — sorting a list with a real sorting algorithm beats generating it token by token — which is why skills run inside a code-execution environment.
Supported across Claude.ai, Claude Code, the Claude Agent SDK, and the Claude Developer Platform. On the API, a skill is referenced by skill_id in the container alongside the code execution tool.
On the Claude API, “Skills run in a code execution environment where Claude has filesystem access, bash commands, and code execution capabilities” — the code execution tool is the foundation. Across other surfaces (Claude Code, the Agent SDK), skills rely on filesystem access plus that surface's own execution/runtime model.
“Skills stack together. Claude automatically identifies which skills are needed and coordinates their use.” An open cross-platform standard was published in Dec 2025.
Because they live at different layers, the interesting configuration is all three together. Anthropic is explicit that skills and MCP are complementary — skills “complement Model Context Protocol (MCP) servers by teaching agents more complex workflows that involve external tools and software.” A skill supplies the procedure; MCP supplies the connection to outside systems; tools are the calls that actually do the work; and each call executes wherever it lives — in your process (client tools), in Anthropic's infrastructure (server tools), in an MCP server, or, for a skill's bundled scripts, in a code-execution sandbox. There is no single runtime beneath all of it.
Every concrete action — whether defined in-process, delivered by an MCP server, or bundled inside a skill — ultimately surfaces to the model as something it can call. The model emits the call; something else executes it.
When a capability lives outside your codebase (a SaaS system, a shared internal service), MCP is the standardized way to expose and call it — without it, you'd hand-write a custom integration. A locally defined tool needs no MCP at all.
A skill's instructions tell the model which tools to call and in what order, plus the domain rules and edge cases. Skills can rely on MCP-provided tools and bundle their own scripts; in Claude Code a skill's SKILL.md can even be provided by an MCP server.
There is no single runtime beneath everything. Client tools run in your process, Anthropic server tools (web search, code execution) in Anthropic's infrastructure, MCP tools in the MCP server, and a skill's bundled scripts in a code-execution sandbox (or, in Claude Code, on the local machine). The code-execution tool is itself a server-side tool — useful for the deterministic steps a skill runs as code, like fill_form.py.
Sources: anthropic.com (“how Skills can complement Model Context Protocol (MCP) servers”) · Agent Skills Overview (skills run in a code-execution environment) · code.claude.com · Skills (a skill's SKILL.md can be “provided by an MCP server”) · MCP · Server tools (tools/call).
The same distinctions, in one view. Read across a row to see how the three layers differ on the dimension that usually decides which one you actually need.
| Dimension | Tool (function call) | MCP | Agent Skill |
|---|---|---|---|
| What it is | One callable function exposed to the model | An open protocol for connecting models to external capabilities | A folder of instructions + scripts + resources |
| Unit of | Action | Integration | Know-how |
| Answers | What can the agent do? | How do capabilities get connected? | How should the agent do this task? |
| Who executes | Your code (client tool) or the provider (server tool) — never the model | The MCP server handles the call — and may itself delegate to the external systems it fronts | The model follows the instructions; any bundled scripts run in the relevant runtime (a code-execution sandbox on the API, the local machine in Claude Code) |
| Form / spec | name + description + JSON-Schema (input_schema / parameters) |
JSON-RPC 2.0; per-request _meta, server/discover, tools/list, tools/call; stdio or Streamable HTTP |
SKILL.md with YAML frontmatter (name, description) + bundled files |
| Where it lives | In your process, or behind a provider/MCP server | A local subprocess or a remote HTTP service | The filesystem (uploaded via API, or in .claude/skills/) |
| Context cost | Definition sits in context every request (names, descriptions, schemas) | Hosts typically surface the server's tools to the model as callable tool definitions once connected | ~100 tokens until triggered (progressive disclosure); body & files load on demand |
| Standardization scope | Per-provider JSON shapes (similar but not wire-compatible) | Cross-vendor wire standard — “build once, integrate everywhere” | Anthropic format; published as an open cross-platform standard (Dec 2025) |
| Analogy | A function / API endpoint | A USB-C port (or LSP for AI apps) | An onboarding guide / runbook for a new hire |
| Primary source | how-tool-use-works | modelcontextprotocol.io | agent-skills/overview |
Every cell above is drawn from the sources cited in the preceding sections. The comparison is deliberately layer-by-layer: the three are most useful read as a stack, not as a menu of mutually exclusive options.
Because they're layers, the real question is rarely “which one” but “which one first.” A practical way to decide, starting from the symptom you're trying to fix.
There's a specific action or lookup — query this DB, call that API, send this message — that the model should be able to invoke. Keep the description concise; one tool, one capability. If the action already lives in your process, a plain tool with no MCP is the simplest correct answer.
You're integrating an external or third-party system, or you want one integration to work across many agents and hosts without rewriting it each time. MCP turns “a custom connector per app” into “one server many clients can speak to.” If it's purely an in-process function, you don't need MCP.
The capabilities exist, yet the agent needs domain procedure: the right sequence, the edge cases, the team's own conventions, the validation steps. Package that as a skill so the knowledge loads only when relevant — and bundle a script when a step should be deterministic rather than improvised.
description, which is paid for
in tokens on every request. (2) An MCP server for purely local logic — if the code runs in
your own process and isn't meant to be shared across hosts, a direct tool is simpler than setting up
a protocol server. Match the layer to the problem.
Tools are the unit of action, MCP the unit of integration, skills the unit of know-how. They answer different questions and most real agents use all three at once.
Whatever the layer, the model emits a structured request; your code, a server, or the sandbox executes it. That invariant is what makes the layers stack cleanly.
“Tool” is one of MCP's three server primitives. MCP standardized how tools (and resources and prompts) are discovered and called — it's a delivery channel, not a competitor.
Progressive disclosure keeps a skill near-free (~100 tokens) until it's relevant. Skills teach the agent how to use the capabilities it already has — and can run deterministic code.
Anthropic states skills “complement MCP servers.” A skill encodes the workflow, MCP connects the external capabilities, tools are the calls, code execution is the floor.
Need a discrete action → tool. Need to connect or reuse an external system → MCP. Have the tools but want them used expertly → skill.
input_schema; OpenAI and Google use parameters.tool_calls array on the assistant message.tools/list and tools/call.name and description) plus instructions._meta — Metadata carrying the MCP revision and client capabilities on every request; client identity is normally included as well.