
Security News
Happy Birthday, Shai-Hulud
It has been one year since Shai-Hulud made its first appearance on npm.
cyberchef-mcp
Advanced tools
MCP server exposing CyberChef's 504 data-transformation operations -- encryption, encoding, compression, forensics -- as tools for AI assistants.
This project provides a Model Context Protocol (MCP) server interface for CyberChef, the "Cyber Swiss Army Knife" created by GCHQ.
By running this server, you enable AI assistants (like Claude, Cursor AI, and others) to natively utilize CyberChef's extensive library of 504 data manipulation operations—including encryption, encoding, compression, and forensic analysis—as executable tools.
Latest Release: v4.2.0 | Release Notes | Tutorial | Examples | Breaking Changes | Security Policy
Upstream base: GCHQ CyberChef v11.4.0 | Licence: GPL-3.0-or-later (from v2.0.0; v1.9.x and earlier remain Apache-2.0)

CyberChef is a simple, intuitive web app for carrying out all manner of "cyber" operations within a web browser. It was originally conceived and built by GCHQ.
This fork wraps the core CyberChef Node.js API into an MCP server, bridging the gap between natural language AI intent and deterministic data processing.
This project maintains a selective sync relationship with the upstream GCHQ/CyberChef repository:
src/core/** (minus three generated paths) and six upstream-owned
files in src/node/. Mirrored verbatim — never hand-edit them; fork changes live as
re-applied patches.src/node/mcp-server.mjs, src/node/lib/**, tests/mcp/,
workflows)Exact scope, the patch model, and what to do when a sync conflicts: Upstream Sync Guide.
See Upstream Sync Guide for details on the synchronization process.

The server exposes CyberChef operations as MCP tools:
linux/arm64 as well as linux/amd64 — Apple Silicon, Graviton, Raspberry Pi 4/5 — and the image is down from 643 MB to 453 MB. Also CYBERCHEF_OFFLINE=true for air-gapped hosts: 502 of the 504 operations never touched a network anyway, so this is a fail-closed switch for the two that do, checked against the recipe rather than the tool name. See the edge deployment guide for architectures, sizing and air-gapped install, and the release notes for how the size reduction was done and verified./metrics (20 metric families, off by default — unlike the health probes it reports which tools are used, how often and how large the inputs are, which is a reconnaissance surface), OpenTelemetry spans following the MCP semantic conventions, and trace_id/span_id on every log line. It adds one package: the OTel API, not the SDK — measured at 1 package / 2.6 MB / +9 ms against the SDK's 71 packages / 50 MB / +100 ms, which would have handed back more than half of v2.6.0's startup work on every stdio launch. You supply the SDK, so every OTLP backend works rather than a chosen few. Ships a Grafana dashboard, alert rules and a runnable Prometheus stack — all executed against a live server rather than reviewed. Tool arguments are never recorded: the conventions mark them Opt-In, and for this server the arguments are the sensitive material.cyberchef:read, cyberchef:write, cyberchef:network), where the scope a tool needs is derived from its annotations rather than a table that goes stale. Audit logging for who called what. Off unless CYBERCHEF_AUTH_ISSUER is set, and deliberately not applied to stdio — the MCP specification says stdio SHOULD NOT use OAuth, because a bearer token protects nothing when the client already owns the process.CYBERCHEF_TENANT_CLAIM) — never from a header the caller controls. Without it, any caller on a shared HTTP deployment could list, modify and delete any other caller's saved recipes, and clear() destroyed every tenant's at once. Off unless configured, and configuring it without CYBERCHEF_AUTH_ISSUER is a startup error rather than a silent downgrade.cyberchef_search, batch search, and saved-recipe execution). tools/list is built from metadata, and an ordinary operation call loads just the one operation it runs — verified: cyberchef_bake completes without the barrel being loaded at all. A background warm-up was tried, measured, and removed: module loading blocks the event loop, so it just moved the cost in front of the first request.helm template rather than as a crashloop.fetch has none by default) and cached failures not at all, so an issuer outage turned every request into two outbound ones that could hang until the OS gave up. Now a 5 s deadline and a circuit breaker: 20 verifications against a down issuer went from 40 outbound attempts to 10.cyberchef_xor_key_length (repeating-key XOR length by index of coincidence), cyberchef_cyclic_pattern (De Bruijn patterns and overflow offsets, byte-compatible with pwntools' cyclic), cyberchef_hash_identify (hash format with the hashcat mode and John format name) and cyberchef_rsa_attack (Fermat, shared factors, Wiener and unpadded small-e). Twelve more arrived in v3.3.0 (classical ciphers, crib dragging, entropy scanning, hash cracking and statistics, JWT weaknesses, plaintext scoring, multi-key RSA, substitution and Vigenère breaking, timestamp identification, corpus diffing), then cyberchef_ecdsa_recover in v3.4.0 (private-key recovery from a reused ECDSA nonce) and cyberchef_cert_chain in v3.8.0 (orders an X.509 bundle, verifies every link cryptographically, and reports the chain's validity window as the intersection of its members', both ends). cyberchef_pqc_identify arrived in v3.11.0: it names the NIST post-quantum parameter set behind a key, signature or ciphertext — ML-KEM (FIPS 203), ML-DSA (FIPS 204) or SLH-DSA (FIPS 205) — from the OID when there is DER to read, and from byte length when there is not, in which case it reports every candidate and says so rather than picking one. See Analysis Tools. An operation is a pure run(input, args) over one input and cannot express an analysis; cyberchef_bake cannot either, because a recipe is a pipeline, not a loop. Since v4.1.0 they are reached through cyberchef_analyse({tool, arguments}) on the default index surface, and remain listed outright on curated and all — nineteen of them had been 68% of the index, listed only because cyberchef_describe_operation refused them and pointed at tools/list, which made the listing their sole schema path. There is deliberately no plugin loader — node:vm is not a security boundary, and that was measured rather than assumed (ADR 0002).CYBERCHEF_TRANSPORT=socket), one pinned server instance per connection. It carries no authentication, so a non-loopback bind is refused unless explicitly allowed and the Unix socket is created 0600. There is deliberately no WebSocket transport — MCP does not define one.Add Text To Image had never worked in this fork at all, since v1.7.1. Both are fixed as fork patches.Generate QR Code, Render Image and the image set return an MCP image content block; Play Media returns an audio block. Before v2.2.0 the html-to-text conversion deleted the payload and these operations returned an empty string — they had never worked over MCP. Other binary stays byte-lossless latin1 text, or base64 with CYBERCHEF_BINARY_OUTPUT=base64.readOnlyHint, destructiveHint, idempotentHint, openWorldHint and a readable title, so a client can skip the approval prompt for a pure operation. The exceptions were measured, not guessed — only HTTP request and DNS over HTTPS reach the network, and non-idempotence was determined by running each candidate twice and comparing.analyse-unknown-data, extract-iocs, deobfuscate-script, identify-hash, decode-chain) for when you do not yet know which of 504 operations you need, and saved recipes exposed as readable resources at recipe://<id>.cyberchef_bake: The "Omni-tool". Executes a full CyberChef recipe (a chain of operations) on an input. Ideal for complex, multi-step transformations (e.g., "Decode Base64, then Gunzip, then prettify JSON").tools/list is an index by default — 23 tools and 15,620 bytes, rather than 545 tools and 426,706 bytes. Every operation stays reachable: cyberchef_categories -> cyberchef_list_operations -> cyberchef_describe_operation walks down to any of them, cyberchef_search finds one by keyword, and cyberchef_bake runs any of them by name. The 19 analysis tools are reachable the same way, through cyberchef_describe_operation and cyberchef_analyse — they were listed on every surface until v4.1.0, where nineteen of them were 68% of the index, because describe_operation used to refuse them and point at tools/list, making the listing their only schema path. CYBERCHEF_TOOL_SURFACE=curated (120 tools, 109,548 bytes) or =all (all 545, 426,706 bytes) if you would rather pre-load; both still list every analysis tool outright. See the User Guide.
cyberchef_to_base64 / cyberchef_from_base64cyberchef_aes_decryptcyberchef_sha2cyberchef_yara_rulescyberchef_search: A utility tool to help the AI discover available operations and their descriptions.cyberchef_recipe_create / cyberchef_recipe_get / cyberchef_recipe_listcyberchef_recipe_update / cyberchef_recipe_delete / cyberchef_recipe_executecyberchef_recipe_export / cyberchef_recipe_importcyberchef_recipe_validate / cyberchef_recipe_testcyberchef_batch - Execute multiple operations in parallel or sequential modecyberchef_telemetry_export - Privacy-first usage analytics (opt-in)cyberchef_cache_stats / cyberchef_cache_clear - Cache inspection and managementcyberchef_quota_info - Resource quota and usage trackingcyberchef_migration_preview,
cyberchef_deprecation_stats and the cyberchef-migrate binary existed to help callers reach
v2.0.0, nine minors earlier. They were advertised on every surface and cost 995 bytes of
every tools/list, while the only warning still emitted was DEP007 — a withdrawn code
whose own text read "No action required". Your v1-format recipes need no migration: positional
arguments, bare string operations and named-object arguments all bake identically today.
cyberchef_ prefix is permanent. DEP001, DEP007 and DEP008 announced its removal in v1.8.0 and were withdrawn in v2.0.0: removing it saves 2.6% of the tools/list payload while colliding 19 tool names in MCP's flat namespace and breaking every existing integration. Keep using cyberchef_to_base64, cyberchef_bake and cyberchef_search. See v2.0.0 Breaking Changes.cyberchef_worker_stats - Monitor worker pool utilization, active/completed tasks, and pool configurationCYBERCHEF_ENABLE_WORKERS=true environment variablenonroot). The base is rebuilt daily and carries no package manager (apk, wget and curl are all absent) -- but it does include a BusyBox shell and npm, so treat a container compromise as having a shell available. This line previously claimed "no shell" and "726 MB on disk"; both were wrong, and the correction is recorded in the v3.1.0 baseline.CYBERCHEF_TRANSPORT=http. Every HTTP client gets its own session and its own MCP server instance, with CORS, DNS-rebinding protection and a session cap. See the HTTP Transport Guide.notifications/progress via the MCP SDK progress token mechanism for real-time status updates during long-running tasks.zod.>=26 <27 since v4.0.0, and the published image runs Node 26 -- floor and runtime are now the same version rather than two majors apart.>=26 <27 for the npm install, or Docker for the container.Option 1: npm (Recommended)
npx cyberchef-mcp
No clone, no build, no Docker daemon. For an MCP client, point it at the same command:
{
"mcpServers": {
"cyberchef": { "command": "npx", "args": ["-y", "cyberchef-mcp"] }
}
}
Installing it permanently works too — npm install -g cyberchef-mcp, then run cyberchef-mcp.
That is the only binary the package ships; cyberchef-migrate was removed in v4.0.0.
Option 2: Pull from Docker Hub
# Docker Hub provides health scores and supply chain attestations
docker pull parobek/cyberchef-mcp:latest
docker tag parobek/cyberchef-mcp:latest cyberchef-mcp
docker run -i --rm cyberchef-mcp
Option 2b: Pull from GitHub Container Registry (Alternative)
docker pull ghcr.io/doublegate/cyberchef-mcp_v4:latest
docker tag ghcr.io/doublegate/cyberchef-mcp_v4:latest cyberchef-mcp
docker run -i --rm cyberchef-mcp
Option 3: Download Pre-built Image (Offline Installation)
For environments without direct GHCR access, download the pre-built Docker image tarball from the latest release:
Download the tarball (141 MB compressed; measured against the published v3.1.0 asset, not estimated):
# Download from GitHub Releases
wget https://github.com/doublegate/CyberChef-MCP/releases/download/v4.2.0/cyberchef-mcp-v4.2.0-docker-image.tar.gz
Load the image into Docker:
docker load < cyberchef-mcp-v4.2.0-docker-image.tar.gz
Tag for easier usage:
docker tag parobek/cyberchef-mcp:latest cyberchef-mcp
Run the server:
docker run -i --rm cyberchef-mcp
Option 4: Build from Source
Clone the Repository:
git clone https://github.com/doublegate/CyberChef-MCP.git
cd CyberChef-MCP
Build the Docker Image:
docker build -f Dockerfile.mcp -t cyberchef-mcp .
Run the Server (Interactive Mode): This command starts the server and listens on stdin. This is what your MCP client will run.
docker run -i --rm cyberchef-mcp
Optional: Run with Enhanced Security (Read-Only Filesystem): For maximum security in production deployments:
docker run -i --rm --read-only --tmpfs /tmp:rw,noexec,nosuid,size=100m cyberchef-mcp
CyberChefcommanddockerrun -i --rm cyberchef-mcpAdd to your configuration file (typically ~/.config/claude/config.json):
{
"mcpServers": {
"cyberchef": {
"command": "docker",
"args": ["run", "-i", "--rm", "cyberchef-mcp"]
}
}
}
Add to your Claude Desktop configuration file:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%/Claude/claude_desktop_config.json{
"mcpServers": {
"cyberchef": {
"command": "docker",
"args": ["run", "-i", "--rm", "cyberchef-mcp"]
}
}
}
After adding the configuration, restart Claude Desktop. The CyberChef tools will appear in the available tools panel.
Version 1.4.0 introduces comprehensive performance optimizations and configurable resource limits. All features can be tuned via environment variables for your deployment needs.
LRU Cache for Operation Results
Automatic Streaming for Large Inputs
Resource Limits
Memory Monitoring
Every setting can be given either in a cyberchef.config.json file or as an environment variable,
with environment variables taking precedence over the file. Nothing is required: with no file,
the server behaves exactly as it always has.
{
"server": { "maxInputSize": 10485760, "operationTimeout": 30000 },
"security": { "offline": true },
"tools": { "surface": "curated" }
}
A malformed file, an unknown section or an unknown setting stops the server with a message naming the mistake, rather than starting on defaults nobody chose. All 61 settings, their sections and their environment-variable equivalents are in the configuration guide.
The same settings as environment variables:
# Logging (v1.5.0+)
LOG_LEVEL=info # Logging level: debug, info, warn, error, fatal
# Retry Logic (v1.5.0+)
CYBERCHEF_MAX_RETRIES=3 # Maximum retry attempts for transient failures
CYBERCHEF_INITIAL_BACKOFF=1000 # Initial backoff delay in milliseconds
CYBERCHEF_MAX_BACKOFF=10000 # Maximum backoff delay in milliseconds
CYBERCHEF_BACKOFF_MULTIPLIER=2 # Backoff multiplier for exponential backoff
# Streaming (v1.5.0+)
CYBERCHEF_STREAM_CHUNK_SIZE=1048576 # Chunk size for streaming (1MB)
CYBERCHEF_STREAM_PROGRESS_INTERVAL=10485760 # Progress reporting interval (10MB)
# Recipe Management (v1.6.0+)
CYBERCHEF_RECIPE_STORAGE=./recipes.json # Storage file path
CYBERCHEF_RECIPE_MAX_COUNT=10000 # Maximum number of recipes
CYBERCHEF_RECIPE_MAX_OPERATIONS=100 # Max operations per recipe
CYBERCHEF_RECIPE_MAX_DEPTH=5 # Max nesting depth
# Batch Processing (v1.7.0+)
CYBERCHEF_BATCH_MAX_SIZE=100 # Maximum operations per batch
CYBERCHEF_BATCH_ENABLED=true # Enable/disable batch processing
# Telemetry & Analytics (v1.7.0+)
CYBERCHEF_TELEMETRY_ENABLED=false # Privacy-first: disabled by default
# Rate Limiting (v1.7.0+)
CYBERCHEF_RATE_LIMIT_ENABLED=false # Disabled by default
CYBERCHEF_RATE_LIMIT_REQUESTS=100 # Max requests per window
CYBERCHEF_RATE_LIMIT_WINDOW=60000 # Time window in milliseconds
# Cache Management (v1.7.0+)
CYBERCHEF_CACHE_ENABLED=true # Enable/disable caching
# Resource Quotas (v1.7.0+)
CYBERCHEF_MAX_CONCURRENT_OPS=10 # Maximum concurrent operations
# (Removed in v4.0.0) V2_COMPATIBILITY_MODE and CYBERCHEF_SUPPRESS_DEPRECATIONS went with the
# deprecation system they configured. Do not set them: the `compatibility` section is now an
# unknown section, and `cyberchef.config.json` fails CLOSED on one -- the server refuses to start
# with "unknown section \"compatibility\"". The env vars are simply ignored.
# Transport (v1.9.0+; per-session HTTP since v2.0.0)
CYBERCHEF_TRANSPORT=stdio # Transport type: stdio or http
CYBERCHEF_HTTP_PORT=3000 # HTTP transport port
CYBERCHEF_HTTP_HOST=127.0.0.1 # HTTP bind address (use 0.0.0.0 in a container)
CYBERCHEF_ALLOWED_HOSTS= # Comma-separated Host allowlist. DNS-rebinding protection
# is ON by default (loopback names). Set this when binding
# a non-loopback address; `*` disables the check.
CYBERCHEF_ALLOWED_ORIGINS= # Comma-separated Origin allowlist; enables CORS. Required
# by browser MCP clients (e.g. MCP Inspector's web UI).
CYBERCHEF_SESSION_TIMEOUT=1800000 # Idle HTTP session reap threshold (30 min)
CYBERCHEF_HTTP_MAX_BODY=4194304 # Maximum accepted HTTP request body (4 MiB)
CYBERCHEF_HTTP_PATH=/mcp # MCP endpoint path; any other path returns 404
CYBERCHEF_MAX_SESSIONS=100 # Cap on concurrent HTTP sessions; initialize 503s beyond it
# Worker Thread Pool (v1.9.0+)
CYBERCHEF_WORKER_MIN_THREADS=1 # Minimum worker threads
CYBERCHEF_WORKER_MAX_THREADS=4 # Maximum worker threads
CYBERCHEF_WORKER_IDLE_TIMEOUT=30000 # Worker idle timeout in milliseconds
CYBERCHEF_WORKER_MIN_INPUT_SIZE=1024 # Minimum input size for worker routing (bytes)
# Performance (v1.4.0+)
CYBERCHEF_MAX_INPUT_SIZE=104857600 # Maximum input size (100MB)
CYBERCHEF_OPERATION_TIMEOUT=30000 # Operation timeout in milliseconds (30s)
CYBERCHEF_STREAMING_THRESHOLD=10485760 # Streaming threshold (10MB)
CYBERCHEF_ENABLE_STREAMING=true # Enable streaming for large operations
CYBERCHEF_ENABLE_WORKERS=false # Enable worker thread pool (disabled by default)
CYBERCHEF_CACHE_MAX_SIZE=104857600 # Cache maximum size (100MB)
CYBERCHEF_CACHE_MAX_ITEMS=1000 # Cache maximum items
High-Throughput Server (Large Files)
docker run -i --rm --memory=4g \
-e CYBERCHEF_MAX_INPUT_SIZE=524288000 \
-e CYBERCHEF_STREAMING_THRESHOLD=52428800 \
-e CYBERCHEF_CACHE_MAX_SIZE=524288000 \
-e CYBERCHEF_OPERATION_TIMEOUT=120000 \
ghcr.io/doublegate/cyberchef-mcp_v4:latest
Low-Memory Environment
docker run -i --rm --memory=512m \
-e CYBERCHEF_MAX_INPUT_SIZE=10485760 \
-e CYBERCHEF_STREAMING_THRESHOLD=5242880 \
-e CYBERCHEF_CACHE_MAX_SIZE=10485760 \
-e CYBERCHEF_CACHE_MAX_ITEMS=100 \
ghcr.io/doublegate/cyberchef-mcp_v4:latest
Claude Desktop with Custom Limits
{
"mcpServers": {
"cyberchef": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "CYBERCHEF_MAX_INPUT_SIZE=209715200",
"-e", "CYBERCHEF_CACHE_MAX_SIZE=209715200",
"ghcr.io/doublegate/cyberchef-mcp_v4:latest"
]
}
}
}
Debug Logging for Troubleshooting (v1.5.0+)
docker run -i --rm \
-e LOG_LEVEL=debug \
-e CYBERCHEF_MAX_RETRIES=5 \
ghcr.io/doublegate/cyberchef-mcp_v4:latest
Worker Thread Pool for CPU-Intensive Operations (v1.9.0+)
docker run -i --rm \
-e CYBERCHEF_ENABLE_WORKERS=true \
-e CYBERCHEF_WORKER_MAX_THREADS=8 \
-e CYBERCHEF_WORKER_IDLE_TIMEOUT=60000 \
ghcr.io/doublegate/cyberchef-mcp_v4:latest
HTTP Transport for Browser/Remote Clients (v1.9.0+)
docker run --rm -p 3000:3000 \
-e CYBERCHEF_TRANSPORT=http \
-e CYBERCHEF_HTTP_PORT=3000 \
-e CYBERCHEF_HTTP_HOST=0.0.0.0 \
-e CYBERCHEF_ALLOWED_HOSTS=localhost:3000,127.0.0.1:3000 \
ghcr.io/doublegate/cyberchef-mcp_v4:latest
CYBERCHEF_ALLOWED_HOSTS is new in v2.0.0. DNS-rebinding protection is on by default — with
nothing set the server answers only to localhost, 127.0.0.1 and [::1] — so binding a
non-loopback address means naming the hosts you will reach it by, as the example above does.
Loopback is not an exemption: DNS rebinding exists to reach loopback, by making the victim's
browser resolve an attacker-controlled name to 127.0.0.1. The browser then treats the request as
same-origin, so no preflight is sent and CYBERCHEF_ALLOWED_ORIGINS never comes into it. See
the HTTP transport guide for the full
walkthrough.
Multiple simultaneous clients work from v2.0.0. Before it, the HTTP transport was a single
process-wide instance, so the first client to connect succeeded and every one after it was refused
with Invalid Request: Server already initialized (#36).
Each client now gets its own session and its own MCP server instance. See the
HTTP Transport Guide.
For detailed performance tuning guidance, see the Performance Tuning Guide.
Run the benchmark suite to measure performance on your hardware:
# Install dependencies
npm install
# Generate required configuration
npx grunt configTests
# Run benchmarks
npm run benchmark
The benchmark suite tests 20+ operations across multiple input sizes (1KB, 10KB, 100KB) in categories including:
This project implements comprehensive security hardening with continuous improvements:
-dev variant for compilation, the slim runtime variant for productiondocker run --read-only with tmpfs mount for /tmpdocker run -i --rm --read-only --tmpfs /tmp:rw,noexec,nosuid,size=100m cyberchef-mcpexit-code: '1' in CI/CDMath.random() with crypto.randomBytes()SafeRegex.mjs helper into the affected operations. Those operations live under
src/core/operations/, which upstream-sync.yml copies verbatim from upstream, so a
later sync removed every import. The module has been removed rather than left as
dead code claiming a protection it no longer provided.src/core/** is a fix with an expiry date set by the next sync.docker sbom commanddocker scout quickview and docker sbom commands to inspect attestations locallynonroot)--read-only flag for immutable deploymentsapk, wget and curl are absent) and production dependencies only. A BusyBox shell and npm ARE present -- this line said "no shell" until v3.2.0, when measuring the published image showed otherwise. Size a container compromise accordingly.crypto.randomBytes() or crypto.getRandomValues()# Recommended: Run with maximum security options
docker run -i --rm \
--read-only \
--tmpfs /tmp:rw,noexec,nosuid,size=100m \
--cap-drop=ALL \
--security-opt=no-new-privileges \
cyberchef-mcp
# Note: the image already runs as non-root (UID 65532)
# --read-only requires tmpfs mount for /tmp directory
For detailed information, see:
The original roadmap scoped 19 releases across 6 phases through August 2027. It was overtaken:
all six phases are complete and the project is at v4.2.0. The table below is kept because it
records what each phase was for; docs/planning/ROADMAP.md is the
live source and has a row per shipped release.
| Phase | Releases | Timeline | Focus | Status |
|---|---|---|---|---|
| Phase 1: Foundation | v1.2.0 - v1.4.6 | Q4 2025 - Q1 2026 | Security hardening, upstream sync, performance | Completed |
| Phase 2: Enhancement | v1.5.0 - v1.7.3 | Q2 2026 | Streaming, recipe management, batch processing | Completed |
| Phase 3: Maturity | v1.8.0 - v2.0.0 | Q3 2026 | API stabilization, upstream catch-up, relicensing, v2.0.0 | v2.0.0 Released |
| Phase 4: Expansion | v2.2.0 - v2.4.0 | Q4 2026 | Multi-modal (v2.2.0 shipped), protocol currency and transports (v2.3.0 shipped), the tool registry and its first four tools (v2.4.0 shipped) | Complete |
| Phase 5: Enterprise | v2.5.0 - v2.7.0 | Q1 2027 | OAuth 2.1, RBAC, audit logging and multi-tenancy (v2.5.0 shipped), horizontal scaling and deployment (v2.6.0 shipped), metrics, tracing and dashboards (v2.7.0 shipped) | Complete |
| Phase 6: Evolution | v2.8.0 - v3.0.0 | Q2-Q3 2027 | Edge deployment, AI-native features, v3.0.0 | Completed — and early: v3.0.0 shipped 2026-09 rather than Q3 2027 |
| Beyond the plan | v3.1.0 - v4.2.0 | 2026-09 | Conformance against the official suite, magic re-ranking, the arm64 benchmark, PQC identification, retiring the v2 migration surface (v4.0.0), the tool-surface work in v4.1.0, and the dispatch consolidation in v4.2.0 | Shipped, none of it in the original six phases |
External project integration — what it actually produced. The planning tree
(External Project Integration, 30 documents) scoped 80-120 new tools
from 8 security projects. Measuring each against the 504 operations already present cut that hard:
four tools shipped in v2.4.0, drawn on xortool, pwntools, RsaCtfTool, hashcat and John — and
nineteen now exist, twelve added in v3.3.0 and one each in v3.4.0, v3.8.0 and v3.11.0. Four of
the eight projects contributed nothing, because the capability was already here — Magic covers
what Ciphey, Ares and katana's core do, and cryptii's encodings have 26 equivalents among the
operations. The cyberchef-recipes preset corpus remains unbuilt. See
THIRD-PARTY-NOTICES.md for what was taken from where.
See the Full Roadmap for what shipped, and v4 planning for what is being watched for. A major version here exists because the protocol forced one, not because the number was next.
New here? Start with the Tutorial — a guided first hour, from
install to decoding a real sample. Then examples/ for eight runnable scripts that
CI executes on every change, so they cannot drift from the code.
Detailed documentation is organized in the docs/ directory:
recipe_execute guards input size, recipe_export was double-encoded by the table) kept theirs. Behaviour preservation proven byte-for-byte through a real client rather than assertedcyberchef-migrate bin, advertised on every surface for a migration nine minors oldcyberchef_pqc_identify, all eighteen NIST parameter sets), and the thin coverage margin the previous release warned about being hit one release laterrunServer() ran on every test import, arming process.exit(1) in 23 files — and fixing it dropped coverage below the gate, because the bug had been executing itselfcyberchef_cert_chaincount: 0 since the ownership proofs landedcyberchef_ecdsa_recoverJSON Beautify stops returning unparseable JSONlinux/arm64 alongside amd64, and infrastructure scanningnpm prune --omit=dev, and OpenTelemetry spans on the API onlynode:vm measurement that rules one out. Three documents corrected that described work nobody had done.ArrayBuffer — unrelated bytes — instead of the image, Add Text To Image working for the first time, the coverage gate raised from 75/70/90/75 to 95/88/96/96, 1,023 MCP testsGenerate QR Code returned "" and never worked), tool annotations on all 527 tools, prompts and resources, LM Hash off OpenSSL, unknown arguments rejected instead of silently defaulted, 955 MCP teststools/list), Zod 4 schema fix, all 10 flow-control operations working, AES and 62 other toggleString operations fixed, logs to stderr, 60s shutdown hang removed, tutorial + 8 runnable examplesIf you want to modify the server code without Docker:
.nvmrc pins 26 (matching engines: >=26 <27 and every
CI workflow), so nvm use / fnm use selects it. Worth doing rather than assuming: through
v4.0.0 this file said 24 while the floor was already 26, so version managers quietly
selected a Node below the floor for an entire release.
nvm use # or: fnm use
node --version # expect v26.x
npm install
npx grunt configTests
npm run mcp
This project uses GitHub Actions to ensure stability and security:
Core Development Workflows:
core-ci.yml): Tests the underlying CyberChef logic and configuration generation on Node.js 26mcp-docker-build.yml): Builds, verifies, and security scans the cyberchef-mcp Docker imagepull_requests.yml): Automated testing and validation for pull requestsperformance-benchmarks.yml): Automated performance regression testing on code changes (v1.4.0+)Code Quality & Coverage:
codecov.yml)codecov.yml, coverage flags, thresholds, PR commentingSecurity & Release Workflows:
security-scan.yml): Trivy vulnerability scanning, SBOM generation, weekly scheduled scanscodeql.yml): Automated security scanning for code vulnerabilities (CodeQL v4)mcp-release.yml): Publishes Docker image to GHCR with SBOM attachment on version tags (v*), automatically creates GitHub releasesUpstream Sync Automation (v1.3.0+):
upstream-monitor.yml): Monitors GCHQ/CyberChef for new releases weekly (Sundays at noon UTC), creates GitHub issues for reviewupstream-sync.yml): Selective file synchronization workflow - copies only src/core/operations/*.mjs files, prevents restoration of deleted web UI components, creates PR for reviewrollback.yml): Emergency rollback mechanism with state comparison and ref-proj guidanceAll workflows use the latest CodeQL Action v4 for security scanning and SARIF upload.
# Run all tests (requires Node.js >=26 <27; 241 Node-API + 2,289 operation tests)
npm test
# Run MCP validation test suite (1,728 tests across 75 files, with Vitest)
npm run test:mcp
# Run MCP tests with coverage report
npm run test:coverage
# Run performance benchmarks (v1.4.0+)
npm run benchmark
# Test Node.js consumer compatibility
npm run testnodeconsumer
# Lint workflows (matches the CI gate)
actionlint .github/workflows/*.yml
# Lint code
npm run lint
Test Coverage: The MCP server maintains comprehensive test coverage:
vitest.config.mjs): 96% lines, 95% statements, 89% branches, 96% functions, with src/node/lib/** held separately at 99 lines / 99 statements / 94 branches / 100 functionsls tests/mcp/*.test.mjs is authoritative.Contributions to the MCP adapter are welcome! We appreciate:
git checkout -b feature/amazing-feature)feat:, fix:, docs:, etc.)For contributions to the core CyberChef operations, please credit the original GCHQ repository.
cyberchef-mcp_v3, v2.x at cyberchef-mcp_v2.v1.9.x line until ~March 2027.npx cyberchef-mcp runs the server without installing it;
npm install -g cyberchef-mcp installs the cyberchef-mcp bin. The package is the artefact the
MCP registry listing points at, which is why the release job waits for npm to serve it before
publishing that listing.glama.json at the repository root. The badges above and below render its
current scores live; they are deliberately not transcribed into this file, because a number
copied out of a service is a number that rots.If you find this project useful, consider supporting its development:
As of v2.0.0, CyberChef-MCP is licensed under GPL-3.0-or-later. Versions 1.9.x and earlier remain Apache-2.0 and are unaffected.
Upstream CyberChef is released under the
Apache 2.0 Licence and is covered by
Crown Copyright.
Files inherited from upstream keep their Apache-2.0 headers; the full text is preserved in
LICENSE.Apache-2.0. This is not a relicensing of GCHQ's code — it is the
combined work that is GPLv3, which Apache-2.0's one-way compatibility with GPLv3 permits.
The change was forced by v2.0.0 incorporating algorithms from GPL-licensed reference tools:
katana is GPL-3.0-or-later (ruling out GPLv2) and John the Ripper is GPL-2.0-or-later, while
Apache-2.0 is compatible with GPLv3 but not GPLv2. GPL-3.0-or-later is the only licence that
admits all three. The reasoning is recorded in
ADR 0001, and per-component attribution is in
THIRD-PARTY-NOTICES.md.
What this means for you: running CyberChef-MCP — including serving it over HTTP — carries no obligation, as GPLv3 has no network-use clause. Distributing a derivative of it does: that must also be GPLv3. If your policy precludes GPLv3, stay on the v1.9.x line, which remains Apache-2.0 and receives security-only patches through its LTS window.
FAQs
MCP server exposing CyberChef's 504 data-transformation operations -- encryption, encoding, compression, forensics -- as tools for AI assistants.
We found that cyberchef-mcp demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.

Security News
It has been one year since Shai-Hulud made its first appearance on npm.

Research
/Security News
Operators behind PolinRider used a compromised GitHub account to plant malware in four development versions of a Packagist package with 700,000+ downloads.

Security News
GitHub Actions now supports cache-mode, a least-privilege control on the Actions cache aimed at the cache poisoning technique behind recent compromises.