Deliberately-vulnerable, fully mocked (network-less) reference MCP agent — the test target for the Mylonite AI-security scanner. NOT for production use.
Project description
mcp_kitchen_sink — deliberately-insecure reference MCP agent
a.k.a. "the reference app" — Mylonite's built-in proving ground. The reference app,
the mcp-kitchen-sink pip package, and the reference:vulnerable /
reference:guarded scan targets are all the same artifact under three
names. The canonical walkthrough is docs/quarry.md.
⚠️ This package is intentionally insecure research scaffolding. It exists as ground truth for Mylonite's differential-oracle validation engine (see
ROADMAP.mdPhases 0–2). Do not expose it to anything but loopback. Both server variants refuse to bind to non-loopback interfaces by default. Seemylonite/SECURITY.mdfor the project's dual-use policy.DEMO ONLY — the reference app is a deliberately vulnerable in-process reference agent. It never binds to a network. Never point Mylonite at a system you don't own or operate (see SECURITY.md).
What this is
A small agentic application with four tools — read_note, write_note,
web_fetch, send_email — shipped in two variants:
server_vulnerable: Seeded weaknesses across three categories that Phase 1 of Mylonite's exploit-finding agent will discover:- Indirect prompt injection — tool results are inlined into the planner's context with no quarantine wrapper.
- Tool poisoning — tool descriptions carry text that the planner happily treats as instruction.
- Excessive agency —
web_fetchhas no allow-list;send_emailfires without confirmation.
server_guarded: Same tool surface, hardened. Untrusted content goes through an<untrusted>quarantine envelope; tool descriptions pass a character allowlist;web_fetchis restricted;send_emailrequires a separateconfirm_sendstep.
A thin LiteLLM-backed planner (planner.py) sits in front of either server
and is used as "the agent under attack" in the validation tests. Two planner
variants mirror the server variants so the differential oracle has a clean
vulnerable-vs-guarded matchup.
The four seeded weaknesses
The full catalogue (loci, summaries) is in
seeds/seeds.yaml; the attack patterns that exercise each
weakness live in src/mylonite/scan/seeds.py. The scenario-by-scenario
walkthrough is docs/quarry.md.
| W | Name | OWASP LLM | OWASP ASI | MITRE ATLAS | Guard (in server_guarded) |
|---|---|---|---|---|---|
| W1 | tool-description-instruction-smuggling | LLM01 | ASI02 | AML.T0051 | description allowlist + parenthetical refusal |
| W2 | indirect-injection-via-note-body | LLM01, LLM05 | ASI01, ASI06 | AML.T0051 | read_note wraps bodies in <untrusted> |
| W3 | unrestricted-web-fetch | LLM06 | ASI02, ASI05 | AML.T0049 | web_fetch hostname allowlist |
| W4 | unconfirmed-email-send | LLM06 | ASI02 | — | two-step send: send_email + confirm_send |
Try it
mylonite demo
Runs Mylonite's real scan pipeline against both builds of the reference app —
offline, no API key — and prints one row per weakness above plus the
vulnerable-vs-guarded differential headline. See
docs/quarry.md for the expected output and the
follow-on mylonite scan flows.
How to run
# from the repo root — two editable installs:
pip install -e ".[dev]"
pip install -e ./reference_targets/mcp_kitchen_sink
python -m mcp_kitchen_sink.server_vulnerable # vulnerable, loopback only
python -m mcp_kitchen_sink.server_guarded # hardened, loopback only
Both servers exit immediately if the configured bind address is not
loopback (127.0.0.1 / ::1).
Seeds
seeds/ contains a small bank of failure-mode descriptions used by the
forthcoming security-mutation-score check in Phase 2. Each seed pairs a
specific weakness in the vulnerable server with a guard in the guarded
server and is tagged with OWASP LLM / OWASP ASI / MITRE ATLAS IDs.
Tests
tests/ proves the basic differential ground truth:
- A canned indirect-injection payload against
server_vulnerablemakes the planner act on the injected instruction. - The same payload against
server_guardedis refused.
These two tests are the contract that Phase 2's validation pipeline mechanises.
License
Apache-2.0, same as the parent project. See LICENSE at the repo root.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mcp_kitchen_sink-0.1.0.tar.gz.
File metadata
- Download URL: mcp_kitchen_sink-0.1.0.tar.gz
- Upload date:
- Size: 16.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cb33d692a29981b45173c8b030960d55c987e3bde6dcf8d5e7320ee90bd8db4d
|
|
| MD5 |
c367b29e873d728cfe9486819e11227c
|
|
| BLAKE2b-256 |
689177e12a9f455414cae6c02388e81af55fd8f277c9d21ea6c529ea7666e0b2
|
Provenance
The following attestation bundles were made for mcp_kitchen_sink-0.1.0.tar.gz:
Publisher:
release-kitchen-sink.yml on Abidemialade/mylonite
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mcp_kitchen_sink-0.1.0.tar.gz -
Subject digest:
cb33d692a29981b45173c8b030960d55c987e3bde6dcf8d5e7320ee90bd8db4d - Sigstore transparency entry: 2341785400
- Sigstore integration time:
-
Permalink:
Abidemialade/mylonite@ad0bbedc20cc5959e5121848464855cb83e03762 -
Branch / Tag:
refs/tags/ks-v0.1.0 - Owner: https://github.com/Abidemialade
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-kitchen-sink.yml@ad0bbedc20cc5959e5121848464855cb83e03762 -
Trigger Event:
push
-
Statement type:
File details
Details for the file mcp_kitchen_sink-0.1.0-py3-none-any.whl.
File metadata
- Download URL: mcp_kitchen_sink-0.1.0-py3-none-any.whl
- Upload date:
- Size: 14.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b2e34e108f00572a503237a815716f3b3bf379381ca914d8b7473b56595071fa
|
|
| MD5 |
44fec255e20246c694ac73cbf292f0f4
|
|
| BLAKE2b-256 |
123a2704513c35d2c4986920187127f08c703527cadb3298c4b34287722477d8
|
Provenance
The following attestation bundles were made for mcp_kitchen_sink-0.1.0-py3-none-any.whl:
Publisher:
release-kitchen-sink.yml on Abidemialade/mylonite
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mcp_kitchen_sink-0.1.0-py3-none-any.whl -
Subject digest:
b2e34e108f00572a503237a815716f3b3bf379381ca914d8b7473b56595071fa - Sigstore transparency entry: 2341785412
- Sigstore integration time:
-
Permalink:
Abidemialade/mylonite@ad0bbedc20cc5959e5121848464855cb83e03762 -
Branch / Tag:
refs/tags/ks-v0.1.0 - Owner: https://github.com/Abidemialade
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release-kitchen-sink.yml@ad0bbedc20cc5959e5121848464855cb83e03762 -
Trigger Event:
push
-
Statement type: