Announcing CIMD support for MCP Client registration
Learn more

What is an Agent Tool Calling Platform?

Shri Mithran
Director of Marketing

Every useful agent eventually needs to do something outside the chat window. It has to read a ticket, update a CRM record, open a pull request, or send a message, and each of those actions lives in someone else's software behind someone else's login.

This guide explains what sits between an agent and those apps. It defines the term, separates it from function calling, MCP, and A2A, and walks through the six layers every production tool call passes through. It then compares how the main platforms differ, gives five questions for a build-or-buy decision, and ends with a per-user tool call in about 25 lines of code.

TL;DR

  • An agent tool-calling platform is the layer that lets an agent discover, authorize, and run actions in other software as a specific user. Frameworks run the model loop; the platform owns credentials, permissions, scopes, and logs.
  • Tool calling has six layers: discovery, schema, authentication, per-tool permissions, execution, and audit. Most frameworks and protocols cover the first two and leave the last four to you.
  • Function calling is a model feature, MCP is a protocol for exposing tools, and A2A connects agents to each other. None of them decides whose credentials a tool call uses.
  • Catalog size is the easiest number to compare and the least useful one. Platform choice comes down to layers 3 to 6: how each user authorizes, how tools are scoped, how calls run, and what gets logged.
  • Scalekit runs each call as the user who authorized it, scopes tools per agent role through Virtual MCP servers, and by default keeps raw tokens out of your code, your logs and the model's context.

What an Agent Tool Calling Platform Does for an Agent

An agent tool calling platform is the infrastructure that turns a model's request ("call github_issues_list") into a real API call, made with the right person's credentials, limited to the right actions, and recorded. The model decides what to do. The platform decides whether it is allowed, whose access it uses, and what happens to the result.

A working definition has three parts:

  • Discover and describe: the agent can find tools and read schemas a model understands.
  • Authorize per user: every call carries the grant of the one user it acts for.
  • Run and record: the call executes against the app's API, handles errors, and leaves a log line.

Suppose a company ships an engineering triage agent to its customers. Each customer's engineers connect their own GitHub and Slack accounts, and the agent reads their issues and posts summaries to their channels. That single agent now acts for hundreds of people in dozens of tenants, and every call has to land in the right account.

How Tool Calling, Function Calling, MCP and A2A Fit Together

These four terms get used interchangeably, but each one names a different part of the stack. Sorting them out first makes the platform layer easier to see.

Term
What it is
Who defines it
What it leaves open
Function calling
A model feature: the model returns a structured request to call a named function with JSON arguments
Model providers, for example OpenAI and Anthropic
Running the function, credentials, permissions
Tool calling
The full loop: the model asks, your code runs the action, the result goes back to the model
Your agent framework
Whose account the action runs in
MCP
An open protocol that lets any client list and call tools on a server
The Model Context Protocol project
Downstream app credentials per user
A2A
An open protocol for agents to talk to other agents
Google, donated to the Linux Foundation
Tool execution inside each agent

Function calling and tool calling are close cousins. Function calling describes what the model emits, and tool calling describes the whole round trip that your code completes around it.

MCP standardizes the connection between an agent and a tool server. Its authorization spec covers how a client proves itself to an MCP server, which leaves out the question of how that server gets each end user's Gmail or Salesforce token. A2A sits one level up again, letting agents built on different frameworks delegate work to each other.

Arcade's own guide to agent tool calling puts it in 2026, protocol connectivity is largely settled. We agree. The triage agent can speak MCP, call functions through any major model, and hand work to other agents, so the protocols are no longer what separates one platform from another. What still differs is tool quality, authorization and audit, which covers everything that happens after the model says "list this user's issues", and that is where the six layers come in.

The Six Layers Every Production Tool Call Passes Through

A production tool call passes through six layers on its way from the model to the app. The table below lists each one with the question it answers, what goes wrong when it is missing, and what to check when you evaluate a platform.

Layer
Question it answers
What breaks without it
What to check
1. Discovery
Which tools exist, and which can this user call right now?
The model sees hundreds of tools, picks the wrong one and burns tokens
Search by intent, filtering by what the user has connected
2. Schema
Can the model call this tool correctly?
Raw API ports with 40 optional fields cause malformed calls
Schemas written for LLMs, with read-only and destructive hints
3. Authentication
Whose credentials does this call use?
One shared token acts for everyone, so one leak exposes every tenant
Per-user connected accounts, token vault, automatic refresh
4. Per-tool permissions
Which actions may this agent take for this user?
A summarizer that can also delete files
Tool allowlists per agent role, read-only modes
5. Execution
Did the call run, and what came back?
Silent 2xx failures, unhandled 401s and 429s
Clear error classes, re-authorization flow, rate-limit handling
6. Audit
Who did what, through which agent, and when?
No answer for a security review or an incident
Per-call logs with user, tool and status, export to a SIEM

