The short answer
In mcp vs api evaluations, the distinction is architectural: a REST API exposes endpoints for software systems to consume over HTTP, while the Model Context Protocol (MCP) (defined in the MCP specification) standardizes how an LLM agent discovers, parameterizes, and executes external tools.
Use a REST API when building distributed web services, mobile backends, webhook receivers, or high-throughput batch pipelines. Build an MCP server when exposing local tools, filesystem access, database queries, or development workflows directly into an AI coding assistant like Claude Code or Cursor.
REST API Architecture: Agent ──► Generates curl/fetch code ──► HTTP Network Request ──► Parses Raw Response MCP Architecture: Agent ──► JSON-RPC 2.0 (stdio) ──► Native Tool Execution ──► Structured Result
Our benchmark harness measures the difference: wrapping an equivalent set of database operations in MCP reduces the context definition payload from 1,069 bytes to 450 bytes—consuming 42.1% of the REST OpenAPI payload.
Architectural contract: JSON-RPC 2.0 vs HTTP verbs
A traditional REST API models operations as resource mutations over HTTP methods (GET, POST, PUT, DELETE). Clients must know URL routes, request header specifications, status code meanings, and authentication schemes.
MCP eliminates HTTP method negotiation by using the JSON-RPC 2.0 specification. The host agent and the MCP server communicate via standardized envelopes over standard input/output (stdio) or Server-Sent Events (SSE):
// MCP Request Envelope
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "execute_query",
"arguments": {
"sql": "SELECT id, title FROM articles WHERE status = 'published'"
}
}
}
The server returns a structured array of content blocks and an optional isError flag:
// MCP Response Envelope
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"content": [
{
"type": "text",
"text": "[{\"id\":147,\"title\":\"Claude Code vs ChatGPT Coding\"}]"
}
],
"isError": false
}
}
Because every MCP tool adheres to this identical protocol contract (as we walked through in our tutorial on how to build an MCP server from scratch), the agent does not need to learn custom networking logic for different vendors.
Context window cost: OpenAPI specs vs tools/list
When an agent interacts with a REST API, developers typically inject an OpenAPI 3.0/3.1 document or a Swagger JSON snippet into the prompt.
OpenAPI specifications carry massive structural overhead designed for human documentation and client SDK generation:
- Path routing parameters and method discriminators (
paths./users.get) - Multi-status response matrices (
200 OK,400 Bad Request,401 Unauthorized,404 Not Found,500 Server Error) - Content-type negotiation arrays (
application/json,text/plain) - Security scheme definitions and OAuth scopes
In an MCP handshake, the agent calls tools/list. The server replies with tool names, human descriptions, and a strict JSON Schema defining inputSchema:
| Specification Layer | REST (OpenAPI 3.1) | MCP (tools/list) |
|---|---|---|
| Envelope Type | HTTP URL / Header / Body | JSON-RPC 2.0 |
| Response Schemas | Explicit status codes (200/400/500) | content: [{ type, text }] |
| Path Mapping | Included in every endpoint | Dropped (named tool dispatch) |
| Header Config | Explicitly declared | Handled by transport layer |
| Measured Size (5 DB tools) | 1,069 bytes | 450 bytes |
| Relative Context Footprint | 100% | 42.1% |
On large enterprise APIs with 30+ endpoints, feeding raw OpenAPI schemas consumes 15,000+ prompt tokens before the user types their first prompt. With MCP, tools can be grouped into dedicated servers and scoped using project-level configuration in .mcp.json.
Transport and session lifecycle: stdio pipes vs stateless HTTP
The transport mechanism dictates performance, state management, and operational complexity.
Stdio Child Process (Default MCP)
In terminal agents like Claude Code, the MCP client spawns the server as a local child process (node server.mjs, python -m mcp_server, or docker run).
- Communication: Standard POSIX pipes (
stdinandstdout). - Latency: ~0.8 ms IPC transmission time. Zero TCP overhead, zero DNS lookup, zero TLS handshake.
- Statefulness: The server process lives for the duration of the agent session. It can maintain open SQLite connections, in-memory caches, or active Git repository handles.
Stateless HTTP (Traditional REST API)
REST APIs are stateless by design. Every invocation requires:
- 1. Network overhead: TCP three-way handshake and TLS negotiation (unless using HTTP keep-alive).
- 2. Auth verification: Per-request credential verification (API keys, JWT signature checks).
- 3. Connection pool: Database connection establishment or connection pool checkout.
- 4. Total latency: 25 ms – 200 ms depending on network proximity.
When an AI agent performs an iterative loop spanning 20 tool calls, the 0.8 ms IPC roundtrip of an stdio MCP server saves significant wall-clock execution time compared to repeated remote HTTP roundtrips.
Security and permissions: local sub-process vs network surface
The security boundaries between the two architectures differ fundamentally:
REST API Security: Public Internet ──► Firewall ──► API Gateway (JWT/API Key) ──► Backend MCP Security: Host Agent ──► Permission Prompt (User Confirm) ──► Sandboxed Subprocess (stdio)
With a REST API, credentials (such as database passwords or service tokens) must either be passed to the agent or managed via proxy gateways. If an agent hallucinates a destructive DELETE request, the remote server processes it unless blocked by API gateway rules.
With MCP, execution security is managed by the host client:
- Interactive approval: Terminal agents prompt the operator before executing sensitive tool calls (e.g.
mcp__postgres__execute_query). - Environment isolation: Secrets are injected directly into the sub-process environment in
.mcp.jsonconfiguration using-eflags, preventing sensitive tokens from ever entering the LLM's conversation context. - Restricted tool allowlists: Operators can restrict agents using flags like
--allowedTools "mcp__github__get_issue", mathematically preventing access to write operations.
When to choose an MCP server over a REST API
Use this decision matrix when planning tool integration for AI agents:
| Requirement | Best Choice | Rationale |
|---|---|---|
| Local filesystem or git automation | MCP (stdio) | Direct child process access; zero network configuration required. |
| Exposing database queries to Claude Code | MCP (stdio) | Persistent connection pool; structured JSON Schema parameters. |
| Third-party SaaS integration (Slack, Linear, GitHub) | MCP (stdio or SSE) | Off-the-shelf MCP servers handle auth tokens outside model context. |
| Public multi-tenant API for third-party developers | REST API | Standardized HTTP tooling, rate limiting, and broad language support. |
| High-throughput file downloads / binary streaming | REST API | Streaming binary video/audio over JSON-RPC strings adds base64 overhead. |
| Webhook ingestion from external systems | REST API | External servers require a listening public HTTP URL. |
Common mistakes when wrapping APIs in MCP
Passing raw HTTP errors directly into tool output. When a wrapped API returns an HTTP 500 HTML error page, stringifying that response dumps 4,000 tokens of useless HTML into the LLM context. Always parse and summarize API errors into concise text before returning.
Exposing 50 granular CRUD endpoints in a single MCP server. Each declared tool adds its schema to every request prompt. Combine related operations or split tools across focused, domain-specific servers so you can activate them only when needed.
Hardcoding API tokens in .mcp.json. Committing API keys to source control exposes credentials. Reference environment variables (${GITHUB_TOKEN}) or pass them via client flags.
Ignoring the isError flag. JSON-RPC responses indicate tool application failure using { "isError": true } inside the result block, not by throwing JSON-RPC transport errors. Returning a protocol error aborts the agent session; returning isError: true allows the model to self-correct.
Conclusion
The debate between mcp vs api is not about deprecating REST, but about using the right interface for AI agents. REST remains the foundation of web-scale service communication. MCP is the purpose-built orchestration protocol that enables models to discover and drive those systems with minimal context bloat, persistent session state, and local execution security.
When connecting internal databases and local developer tools to your coding assistant, start with a lightweight stdio MCP server. When building public services that external applications consume, publish a clean REST API. To learn how to configure MCP in your existing workflow, explore our complete guides on Claude Code MCP setup, Anthropic's MCP documentation, and configuring mcp.json.
Frequently asked questions
Is MCP a replacement for REST APIs?
Why does MCP cost fewer tokens than an OpenAPI specification?
How does MCP communicate if not over HTTP?
Can an AI agent call a REST API without MCP?
Muhammad Kashif
Founder and editor of Devventa, covering AI coding assistants, Next.js and the modern AI development stack.

