Skip to main content
Glama
ChristopherValvo

script-decoder-mcp

Script Decoder MCP

A defensive, static-analysis MCP server that explains what a script does — in plain English and with technical evidence — without ever executing it.

Paste a Python, PowerShell, shell, JavaScript, batch, or VBScript script (or a single command line) and get back: a behavior breakdown (network, file, process, persistence, credential-access, discovery, defense-evasion, execution), safely decoded obfuscated content, extracted indicators of compromise, a transparent risk score, and a contextual MITRE ATT&CK mapping — all with source-line evidence and explicit observed/inferred/ possible classifications.

Defensive-use statement: this project performs static analysis only. It never executes, imports, compiles-for-execution, or otherwise runs submitted content. It never sends submitted scripts or decoded content to any third-party service. It is intended for SOC analysts, incident responders, and anyone who needs to understand an unfamiliar or suspicious script before deciding what to do with it — not to enable offensive use.

Features

  • Five MCP tools: analyze_script, decode_blob, extract_indicators, explain_command, compare_scripts.

  • A local browser GUI (see Browser GUI) for the same five analyses, with no MCP client required.

  • Six language analyzers: Python (AST-based), PowerShell, shell (bash/sh/zsh), JavaScript, batch, and VBScript (rule-based).

  • Bounded recursive decoding: Base64, Base32, hex, URL encoding, Unicode escapes, HTML entities, gzip/zlib/bz2, ROT13, reversed strings, PowerShell -EncodedCommand, integer/char-code arrays, simple string concatenation, and explicit-key XOR — chained safely up to a configurable depth, with decompression-bomb protection.

  • IOC extraction: URLs, domains, IPv4/IPv6, emails, file paths, registry keys, hashes, mutex-like strings, user agents, named pipes, scheduled-task/service names, and common cloud resource identifiers — including defanged-notation recognition (hxxp, example[.]com, 10[.]0[.]0[.]1).

  • Transparent, documented risk scoring (0-100) with contributing factors listed in every response — never a black box, never a malware verdict.

  • Conservative, local, offline MITRE ATT&CK mapping.

  • Prompt-injection safe: all submitted and decoded content is treated as inert data, never as instructions, and is explicitly labeled as untrusted in evidence excerpts.

  • Optional, local, disabled-by-default CyberChef-style adapter for a small set of additional decode operations, with no network access and an operation allowlist.

  • No outbound network access is required or performed during analysis.

Related MCP server: KeyboardCrumbs MCP Server

Architecture

See docs/architecture.md for the full breakdown. In short:

MCP client (e.g. Claude Desktop)
        │  stdio (default) or localhost HTTP
        ▼
 server.py (5 MCP tools)
        │
        ├─ analyzers/        language detection + per-language static analysis (AST for
        │                    Python, regex/rule-based for the rest)
        ├─ decoding/         bounded recursive decoding engine, native decoders, optional
        │                    local CyberChef-style adapter
        ├─ extraction/       IOC extraction
        ├─ classification/   risk scoring + ATT&CK mapping
        ├─ reporting/        assembles the final structured response + summaries
        └─ security/         sanitization and trust-boundary helpers

Nothing in this pipeline executes, imports, or evaluates submitted content. See docs/threat-model.md for the full threat model and SECURITY.md for the security policy.

Installation

Requires Python 3.12+.

python -m venv .venv
# Windows: .venv\Scripts\activate    macOS/Linux: source .venv/bin/activate
pip install -e ".[dev]"

Optional: Node.js 18+ if you want to enable the local CyberChef-style adapter (disabled by default; not required for any core functionality).

Local development

pip install -e ".[dev]"
python -m pytest
ruff check .
ruff format --check .
mypy src

Running the server

Default transport is stdio, which is what MCP clients like Claude Desktop expect:

python -m script_decoder_mcp
# or, after `pip install -e .`:
script-decoder-mcp

