Skip to main content
Glama

Scepter

Is this MCP server alive, maintained, and safe to use?

MCP health (Scepter checking itself: scepter badge scepter-mcp --npm)

Scepter demo

More than half of published MCP servers are already dead, and only a fraction of the tens of thousands out there are actively maintained. Developers wire them into their AI agents without knowing which ones are abandoned, unmaintained, or risky. Scepter answers that question in one command.

npx scepter-mcp check owner/repo

Install

# run without installing
npx scepter-mcp check <server>

# or install the command globally
npm install -g scepter-mcp
scepter check <server>

Requires Node 18 or newer. No runtime dependencies.

Related MCP server: MCP Security Gateway

Usage

Check one server, by GitHub repo or npm package:

scepter check owner/repo
scepter check https://github.com/owner/repo
scepter check some-mcp-server
scepter check @scope/name

Scan every server in an MCP config file:

scepter scan ./mcp.json
  HEALTHY  88  owner/weather-mcp
  CAUTION  61  another/mcp-thing
  RISKY    22  abandoned/old-mcp

  1 healthy   1 caution   1 risky

Options:

Flag

Effect

--github

read the target as a GitHub repo

--npm

read the target as an npm package

--json

print JSON instead of a report

-h, --help

show help

Set GITHUB_TOKEN in your environment to raise the GitHub API rate limit.

Exit code is 1 when the verdict is risky, so you can use Scepter in CI.

Track health over time, not just a snapshot

Every check logs its score to ~/.scepter/history. The next time you check the same target, the report shows what changed:

  SCORE 92/100 · HEALTHY
  ▲ +6 pts since last check (3d ago, was 86/100)
  ▁▃▅▆▇▇  6 checks recorded

If the verdict itself flips (healthy → caution, say), that's called out explicitly, not left for you to notice by comparing two numbers.

Watch a server instead of remembering to re-check it

scepter watch owner/repo --interval=60

Re-checks the target on a schedule (default every 30 minutes) and prints one line per tick, same history file check reads its trend from. When a verdict actually changes, it's flagged inline instead of scrolling past silently:

  Watching owner/repo every 60m. Ctrl+C to stop.

  14:02:11  HEALTHY  92/100
  15:02:14  HEALTHY  90/100
  16:02:09  CAUTION  61/100  ← changed
    owner/repo moved from healthy to caution (90 → 61/100).

Useful for a server you've already wired into an agent and want to know the moment it starts to rot, instead of finding out when a tool call fails.

Add a health badge to your README

scepter badge owner/repo

Prints a copy-paste Markdown badge:

