Tool Overload: The Pain Points of Vercel AI SDK's Tool-Only Architecture

In the previous article, we have already achieved: you write a few tool(...), wrap functions like checking time and weather, and then the model can automatically invoke these capabilities.
With just this one trick, you can already make quite a few practical small things: internal customer service assistants, knowledge base Q&A, and AI mini-features in SaaS.
Then the question arises: What happens if you keep going?
Tools go from 3 to 30.
The calling environment goes from 'a Web frontend' to 'Web + IDE plugin + internal Agent'.
The team goes from 'just you' to 'three or four groups writing tools at the same time'.
At this point, relying solely on the 'Vercel AI SDK Tool' layer starts to become difficult. In this article, we won't rush into MCP; instead, we'll clearly lay out the problems that the 'pure Tool architecture' will encounter.
1. Review: The ideal world of only Tool
First, a quick review of the 'previous episode' model:
You have a Next.js / Node.js project.
You use
tool(...)in Vercel AI SDK to wrap business functions, such asgetCurrentTime,getWeather.When calling the model, you attach these Tools to the
toolsparameter, and the model can call them on demand.
From an architecture diagram perspective, it looks roughly like this flat structure:
User → Next.js API Route → Vercel AI SDK → Model Model ←→ Tool (encapsulates your business functions)
Everything is in one project:
Tool directly calls your database and your HTTP API.
Permission validation and logging are entirely determined by this one backend service.
For a 'single application, single team' project, this is very comfortable:
Modify business logic in only one place.
Only need to consider one deployment unit.
Debugging and observability are done in a familiar environment.
2. First layer of complexity: maintenance pressure from the surge in the number of tools
Let's first not introduce 'multiple applications' or 'multiple hosts'; just look within the same project.
2.1 From 'a few tools' to 'a bunch of tools'
Imagine you are building a backend operations assistant, roughly with these Tools:
Ticket related:
listTickets,getTicketDetail,updateTicketStatus…User related:
getUserProfile,banUser,sendNotification…Order related:
getOrder,refundOrder,listRefundRequests…Report related:
getDailyStats,exportReport…
Each Tool itself is not complex, but together they amount to dozens of files:
Each Tool needs to define parameter schema, description, and return value structure.
Many Tools underneath call your existing REST / RPC / DB logic.
In the short term, this is not a problem; the Tool is your project's 'AI layer API gateway'.
2.2 Code starts to exhibit three types of 'duplication and fragmentation'
As the number of tools grows, three subtle problems emerge:
Same business capabilities are repeatedly encapsulated
Your old backend already has a set of 'business APIs', and now you wrap them again at the Tool layer.
If other projects also need these capabilities, they have to wrap them again (in their own Tools).
Types and validation rules are scattered
Originally, domain models (orders, tickets, users) already have types and validation in the backend.
The Tool layer writes JSON Schema / Zod again, making it easy for 'not updated together' issues to occur one day.
Permission logic is scattered across multiple Tools
You might do checks like 'does the current user have permission to operate this order' in each Tool's
executefunction.This seems correct, but when dozens of Tools do similar checks, it becomes very difficult to globally tighten or relax a certain permission.
At this stage, the pure Tool architecture can still fully hold up, but the maintenance experience starts to worsen. You will start to think: Can we make the 'tool layer' into a more independent, reusable thing, instead of being tightly bound within this project?
This is the first small step towards MCP, but we are not in a hurry yet.
3. Second layer of complexity: the calling environment goes from one to multiple
Take one step further: tools are not only used by your current web application, but also want to be used by other hosts.
3.1 Typical scenarios of multiple hosts
You may have such a combination of needs:
Web: An 'AI Assistant' panel in the operations backend that calls tools to help operators with queries and operations.
IDE plugin: Engineers use an Agent in the development environment to check the status of a certain order/user, using the same set of business tools.
Internal 'dashboard': The company wants to build a unified AI console that can call tools from various business lines.
The common point of these three hosts is: they all want to call the same set of business capabilities.
If you only use Vercel AI SDK's Tool, each host will likely do the same things:
Write a set of Tool wrappers in their own project.
Handle authentication, throttling, and auditing separately.
Maintain prompts separately to tell the model 'which tools are available'.
In the long run, this will become a typical 'bunch of isolated islands':
Group A's Tool and Group B's Tool are both named
getUser, but their behavior may not be exactly the same.Permission policies are inconsistent across different hosts—some are strict, some are loose.
Whenever any backend API changes its return structure, you have to notify all projects to update the Tool wrappers.
3.2 This is actually a 'missing protocol layer' problem
Note, this problem has gone beyond 'how good a certain SDK is'; it's more like:
Does our company have a 'unified AI tool access layer'? Or does each project build its own?
One thing Vercel AI SDK does very well is: it unifies different vendor interfaces for you in the 'model invocation' segment. But it is not responsible for answering 'how tools are exposed externally and how they are shared by different hosts', which is precisely where protocols like MCP have room to play.
4. Third layer of complexity: cross-team collaboration and external publishing
Going up another dimension, you are no longer just 'internal reuse', but you want to publish tools as a 'product'.
4.1 What you want becomes a 'tool platform'
For example, your team develops a set of very useful tools:
Git repository management tools (view PRs, merge, rollback, etc.).
Order risk control tools (detect suspicious orders, initiate manual review).
Project knowledge base tools (query project information across multiple systems).
You will start to have these demands:
Can others also use this tool? For example, IDE plugins, internal Agents, and even external partners.
Can we produce a 'unified interface documentation' instead of 'if you use Next, use this set of Tools; if you use something else, figure it out yourself'?
Can we have a 'tool marketplace' or 'registry' where others can directly install our tools instead of digging through your project's code?
At this point, 'just writing some Vercel AI SDK Tools' is no longer enough:
Tool is more like an SDK-level wrapper, tightly coupled to the specific runtime environment (Node/Next/Vercel).
You need an independent 'tool protocol layer' that is not bound to any particular framework or SDK.
The Model Context Protocol (MCP) proposed by Anthropic works at this layer:
It defines the entire mechanism of 'how tools are described and discovered' and 'how Host lists tools and invokes them'.
The tool implementation side (MCP Server) can be in any language/framework.
The host side (MCP Client / Host) can be an IDE, a desktop application, your web backend, or even another Agent system.
You can think of it as:
Tool: A 'function-level wrapper' written in a specific project.
MCP: A 'tool-level protocol' agreed upon across the entire ecosystem.
5. From the AI SDK perspective, what exactly are the 'boundaries'?
Going back to the specific product of Vercel AI SDK, combining official documentation and community discussions, we can summarize the boundaries/pain points of 'relying only on Tool' into several categories.
5.1 The scope of Tool is mainly 'inside the application'
The official positioning of AI SDK is: help you quickly build AI applications and Agents in environments like Next.js and Node.js. Its Tool abstraction is mainly designed around this goal:
Very suitable for directly wrapping TypeScript / JavaScript logic in the current project.
Can be tightly bound to this codebase for a long time, serving this one application.
But it is not an 'external standard':
Other teams or projects do not know what your Tool definitions look like unless they look directly at the code.
IDE/desktop client/Agent platforms cannot directly 'discover and access' your set of Tools.
5.2 From an ecosystem perspective: each SDK has its own Tool abstraction
Not only Vercel AI SDK, but LangChain, LlamaIndex, and various self-developed Agent frameworks all have their own way of 'tool definition'.
If you only stay at the SDK layer (including AI SDK's Tool), you will find that:
Each framework defines tools slightly differently (API, parameter declaration, lifecycle).
Tools cannot be reused directly between frameworks; either copy-paste or write various adaptation layers.
Once you want to unify 'IDE plugin + Web application + CLI' to use the same set of tools, you have to 'abstract above the SDK'.
This is the problem that protocols like MCP try to solve: making tools a 'common language' that can cross frameworks, products, and companies.
5.3 Some practical feedback: when the project becomes complex, you will build a layer of 'platform' yourself
There are already many developers in the community who heavily use Vercel AI SDK discussing:
When the project becomes complex, they will build a custom 'tool/message abstraction' layer on top of AI SDK, rather than directly using Tool naked.
For example: uniformly handling details of different model providers, adding stronger observability capabilities, enhancing retry and rate limiting, and doing additional decision logic at the Tool invocation layer.
This is essentially a 'protocolization' trend: It's just that this protocol currently stays at the level 'inside your organization', while MCP opens it up as an ecosystem-level standard.
6. Looking at MCP from the Tool perspective: what exactly are we missing?
We can use a very practical analogy to summarize the previous discussion.
Traditional APIs are designed for 'human developers':
You know which endpoints exist, there is Swagger documentation, and examples.
You manually write call sequences, error handling, and retry logic in code.
MCP is designed for 'AI agents/assistants':
The model itself does not know which systems and capabilities are available.
MCP exposes the 'tool list, parameter requirements, expected output' in a machine-understandable way.
The model can ask: 'What tools are available now?', 'What parameters does this tool need?', 'What result will I get?'.
From the perspective of Vercel AI SDK Tool:
Tool allows the model to intelligently call your functions inside one application.
MCP, on the other hand, tries to let the model intelligently discover and call various tools across the entire ecosystem.
The two are not conflicting, just at different levels:
Tool focuses on 'SDK-level DX': type safety, deep Next.js integration, frontend experience.
MCP focuses on 'protocol-level interoperability': multi-host, multi-framework, multi-language tool sharing.
7. Laying the groundwork for the next article: How will we use MCP?
In this article, we deliberately did not dive into the technical details of MCP; we only explained its motivation from the perspective of 'what happens when you push Tool to its limits':
When you are only building one web application, Vercel AI SDK Tool is basically enough.
When you want to reuse the same set of tools across multiple hosts, multiple teams, and multiple frameworks, Tool alone is not enough; you need a protocol layer.
MCP is such a protocol: standardizing 'tool description, discovery, and invocation'.
In the next article, we will focus on MCP itself:
Clarify the concepts of Host / Server / Client in MCP.
Draw an architecture diagram of the 'tool ecosystem' so you know its relationship with API / SDK.
Use a simple example to show 'what an MCP Server roughly looks like', but without binding to a specific language/framework.
Follow on Google
Add HeyBinyang as a preferred source on Google
If you'd like to keep finding my updates through Google, you can mark this site as a preferred source and make it easier to spot in relevant reading flows.
SHARE
Share
Share this article.