Skip to content

The datasheet for every AI agent

Audit an MCP Server Before You Install It

Map declared tools, credential permissions, host approvals and untrusted inputs, then record an approve, restrict or refuse decision.

By The Agents Index Editorial, Research deskPublished Updated Re-verified

Scope · 9 topics
  • Pre-install inventory of tool names, complete schemas and parameters
  • Declared behavior versus handler reach and credential entitlement
  • Local execution and remote discovery boundaries
  • Host filtering, deferred loading and confirmation policy
  • Untrusted-content influence and who controls each boundary
  • Hypothetical ticket-server blast-radius audit and narrower redesign
  • Confused-deputy consent and token-passthrough review
  • Approve, restrict or refuse decision record
  • Weekly canonical-guide maintenance and evidence limitations

Direct answer: review four boundaries, not one tool list

Before installing or connecting an MCP server, create one review row per tool: its declared parameters, every system it could read or write under the proposed credentials, the host's invocation and confirmation rules, and the untrusted content that could influence its arguments. Record an approve, restrict or refuse decision before granting access. Treat unknown reach as an unresolved approval condition, not as zero reach.

This is a documentation-based walkthrough. Account-level steps were not exercised by the publisher; no server was installed or exercised. The checklist and decision rules are our recommended review method, not a penetration test or certification of an implementation.

Source-check date: 23 September 2026, using the supplied retrievals. This review uses the MCP tools specification at the 2025-06-18 URL, security guidance at the 2025-11-25 URL and OpenAI's Responses API guide. Treat those URL version labels separately from the retrieval date; this review does not establish a newly announced change.

BoundaryQuestion to answerEvidence to request
DECLARESWhat does the server say each tool does?Version-matched inventory, complete input schemas, descriptions, annotations and documented outputs.
ENTITLEDWhat could its credentials and process access?Effective scopes, resource permissions, downstream authorization rules, filesystem and network policy.
INVOKEWhat will this host let the model call without confirmation?Effective allowlist, approval configuration, exceptions and approval-handling code.
INFLUENCEWho could supply content that shapes a tool choice or argument?Provenance and editing rights for retrieved documents, ticket text, server descriptions and returned content.

Our interpretation: a declared tool description is a vendor statement, not a capability proof. Keep the four boundaries separate even when a vendor presents them as one feature.

1. Obtain the complete inventory without production access

The MCP tools specification documents tools/list as a paginated discovery operation. Tool discovery

The specification defines inputSchema as JSON Schema describing expected parameters. Tool definitions

  1. Request an inventory exported from the maintainer's review environment, or inspect the proposed release's tool definitions without executing it. Record the package or endpoint, release or commit, operator, intended identity and export date.
  2. For an exported tools/list result, require every page and record which identity and permissions produced it. Treat a static catalogue as declared evidence, not proof of what your eventual connection will expose.
  3. Copy every parameter, including required and optional fields, defaults, enums, nested objects, referenced schema definitions and whether additional properties are permitted. Highlight unrestricted strings, arbitrary JSON, URLs, paths, queries, recipients, tenant selectors and resource IDs.
  4. Record output descriptions and annotations separately from enforcement evidence. Ask what rejects an out-of-bound request and where that rejection is implemented.
  5. If discovery requires running unfamiliar code or granting broad access, stop this pre-install review. Request an offline artifact or authorize a separate isolated evaluation without production credentials. Do not silently turn inventory collection into production installation.

The specification requires clients to treat tool annotations as untrusted unless they come from trusted servers. Annotation trust rule

Our review rule: do not accept a read-only annotation, reassuring name or narrow example as proof that broader operations are impossible.

The specification says resource links returned by tools are not guaranteed to appear in resources/list results. Resource links

Include returned links and embedded content in the review. Ask what the host may fetch next, under which identity, and whether that destination has been approved.

2. Map entitlement, handler reach and runtime reach

