MCP vs REST API: When to Use Which for Database Access

I keep getting a version of this question: "we already have a REST API in front of our database, why would we add MCP?" It's a fair question, and the answer isn't "MCP is newer so use MCP." They're for different consumers, and once you see that, the choice gets obvious.
Who's calling matters more than what it returns
A REST API is designed for a programmer who reads your docs, learns your endpoints, and writes code against them ahead of time. The contract is fixed. GET /users/:id returns a user, the fields are known, and your client code was written knowing all of that. The intelligence is on the developer's side, baked in before runtime.
MCP is designed for an AI client that shows up not knowing your API and figures it out at runtime. The model asks "what tools do you have," gets a description of each, and decides which to call based on the task in front of it. The intelligence is in the model, applied live.
That's the real split. REST assumes a developer wrote the integration in advance. MCP assumes the caller is reasoning about your service on the fly. Same database underneath, completely different consumer.
What this means in practice
If you're building a feature where you control both ends — your frontend calling your backend, a known integration, a webhook — REST (or GraphQL, or gRPC) is right and MCP would be a strange choice. You don't need runtime tool discovery when you wrote the client yourself. The fixed contract is a feature, not a limitation.
If you want an AI assistant to be able to use your service — answer questions, take actions, work data into a larger task — MCP is what lets it. You could technically point a model at your REST API and have it read the OpenAPI spec, and people do, but you end up rebuilding a chunk of what MCP standardizes: tool descriptions, structured calls, the discovery handshake. MCP is that pattern, agreed on once so every client speaks it.
For database access specifically
This is where it gets concrete. Say you want people (and agents) to ask questions of your database.
The REST approach means you predefine the questions. You build /metrics/active-users, /metrics/revenue, /reports/cohorts, one endpoint per question someone might ask. It's safe and fast and completely rigid. The day someone asks a question you didn't build an endpoint for, they're stuck, and you're back to writing endpoints.
The MCP approach means you expose the ability to query, with guardrails, and let the model compose the question it needs. "Revenue by channel for users who signed up in March" doesn't need its own endpoint. The agent writes the query. You never anticipated that exact question and you didn't have to.
The tradeoff is real and worth saying out loud. REST endpoints are bounded — you know every query that can run because you wrote them. A query-capable MCP server is open-ended, which is more powerful and requires more care, because now the safety has to live in the layer (read-only enforcement, row caps, timeouts) instead of in the fact that you only built four endpoints.
You'll probably want both
This isn't really a versus. Most teams I talk to end up with both, serving different jobs.
The REST API stays the backbone for your product's own features and your known integrations, where a fixed contract is exactly what you want. MCP gets added when you want AI clients to work with your data flexibly, where a fixed contract is the thing getting in your way.
The mistake is using REST for the AI case and ending up writing an endpoint for every question a human can think of, or using MCP for the product case and giving up the predictability you wanted. Match the protocol to the caller. Code that was written in advance wants REST. A model reasoning at runtime wants MCP.
For the database-access half of that, a query-capable MCP server with real guardrails is what we build at QueryBear, precisely so you don't have to choose between "rigid endpoints" and "unsafe raw access." But the framing holds no matter whose tool you use: it's a question about who's calling, not which protocol is newer.