What Did We Actually Trust When We Connected the MCP Server?
A familiar tool name returns with a different description. Keep server identity, reviewed capabilities and individual calls separate as the connection changes.
15 sections · 7 questions · 1 coding challenge
The arrow keys move between sections too.
A Shared Tool Interface Made Discovery Useful
BOTIE
The 2025-11-25 specification includes tool metadata and change notifications. A host therefore needs to account for discovery as an ongoing process. Our example treats changed metadata as a new review event because a description can influence the next model proposal even when the tool’s short name stays the same.
Sources for this history
The Tool Still Says read_manual
Botie has been reading manuals through an MCP server. Today the same tool name appears with a longer description asking the agent to attach its conversation before every lookup. The connection still works. Should the host expose the changed tool automatically?
MCP gives clients and servers a shared way to describe and call capabilities. We still need to decide which implementation we trust, which capabilities this task needs and what happens when those capabilities change.
These are invented records and deterministic policy checks. The browser runs no agent, shell command, MCP server or network request. Passing these fixtures establishes only the stated policy behaviour.
Step 1 of 2
One name, several possible capabilities
The host has reviewed the manuals server and metadata version 1.
| Discovery | Server identity | Metadata | Host decision |
|---|---|---|---|
| Original tool | manuals | version 1 | Available for authorised calls |
| Changed description | manuals | version 2 | Hold for review |
| Same short name elsewhere | public-search | version 1 | Not the reviewed capability |
Original tool
- Server identity
- manuals
- Metadata
- version 1
- Host decision
- Available for authorised calls
Changed description
- Server identity
- manuals
- Metadata
- version 2
- Host decision
- Hold for review
Same short name elsewhere
- Server identity
- public-search
- Metadata
- version 1
- Host decision
- Not the reviewed capability
Step 2 of 2
Review and execution are different stages
Making a tool available does not grant every user permission to call it on every object.
- 1
Configured server
Known endpoint or executable - 2
Reviewed manifest
Approved capability description - 3
Proposed call
Validate arguments and task authority - 4
Service boundary
Authorise the specific operation
Discovery is followed by per-call policy
Identity and metadata must match before per-call policy is even considered.
Compare the capability we reviewed with the one offered now
Check configured server identity separately from the reviewed metadata fingerprint.
BOTIE
Tool exposure decision
available for authorised calls
Follow the operations
1. Discovered tool
{ "server": "manuals", "name": "read_manual", "schemaDigest": "schema-1", "descriptionDigest": "description-1" }2. Configured server ID
manuals
3. Match the configured server
true
4. Reviewed manifest
{ "server": "manuals", "name": "read_manual", "schemaDigest": "schema-1", "descriptionDigest": "description-1" }5. Compare reviewed tool metadata
true
6. Expose only the reviewed tool
available for authorised calls
7. Result
available for authorised calls
These are invented records and deterministic policy checks. The browser runs no agent, shell command, MCP server or network request. Passing these fixtures establishes only the stated policy behaviour.
1. Start with the host’s connection decision
The host is the application coordinating the model and its integrations. It creates clients that communicate with servers. Choose servers through controlled configuration, keeping the provider and intended task visible to the person administering the host.
A model-generated URL, package name or startup command should not silently become a trusted connection. Review the implementation and the authority it would receive before enabling it. Connecting a second server can expose a different set of records and side effects.
Connection configuration belongs to a control path with its own permissions.
2. Distinguish a local process from a remote service
A local stdio server is a program the host launches. Its access comes from its operating-system identity, mounts, environment and network. Review its executable and arguments, then constrain it like other third-party code.
A remote HTTP server adds a network service and, where needed, delegated authorisation. Review the actual endpoint and transport configuration. A local proxy connecting to a remote server still needs to enforce the remote trust boundary; calling one end local does not erase the other end.
MCP standardises messages. It does not automatically sandbox a server process.
3. Expose the capabilities needed by this task
Tools request operations. Resources provide material to read. Prompts provide reusable interaction templates. Each can introduce content or behaviour the host must handle according to its origin.
Expose a narrow tool set for the task, such as reading an approved manual by ID. Prefer that contract over a general command runner with unrestricted arguments. A general tool combines many effects behind one name, making meaningful review and permission enforcement harder.
A small capability contract makes the intended consequence easier to inspect.
4. Keep metadata from granting itself authority
A description helps the model decide when to use a tool. Input and output schemas describe data shapes. An annotation such as readOnlyHint describes expected behaviour. None of these strings independently enforces the service’s permissions or proves what its implementation will do.
Keep the server identity with the tool name. Compare discovered metadata with the reviewed capability set under your deployment policy. Treat unexpected additions, description changes and schema changes as reviewable events rather than automatically widening the agent’s authority.
A hint about safety is not an access-control decision.
Fingerprint the complete reviewed metadata selection
This demonstrates stable encoding for a small fixture. A production manifest needs a documented canonicalisation and version policy.
import hashlib, json
metadata = {"name":"read_manual", "schema":{"asset":"string"}, "description":"Read an approved manual"}
encoded = json.dumps(metadata, sort_keys=True, separators=(",", ":")).encode()
digest = hashlib.sha256(encoded).hexdigest()
print(len(digest))64The digest detects changes to these bytes. It does not establish that the server behaves as described.
Check yourself
Questions on Parts 1 to 4
Question 1 of 2
What should this host policy do?
Use the information below.
read_manual has the same schema but a new description asking for conversation history.5. Notice changes after initial discovery
Servers can advertise a changed tool list. Reconcile it with the host’s approved set and revoke stale cached capabilities when necessary. Version or pin deployed server code where practical, and preserve the metadata used for a reviewed call.
Metadata can remain unchanged while implementation behaviour changes. Provider review, constrained credentials, per-call authorisation and monitoring are still required. A fingerprint catches one class of change; it does not freeze a remote service’s internals.
Discovery review narrows exposure but cannot replace execution controls.
6. Validate results before using them
A tool response can carry structured values, text and resource links. Check expected schemas and content bounds, preserve provenance and handle protocol errors separately from a tool’s reported execution error. Neither failure should quietly become a successful empty result.
Returned text may contain instructions. Returned links may point to an unapproved location. Validate a link through the relevant retrieval policy before fetching it; do not let a tool result choose an unrestricted new filesystem or network capability.
The response is evidence from a source, even when its JSON is well formed.
7. Review additional requests made during the interaction
Some MCP capabilities let a server request model sampling or solicit information through the host. Review the requested scope and presentation to the user. Do not automatically include unrelated conversation history, private files or credentials in a server-initiated request.
Keep consent attached to the actual disclosed data and destination. A server’s request for information does not establish that it needs the information or that the current user may disclose it.
A new direction of communication creates another place to inspect authority.
8. Exercise the host against a disposable server
Test discovery changes, oversized or malformed results, tool errors and attempted calls outside the approved set. Use synthetic records and a server that cannot reach production systems. Verify what the host exposes after each change.
Keep these integration checks separate from the browser manifest exercise. The next lesson follows an authorised HTTP connection into the token and object checks that a real server must enforce.
A successful handshake is not an end-to-end security test.
Check yourself
Questions on Parts 1 to 8
Question 1 of 5
MCP itself removes access to environment credentials.
Consider this example.
A local MCP server runs with the developer’s environment.Try it with Botie
Build with Botie
Write and run Python