Frameworks handle discovery and schema; layers 3 to 6 decide whether a call is safe to run for a real user.

Layers 1 and 2 are about the model's experience of tools. Discovery cost is easy to underestimate: the GitHub Copilot CLI documentation on tool search notes that a few dozen tool definitions can use 10,000 to 20,000 tokens before an agent does any work.

Layers 3 to 6 are about the user's safety and your team's ability to answer for what happened. For the triage agent, layer 3 means engineer A's run uses engineer A's GitHub token. Layer 4 means the summarizer role cannot close issues, layer 5 turns an expired grant into a reconnect prompt for the user, and layer 6 means a customer's security team can see every call the agent made in their tenant.

What Your Agent Framework Covers and What It Leaves to You

Agent frameworks such as LangChain, the OpenAI Agents SDK, the Vercel AI SDK, and Mastra are very good at the model loop. They format tool schemas for the model, parse its requests, call your function, and feed the result back.

What they don't do is own anyone's credentials. A framework calls whatever function you register, and that function needs a token from somewhere. Here is how the work usually splits:

  • The framework handles: prompt assembly, tool schema formatting, the call loop, retries on model errors, streaming.
  • You handle without a platform: OAuth apps per provider, consent screens, token storage and encryption, refresh logic, per-user scoping, error mapping, and logs.
  • The gap: every item in that second list repeats for every app you add.

The triage agent shows how fast this grows. GitHub and Slack each have their own OAuth flow, scopes, token lifetimes, and refresh rules, and adding Linear or Jira next quarter repeats all of it. For a closer look at the refresh side alone, see our guide on handling token refresh for AI agents.

How Agent Tool Calling Platforms Differ From Each Other

Most platforms in this category cover all six layers to some degree, so the useful comparison is where each one leans. The table below compares them on catalog and hosting.

Platform
Catalog
Hosting options
Where it leans
Composio
1,500+ apps
Composio Cloud, or self-hosted on the Enterprise tier
Catalog breadth and time to a first call
Pipedream Connect
10,000+ tools across 3,000+ APIs
Hosted; a dedicated VPC gives tool calls a static egress IP
Widest claimed API coverage, with a remote MCP server
Arcade
8,000+ tools
Cloud, VPC, on-prem or air-gapped
Published tool evals and governance material
Nango
7,000+ tools, auth for 1,000+ APIs
Cloud or self-hosted; source-available under the Elastic License 2.0
Code-first TypeScript functions
Paragon ActionKit
1,000+ integration actions
Cloud, or self-hosted in your own cloud
Integrations embedded in SaaS products
Merge Agent Handler
Hosted in US-East; single-tenant, EU or APAC residency and VPC peering on Enterprise
DLP scanning and redaction on tool calls
Auth0 Token Vault
Not published
Runs inside your Auth0 tenant, hosted by Auth0
Credential storage inside an existing Auth0 setup
Scalekit
500+ connectors, 20,000+ tools
US or EU cloud, VPC, self-hosted or air-gapped
Per-user authorization and per-tool scope

Two more dimensions, authorization model and governance, don't fit in a single cell:

  • Authorization model: each platform above describes some form of per-user connection. The differences sit in the details, such as whether a grant is bound to one tenant, whether raw tokens ever reach your code, and whether tools can be limited per agent role for that user. Scalekit ties each grant to your app's own ID for that user, keeps raw tokens out of your code by default, and limits tools per agent role through Virtual MCP servers.
  • Governance: Arcade runs evals that catch hallucinated and destructive calls before they run, and Merge scans tool-call inputs and outputs for sensitive data. Composio records user, team, tool, action and outcome for every call, including calls its policy denied. Scalekit logs every call against the user's identifier and status, streams those logs to a SIEM on the Enterprise plan, and can issue read-only session tokens that refuse any write call.

If your main constraint is the number of apps on day one, Composio or Pipedream will likely get you there fastest. If you need DLP redaction on every payload, Merge is built around it. Most teams shipping customer-facing agents need their top 50 to 100 apps done well, and their harder problem sits in layers 3 and 4.

When your agent acts for many users inside their own accounts and needs per-tool scope and per-user audit, Scalekit is built for that case.

