On this page
REST is 24 years old. GraphQL is 11. MCP is barely a year old. They solve different problems for different clients.
REST and GraphQL were designed for human-operated software. A frontend developer writes fetch calls. A mobile team builds request layers. The client is always a person writing code that calls your API.
MCP was designed for a different client: an AI agent that discovers your API at runtime, decides which endpoints to call, and executes them autonomously.
The architectural difference
| REST | GraphQL | MCP | |
|---|---|---|---|
| Communication | Stateless request-response | Stateless request-response | Persistent, stateful session |
| Endpoints | Multiple fixed endpoints | Single endpoint, flexible queries | Dynamic tool discovery |
| Consumer | Human-written code | Human-written code | AI agents |
| Schema | OpenAPI (optional) | Required, self-documenting | Required, capability-based |
| Auth model | Per-request tokens | Per-request tokens | Session-level with permission tiers |
The critical difference is discovery. A REST client knows the endpoints ahead of time because a developer hardcoded them. An MCP client discovers available tools at runtime and decides which to call based on descriptions and context.
What REST does well
REST is the right choice for public APIs consumed by developers. The URL-per-resource model maps cleanly to HTTP caching. CDNs, browser caches, and proxy caches all understand it.
GET /api/v1/issues?status=unresolved
Authorization: Bearer sk-...
Every frontend framework has a fetch library. Every backend framework has a router. The ecosystem is 24 years deep. For developer-facing APIs, REST is not going anywhere.
What GraphQL does well
GraphQL solves the over-fetching problem. A mobile app and a web app need different data from the same API. Instead of building two REST endpoints or accepting wasted bandwidth, each client requests exactly what it needs.
query {
issues(status: UNRESOLVED) {
id
title
assignee { name }
}
}
The self-documenting schema is valuable. Clients can introspect available types and fields without reading docs. This property is why Apollo and others are exploring GraphQL as a backend for MCP tools.
What MCP adds
MCP is not a replacement for REST or GraphQL. It’s a layer that sits between your existing API and AI agents.
An MCP server exposes tools. Each tool has a name, a description, and typed inputs. The agent reads the descriptions, decides which tool to call, constructs the inputs, and sends the request through the MCP protocol.
Tool: list_issues (read)
GET /projects/{org}/{project}/issues/
List issues in a project, optionally filtered by status
params: org*: string, project*: string, query: string
Three things MCP provides that REST and GraphQL don’t:
- Permission tiers. Each tool is classified as
read,write,admin, orforbidden. The agent knows the risk level before calling. - Consent gates. Sensitive operations require the user to confirm before the agent executes them.
- Capability-based discovery. The agent doesn’t browse endpoints. It receives a typed list of actions with descriptions optimized for LLM comprehension.
The same API, three ways
Consider a Sentry API. Here’s how you’d expose “list issues” to each type of client.
REST (for developers):
curl https://sentry.io/api/0/projects/my-org/my-project/issues/ \
-H "Authorization: Bearer $TOKEN"
The developer reads the docs, writes the URL, handles errors.
GraphQL (for frontends):
query {
project(org: "my-org", slug: "my-project") {
issues(status: UNRESOLVED) {
id
title
count
}
}
}
The frontend requests exactly the fields it needs.
MCP via paso (for agents):
- name: list_issues
description: List issues in a project, optionally filtered by status
method: GET
path: /projects/{organization_slug}/{project_slug}/issues/
permission: read
inputs:
organization_slug:
type: string
required: true
description: Organization slug
in: path
project_slug:
type: string
required: true
description: Project slug
in: path
query:
type: string
description: "Search query (e.g., 'is:unresolved')"
in: query
The agent reads the description, knows the permission tier, constructs the request, and calls it through the MCP protocol. No SDK integration. No fetch layer. The agent figures out when and how to call it.
Where paso fits
paso is not an MCP SDK. It’s not a replacement for the MCP TypeScript or Python libraries.
paso sits between your existing REST API and the MCP protocol. You describe your API’s capabilities in YAML. paso generates a compliant MCP server from that description.
Without paso, exposing a REST API to agents means writing 200+ lines of TypeScript: tool registration, input validation, request routing, auth forwarding, error handling. For every protocol.
With paso, you write 30 lines of YAML. paso handles the protocol layer. When the next protocol arrives (A2A, or whatever comes after), your declaration stays the same.
When to use what
Use REST when your consumers are developers building integrations. Public APIs, webhooks, third-party platforms.
Use GraphQL when your consumers are frontend teams that need flexible querying. Complex UIs, mobile apps, multiple client types.
Use MCP when your consumers are AI agents. Claude, Cursor, Copilot, custom agents. This is the growing case.
Use paso when you want MCP without writing protocol code. You already have a REST API. You want agents to access it safely. You don’t want to maintain a separate MCP server codebase.
These are not exclusive. Most APIs will be consumed by all three types of clients simultaneously. REST for developers, GraphQL for frontends, MCP for agents. The question is not which protocol to choose. It’s whether your API is ready for AI clients today.
Questions
Can I use MCP with a GraphQL API?
Yes. paso works with any HTTP API. Your base_url points to your GraphQL endpoint and capabilities map to specific operations. Apollo also offers a dedicated GraphQL-to-MCP server.
Does MCP replace my REST API? No. MCP is an additional access layer for AI agents. Your REST API continues to serve developers and existing integrations.
Is MCP only for Anthropic/Claude? No. MCP was donated to the Linux Foundation’s Agentic AI Foundation in December 2025. It’s an open standard supported by multiple clients including Claude, Cursor, and others.
Related:
- How to Create an MCP Server for a hands-on comparison of manual vs. paso
- paso vs Writing MCP Servers by Hand for the line-by-line breakdown
- Why We Built paso for the motivation behind a declarative approach