Atlas / MCP servers / fastly / Fastly

FastlyBLOCK

mcp/fastly/fastly-1

Model Context Protocol (MCP) server for AI-powered Fastly CDN management.

Verdict
BLOCK
Grade
F
Trust score
46 /100
Exposed tools
3 2r · 1w · 0d
Transport
streamable-http
License
MIT
Stars
39
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

The Fastly MCP server lets MCP clients work with the Fastly API.

Connect it to an assistant such as Claude Desktop, Claude Code, Gemini CLI, Opencode, Qwen Code, Cline, or Swival, and give it a Fastly API token. The assistant can then:

  • Look up services and inspect domains and TLS settings.
  • Check traffic and usage.
  • Manage dictionaries and ACLs.
  • Purge content and make configuration changes when you ask it to.

This project is actively developed and has Tier 1 Fastly open-source support. The support policy is described in Fastly's open-source documentation.

Questions and feedback are welcome on the Fastly developer tools community forum.

Contents

  • How it works
  • Requirements
  • Installation
  • Running over HTTP
  • Running a remote service for several users
  • Using the server well
  • Secret encryption
  • Troubleshooting
  • Local development
  • Security
  • License

How it works

Most MCP servers expose one tool for each operation. Because Fastly's API is large, this server uses a smaller set of tools that an assistant can use together.

  1. Start with search to find API methods by keyword, method name, API class, or HTTP path.
  1. Then use inspect to get a method's documentation, including its parameters, return type, and an example.
  1. Once you have the details, use execute to run a short JavaScript snippet with the Fastly client already set up with your API token.

This keeps the tool list small while still covering every method documented in the bundled Fastly client docs.

Requirements

Runtime

Install either [Bun](https://b

Read from source at commit 4bbb02b5150cOBSERVED · 2026-10-08
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control.

claude-code
claude mcp add mcp -- npx -y @fastly/[email protected]
claude-desktop
{
  "mcpServers": {
    "mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@fastly/[email protected]"
      ]
    }
  }
}
03

Exposed tools (3)

2 read · 1 write · 0 destructive.

ToolRiskDescription
executewrite
inspectread
searchread
04

Trust audit

BLOCKgrade F · trust 46/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (2 observation(s))
Network
declared (6 observation(s))
Shell
declared (3 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHNetwork egress · net.metadata_ip · CWE-200, CWE-319
deploy/fastly-mcp.service:57
IPAddressDeny=169.254.169.254 fd00:ec2::254
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
HIGHNetwork egress · net.metadata_ip · CWE-200, CWE-319
deploy/metadata-deny-docker.nft:18
define METADATA_V4 = { 169.254.169.254 }
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
scripts/bench-secrets.js:243
console.log(`Secret shield benchmark under ${runtime}\n`);
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
Dockerfile:43
CMD ["bun", "--eval", "const r = await fetch('http://127.0.0.1:8231/healthz'); process.exit(r.ok ? 0 : 1)"]
MEDIUMObfuscation / stealth · obf.anti_debug · CWE-506, CWE-94
src/host-checks.js:37
`Remote mode needs the Yama ptrace restriction, but ${YAMA_PATH} cannot be read. ` +
MEDIUMHard-coded secrets · secret.anthropic · CWE-798, CWE-321
test/secrets.test.js:21
"sk-ant-api03-q8ZrT2mXw7LpK4vN9cYb3HsJ6dFg1RtU5eWo0iPa-_Qz8XyV2nMb7CkL4jHg9DfS3aWe6RtY1uIo5pZx0cVb";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
test/remote-http.test.js:483
const token = "synthetic-token-restricted";
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
test/helpers.js:8
export const GITHUB_PAT = "ghp_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghij";
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
test/http.test.js:934
const GITHUB_PAT = "ghp_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghij";
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
test/remote-helpers.js:60
export const UPSTREAM_SECRET = "ghp_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghij";
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
test/remote-secrets.test.js:10
const GITHUB_PAT = "ghp_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghij";
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
test/secrets.test.js:11
const GITHUB_PAT = "ghp_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghij";
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
docs/TlsPrivateKeysApi.md:31
tls_private_key: {"data":{"type":"tls_private_key","attributes":{"key":"-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n","name":"My private key"}}},
MEDIUMHard-coded secrets · secret.slack · CWE-798, CWE-321
test/remote-secrets.test.js:11
const SLACK_BOT = "xoxb-12345678-12345678-siXA";
MEDIUMHard-coded secrets · secret.slack · CWE-798, CWE-321
test/truncate.test.js:10
slack: "xoxb-1234567890-9876543210-AbCdEfGhIjKlMnOpQrStUvWx",
MEDIUMHard-coded secrets · secret.stripe · CWE-798, CWE-321
test/remote-secrets.test.js:12
const STRIPE_LIVE = "sk_live_F9ZJz11XNvB3i0RhazAEAbGJdznewI9VguEStDdFtyHK";
MEDIUMAuth / authz · mcp.remote_no_auth · CWE-287, CWE-862
streamable-http
Why it matters. a network transport with no auth environment variable found
Fix. require a token
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
test/fixtures/remote-server.mjs:10
import { resolveExecutionRuntime } from "../../src/execution-runtime.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
test/fixtures/remote-server.mjs:11
import { runCli } from "../../src/main.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
test/fixtures/run-execute-under-node.mjs:5
import { execute } from "../../src/tools/execute.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
test/fixtures/run-sandbox-under-node.mjs:5
import { SANDBOX_PATH } from "../../src/tools/execute.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
test/fixtures/sandbox-with-mock-fastly.mjs:24
await import("../../src/sandbox.js");
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
REMOTE-HTTP.md:132
The supplied rules cover `169.254.169.254` and `fd00:ec2::254`.
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
REMOTE-HTTP.md:267
docker compose exec fastly-mcp bun -e 'await fetch("http://169.254.169.254/", { signal: AbortSignal.timeout(3000) }).then(() => console.log("REACHABLE"), (e) => console.log("blocked", e.code ?? e.name
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
REMOTE-HTTP.md:274
sudo -u fastly-mcp curl -v --max-time 3 http://169.254.169.254/
Why it matters. cloud metadata endpoint: the classic SSRF credential grab

Gates applied: no_behavioural_pass.

Audited 2026-10-08 · audit v0.4.1 · source sha 4bbb02b5150cfull audit observations/trust-audit/mcp-server/fastly__fastly-1.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-084bbb02b5150cBLOCKF46first audit
06

Questions

What is the Fastly MCP server?

Model Context Protocol (MCP) server for AI-powered Fastly CDN management.

What tools does Fastly expose?

3 in total: 2 read-only, 1 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is Fastly safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (46/100) and found 2 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does Fastly need?

No credential environment variables were found in its source, so it appears to need none.

How does Fastly run?

It speaks streamable-http, so it runs as a service you connect to over the network. It is published on npm as @fastly/mcp at 2.3.0.

How current is this page?

The grade is for one exact copy of the source (4bbb02b5150c), read on 2026-10-08. The repository is watched and re-audited when it changes.

Advertisement