Set SDMCP_TRANSPORT=http (see .env.example) to run over localhost HTTP instead; it binds 127.0.0.1 by default and is never exposed remotely without explicit additional configuration, which this project does not provide.

Browser GUI

Prefer a browser over an MCP client? There's a local web GUI that calls the exact same analyzer/decoder code as the MCP tools -- it's a thin FastAPI wrapper around reporting/formatter.py, not a separate implementation, so results never drift from the MCP server.

pip install -e ".[web]"
python -m script_decoder_mcp.web.app
# or: make web

Then open http://127.0.0.1:8787. It has one tab per tool (Analyze Script, Decode Blob, Extract Indicators, Explain Command, Compare Scripts), plus "Load good/bad example" buttons that load examples/good_script_benign.py and examples/bad_script_suspicious.py for a quick before/after. Like the MCP server, it binds to 127.0.0.1 only by default (SDMCP_WEB_HOST/SDMCP_WEB_PORT to change), has no authentication, is not meant to be exposed beyond localhost, and never sends anything you paste anywhere beyond your own machine.

Claude Desktop / MCP client configuration

Add to your MCP client config (see examples/claude-desktop-config.example.json and examples/mcp-client-config.example.json):

{
  "mcpServers": {
    "script-decoder": {
      "command": "script-decoder-mcp",
      "args": []
    }
  }
}

If you haven't installed the console script, point command at the venv's Python and args at ["-m", "script_decoder_mcp"] instead.

Tools

analyze_script

Statically analyzes a full script. Input: content (required), language (default auto), filename, decode_embedded_content (default true), include_line_references (default true), analysis_depth (quick/standard/deep, default standard), map_to_attack (default true).

Returns a schema_version-stamped response with summary, plain_language_summary, analyst_summary, verdict, risk_score, risk_factors, behaviors (each with category, title, description, evidence, source_lines, confidence, classificationobserved/inferred/possible — and severity), decoded_artifacts, indicators, imports/functions/commands, suspicious_constructs, attack_techniques, limitations, errors, and analysis_metadata. execution_performed is always false.

decode_blob

Decodes a single encoded/obfuscated value. Input: content (required), encoding_hint, max_depth, use_cyberchef (default false). Returns the detected encodings, every attempted decode chain, the successful chain (if any), decoded text/size/hashes, any indicators found in the decoded text, and warnings. Never claims to decode arbitrary encryption and never brute-forces a password or key.

extract_indicators

Extracts IOCs from arbitrary text or source. Input: content (required). Returns a dictionary of indicator categories, each entry carrying value, normalized_value, type, source_lines, context, confidence, and defanged_value.

explain_command

Explains a single command line. Input: command (required), shell (auto/cmd/powershell/bash/zsh/python, default auto), include_tokens. Returns executable, arguments, pipelines, redirections, environment changes, possible side effects, and suspicious features — never runs the command.

compare_scripts

Diffs two versions of a script. Input: original_content, new_content, language (default auto), decode_embedded_content (default true). Returns added/removed behaviors, changed indicators, newly decoded artifacts, the risk-score delta, and line-level change summary.

Example requests

See examples/sample_requests.md.

CyberChef integration

Disabled by default (SDMCP_CYBERCHEF_ENABLED=false). When enabled, decode_blob (with use_cyberchef: true) can fall back to a small local Node.js worker (cyberchef-worker/index.mjs) for a fixed, allowlisted set of operations: From Base64, From Base32, From Hex, URL Decode, HTML Entity Decode, Gunzip, Zlib Inflate, ROT13, Reverse.

Deviation from the original design: rather than depending on the cyberchef npm package (a large dependency tree), the worker reimplements these named operations using only Node.js built-ins, in a single auditable file. It performs no network access, no filesystem access beyond stdin, and no dynamic code loading. See cyberchef-worker/README.md for details and how to extend it. It is never called against a public CyberChef instance, and native Python decoders remain fully functional with or without it.

Docker

docker compose build
docker compose run --rm script-decoder-mcp

