AIAI Operator Security · Control 4 of 6

MCP Tool Versioning: Pinning What an AI Agent Is Allowed to Do

Control 4 of 6 in the AI operator security series: a version on every tool definition, notice before it changes, and the right to hold the one you approved.

Everything else your company runs has a release number. The database has one. The laptop image has one. The payroll system nobody may touch in the last week of a quarter has one, and the person who approved it can tell you which. Then an AI agent arrives with a list of tools, and the tools have names. Names are all they have. Nothing on the list says which update_record the agent will call tomorrow, and nothing has to tell you when the answer changes.

MCP tool versioning is the fourth of the six AI operator security controls, and the one that keeps the first three true after the day you verified them. The control is that a tool’s definition is pinned: it carries a version, it changes only with notice, and you can hold the version you approved until you have read the next one. This guide walks a buyer through that sentence, from what a tool definition is to what to put in the RFP. It expands Control 4 of the AI agent security checklist, the index for the series.

The series rests on one idea. AI operator security is being safe from the AI agents you operate. Most AI security protects you from someone else’s model. AI operator security protects you from your own agents. The term and the reasoning behind it are in AI operator security; the AI agent security checklist turns them into six questions, and this guide takes one of the six slowly.

The name stays. The tool moves.

What the Agent Actually Reads

A tool, in the vocabulary this series uses, is one operation an MCP server exposes: search_customers, update_ticket, issue_refund. What matters here is what a tool is made of, because that is what your security review approved.

The MCP specification (current revision, 2026-07-28) says a tool definition includes seven things: a name, the unique identifier; an optional title for display; a description, the human-readable description of functionality; optional icons for display in user interfaces; an inputSchema, the JSON Schema defining expected parameters; an optional outputSchema for structured results; and optional annotations, properties describing tool behavior. That is the whole definition, and the entry a buyer would want most is missing: a version.

Who reads which field is the point. The model, which decides whether to call the tool at all, works from the name, the description, and the input schema: the description tells it when the tool fits, the schema what to send. It never sees the vendor’s code, and it never sees last month’s description either. It sees whatever text arrived this session.

FieldRead byDecides
nameThe clientWhich tool is called
titlePeopleWhat the consent screen says
iconsPeopleHow the tool looks in the client
descriptionThe modelWhen the tool looks right
inputSchemaThe modelWhat arguments get sent
outputSchemaThe clientWhat shape comes back
annotationsThe clientWhether to ask a person first

Two consequences follow. The description is a prompt the vendor writes and your agent reads. The schema is the capability: a tool whose schema gains one optional field has gained a capability, however the name reads. Your review approved both on a particular day. This control answers whether that is still what the agent is reading.

How a Definition Changes Under You

A tool definition is not a file you downloaded. It is a reply. Each session the client asks the server for its tools with tools/list, and the server answers with whatever it has that day. A server can also change the answer mid-session. It can declare a listChanged capability, which the specification says indicates whether the server will emit notifications when the list of available tools changes, and when the list does change, a server that declared the capability should send a notification named notifications/tools/list_changed to clients that have asked to hear about it. The client then asks for the list again and hands the new definitions to the model.

Read that as a buyer. The notification goes to the client process, not to a person. It carries no detail: the specification’s example is a method name with no parameters. It is a should rather than a must. And a definition that changes overnight needs no notification at all, because the next session opens with a fresh tools/list. A notification to the client is not notice to the buyer. It is a cache invalidation, and the people who approved the old list are not on the distribution.

The failure pattern that follows is quiet. The update tool that also deletes: update_record gains an optional parameter that clears a record when the new value is empty, and the agent uses it the first time an empty value looks right. The search tool that also exports: search_tickets gains a flag to return every match as a file, and a read-only tool is now the export the allow-list was built to prevent. And the one buyers rarely check: the description rewritten so the model uses the tool more often. A description is a prompt, and a vendor whose metrics reward usage will tune it, in good faith, until the agent reaches for the tool in situations your review never considered. Nobody attacked anything. The name stayed. The tool moved.

The hostile version has a name. In April 2025, Invariant Labs described tool poisoning: malicious instructions embedded within MCP tool descriptions that are invisible to users but visible to AI models, and a variant they called a rug pull, in which a server changes a tool description after the client has already approved it. The mechanism is the one a well-meaning vendor uses to ship a feature.

Annotations do not close the gap. A server can label a tool read-only or destructive, and a careful client uses the label to decide when to ask first. But the specification says clients must consider tool annotations untrusted unless they come from trusted servers, and even a trusted server’s label is a statement about itself at a point in time, checked against nothing. An annotation is a hint. A version is a commitment that the definition has not moved. The control needs the second.

What MCP Tool Versioning Means in Practice

The fix is ordinary engineering. From the buyer’s chair it has six parts, each a thing you can be shown.

A version identifier on every tool definition. The protocol does not supply one: a server identifies itself with a name and a version of its own, but a server that moved from 2.3 to 2.4 has told you that something among forty tools changed, not which. The identifier has to sit on the tool, in its metadata, its name, or its description, and it has to change whenever the description, the schema, or the behavior behind them changes. Unchanged text over code that now deletes is a changed tool, and an honest version says so.

Then a changelog, per tool and dated; notice to a named contact on your side before the change ships, not a release note the morning after; a review window long enough to read the diff and rerun the injection test from control 5; a pin that holds your agent’s identity on the approved version while the window is open; and a diff on request, the old definition beside the new.

ElementFormWithout it
Version identifierOn the definitionYou cannot name what you approved
ChangelogPer tool, datedYou cannot see what changed
NoticeBefore, to a personYou find the change in the log
Review windowDays, in writingNotice is a courtesy
PinPer identityReview is advisory
Diff on requestOld beside newEvery claim is a sentence

The pin is the part vendors push back on, so be precise about what it costs them: serving two versions of a definition to two identities for the length of a window. A server that scopes tools/list to the caller’s identity, the design in MCP auth and security, can do this; so can a gateway in front of the server that holds the approved definitions and masks the rest. A vendor who says the pin is impossible is usually saying the tool list is not per identity either, which is a finding on control 1.

An Allow-List That Can Grow Is Not an Allow-List

The first control in this series is a short list of tools attached to an identity and enforced on the server. The list is made of names, and it can grow two ways without anyone adding a line to it. The server can add a tool, which the list-changed notification announces to the client and to no one else. Or a tool already on the list can widen, the same name around a larger capability, which nothing announces at all. The permissions guide named scope sprawl as a failure mode: three tools at launch, forty a year later. This is how the sprawl arrives, one quiet definition at a time. An allow-list the vendor can lengthen without telling you is not an allow-list. It is a snapshot of one.

The other controls lean on the version the same way. The agent’s own identity is where the pin attaches. The approval gate is per call on a tool name, and an approver who reads update ticket and clicks approve has approved whatever that name does today, so a changed definition goes back through the gate. The injection test was run against a description and needs running again when the description changes. And the audit log should carry the version on every call, because that log line is the only literal answer to the question in the RFP.

How to Verify the Control

The vendor says the tools are versioned. Three steps turn the sentence into evidence, and the first two need no vendor in the room.

First, pull the current definitions. Call tools/list as the agent’s own identity, or have the vendor do it on a screen you can see, and keep the full reply: every tool’s name, description, input schema, and annotations. Second, compare the reply to the copy you kept. The permissions verification told you to date and keep the tools/list output; that file is the approved definition, and the comparison is a diff. Third, ask the vendor for the diff since approval. A vendor with the control produces it from the changelog the same day. One without it reconstructs it from a code repository, or cannot, which is also an answer.

Then ask what happens when the vendor ships a version your side has not reviewed. The right answer is that your agent stays on the old one until the window closes.

What to keep: the approved definitions, dated; the vendor’s changelog since; and the diff you ran, which should be empty or match the notices you received. That is the artifact: not the vendor’s assurance that nothing changed, but your copy, and a comparison against it that comes up clean.

Key Signal

Ask the vendor which version of the tool your agent called this morning. If the answer is an identifier they can show you on the definition and on the log line, you are looking at the control. If the answer is the current one, there is no control, because the current one is whatever it happens to be.

Failure Modes

Common Failure Modes

No version anywhere: the tool is whatever the server served this session. The server version standing in for tool versions: the release went from 2.3 to 2.4 and nobody can say which of forty definitions moved. The suffix that never moves: update_record_v2 has been v2 through six changes. Notice after the fact: the release note that arrives the morning the change is live. Notice to the wrong party: the vendor counts the list-changed notification as having told you, and it told your client. The pin that is a promise: we will not change it without asking is a sentence, not a configuration. Unchanged text over changed code: the definition your review approved is byte for byte the same, and the tool deletes now.

All seven fail the same question. Ask which version the agent called this morning, and the answer is a shrug.

The Contract Term and the RFP Question

The reason every control needs a term in the contract is set out in the checklist. The term from the hub is short: tool changes come with notice and a version you can pin, with a window to review before the new version runs against your data. Four details make it enforceable. A change means a change to the description, the schema, or the behavior behind them. Notice goes to a named contact before the version is served to your identity. The window is a number of days, and the pin holds for all of them. And the diff is deliverable on request, for any two versions. A sunset is fair in return: the vendor may retire the old version when the window closes, so the buyer gets a review, not a veto.

Pair it with the permissions term, that enforcement is server-side and the contract names the point, because the two describe one thing: a list the vendor cannot lengthen, holding definitions the vendor cannot move, without your knowing. Both belong with the security terms in SaaS vendor security due diligence.

The RFP Question

How do I know the tool called today is the one I approved last month?

Approved a tool list that may have moved since?

