Atlas / MCP servers / saagpatel / MCPAudit

MCPAuditBLOCK

mcp/saagpatel/mcpaudit

Audit all locally configured MCP servers for permission risks, prompt injection threats, and schema drift

Verdict
BLOCK
Grade
F
Trust score
41 /100
Exposed tools
5 3r · 2w · 0d
Transport
stdio · streamable-http
License
MIT
Stars
4
01

Overview

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

[](https://pypi.org/project/mcp-audits/) [](https://pypi.org/project/mcp-audits/) [](https://github.com/saagpatel/MCPAudit/actions/workflows/ci.yml) [](https://github.com/saagpatel/MCPAudit/actions/workflows/codeql.yml) [](LICENSE)

See what your AI tools' MCP servers can reach.

MCPAudit reviews MCP server configuration and, when asked, lists the tools a server exposes. It highlights declared capabilities, instruction-shaped text heuristics, and changes from a saved pin so you can decide what to investigate. Findings are review signals: a high score means broader capability exposure, not that a server is malicious or unsafe.

[!IMPORTANT] The package is mcp-audits; the command is mcp-audit. The default check is static. check --connect and legacy scan can start configured local programs or contact configured endpoints. Package verification, downloads, and LLM analysis are separate opt-in operations. MCPAudit does not edit configs, and reports environment variable key names, never their values. Review generated reports before sharing them.

Try it

mcp-audit                              # static review of supported configs
mcp-audit check --config ./mcp.json    # review this file only; no connections
mcp-audit demo                         # see a bundled synthetic example
mcp-audit explain MCP007         
Read from source at commit 134a36f1934bOBSERVED · 2026-10-11
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. Replace the environment placeholders with a token scoped to the least it needs.

claude-code (pypi)
claude mcp add mcp-audits -- uvx mcp-audits==2.9.0 serve
03

Exposed tools (5)

3 read · 2 write · 0 destructive.

ToolRiskDescription
execute_commandwriteRun a shell command and return its output.
pingreadReturn a JSON object as text.
read_filereadRead a file from disk at the given path.
statusread🙂
write_filewriteWrite content to a file at the given path.
04

Trust audit

BLOCKgrade F · trust 41/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 surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (11 observation(s))
Network
declared (9 observation(s))
Shell
declared (1 observation(s))
Dependencies
pinned
Secrets in source
found

Findings (25)

HIGHCode injection · code.deserialize · CWE-78, CWE-94, CWE-95
src/mcp_audit/pinning.py:1228
raw: Any = yaml.load(data.decode("utf-8"), Loader=_NoAliasSafeLoader)  # noqa: S506 - loader subclasses SafeLoader
Why it matters. deserialises untrusted bytes into live objects
Fix. use json or yaml.safe_load
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
src/mcp_audit/integrity.py:98
home / ".netrc",
Why it matters. touches a credential store
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
src/mcp_audit/proof_observer.py:59
".netrc",
Why it matters. touches a credential store
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
src/mcp_audit/proof_observer.py:64
"id_ecdsa",
Why it matters. touches a credential store
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
src/mcp_audit/proof_observer.py:65
"id_ed25519",
Why it matters. touches a credential store
HIGHFilesystem / path · fs.credential_store · CWE-22, CWE-59
src/mcp_audit/proof_observer.py:66
"id_rsa",
Why it matters. touches a credential store
HIGHNetwork egress · net.tls_off · CWE-200, CWE-319
src/mcp_audit/provenance.py:51
"--insecure",
Why it matters. certificate verification is disabled
Fix. leave verification on
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/generate_oauth_transcript_fixtures.py:23
REDIRECT = "http://127.0.0.1:43119/callback"
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/generate_oauth_transcript_fixtures.py:24
REDIRECT_OTHER = "http://127.0.0.1:43119/other"
MEDIUMNetwork egress · net.raw_ip · CWE-200, CWE-319
scripts/generate_oauth_transcript_fixtures.py:25
REDIRECT_EPHEMERAL = "http://127.0.0.1:49152/callback"
MEDIUMObfuscation / stealth · obf.anti_debug · CWE-506, CWE-94
src/mcp_audit/analysis_budget.py:46
sys.settrace(trace)
MEDIUMObfuscation / stealth · obf.anti_debug · CWE-506, CWE-94
src/mcp_audit/analysis_budget.py:52
sys.settrace(previous)
MEDIUMHard-coded secrets · secret.aws · CWE-798, CWE-321
tests/fixtures/configs/cfg_secrets.json:13
"AKIAABCDEFGHIJKLMNOP",
MEDIUMHard-coded secrets · secret.aws · CWE-798, CWE-321
tests/test_redaction.py:84
"AKIAABCDEFGHIJKLMNOP",
MEDIUMHard-coded secrets · secret.aws · CWE-798, CWE-321
tests/test_redaction_surfaces.py:42
"AKIAABCDEFGHIJKLMNOP",
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
tests/fixtures/redaction/final-round.json:37
"text": "postgresql://app:p@[email protected]:5432/app",
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
tests/fixtures/redaction/final-round.json:41
"text": "mysql://app:p@[email protected]:5432/app",
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
tests/fixtures/redaction/final-round.json:45
"text": "redis://app:p@[email protected]:5432/app",
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/test_redacted_excerpt.py:100
secret = "abcdefghijklmnopqrstuvwxyz0123456789"
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/test_redacted_excerpt.py:179
secret = "abcdefghijklmnopqrstuvwxyz0123456789"
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
tests/fixtures/configs/cfg_secrets.json:7
"ghp_SECRETVALUE1234567890abcdefABCDEF12",
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
tests/test_redacted_excerpt.py:129
"ghp_abcdefghijklmnopqrstuvwxyz0123456789",
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
tests/test_redacted_excerpt.py:151
("ghp_abcdefghijklmnopqrstuvwxyz0123456789", "vwxyz"),
MEDIUMHard-coded secrets · secret.github · CWE-798, CWE-321
tests/test_redaction_surfaces.py:37
"ghp_SECRETVALUE1234567890abcdefABCDEF12",
MEDIUMHard-coded secrets · secret.slack · CWE-798, CWE-321
tests/fixtures/configs/cfg_secrets.json:12
"xoxb-SLACKSECRET-123456",

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 134a36f1934bfull audit observations/trust-audit/mcp-server/saagpatel__mcpaudit.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-11134a36f1934bBLOCKF41first audit
06

Questions

What is the MCPAudit MCP server?

Audit all locally configured MCP servers for permission risks, prompt injection threats, and schema drift

What tools does MCPAudit expose?

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

Is MCPAudit safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (41/100) and found 7 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 MCPAudit need?

It reads ANTHROPIC_API_KEY and MCP_AUDIT_PIN_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does MCPAudit run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on PyPI as mcp-audits.

How current is this page?

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

Advertisement