The image runs as a non-root user, uses a multistage build, and does not require network access at runtime. See Dockerfile and docker-compose.yml.

Security model

  • Static analysis only: no eval/exec/compile-for-execution of submitted content, no os.system/shell=True on submitted content, no importing of submitted scripts, no outbound network requests, no DNS resolution, no reputation-service calls.

  • Every resource limit (input size, decode output size, decompression size, recursion depth, candidate branches, analysis duration, indicators per category, evidence excerpt length) is documented in .env.example and enforced in src/script_decoder_mcp/limits.py; a threshold being hit is always reported as a limitation, never silently ignored.

  • All submitted and decoded content is treated as untrusted data, never as instructions — see src/script_decoder_mcp/security/.

  • No secrets are read, stored, or logged. Logging is JSON-structured and never emits full submitted content (see src/script_decoder_mcp/logging_config.py).

  • Full details: docs/threat-model.md, SECURITY.md.

Limitations

  • Static analysis cannot always determine runtime behavior. What a downloaded payload or a dynamically constructed command will actually do when run is not knowable from source alone, and responses/results of any network call are never fetched.

  • Dynamically constructed values (string building, indirect calls) lower analysis confidence and are flagged as inferred or possible, not observed.

  • Risk scoring is a heuristic, not a malware verdict; ATT&CK mapping is contextual evidence, not proof of malicious intent.

  • Batch and VBScript analysis is rule-based (no safe parser exists for either), so it is less thorough than the Python AST analyzer.

  • Encoding/administrative-tool use alone is never enough to mark something malicious.

Supported languages

Python, PowerShell, Bash/sh/zsh, JavaScript, Batch, VBScript, and single command lines (auto, or specify explicitly).

Extending

See docs/adding-an-analyzer.md and docs/adding-a-decoder.md.

Testing

python -m pytest -v

Test fixtures under tests/fixtures/ are inert text — no functional malware, credential-stealing code, persistence payloads, destructive scripts, or live malicious URLs. They use reserved example domains/IPs (example.com, example.invalid, 192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24).

Two ready-to-use manual test scripts are also included: examples/good_script_benign.py (should score low/no risk) and examples/bad_script_suspicious.py (an inert, non-functional script that exhibits several suspicious static patterns — encoded payload, exec, outbound request construction — and should score meaningfully higher). Neither script does anything if actually run; bad_script_suspicious.py is deliberately written so it does not function even if a reader ignored this warning and executed it.

Troubleshooting

  • "No dedicated analyzer is available for language..." — the language could not be detected or was not one of the six supported languages; indicator extraction and decoding still run.

  • CyberChef warnings in decode_blob — expected when SDMCP_CYBERCHEF_ENABLED=false (the default) and use_cyberchef: true was requested anyway; native decoders already cover the same operations.

  • errors populated in analyze_script — usually a Python SyntaxError; the response still includes a best-effort text-based fallback analysis.

Privacy

No submitted script, decoded artifact, or any derived content is ever sent to a third-party service. The optional CyberChef worker runs locally with no network access. No telemetry is collected by default.

Deployment

Intended for local, single-user use via stdio (the MCP-recommended local transport) or containerized via Docker for isolation. The optional HTTP transport binds 127.0.0.1 by default; exposing it beyond localhost is out of scope for this project and would require adding authentication, which is not currently implemented — see docs/threat-model.md for the residual risk this leaves if you choose to do so anyway.

Available Tools

5 tools
analyze_scriptA

Statically analyze a script (Python, PowerShell, shell, JavaScript, batch, or VBScript) without executing it. Returns behaviors, decoded artifacts, indicators, a risk score, and plain-language and analyst summaries. Never runs the submitted content.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYes
filenameNo
languageNoauto
map_to_attackNo
analysis_depthNostandard
decode_embedded_contentNo
include_line_referencesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorsNo
hashesYes
importsNo
summaryYes
verdictYes
commandsNo
filenameYes
languageYes
behaviorsNo
file_sizeYes
functionsNo
confidenceYes
indicatorsNo
line_countYes
risk_scoreYes
analysis_idYes
limitationsNo
risk_factorsNo
schema_versionNo
analyst_summaryYes
analysis_metadataYes
attack_techniquesNo
decoded_artifactsNo
execution_performedNo
language_confidenceYes
suspicious_constructsNo
plain_language_summaryYes