Send us the agent's current tool definitions and the copy you approved – or the vendor's answer to the RFP question – and we'll tell you what changed, whether the version is a control or a promise, and what to put in the contract. We advise buyers only and have no relationships with the vendors whose tools we diff, which is the point of the exercise.

Get the tool list diffed →

Conclusion

Versioning was never exotic. Everything else your company runs has a release number, and the people who approve changes to those things would not accept the current one as an answer. The tools an agent calls are the last place that answer still passes, because the agent will never complain about a change it was not told about. It will use it.

The name stays. The tool moves. Pin the definition you approved, and make the vendor tell you before it moves again.

Frequently Asked Questions

What is AI operator security?

AI operator security is being safe from the AI agents you operate. Most AI security protects you from someone else's model. AI operator security protects you from your own agents.

What is MCP tool versioning?

A version identifier on every tool definition an AI agent can call, a changelog, notice before a definition changes, a window to review the change, the ability to pin the version you approved until you have reviewed the next one, and a diff the vendor can produce on request. It is the fourth of the six AI operator security controls. Without it, the security review that approved a tool definition approved a name, and the capability behind the name can change overnight.

What does an AI agent actually read in an MCP tool definition?

The MCP specification says a tool definition includes a name, an optional title, a description, optional icons, an input schema, an optional output schema, and optional annotations. The model works from the name, the description, and the input schema: the description tells it when the tool fits and the schema tells it what to send. The model never sees the code behind the tool. A change to the description or the schema is a change to the agent's instructions, and a change to the code behind an unchanged definition is a change the model cannot see at all.

Can an MCP tool change without the operator knowing?

Yes. A server can change a tool's description, schema, or behavior at any time. The specification lets a server declare a listChanged capability and send a notifications/tools/list_changed notification when its tool list changes, after which the client fetches the list again. That notification goes to the client process, says only that the list changed, and is a should rather than a must. Nothing in the protocol tells the buyer's security team, and a definition that changes between sessions needs no notification at all.

Is the MCP list_changed notification the same as notice of a tool change?

No. It is a cache invalidation. The notification tells the client to ask for the tool list again; it carries no diff, names no tool, and reaches a process rather than a person. Notice, in the AI operator security sense, is a message to a named contact at the buyer before the new version is served to the buyer's agent, with the change described and a window to review it.

Do MCP tool annotations guarantee what a tool does?

No. Annotations are optional properties describing tool behavior, such as whether a tool is read-only or destructive, and the MCP specification says clients must consider them untrusted unless they come from trusted servers. They are hints from the server about itself at a point in time. A tool annotated read-only can gain an export parameter without the annotation changing, because nothing checks the annotation against the code. A version is a commitment that the definition has not moved; an annotation is not.

What is tool poisoning in MCP?

A risk class described publicly in April 2025 by Invariant Labs: malicious instructions embedded in MCP tool descriptions that are invisible to users but visible to AI models. The same report described a rug pull, where a server changes a tool description after the client has already approved it. The AI operator security case is the benign version of the same mechanism: a vendor that rewrites a description so the model uses a tool more often has changed the agent's instructions with no attacker in the picture.

How do I verify a vendor's tool versioning?

Three steps. Pull the current tool definitions as the agent's own identity, including the description and the input schema of every tool. Compare them to the copy you kept when you approved the agent, which is the tools list output the AI agent permissions guide (/guides/ai-agent-permissions) told you to date and keep. Then ask the vendor for the diff since approval. A vendor with the control produces the diff from a changelog the same day. One without it reconstructs it from a code repository, or cannot.

What contract term covers AI agent tool versioning?

That tool changes come with notice and a version you can pin, with a window to review before the new version runs against your data. The term should define a change to include the description, the schema, and the behavior behind them, name the contact who receives notice, state the window in days, and oblige the vendor to produce the diff on request. The RFP question that goes with it: how do I know the tool called today is the one I approved last month?

Control 4 of 6 in the series

AI Operator Security

Six controls that keep you safe from the AI agents you operate, each with the artifact that proves it and the question to put in the RFP.

  1. HubAI Agent Security Checklist: The Six Controls to Verify Before You Buy
  2. Control 1AI Agent Permissions: Least Privilege at the MCP Layer
  3. Control 2AI Agent Credentials: Non-Human Identity, Scopes, and Revocation
  4. Control 3Human Approval for AI Agent Writes: Gating Changes to Systems of Record
  5. Control 4MCP Tool Versioning: Pinning What an AI Agent Is Allowed to Do
  6. Control 5Prompt Injection Defense for AI Agents: Controls at the Tool Layer
  7. Control 6AI Agent Audit Log Requirements: What to Record and Who Owns It

The definition, on one page: What Is AI Operator Security?

The term and the argument behind it: AI Operator Security: Staying Safe From the AI Agents You Run

← AI Guides

Start a Conversation

15 minutes with an advisor. No pitch, no pressure.
We'll help you figure out what you actually need.

Talk to an Advisor