← All MCP servers
MCP server

microservices.sh

mcp:microservices-sh/mcp

MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.

Verdict
Suspicious

Risky behavior the analysis could not rule out.

Analyzed Oct 26, 2026, 11:56 UTC at f87778c
3
findings
high
highest severity
3
threat classes
22
files scanned
356/356
checks satisfied
0
package advisories

Why this verdict

  • suspicious: finding mcp-server:.:dist/index.js:3071:CRED
  • suspicious: finding mcp-server:.:dist/index.js:3071:EXFIL
  • suspicious: unverified finding mcp-server:.:dist/index.js:1628:PRIVESC

Security findings 3

Credential access

highContextual riskmedium confidence

The MCP server reads MICROSERVICES_API_KEY/TOKEN from the environment and attaches it as a Bearer header to a fetch whose base URL can be overridden by the tool-call argument apiUrl, so a prompt-injected or malicious agent call could send the stored API key to an arbitrary host.

apiUrl: String(args.apiUrl ?? env.MICROSERVICES_API_URL ?? DEFAULT_API_URL).replace(/\/+$/, ""),
vector:code
Counter-argument considered

The tool argument apiUrl overrides the base URL while the env-sourced API key is attached as a Bearer header to the same request. A prompt-injected call could therefore send the stored key to an arbitrary host, and no allowlist or mitigation is shown.

Data exfiltration

highContextual riskmedium confidence

The control-plane URL and API key are accepted as agent-supplied tool arguments (apiUrl/apiKey), so a prompt-injected agent could redirect deploy_preview/get_deployment_status requests, which carry the env-sourced Bearer token and project config, to an arbitrary host; the arbitrary-host override is not covered by the declared env-only configuration.

apiUrl: String(args.apiUrl ?? env.MICROSERVICES_API_URL ?? DEFAULT_API_URL).replace(/\/+$/, ""),
vector:code
Counter-argument considered

The agent-supplied apiUrl redirects deploy_preview and get_deployment_status requests, which carry the Bearer token and project config, to any host. Nothing in the code restricts the host.

Privilege escalation

mediumUnverifiedmedium confidence

The scaffold generator emits an auth module mounted on public routes where POST /auth/tokens mints signed tokens for caller-chosen subject and scopes (including gateway.admin) and POST /auth/keys/rotate rotates the signing key, both with no authentication, so any network caller can forge privileged tokens.

authRoutes.post("/tokens", async (c) => {
vector:code
Refuted findings 1

Candidates the review stage examined and rejected, kept for transparency.

Data exfiltration

criticalRefutedlow confidence

The scaffolded project CLI script emitted by this generator sends usage telemetry (template id, module count, module ids, exit codes, durations) to api.microservices.sh (or an env-overridable URL) by default; the telemetry is undeclared in the artifact metadata, and the first-run notice is suppressed in --json mode, which agents typically use.

await fetch(TELEMETRY_API_URL + "/events", {
Why it was refuted

This is anonymous product telemetry (template id, module count) in the scaffolded CLI. It prints an in-tool notice and honors MICROSERVICES_TELEMETRY and DO_NOT_TRACK opt-outs. It carries no credentials or sensitive data, so it is not harmful exfiltration.

Coverage gaps 1

Parts of the artifact the static analysis could not fully examine.

no_tools_extracted MCP server target with no statically extractable tools/prompts/resources
server.json