Apollo MCP Server

Security audit

Turn nine configuration decisions into an evidence-backed security review, then assign the ownership work no command can finish.

The OWASP MCP Top 10 catalogs what goes wrong when AI agents call tools over the Model Context Protocol: stolen tokens, poisoned tools, unaudited writes. This page turns that list into a hands-on audit of one server, Apollo MCP Server, pinned to a specific release. Run each command against your own deployment, record what you find, and leave with an evidence-backed report a reviewer can act on without re-running it. Read the OWASP MCP Top 10

Evidence, not evergreen claims. This draft is pinned to v1.17.0 (commit 5118b03, released 2026-07-30). Re-run every check against a later tag before updating the baseline.

Evidence checked 2026-08-12

Step 1 of 4 · About 2 minutes

Check for settings that override your config.

Your config.yaml might not be the final word. Environment variables beginning with APOLLO_MCP_ override matching YAML settings. Complete this setup first so the rest of the audit checks what your deployment is actually using.

How do you run Apollo MCP Server?

Choose your runtime to get exact instructions.

You will see where to open a terminal, how to find the running server, what to copy, and what the result means.

Step 2 of 4 · Run the checklist

Nine decisions. No implied passes.

Run each command, record what you see, and paste redacted evidence. A status only counts once its evidence is complete — your draft never leaves this device.

0%0/9 checked
0 pass0 needs work0 accepted9 open

One-time checklist setup

Point every command at the deployed config.

Preflight not recorded
First choose how Apollo runs

Return to Step 1 and choose the running environment. That choice supplies the correct config-location and artifact-verification guidance.

Choose a runtime in Step 1
Prerequisite: yq v4

In the same Terminal or PowerShell window where you will run the checks, run yq --version. Continue when it reports version 4.x. If the command is missing, follow the official yq installation guide.

Redact before you paste.

Remove bearer tokens, API keys, credentials, secret environment values, customer data, and sensitive request or response bodies. The report reproduces evidence verbatim.

01
Auth & authorization. Requests reach tools without a verified identity or sufficient permission. Read the OWASP entryScope creep. Tokens or tools accumulate more permission than the task needs, so one credential opens everything. Read the OWASP entry

Which transport is the server actually running?

Transport decides whether HTTP authentication, scopes, and host validation apply at all.

transport.type
Not checked
02
Auth & authorization. Requests reach tools without a verified identity or sufficient permission. Read the OWASP entrystreamable_http only

Is any request authenticated at all?

An HTTP deployment without a transport.auth block accepts requests without an identity checkpoint.

transport.auth
Not checked
03
Scope creep. Tokens or tools accumulate more permission than the task needs, so one credential opens everything. Read the OWASP entrystreamable_http with auth

Is every sensitive operation individually scope-gated?

Per-operation enforcement is opt-in and keyed by GraphQL operation name.

overrides.required_scopes
Not checked
04
Token mismanagement. Secrets and bearer tokens stored, logged, or forwarded where they can be read or replayed. Read the OWASP entryAuth & authorization. Requests reach tools without a verified identity or sufficient permission. Read the OWASP entrystreamable_http with auth

Does the caller's token reach the upstream API?

The passthrough flag and forwarded headers are separate paths; audit both.

transport.auth.disable_auth_token_passthrough + forward_headers
Not checked
05
Auth & authorization. Requests reach tools without a verified identity or sufficient permission. Read the OWASP entrystreamable_http only

Is DNS-rebinding protection actually on?

Host validation defaults on, but YAML or one environment variable can disable it.

transport.host_validation.enabled
Not checked
06
Audit & telemetry. You cannot reconstruct what the agent did — or your traces leak what it did. Read the OWASP entry

Do exported spans carry arguments, queries, or responses?

Useful audit data can also be replayable secret material unless both exporters redact it.

telemetry.exporters.{tracing,metrics}.omitted_attributes
Not checked
07
Tool poisoning. An edited tool definition or description changes what the server does — or steers the agent. Read the OWASP entry

Where do tools come from, and who can change them?

Choosing a source moves the trust boundary; every live tool definition must also be reviewed.

operations.source + schema.source
Not checked
08
Command injection. Tool arguments reach a shell or interpreter and execute. Read the OWASP entryIntent subversion. Injected content steers the agent into valid calls the user never intended. Read the OWASP entry

Can callers run ad-hoc mutations?

Typed GraphQL removes the shell from the request path, but write access still needs a deliberate gate.

overrides.mutation_mode
Not checked
09
Supply chain. The binary or image you run is not the one the vendor built. Read the OWASP entry

Is the deployed artifact the one Apollo built?

Provenance differs by platform and by whether you pin a per-architecture image.

release artifact (not YAML)
Not checked

OWASP crosswalk

See what your audit covers.

Status rolls up from the deployment checks above. MCP09 and MCP10 stay open until their process owners are named below.

Token mismanagement. Secrets and bearer tokens stored, logged, or forwarded where they can be read or replayed. Read the OWASP entryToken mismanagement
Not checked
Scope creep. Tokens or tools accumulate more permission than the task needs, so one credential opens everything. Read the OWASP entryScope creep
Not checked
Tool poisoning. An edited tool definition or description changes what the server does — or steers the agent. Read the OWASP entryTool poisoning
Not checked
Supply chain. The binary or image you run is not the one the vendor built. Read the OWASP entrySupply chain
Not checked
Command injection. Tool arguments reach a shell or interpreter and execute. Read the OWASP entryCommand injection
Not checked
Intent subversion. Injected content steers the agent into valid calls the user never intended. Read the OWASP entryIntent subversion
Not checked
Auth & authorization. Requests reach tools without a verified identity or sufficient permission. Read the OWASP entryAuth & authorization
Not checked
Audit & telemetry. You cannot reconstruct what the agent did — or your traces leak what it did. Read the OWASP entryAudit & telemetry
Not checked
Shadow servers. MCP servers running in your organization that nobody inventoried or vetted. Read the OWASP entryShadow servers
Not checked
Context over-sharing. One server or context window serves multiple tenants and leaks between them. Read the OWASP entryContext over-sharing
Not checked

Architecture fully closes one risk: typed GraphQL operations remove the shell from the request path for MCP05. For MCP03 and MCP06, typed operations bound the blast radius; they do not eliminate model-side steering or source-control trust.

Step 3 of 4 · What no command answers

Name the owner. Set the cadence.

0of 6 owned

The nine checks above are things a command can prove. These six are things only a person can promise: recurring reviews and org-level facts that drift silently unless someone is accountable for them. A row counts as owned only when it's confirmed andhas both an owner and a cadence — ticking the box alone isn't a commitment. Two rows are the entire audit for their risk: MCP09 and MCP10 have no config check, so the coverage table and exported report score them from this register alone. Scope review, source access, and redaction-review rows also keep MCP02, MCP03, and MCP08 open until their recurring owner is named.

MCP02
MCP02
MCP08
MCP03
MCP09
MCP10

Step 4 of 4 · Take the evidence with you

Your audit is a handoff, not a score.

Export a plain Markdown record for the deployment ticket, review, or incident-readiness folder. No audit data leaves this browser.

The JSON result follows the public result schema and references the same versioned audit definition.

These become the report header. A report that doesn't say who audited what, and where, can't be trusted or re-run later — blank fields export as “Not recorded.”