The MCP security guidance recommends a progressive, least-privilege scope model beginning with low-risk discovery or read operations. Scope minimization

For each tool, request a trace from argument to handler to downstream operation. Complete the following worksheet using implementation evidence, deployment configuration and permission exports. Mark unsupported answers as unknown.

FieldWhat to record
IdentityUser or service account, credential issuer and audience, scope set, resource restrictions, and who can replace or revoke access.
Handler readsEvery service, tenant, project, table, ticket, attachment or file the handler can retrieve; include any secret-store access.
Handler writesCreation, editing, deletion, permission changes, outbound messages and administrative operations. Ask explicitly about notifications, webhooks and other downstream automations.
Credential entitlementAll effective permissions, including permissions unused by the declared handler. Keep this separate from the demonstrated route through the implementation.
Data destinationsMCP operator, upstream APIs, storage, logging, telemetry and downstream recipients; specify which arguments or results each receives.
EnforcementCredential restriction, server-side authorization check or runtime policy enforcing each boundary, with evidence and an accountable owner.

Our interpretation: if a read handler uses a credential with write permission, record both facts rather than calling the entire installation read-only. Conversely, do not assert that a specific write is reachable through that handler without evidence of a route. Do not accept a prompt instruction as the sole access restriction.

Review local execution separately

The MCP security guidance recommends sandboxed local execution and restricted access to the filesystem, network and other system resources. Local-server controls

Before execution, review the exact startup command and package provenance. Record the process user, inherited environment, mounted directories, accessible credentials, outbound destinations and ability to spawn other processes. Do not approve local execution merely because the declared tools look narrow.

Review remote discovery separately

The MCP security guidance identifies SSRF risks during OAuth metadata discovery when a malicious server controls URLs fetched by the client. OAuth discovery and SSRF

Request the host owner's evidence of discovery-time destination checks, redirect validation and egress restrictions. Include the client's network boundary, not only the remote server's permissions. Make permission to connect for discovery a separate approval from permission to invoke business tools.

3. Establish who can steer calls and who must confirm

The MCP tools specification describes tools as model-controlled but does not mandate a particular user interaction model. Interaction model

The specification recommends confirmation for sensitive operations and showing tool inputs before calling the server. Client security considerations

OpenAI's Responses API guide documents approval by default before data is shared with a connector or remote MCP server. OpenAI approvals

The guide documents allowed_tools for importing only a selected subset of a server's tools. Tool filtering

It also documents require_approval set to 'never' as a way to skip approvals for all tools in that remote MCP server. Approval overrides

Our interpretation: these describe different layers, not interchangeable guarantees or a contradiction. For a Responses API deployment, record both allowed_tools and require_approval, including per-tool exceptions. For another host, request equivalent evidence rather than assuming OpenAI's default applies. Inspect whether the application presents approval requests to a person or accepts them automatically. Require the exact proposed arguments, target resource and destination to be visible before sensitive calls.

OpenAI documents deferred loading in which the model can use a server's label and description to decide when to search it, while individual function definitions load only when needed. Deferred loading

Our review rule: include deferred tools in the complete inventory. An unloaded or unobserved tool is not a denied tool; request the policy preventing later import or invocation.

OpenAI warns that malicious MCP servers may include hidden instructions designed to make models behave unexpectedly. Prompt-injection warning

For each tool, perform this paper trace rather than trying to predict whether a model will obey an attacker:

Untrusted author → content entering model context → proposed tool and arguments
→ reachable read, mutation or recipient → enforcing control → decision
  • Mark free-text influence as yes, no or unknown, naming the parameter path, such as fields.body. Ask whether a retrieved document could influence the text sent there.
  • Include ticket comments, documents, attachments, server descriptions and returned links. Name who can author or replace each input.
  • For search parameters, ask whether internal context could be copied into a query sent to the server. For write bodies, identify where the text would be published.
  • Trace IDs, enums and booleans too. Do not exclude target selection or visibility changes just because they are not prose.
  • Name everyone with steering authority: server maintainers, deployment administrators, credential owners, host-policy editors, approvers, content authors and downstream permission administrators. Record change and revocation authority.

