Common failures when pointing mcp-observatory at an MCP server, and what to do
about them.
Every example below uses scan, but the same applies to score, test and
check — they all launch the target the same way.
The target command isn't on PATH. Either install the server, or let npx
fetch it:
mcp-observatory scan npx -y @modelcontextprotocol/server-filesystem /tmpIf you're pointing at a local build, give the interpreter and an absolute path rather than relying on the shell:
mcp-observatory scan node /abs/path/to/server/dist/index.jsThe entry point isn't executable, or a path in the server's arguments isn't readable by your user.
chmod +xthe entry script if it's invoked directly.- Check the directories you pass as server arguments are readable.
- Don't reach for
sudo. Running an untrusted MCP server as root hands it root, which is exactly the risk this tool exists to measure.
Only affects servers that bind a port (HTTP targets, or mcp-observatory serve).
Something is already listening — usually a previous run that didn't exit.
# find it, then stop it
lsof -i :3000 # macOS / Linux
netstat -ano | findstr :3000 # WindowsMost often a missing required environment variable — many servers exit on startup when a key is absent. See Tool listing returns empty below.
The default per-target timeout is 10 seconds (runner.ts), and a slow
npx cold start alone can eat that.
There is no --timeout CLI flag on scan / score / test. The timeout is
a per-target field in a target config file, which you pass with --target:
{
"targetId": "my-server",
"adapter": "local-process",
"command": "npx",
"args": ["-y", "my-mcp-server"],
"timeoutMs": 30000
}mcp-observatory scan --target ./my-server.jsontimeoutMs works for both local-process and http adapters.
Other things to check:
- Warm the package cache first.
npx -y my-mcp-serveron a cold cache downloads before it starts; run it once by hand so the download isn't inside the timed window. - HTTP targets: confirm the URL is reachable from this machine, and that any
authToken/headersin the config are correct — some servers hang rather than reject when auth is missing.
A server that starts but advertises nothing is nearly always missing configuration.
-
Required environment variables. API keys, config paths, workspace roots. Put them in the target config so the run is reproducible:
{ "targetId": "my-server", "adapter": "local-process", "command": "npx", "args": ["-y", "my-mcp-server"], "env": { "MY_API_KEY": "${MY_API_KEY}" } }${VAR}is expanded from your environment, so no secret is written to the file. -
Try the server standalone first. If it doesn't list tools outside
mcp-observatory, the problem is the server or its config, not the scan:npx -y my-mcp-server
-
Read the raw evidence. There is no
--verboseflag; use the JSON output, which carries per-check evidence and any fatal error the run captured:mcp-observatory scan --format json npx -y my-mcp-server
-
Some servers only expose tools after a workspace argument (a directory, a repository, a database URL). Check the server's own README for required positional arguments.
Usually the upstream API a server wraps, not mcp-observatory itself.
- Scans invoke tools when
--invoke-tools(orscore, which enables it) is used. If the tools call a metered API, each run costs quota. - Use
skipInvoke: truein the target config to check capability listings without calling any tool. - If you're scanning many servers, space the runs out rather than looping
immediately —
watch --interval <seconds>exists for scheduled re-scans.
Include the following when opening an issue:
- the exact command you ran,
mcp-observatory --versionandnode --version,- the JSON output (
--format json), with any secrets redacted.
See CONTRIBUTING.md for how to file a good report.