TDQS

A3.6/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states 'Never runs the submitted content', which is the key behavioral guarantee for a static analyzer. It also enumerates what the tool returns, providing useful transparency, though it doesn't cover limitations or edge cases like unsupported languages or input size constraints.

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?

The description is compact and front-loaded with the core action and primary constraint. The only slight redundancy is 'without executing it' followed by 'Never runs the submitted content', which repeats the same idea. Overall it earns its place with no filler.

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

Completeness2/5

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

This is a 7-parameter tool with no annotations and no parameter descriptions in the schema, so the description must provide more operational context. It covers purpose and outputs well but omits guidance on optional parameters like analysis_depth or map_to_attack, making it incomplete for an agent needing to configure a correct call.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate for the 7 parameters, but it only alludes to supported languages, which maps to one parameter. It does not explain content, filename, map_to_attack, analysis_depth, decode_embedded_content, or include_line_references, leaving most parameters underspecified for an agent deciding how to invoke the tool.

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?

The description states a specific verb and resource: 'Statically analyze a script' with an explicit list of supported languages. It also differentiates itself from siblings by emphasizing it does not execute content and returns a distinct set of outputs (behaviors, indicators, risk score). This makes the tool's purpose unmistakable.

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 description clearly implies this tool is for static, non-executing analysis of scripts, but it never explicitly states when to choose it over siblings like decode_blob, extract_indicators, explain_command, or compare_scripts. There is no 'use this instead of X when...' guidance or exclusion criteria, so the usage context is implied rather than explicit.

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

compare_scriptsA

Compare two versions of a script and report added/removed behaviors, changed indicators, newly decoded artifacts, and the risk score delta. Neither script is executed.

ParametersJSON Schema
NameRequiredDescriptionDefault
languageNoauto
new_contentYes
original_contentYes
decode_embedded_contentNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
summaryYes
limitationsNo
schema_versionNo
added_behaviorsNo
removed_behaviorsNo
risk_score_changeYes
changed_indicatorsNo
execution_performedNo
important_line_changesNo
newly_decoded_artifactsNo

TDQS

A3.9/5.0
Behavior4/5

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

No annotations are present, so the description carries the full burden, and 'Neither script is executed' is a valuable safety-relevant disclosure that also implies a non-destructive analysis operation. It additionally previews the report categories the tool produces. It does not cover auth, rate limits, or content-size constraints, but the core behavioral profile is disclosed.

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?

Two sentences with zero filler; the core purpose is front-loaded and the second sentence delivers an independent safety disclosure. Every clause earns its place.

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?

The output schema covers return structure, and the description covers purpose and the key safety behavior, leaving a coherent calling picture. The remaining gaps — parameter semantics and explicit sibling routing — are minor for a well-named tool with self-evident required parameters.

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

Parameters2/5

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

Schema description coverage is 0%, so the description needed to compensate, but it never explains language, original_content, new_content, or decode_embedded_content beyond the faint echo of 'newly decoded artifacts.' The two content string names are self-explanatory, but language auto-detection semantics and decode_embedded_content's on/off tradeoff are left undocumented.

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 ('compare'), resource ('two versions of a script'), and enumerates distinct report categories (added/removed behaviors, changed indicators, newly decoded artifacts, risk score delta). The 'Neither script is executed' clause and diff-focused output clearly differentiate it from analyze_script, decode_blob, and extract_indicators.

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 usage context is implied — an agent holding two versions of a script would naturally reach for a comparison tool — and the non-execution clause hints at safe analysis use. However, the description names no alternatives and gives no explicit when-to-use vs. when-not-to-use guidance or exclusions against siblings.

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