Record each attacker-controlled path as a possibility to assess, not an observed exploit. The approval question is which enforcing boundary would stop the proposed call if the model followed the untrusted instruction.

4. Worked example: a hypothetical ticket-system server

Everything in this example is hypothetical: tool names, permissions, host configuration and downstream behavior. Assume the proposed server exposes two tools using one account with tenant-wide ticket read/write permission. Both tools are available without confirmation. Tickets may be customer-visible, and updates may notify watchers or trigger configured webhooks. The intended workflow needs only to summarize internal OPS tickets and draft internal notes.

DECLARES: tool and parametersENTITLED: handler, credential and destinationsINVOKE: host policyINFLUENCE: attacker-controlled argumentsDecision and reason
read_ticket(ticket_id: string, include_comments: boolean = true). Declared purpose: return ticket text and comments.Handler reads any tenant ticket and comments through the ticket API, returning them through the MCP operator to the host. Shared credential also permits tenant-wide writes; that is broader entitlement, not evidence that this handler writes.Available without confirmation.No prose-body argument. An untrusted comment could suggest another ticket_id or supply instructions targeting the write tool.RESTRICT: require OPS-only read reach and server-side target enforcement; review the operator as a data recipient and remove unnecessary write entitlement from a read-only deployment.
update_ticket(ticket_id: string, fields: object). Unrestricted write: arbitrary fields, including body, status and visibility.Handler and credential permit updates to any tenant ticket. Potential recipients include customers, watcher notifications and webhook receivers, beyond the ticket record itself.Available without confirmation.Free text: yes, fields.body. An untrusted document could shape the body, select another target ID or request public visibility.REFUSE as proposed: tenant-wide arbitrary-field writes and uncontrolled publication exceed the internal-drafting purpose.

Hypothetical abuse path: an internal ticket comment asks the agent to copy a confidential summary into the public body of another ticket. That path would require the model to follow the instruction, select the write tool and supply the relevant arguments. The table identifies the route and blast radius; it does not establish that any model would take it or that a real server is vulnerable.

A narrower proposal to review

Our recommended redesign is to remove update_ticket. If the purpose is only drafting, keep the draft in the host for review and grant no ticket-system write. If posting internal notes is genuinely required, use the following requirements for a hypothetical replacement.

LayerRequired restrictionEvidence needed for acceptance
Tool contractadd_internal_note(ticket_id: string, body: string); no arbitrary fields, visibility selector, project selector, recipient or destination URL.Versioned schema and handler review showing no route to arbitrary ticket updates.
Credential and server authorizationRead OPS tickets and add internal notes only; deny other projects, public replies, deletion and permission changes. Use read-only credentials for a separate read-only deployment.Effective credential permissions and resource-level authorization evidence. If these restrictions cannot be enforced, retain the refusal.
Downstream effectsKeep notes internal; limit notifications and webhooks to approved internal recipients.Ticket-system configuration identifying actual audiences and triggered actions.
Host policyExpose only reviewed read and internal-note tools. Require human approval for each note with the exact target and body visible.Reviewed allowlist and approval-handling code without an automatic approval path.
Residual influenceContinue treating the body and selected ticket ID as content-influence points.A named reviewer responsible for checking content and target, plus explicit acceptance of remaining risk.

Record the overall decision as RESTRICT: do not install the original proposal; reconsider only after the narrower evidence is supplied. Do not treat filtering out the broad write tool as a substitute for narrowing credential and runtime reach. The replacement still accepts free text; do not describe it as injection-proof.

5. Keep authorization consent separate from tool confirmation

The MCP security guidance requires proxy servers to implement per-client consent to prevent the confused-deputy attack it describes. Confused-deputy guidance