[![MCP health](https://img.shields.io/badge/MCP_health-94%2F100_healthy-brightgreen)](https://github.com/owner/repo)

See what your agent actually calls

Static checks tell you if a server looks healthy. wrap tells you how it really behaves. Put Scepter in front of the real server in your MCP client config:

{
  "mcpServers": {
    "weather": {
      "command": "npx",
      "args": ["-y", "scepter-mcp", "wrap", "--", "npx", "-y", "@scope/weather-mcp"]
    }
  }
}

Scepter forwards every byte unchanged, so your agent works exactly as before, while recording each tool call, its result, timing, and any error locally under ~/.scepter. Then:

scepter report
  Recent MCP sessions   (2)

  SERVER                        CALLS   ERR    AVG    SLOW
  weather-mcp                      42     3    88ms   310ms
  files-mcp                        17     0    12ms    40ms

  Heads up
  - weather-mcp failed 3 of 42 calls (last: "upstream timeout"). Check it: scepter check weather-mcp

Nothing leaves your machine.

Inspect what a server actually hands your agent

check reads metadata. inspect starts the server, completes the MCP handshake and audits the live tool list, the exact text your agent will read:

scepter inspect -- npx -y @playwright/mcp@latest
  @playwright/mcp (live, MCP 2025-06-18)

  ✓ Tools        25 tools, 25 with safety annotations
  ✓ Context      ~5,072 tokens of tool definitions on every turn
  ✓ Pinned       first inspection, tool list pinned for next time
  ✓ Tool audit   no poisoned or unmarked destructive tools

  HEALTHY

Check

What it catches

Tool poisoning

descriptions or parameter docs that tell the model to hide things from you, ignore earlier instructions, read SSH or cloud keys, or redirect other tools

Hidden text

invisible Unicode (format and control characters); a message smuggled in Unicode tag characters is decoded and shown to you

Unmarked destructive tools

tools named like delete_*, exec, drop_* without a destructiveHint, so clients won't ask before running them

Context cost

how many tokens the tool definitions take on every turn, before you type anything; over 50,000 is flagged

Runtime reach

for Node servers, which powerful built-ins the server actually loads while starting: process spawning, networking, file system. What it brought along, not just what its tool list claims

Rug pulls

every tool is pinned to a hash in ~/.scepter/pins; the next inspect reports any tool whose description or schema silently changed

Measured on 11 Oct 2026:

Server

Tools

Annotated

Context per turn

@modelcontextprotocol/server-filesystem

14

14

~3,300 tokens

@playwright/mcp

25

25

~5,100 tokens

chrome-devtools-mcp

30

30

~6,600 tokens

@wonderwhy-er/desktop-commander

26

26

~14,400 tokens

Remote servers work the same way, over Streamable HTTP:

scepter inspect https://mcp.deepwiki.com/mcp
scepter inspect https://example.com/mcp --header "Authorization: Bearer $TOKEN"

The audit is pattern-based and runs entirely on your machine: no account, no API, nothing uploaded. Exit code is 1 on a risky verdict, so it works in CI.

Audit your whole MCP setup

One server can look fine on its own and still be dangerous next to another. audit starts every server in a config (stdio and remote, with their own env and headers), inspects each one, then looks for toxic flows: one tool that reads untrusted content, one that reads private data, and one that can send data out. Together they let a malicious web page or issue steer your agent into leaking your files.

scepter audit ~/.cursor/mcp.json
scepter audit            # no path: finds the MCP configs of the common desktop and coding clients itself

A real setup of six popular servers, 11 Oct 2026:

  HEALTHY filesystem  14 tools, ~3,279 tokens
  HEALTHY playwright  25 tools, ~5,072 tokens
  HEALTHY chrome-devtools  30 tools, ~6,597 tokens
  HEALTHY desktop-commander  26 tools, ~14,396 tokens
  HEALTHY deepwiki  3 tools, ~385 tokens
  HEALTHY context7  2 tools, ~1,307 tokens

  Together: 100 tools, ~31,036 tokens of context on every turn

  ! Toxic flow  content from outside can steer the agent to read private data and send it out
    reads untrusted content: playwright/browser_navigate, playwright/browser_navigate_back, chrome-devtools/navigate_page
    reads private data:      filesystem/read_file, filesystem/read_text_file, filesystem/read_media_file +10
    can send it out:         playwright/browser_file_upload, chrome-devtools/upload_file

  CAUTION

Every server here is well built. The risk only exists in the combination, which is exactly what a per-server scanner can't see.

audit also flags cross-server shadowing: a tool whose description names another server's tool (say, a calculator that mentions send_email) is trying to steer how your agent uses a tool it doesn't own.

Let your agent check servers itself

Scepter also runs as an MCP server, so your agent or any MCP client can check a server before wiring it in:

{
  "mcpServers": {
    "scepter": { "command": "npx", "args": ["-y", "scepter-mcp", "serve"] }
  }
}

It exposes four tools, each with a title, safety annotations and a structured output schema:

Tool

Input

Returns

check_server

target (owner/repo or npm package), optional source

score, verdict and signals for one server

scan_config

path to an MCP config file, optional source

the same for every server in that config

inspect_server

command + args, or a url

live tool audit: poisoning, unmarked destructive tools, context cost, changes

audit_config

path to an MCP config file

every server inspected, plus toxic flows across them

inspect_server and audit_config start the servers they examine, so they are not marked read-only: your client will ask before the agent launches anything.

What it checks

Signal

Weight

Reads

Activity

35

last publish (npm) or last push (GitHub)

Maintained

20

archived flag, license, releases, link back to source

Provenance

15

stars, maintainers, open issues, description

MCP fit

10

whether it declares itself an MCP server

Security

20

known advisories, via GitHub's advisory database

A known critical advisory overrides everything else: the verdict is risky regardless of how well-maintained the project otherwise looks. Couldn't reach the advisory API? That's reported as "could not check", not silently treated as "no advisories" -- Scepter never claims more certainty than it has.

What it does not do (yet)

Scepter does not sandbox the server, watch its network calls, or judge what a tool does at runtime beyond its declared description and annotations. Pattern checks can miss a cleverly worded poisoned description. Scepter never claims a server is "safe" or "undetectable", only what it can observe.

Roadmap

  • v1: health and trust check from metadata (check, scan, badge)

  • v2: see which servers your agent actually calls, and their failures (wrap, report)

  • v2.5: live audit of the tool list: poisoning, unmarked destructive tools, context cost, rug-pull pins (inspect)

  • v2.7: whole-setup audit with toxic flows, remote HTTP servers, and every check available to agents as an annotated MCP tool (audit)

  • v2.8: config auto-discovery, runtime reach, decoded hidden messages, cross-server shadowing, context-cost warnings (this release)

  • v3: full traces, per-task cost, and replay, with the health check as one view

License

MIT

Available Tools

4 tools
audit_configAudit a whole MCP setupA

Start every server in an MCP config file, audit each one like inspect_server, and report toxic flows: combinations of tools that read untrusted content, read private data, and send data out.

NameRequiredDescriptionDefault
pathYesPath to the MCP config file

Output Schema

NameRequiredDescription
flowNo
serversYes
verdictYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations mark this readOnlyHint=false, destructiveHint=false, openWorldHint=true, and the description explains why: it starts (launches) every server, a real side effect on the environment. It also discloses the analytical output — toxic-flow combinations of untrusted-read/private-read/data-egress tools. It omits failure/timeout handling and any auth or resource expectations for launching many servers at once.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the action, then the mechanism, then the payoff. The enumeration of toxic-flow conditions is the only length and it is doing real work, so nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and the description still previews the key finding (toxic flows). It covers the launch-and-audit pipeline adequately; only edge behavior when a server cannot start or hangs is unaddressed for a tool that spins up many processes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With a single parameter at 100% schema description coverage, the schema already defines 'path' as the MCP config file. The description only repeats the same concept ('in an MCP config file') without adding format, path resolution, or relative-vs-absolute details, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (audit) over a specific resource (every server in an MCP config file) and what it produces (report of toxic flows). It also pinpoints the scope boundary against a sibling by saying it audits 'each one like inspect_server', so an agent knows this is the whole-config version, not the single-server one.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'audit each one like inspect_server' frames this as the batch counterpart to inspect_server, giving clear usage context. It stops short of an explicit rule ('use inspect_server for one server, audit_config for a whole file') and never mentions check_server or scan_config, so the sibling routing is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

check_serverCheck an MCP server's healthA
Read-only

Check whether one MCP server is alive, maintained, and safe to use, from its npm package or GitHub repo. Returns a 0-100 score, a verdict (healthy, caution, risky), and the signals behind it.

NameRequiredDescriptionDefault
sourceNoForce how the target is read. Omit to auto-detect.
targetYesGitHub repo (owner/repo or URL) or npm package name

Output Schema

NameRequiredDescription
scoreYes
reasonsNo
verdictYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so the agent knows this is a safe outbound read. The description usefully names what is assessed (liveness, maintenance, safety) and the output shape (0-100 score, verdict, signals), but adds nothing about network cost, latency, or failure behavior when the target is unreachable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, front-loaded with the purpose before the return shape; nothing is wasted. Slight redundancy in enumerating return values when a full output schema already exists keeps it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With annotations, a 100%-covered two-parameter schema, and an output schema handling return values, the description covers what the tool is and what it produces. The remaining gap is sibling differentiation, which matters here because three other tools operate on MCP configurations/servers.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, including the enum and the auto-detect note on 'source'. The phrase 'from its npm package or GitHub repo' restates what the schema already encodes, adding no new format or constraint detail. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource with scope: checking whether ONE MCP server is 'alive, maintained, and safe to use' from an npm package or GitHub repo. Clear, but it never distinguishes itself from the sibling inspect_server, which sounds like a near-neighbor operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied: single-server checks sourced from npm or GitHub. There is no explicit when-to-use/when-not statement and no routing between this tool, inspect_server, audit_config, or scan_config, so the agent must infer the boundary.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

inspect_serverAudit a live MCP serverA

Start an MCP server (stdio command, or a Streamable HTTP url), read its tool list, and audit it: poisoned tool descriptions, destructive tools without a destructiveHint, context cost in tokens, and tools that changed since the last inspection.

NameRequiredDescriptionDefault
urlNoStreamable HTTP endpoint, instead of command
argsNoArguments, e.g. ["-y", "some-mcp-server"]
commandNoExecutable for a stdio server, e.g. npx

Output Schema

NameRequiredDescription
toolsNo
serverYes
verdictYes
findingsNo
contextTokensNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false (consistent with spawning a process), openWorldHint=true, and destructiveHint=false, so the safety profile is largely covered. The description adds real value on top: it discloses that a server process is launched, that the tool compares against the previous inspection (implying persisted state), and that it flags poisoned descriptions and missing destructiveHint - details the annotations cannot convey. It stays silent on network/auth implications of the open world.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with the action first and the audit dimensions collected in a colon list - no filler and no redundancy. Slightly dense, but every clause adds a distinct capability rather than restating the name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the return shape needn't be explained, and the description covers inputs, the act of inspection, and the categories of findings. The only residual gap is the statefulness implied by 'changed since the last inspection' - where that baseline is stored and whether it must be primed - which is left unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so command, args, and url are already documented in the schema. The description reinforces the two input modes (stdio command vs Streamable HTTP url) and mirrors the schema's own example, but adds no syntax or format detail beyond it. Baseline 3 applies when the schema carries the parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a concrete verb and resource: it starts an MCP server (stdio command or Streamable HTTP url), reads its tool list, and audits it. It even enumerates the audit dimensions, so the agent knows exactly what output to expect. What it lacks is differentiation from the sibling check_server or audit_config - the reader can't tell from the text alone which of these to reach for.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The mechanics of use are implied clearly (start the server either via a stdio command or a URL, then audit), but there is no explicit when-to-use, when-not-to-use, or pointer to the alternatives among audit_config, check_server, and scan_config. Given three similarly-named siblings, the routing burden is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

scan_configCheck every server in a configA
Read-only

Run check_server on every npm-launched MCP server listed in an MCP config file (for example mcp.json).

NameRequiredDescriptionDefault
pathYesPath to the MCP config file
sourceNoForce how the target is read. Omit to auto-detect.

Output Schema

NameRequiredDescription
resultsYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful context by disclosing that it delegates to check_server and is limited to npm-launched servers, but that npm-only scope sits in tension with the source enum offering 'github', and no cost/latency or partial-failure behavior is described for a fan-out operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the core action and resource, with the example file name appended as low-cost clarification. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the delegated check_server behavior is stated. What is missing is what happens for non-npm entries or when only part of the config fails, which matters for a fan-out scan.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so path and source are already documented with an enum for source, giving a baseline of 3. The description contributes nothing about parameter meaning beyond what the schema states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a concrete action (run check_server) and its scope (every npm-launched MCP server in a config file, e.g. mcp.json), which an agent can distinguish from check_server's single-target behavior. It does not, however, differentiate itself from the sibling audit_config, which appears to operate on the same config-file resource.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: this is the batch counterpart to check_server, so the agent can infer when to pick it. There is no explicit when-to-use guidance and no mention of when audit_config would be preferable, leaving a real ambiguity between config-level siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updates
    • First observedaudit_config
    • First observedcheck_server
    • First observedinspect_server
    • First observedscan_config

TDQS

A3.6/5.0

Scored across 4 tools

Disambiguation4/5

audit_config, check_server, and scan_config overlap somewhat: audit_config and scan_config both operate on config files and spawn servers, but audit_config focuses on toxic flows while scan_config runs check_server. check_server and inspect_server are fairly distinct (npm/repo health vs. live server tool-list audit) but both 'audit' a server, which could cause some confusion.

Naming Consistency3/5

Two patterns coexist: <verb>_config (audit_config, scan_config) and <verb>_server (check_server, inspect_server). Within groups it's consistent, but the mix of _config and _server targets alongside two different verbs for auditing makes the scheme only partially predictable.

Tool Count4/5

Four tools for a focused audit/scanning domain is lean but reasonable, each earning a place. It sits at the lower boundary of well-scoped rather than heavy.

Completeness3/5

Core flows—inspecting a single server, checking a package/repo, scanning and auditing a config—are covered. However there's no way to get/review prior inspection reports individually, diff drift over time, or audit a URL-based config comprehensively, leaving some lifecycle gaps.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    A continuous, out-of-band trust and reliability layer for the MCP ecosystem. It fingerprints MCP server tool definitions, detects and classifies drift (e.g., rug pulls) via a severity taxonomy, maintains a hash-chained evidence ledger, and gates CI with SARIF—while also acting as an MCP server itself so agents can check a server's safety before binding.
    Apache 2.0
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables safe use of any MCP server by proxying and live-scanning all tool requests and responses, blocking or redacting poison descriptions, indirect prompt injection, malicious arguments, and unauthorized destinations.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables searching and comparing cataloged MCP servers by capability, retrieving installation snippets and trust reports, and checking a ledger of requested abilities through MCP tools.
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    This MCP server lets agents inspect every Model Context Protocol server on the machine, verify tools by running them in a sandbox, and check each call against a human-approved baseline so that changed or newly appeared tools are blocked before they execute. It also surfaces token cost, capability facts, and drift history for each tool entirely locally, without uploading inventory or requiring an account.
    555 PyPI
    1
    Apache 2.0