decode_blobA

Safely decode an encoded or obfuscated value (Base64, hex, URL encoding, Base32, Unicode escapes, HTML entities, gzip/zlib/bz2, explicit-key XOR, ROT13, reversed strings, PowerShell -EncodedCommand, integer/char arrays, simple string concatenation) without executing the result.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYes
max_depthNo
encoding_hintNo
use_cyberchefNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
hashesYes
warningsNo
indicatorsNo
decoded_sizeYes
decoded_textYes
decoded_typeYes
schema_versionNo
attempted_chainsNo
successful_chainNo
detected_encodingsNo
execution_performedNo
decoded_text_truncatedYes

TDQS

A3.5/5.0
Behavior3/5

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

The description provides a valuable safety behavior by stating the tool decodes 'without executing the result', which is essential for a decoding utility with no annotations. However, it does not disclose whether recursive/iterative decoding occurs, what max_depth controls, or whether use_cyberchef introduces external calls or data-sharing implications.

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?

The description is front-loaded with the core purpose and safety guarantee, and the long parenthetical list is information-dense rather than filler. It is somewhat run-on and harder to parse, but every listed item communicates supported scope.

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

Completeness3/5

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

The description gives strong coverage of what the tool decodes and that it is non-executing, and an output schema exists to document return values. However, it leaves the optional parameters' semantics and their interactions unexplained, which is a meaningful gap for correct invocation.

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

Parameters2/5

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

With 0% schema description coverage, the description needed to explain parameters like max_depth, encoding_hint, and use_cyberchef, but it does not. It also mentions 'explicit-key XOR' while providing no key parameter in the schema, which could confuse an agent about how to supply the key.

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?

The description names a specific action ('decode') and a clear resource ('encoded or obfuscated value'), and enumerates the supported formats. This makes the tool's purpose highly distinct from its siblings, which focus on analysis, extraction, explanation, and comparison.

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 description implies when to use the tool: whenever an encoded/obfuscated value matches one of the listed formats. However, it does not explicitly mention alternative tools, exclusion cases, or when not to use decode_blob, leaving the routing decision mostly to inference.

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

explain_commandA

Explain a single command line in plain English without executing it: executable, arguments, pipelines, redirections, environment changes, and suspicious features.

ParametersJSON Schema
NameRequiredDescriptionDefault
shellNoauto
commandYes
include_tokensNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
shellYes
tokensNo
summaryYes
argumentsNo
pipelinesNo
confidenceYes
executableYes
indicatorsNo
limitationsNo
redirectionsNo
schema_versionNo
environment_changesNo
execution_performedNo
suspicious_featuresNo
possible_side_effectsNo

TDQS

A3.8/5.0
Behavior4/5

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

With no annotations, the description carries the full burden, and it delivers the most important behavioral trait: the tool does NOT execute the command. It also discloses the output style ('plain English') and enumerates the dimensions covered (including 'suspicious features', which signals its security-analysis role). It stops short of describing error behavior for malformed commands or unsupported shells, but the critical safety trait is stated upfront.

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?

A single dense sentence with the core purpose and the non-execution caveat front-loaded, followed by an efficient colon-delimited enumeration of coverage. Every phrase earns its place; no filler.

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

Completeness3/5

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

The core behavior, safety posture, and analysis scope are fully described, and the output schema covers return shape so return values need not be restated. However, two of three parameters are unexplained at 0% schema coverage, leaving a real gap for an agent deciding valid shell values and token semantics. The 'suspicious features' mention aligns the tool with its forensic sibling family, which helps contextual selection.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must compensate. It implicitly clarifies the required 'command' parameter (the command line to explain), but 'shell' (including what 'auto' means and valid values) and 'include_tokens' (what tokens are) receive zero explanation in either the schema or the description. The agent cannot reliably parameterize calls beyond the required field.

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?