Five Questions That Settle the Build or Buy Decision

Building the platform layer yourself is a real option, especially for one or two apps you know well. These five questions make the trade-off concrete.

  • How many apps will the agent need in 12 months? One or two apps can be built in-house. Each additional provider adds its own OAuth flow, scopes, and refresh rules to maintain.
  • Does the agent act for many users across many tenants? A single internal user can live with one token. Customer-facing agents need per-user grants and strict isolation between tenants.
  • Who reviews security for your customers? Enterprise buyers ask where tokens are stored, how they are encrypted, and who can read them. Building means answering that yourself, with evidence.
  • Can you scope tools per agent role? A summarizer and an action-taking agent should not see the same tool list, and someone has to maintain that mapping.
  • Will you need logs a customer can audit? If the answer is yes, you need per-call records tied to a user identity and an export path to their SIEM.

If three or more answers point to "many", "yes" or "customers", building is likely to cost more to maintain than a platform. Our post on delegated agent access goes deeper on the multi-tenant case in question 2.

How Scalekit Handles Layers 3 to 6

Scalekit is a tool-calling platform built around the four layers frameworks leave open. It ships 500+ connectors and 20,000+ tools, and the design centers on running every call as a specific user.

It also covers the tool quality point from earlier. Scalekit's tools are schema-optimized for LLMs, and tool search finds tools by intent while marking which ones this user can call right now. When no built-in tool fits, a custom tool on an existing connector takes about 30 minutes to build.

Authentication with one connected account per user

Each user authorizes an app once through an authorization link, which creates a connected account tied to your app's identifier for that user. Scalekit stores the tokens in a vault and refreshes them, so your agent passes the user's identifier, the connection and the tool name, and never a token.

  • Encryption: credentials use AES-256 under a key unique to your environment, wrapped by a master key in Google Cloud KMS. On the Enterprise plan, BYOK lets you hold that master key in your own Cloud KMS.
  • Isolation: raw tokens are not returned to your code by default. Calls through execute_tool or the actions.request API proxy have the token added by Scalekit.
  • Status: each connected account reports ACTIVE, PENDING_AUTH, EXPIRED or another status, so your app knows when to send a reconnect link.

Per-tool permissions with Virtual MCP servers scoped to an agent role

A Virtual MCP server exposes only the tools you list for one agent role. Every user shares its URL, and before each run your server mints a short-lived session token bound to one user and that one server.

  • Scope: the triage agent's summarizer role can list GitHub issues and post to Slack, plus the built-in tool that asks a user to connect an account. Unlisted tools cannot be called.
  • Read-only runs: a token minted with READ_ONLY access shows only read-only tools, and any write call is refused before it reaches the app. This keeps a prompt-injected instruction in a ticket from triggering a write.
  • Cost: fewer tools in context means fewer tokens per call, and scoping tools this way cuts token cost by up to 80%.

Session tokens last one hour by default and can be set anywhere from 60 seconds to 24 hours, so a scheduled run can mint a fresh one each time. For the broader principle, see our guide to least privilege for AI agent tool calls.

Execution and audit with clear errors and exportable logs

Scalekit returns tool output under data, and when the app answers 401, 403 or 429 the call fails with an error that names the cause. Some apps report an error inside a successful 2xx response instead, such as Slack's missing_scope, and that error arrives in data, so the agent should check it before using the result.

Each call is logged with the tool name, connection, connected account, identifier, status, error code, and duration, and tool inputs and responses are not stored. On the Enterprise plan, logs stream to Datadog, CrowdStrike or Google SecOps for teams that keep audit trails in a SIEM.

For teams with strict data rules, Scalekit runs in Scalekit's US or EU region, or on the Enterprise plan in your VPC or self-hosted on Kubernetes or Docker with no connection back to Scalekit. It is SOC 2 Type II and ISO 27001 certified, and the Enterprise plan carries a 99.99% SLA.

Scalekit is not the right choice for every team. If you need the largest number of supported apps on day one, or DLP redaction on every payload, the platforms above that lead on those dimensions are a better fit.

How to Run Your First Tool Call as a Specific User

The code below runs the triage agent's first step for one engineer. It finds or creates their GitHub-connected account, sends them an authorization link if they haven't connected yet, lists the tools they can call, and runs one read-only tool as them.

Both samples use github-connect, the GitHub connection new Scalekit environments include, and read credentials from SCALEKIT_ENVIRONMENT_URL, SCALEKIT_CLIENT_ID and SCALEKIT_CLIENT_SECRET.

Python

