-
Notifications
You must be signed in to change notification settings - Fork 4.7k
model context protocol alternatives
MCP solves one problem well: letting a model find out what it can do, from a thing nobody wrote into the model's prompt. A host registers a server, the server declares its tools, and the model can use something its author never heard of. That is genuinely new, and it is why the standard spread.
It charges for that, on every turn, forever. Whether the charge is worth it depends on a question with a clear answer: does the model need to discover this, or do you already know what you want done?
This page is about not using MCP. If you have already decided you want an MCP server and are only choosing which one, the page you want is Playwright MCP alternatives for browsers, or how to choose among MCP servers for the rest.
Enumerated from our own browser server's tool registry on 2026-09-15 and counted with a tokenizer: 16 tools, 3,141 tokens from 8,040 characters of description, sent again on every single turn of every session. A forty-turn session spends around 128,000 tokens restating what the tools are, before a page has been read.
That is not a criticism of MCP; it is the mechanism working. Discoverability means the description has to be present for the model to discover it. But it is the number to hold against every alternative below, because every alternative below costs zero per turn and pays somewhere else instead. How many MCP tools is too many is the same figure from the inside.
A library, imported directly. You write code that calls the thing. No protocol, no server, no descriptions in context, no model deciding whether to call it. This is the right answer far more often than the current conversation suggests, and it is the one people skip because it feels like a step backwards. It is only a step backwards if the step forward was discovery, and in a script you wrote, it was not.
Provider-native function calling. You hand the model a list of function schemas in your own request and dispatch what it picks. The model still chooses, which is the part MCP is often credited with; what you give up is interoperability, because your definitions live in your application and nobody else's host can find them. What you gain is control over exactly what is sent, when. If your tool list is fixed and yours, this is MCP without the registry.
A plain API, with the model out of the loop. The strongest option and the easiest to overlook. If the sequence of calls is known, a model deciding it again on every run is the expensive way to run a script you could have written, and it is less reproducible: nothing guarantees the same decision on the four thousandth item as on the third. Playwright MCP vs the CLI is this argument applied to browsers, and MCP for web scraping is it applied to the case where the repetition is the whole job.
An agent framework. Not an alternative to MCP so much as a different layer: most of them can consume MCP servers. If what you actually wanted was a program that loops, retries and keeps state, the protocol was never the missing piece.
One question, and it is not about your tooling:
Is the next step knowable before you run it?
If yes, everything above beats MCP, and the plain API beats all of them. If no, because the page is different every time, because the answer determines the next call, because a hundred sources have a hundred shapes, then a model choosing among declared tools is worth 3,141 tokens a turn and there is no cheaper way to get it.
The second question is narrower and decides between MCP and native function calling: does somebody else need to find these tools? MCP's real product is that an assistant you did not write can use a server you did not write. If both ends are yours, you are paying for a registry with one entry in it.
Worth saying, since this page is published by people who ship an MCP server.
Until version 0.9.0 this project's interface lived inside the server process and reached the browser directly, because it was right there. It was moved out, and it now talks to the server over MCP like any other client. That is the opposite of the trade this page recommends, and the reason is the one case where it holds: a privileged path means the tools are never proven sufficient. If the flagship interface can reach around the protocol, the protocol quietly becomes a second-class way to do things, and the gaps only show up for other people. Being our own client is how the tool surface gets tested by the thing we care about most.
So the recommendation is not "avoid MCP". It is that the protocol earns its cost where discovery is real, and that a great many things sold as needing it are a function call with extra steps.
What is an alternative to MCP? A library import, provider-native function calling, a plain API with no model in the loop, or an agent framework. Which one depends on whether the next step is knowable.
Is MCP better than function calling? Different. Function calling is your tools in your app; MCP is anybody's tools in anybody's host. If both ends are yours, function calling is cheaper and simpler.
Do I need MCP to give a model tools? No. Every provider supports tool definitions directly.
Is MCP going away? Nothing here suggests so, and the point of this page is not to bet on that. It is that a standard being good does not make it the right shape for one particular job.
What does MCP cost? Measured on ours: 3,141 tokens on every turn for 16 tools. Yours scales with description length and argument schemas, not just tool count.
See also: How to choose among MCP servers, MCP versus an API and versus RAG, and how to build an MCP server.
- This project's own MCP server, enumerated through its tool registry on 2026-09-15: 16 tools, 3,141 tokens for the complete definitions, counted with
tiktokenrather than estimated. - The MCP transports overview, retrieved 2026-09-13, for what the protocol does and does not define.
Written by people who ship an MCP server and moved their own interface onto it. The recommendation most against our interest is the third one, and it is third because it is right more often than the two above it.
- OpenAI Operator alternatives
- Open-source Operator-style agents
- Is OpenAI Operator still available?
- OpenAI Operator vs Claude computer use
- browser-use alternatives
- Choosing an AI browser agent
- Open-source AI browser agents
- Open-source computer-use agents
- What is an AI web agent?
- AI browser agents vs traditional scraping
- Cloud browser infrastructure for AI agents, explained
- Browserbase alternatives
- Firecrawl vs an AI browser agent
- Skyvern alternatives
- Stagehand vs browser-use
- Project Mariner is gone: what replaced it
- Manus alternatives
- Gemini computer use vs Claude computer use
- AIHawk, reviewed honestly by its own wiki
- AI browser vs AI browser agent: which one do you want?
- AI browser agent vs RPA: which one fits the job
- AI browser agent vs n8n, Zapier and Make
- Vercel agent-browser alternatives, compared honestly
- What is an agentic browser? Definition and the two kinds
- Open-source agentic browsers: the three layers, compared
- Choosing an MCP server for browser automation: four axes
- Stealth MCP servers compared: Camoufox, nodriver, Patchright
- Playwright MCP alternatives, and the three you don't need
- Autonomous browser agents: the four rungs of autonomy
- What is actually free in the AI browser agent stack
- browser-use on GitHub: what the repo actually gives you
- Playwright MCP vs Chrome DevTools MCP: different jobs
- How to choose among MCP servers: a map by category
- Which MCP servers are worth adding to Claude Code
- MCP on GitHub: finding servers and judging them fast
- MCP vs an API: the decision, and what the wrapper costs
- MCP alternatives: when the protocol is the wrong shape
- Why does my AI agent get blocked?
- The timing signal AI agents give off
- Agent retry loops trip rate limits, not fingerprints
- Claude computer use detected as a bot
- browser-use getting blocked: what you can and cannot change
- Playwright MCP session blocked: four causes, four fixes
- Playwright MCP and captchas: what actually gets you past
- Cloudflare and a browser MCP server: what is being read
- Can an AI agent solve a captcha? The honest answer
- Getting an AI agent to fill out forms
- Which model to use with AIHawk
- Browser problem or model problem?
- Running AIHawk's browser from Claude Code
- Extracting data to a CSV with an AI agent
- Monitoring a page for changes with an AI agent
- Running AIHawk's browser from Claude Desktop
- Running AIHawk's browser from Cursor
- Using an AI agent to hunt for apartments
- Getting website data into Google Sheets with an AI agent
- Using an AI agent to download invoices from portals
- AI agents for web research
- Using an AI agent to test your own website
- Running AIHawk's browser from Cline
- Posting to social media with an AI agent
- Posting to Facebook with an AI agent
- Posting to Instagram with an AI agent
- Posting to X with an AI agent
- Automating LinkedIn posts: read this first
- Appointment bots: what they are and what an agent can legitimately do
- Track prices across sites with an AI agent
- Build a lead list with an AI browser agent
- Run an AI browser agent on a schedule
- AI browser agent with a local LLM: what changes
- Should you log your AI agent into your accounts?
- How to write a task an AI browser agent can follow
- Move data between two web apps with an AI agent
- The MCP server
- How the tools are shaped, and why
- Playwright MCP vs the Playwright CLI: which fits when
- Playwright MCP: browser is already in use, and the fix
- Playwright MCP best practices: four decisions that matter
- Playwright MCP with a proxy, and the three leaks it leaves
- A browser MCP server in GitHub Copilot: setup and limits
- Using a browser MCP server for web scraping: the pattern
- Which LLM for browser automation: the four properties
- How to build a browser agent, and what to take instead
- Getting an AI agent to log into a website: three routes
- MCP tools, resources and prompts: who controls each
- How many MCP tools is too many? The context arithmetic
- How to build an MCP server: the decisions, not the scaffold
- Local or remote MCP server: what changes, and what does not
- Writing an MCP client in Python: the thirty-line version
- Self-hosted AI agent: what one actually costs to run
- How long an AI browser agent takes per step, measured
- Text, HTML, snapshot or screenshot: what the agent should read
- Giving an AI browser agent a stopping condition
- Keeping an AI browser agent out of destructive actions
- Why did the AI agent click the wrong thing
- When the page changes under the AI agent
- Running one AI agent task across a list of sites
- Seeing a page as it appears in another country
- Getting data out of a dashboard with no export button
- Two browsers in one session: main and support
- Finding the dead links on a site with an AI agent
- Filling a CRM record from a company's website
- One form submission per spreadsheet row, with an AI agent
- Dated screenshots of a page as evidence
- Checking order and delivery status with an AI agent
- Reading a PDF that opens inside the browser
- Summarising a long page or thread with an AI agent
- Collecting every image on a page with its caption
- Collecting event and course listings with an AI agent
- Cancelling a subscription with an AI agent
- What an AI agent can and cannot do inside an iframe
- Shadow DOM and an AI agent: you can click it, you cannot read it
- What a page snapshot costs, per control
- Native selects and the ones that only look like selects
- Clicking by selector or by coordinates
- How long the agent waits before it gives up
- What a second browser costs
- Uploading a file with an AI agent, and why this one cannot
- Watching the agent work, and when it is worth it
- When not to use an AI browser agent
- Agent or script: deciding once instead of every time
- Using the keyboard instead of the mouse
- Secrets in an agent task: where they end up
- What an agent run should log
- Deduplicating what an AI agent collects
- Normalising values across sites
- Validating an AI agent's output
- Reading a table with an AI agent
- Driving a site's own search and filters
- The task works headed and fails headless