The description states a specific verb and resource ('Explain a single command line in plain English') and enumerates the exact scope of analysis: executable, arguments, pipelines, redirections, environment changes, and suspicious features. This clearly distinguishes it from siblings like analyze_script (presumably whole scripts), decode_blob (encoded data), and compare_scripts (comparisons).

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 'single command line' scoping provides implicit guidance that this tool is not for full scripts or encoded blobs, and 'without executing it' implies safe analysis. However, no sibling is named and no explicit when-to-use vs when-not-to-use routing is given — the agent must infer the boundary with analyze_script from the word 'single'.

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

extract_indicatorsA

Extract potential security indicators (URLs, domains, IPs, emails, file paths, registry keys, hashes, and more) from text or source code, including defanged notations. Never resolves domains or makes network requests.

ParametersJSON Schema
NameRequiredDescriptionDefault
contentYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
indicatorsNo
total_countYes
schema_versionNo
truncated_categoriesNo

TDQS

A4.4/5.0
Behavior4/5

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

With no annotations provided, the description carries the full disclosure burden. It explicitly states a safety-critical behavior: 'Never resolves domains or makes network requests,' and also clarifies that defanged notations are handled. It could add more about edge cases or empty results, but the key behavioral traits are disclosed.

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?

The description is a single sentence with no fluff. It front-loads the action and object, enumerates relevant indicator types, and ends with an important safety constraint. Every phrase earns its place.

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?

Given the low complexity, one required parameter, and the presence of an output schema, the description is nearly complete. It explains what the tool does, what input it expects, and a key behavioral guarantee. It does not mention fallback behavior or limitations, but nothing critical is missing for calling this tool correctly.

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

Parameters4/5

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

The schema only defines 'content' as a string with no description, so the description must compensate. It adds useful semantics by stating the parameter should contain text or source code and that defanged notations are acceptable. This is sufficient for the single-parameter interface, though more detail on size limits or encoding would be even better.

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?

The description begins with a specific verb ('Extract') and a concrete resource ('potential security indicators'), then enumerates the indicator types. It clearly distinguishes this tool from siblings like analyze_script or explain_command, which perform different operations on similar inputs.

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 description makes the intended use case clear: extract indicators from text or source code, including defanged notation. It does not explicitly name sibling alternatives or state when not to use them, but the context is specific enough for an agent to select this tool for IOC extraction.

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. 5 tool updatesv0.1.0
    • First observedanalyze_script
    • First observedcompare_scripts
    • First observeddecode_blob
    • First observedexplain_command
    • First observedextract_indicators

TDQS

A4.1/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: analyzing a full script, decoding a single blob, extracting indicators, explaining a command line, and comparing script versions. Although analyze_script returns decoded artifacts and indicators, the dedicated tools serve standalone use cases without ambiguity.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern: analyze_script, decode_blob, extract_indicators, explain_command, compare_scripts. The naming convention is uniform and predictable.

Tool Count5/5

Five tools is well-scoped for a static script decoding and analysis server. Each tool covers a distinct capability without redundancy or bloat.

Completeness5/5

The tool surface covers the full static analysis workflow: analyzing scripts, decoding blobs, extracting indicators, explaining commands, and comparing versions. There are no obvious missing operations for the stated purpose of safely decoding and analyzing scripts without execution.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables comprehensive threat analysis for Indicators of Compromise (IoCs) including IP addresses, file hashes, domains, and URLs. It provides detailed reputation scores, security vendor evaluations, and network metadata to facilitate security assessments and risk detection.
    4
    MIT
  • A
    license
    A
    quality
    Not graded
    maintenance
    Provides real-time threat intelligence including IP risk scores, CVE lookups, and malware hash analysis without requiring an API key. It enables users to monitor active threats, predict CISA KEV additions, and detect pre-attack infrastructure staging through natural language.
    8
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables secure static analysis of Microsoft Office documents and related file types for malicious content, integrating with systems that support the MCP protocol.
    4
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides security analysis and malicious tool detection for MCP tools with context-aware detection, behavioral pattern analysis, and risk scoring.
    -