import os from scalekit import ScalekitClient actions = ScalekitClient( env_url=os.environ["SCALEKIT_ENVIRONMENT_URL"], client_id=os.environ["SCALEKIT_CLIENT_ID"], client_secret=os.environ["SCALEKIT_CLIENT_SECRET"], ).actions user_id = "user_123" # your app's internal user ID, taken from the server session account = actions.get_or_create_connected_account( connection_name="github-connect", identifier=user_id ).connected_account if account.status != "ACTIVE": link = actions.get_authorization_link(connection_name="github-connect", identifier=user_id).link raise SystemExit(f"Ask the user to connect GitHub first: {link}") page, _ = actions.tools.list_scoped_tools( identifier=user_id, filter={"connection_names": ["github-connect"]}, page_size=100 ) result = actions.execute_tool( tool_name="github_user_repos_list", identifier=user_id, connection_name="github-connect", tool_input={"per_page": 5, "sort": "updated"}, ) print(len(page.tools), "tools available;", result.data)

TypeScript

import { ConnectorStatus, ScalekitClient } from '@scalekit-sdk/node'; const scalekit = new ScalekitClient( process.env.SCALEKIT_ENVIRONMENT_URL!, process.env.SCALEKIT_CLIENT_ID!, process.env.SCALEKIT_CLIENT_SECRET!, ); const userId = 'user_123'; // your app's internal user ID, taken from the server session const { connectedAccount } = await scalekit.actions.getOrCreateConnectedAccount({ connectionName: 'github-connect', identifier: userId, }); if (connectedAccount?.status !== ConnectorStatus.ACTIVE) { const { link } = await scalekit.actions.getAuthorizationLink({ connectionName: 'github-connect', identifier: userId }); throw new Error(`Ask the user to connect GitHub first: ${link}`); } const page = await scalekit.tools.listScopedTools(userId, { filter: { connectionNames: ['github-connect'] }, pageSize: 100, }); const result = await scalekit.actions.executeTool({ toolName: 'github_user_repos_list', identifier: userId, connector: 'github-connect', toolInput: { per_page: 5, sort: 'updated' }, }); console.log(page.tools.length, 'tools available;', result.data);

Two details carry most of the safety here. The identifier comes from your server-side session, never from the request body, so one user can't act as another. In Node, executeTool names the connection connector instead of connectionName, unlike the other SDK calls, so the two are easy to mix up.

Conclusion

An agent tool-calling platform is the layer that makes a model's request safe to run for a real person. Frameworks and protocols now handle discovery and schemas well, so the differences that remain sit in authentication, per-tool permissions, execution, and audit, and those are the layers to test in any evaluation.

To see the full loop for yourself, run the Scalekit quickstart, which connects your own GitHub account and makes a first per-user tool call in about 10 minutes. For a production design review covering your agent's roles, tenants, and audit requirements, talk to a Scalekit engineer.

FAQs

What is tool calling in AI agents?

Tool calling is the loop where a model asks to run a named action with structured arguments, your code runs it against a real system, and the result goes back to the model. It is how an agent moves from answering questions to reading and changing data in other apps.

Is tool calling the same as function calling?

They overlap. Function calling is the model feature that emits a structured request, and tool calling is the full round trip, including execution, credentials, and error handling that happen outside the model.

Do I need a tool calling platform if I use MCP?

MCP standardizes how an agent lists and calls tools on a server. It does not store each user's tokens for downstream apps, scope tools per agent role or log calls per user, so a platform is still useful whenever your agent acts for more than one person.

How does an agent call tools as a specific user?

Each user authorizes an app once, which creates a stored grant linked to your app's ID for that user. On every call, the agent passes that ID, the connection name and the tool name, and the platform adds that user's token to the outgoing request.

How many tools can an agent handle before accuracy drops?

There is no single number. GitHub's Copilot CLI loads every tool below roughly 30 and, on supported models, switches to tool search above that, noting that selection accuracy falls once several dozen tools are in view. Scoping tools per agent role and filtering by what each user has connected keeps the list short.

How is a tool calling platform different from an iPaaS?

An iPaaS such as Zapier or Make runs workflows a person designs in advance, usually set off by an event. A tool-calling platform serves tools to a model at runtime, with schemas the model can read, per-user credentials, and per-call logs, so the agent chooses which action to take for each request.

No items found.
Agent
Auth Quickstart
On this page
Share this article
Scalekit
Connect Agents & Apps

Acquire enterprise customers with
‍zero upfront cost.

Every feature unlocked. No hidden fees.