For a proxy using a shared upstream OAuth client identity, request evidence of per-client consent, exact registered redirect-URI validation and state validation. Record who approves upstream scopes and how consent is bound to the requesting client. Keep this separate from confirmation of an individual tool call.

The MCP security guidance says servers must not accept tokens that were not explicitly issued for the MCP server. Token-passthrough guidance

Request a token-flow diagram identifying each token's issuer, audience, recipient and validation point, including separate downstream credentials. These confused-deputy and token-passthrough concerns come from MCP's own security guidance, not an allegation about any named product.

OpenAI's legacy-connector instructions say to supply an OAuth access token in the authorization field and handle OAuth client registration and authorization separately in the application. Connector authorization

Our interpretation: that integration instruction does not settle token-audience or downstream-validation questions. Hold any assertion that a particular connector's flow complies with, or violates, the MCP rule pending implementation evidence. Do not infer forbidden passthrough merely from the presence of an authorization field.

If an implementation guide explicitly contradicts the applicable specification, record both passages, versions and the affected configuration. State the disagreement and hold the affected assertion and approval condition instead of silently reconciling them. Do not mistake a protocol recommendation and a host-specific default for conflicting statements about the same layer.

6. Sign the decision and define when it expires

Use these editorial decision rules before installation:

  • APPROVE: the complete inventory, effective entitlement, runtime reach, destinations, invocation policy and residual influence risks have documented boundaries acceptable to the accountable owner. Limit approval to the recorded configuration.
  • RESTRICT: the purpose is acceptable only with named enforceable limits. List required changes and evidence; do not install the unrestricted configuration while waiting.
  • REFUSE: proposed reach is unacceptable, necessary controls are unavailable, or evidence is insufficient to bound sensitive access. Distinguish demonstrated overreach from missing evidence.
Decision: APPROVE / RESTRICT / REFUSE
Purpose and permitted data:
Server operator, endpoint or package, version or digest:
Host version and effective configuration:
Complete tool inventory and schema artifact:
Credential identity, scopes and resource permissions:
Handler reach, runtime reach and downstream destinations:
Per-tool confirmation and content-influence review:
Evidence references and unresolved assertions:
Required restrictions and accountable owners:
Residual risk accepted by:
Decision date, next review date and revocation owner:

Our evidence rule: a tool that was never invoked in an evaluation is not a tool proven impossible to invoke. Require enforcement evidence, not just an absence of calls. This pre-install review cannot establish runtime correctness, uncover every hidden behavior or prove resistance to adversarial content.

OpenAI warns that MCP servers may update tool behavior unexpectedly. Server-change warning

Maintenance rule for this canonical guide: recheck the versioned specification, security guidance and implementation guide weekly; next review due 30 September 2026. A source change triggers review of affected assertions in this same guide, never a dated news page. Preserve supported explanations when nothing substantive changes. Reopen an installation decision after changes to server code, schemas, credentials, host policy or downstream destinations. If a required source cannot be retrieved reliably, leave that review unresolved rather than treating retrieval failure as confirmation.

Sources

Frequently asked questions

What if the maintainer will only reveal the tools after I connect?
Request a version-matched offline inventory first. If it is unavailable, keep production approval unresolved and authorize any isolated evaluation separately, without production credentials. Do not treat a discovery connection as an already-approved installation.
Can an evaluation with no write calls justify approving a server as read-only?
Our review rule is no: absent calls describe that evaluation, not an enforced boundary. Require evidence of credential restrictions, server-side authorization, runtime limits and host policy, including restrictions on tools that could load later.

Advertise here

Reach buyers mid-decision. Reach builders choosing their next agent. Promote your brand with a display placement or bring your listing into focus with Featured.

Explore owner options →Advertise on this page →

The digestFree

Which agents actually ship.

What we re-checked, what got added, and one number from the index. Tuesdays.

One-click unsubscribe