pwno-mcp
projectother build verified scannedMCP for Pwn
run it
on your own machines, one way per deploy method# once, as root:
docker build -t mcp-local/pwno:221da23ad62f08ed8e793c9f5cdca2a5a975f644 'https://github.com/pwno-io/pwno-mcp.git#221da23ad62f08ed8e793c9f5cdca2a5a975f644'
#!/usr/bin/env bash
# pwno (io.github.pwno-io/pwno-mcp), recipe docker (worker, verified 2026-10-17 on v, run r-20261017T132235Z-d8c3992548fe).
# Generated by Hub for toolset "my-agent"; started by mcp-my-agent-pwno.service.
set -euo pipefail
export HOST=127.0.0.1 PORT=8101
exec docker run --rm --name mcp-my-agent-pwno -p 127.0.0.1:${PORT}:5500 mcp-local/pwno:221da23ad62f08ed8e793c9f5cdca2a5a975f644
[Unit]
Description=MCP server pwno (toolset my-agent), generated by Hub
After=network-online.target docker.service
Wants=network-online.target
[Service]
Type=simple
User=mcp
Group=mcp
SupplementaryGroups=docker
EnvironmentFile=/etc/mcp/my-agent.env
Environment=HOME=/var/lib/mcp/pwno
WorkingDirectory=/var/lib/mcp/pwno
ExecStart=/opt/mcp/my-agent/bin/pwno.sh
Restart=on-failure
RestartSec=5
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
PrivateTmp=true
ReadWritePaths=/var/lib/mcp/pwno
[Install]
WantedBy=multi-user.target
docker build -t pwno 'https://github.com/pwno-io/pwno-mcp.git#221da23ad62f08ed8e793c9f5cdca2a5a975f644' docker run --rm -p 127.0.0.1:8101:5500 pwno
# Generated by Hub for toolset "my-agent" (2026-10-18T23:39:13+00:00).
# Each package server runs behind a stdio->HTTP bridge and listens on localhost only.
# cp .env.example .env # fill the ${VAR}s
# docker compose up -d && bash smoke.sh
# Remote servers are not here: clients reach them directly (see clients/).
name: mcp-my-agent
services:
pwno:
build:
context: https://github.com/pwno-io/pwno-mcp.git#221da23ad62f08ed8e793c9f5cdca2a5a975f644
ports:
- 127.0.0.1:8101:5500
restart: unless-stopped
volumes:
npm-cache: {}
uv-cache: {}
# Generated by Hub for toolset "my-agent" (2026-10-18T23:39:13+00:00).
# kubectl create namespace mcp
# kubectl -n mcp create secret generic mcp-credentials --from-env-file=.env
# kubectl apply -f kubernetes.yaml
# Services are cluster-internal: <name>.mcp.svc.cluster.local:8000/mcp. Put an ingress
# with auth in front before exposing any of them.
apiVersion: v1
kind: Namespace
metadata:
name: mcp
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: pwno
namespace: mcp
labels: &id001
app: pwno
spec:
replicas: 1
selector:
matchLabels: *id001
template:
metadata:
labels: *id001
spec:
containers:
- name: pwno
image: CHANGE_ME
ports:
- containerPort: 5500
name: http
env: []
---
apiVersion: v1
kind: Service
metadata:
name: pwno
namespace: mcp
spec:
selector:
app: pwno
ports:
- port: 5500
targetPort: http
name: http
# Generated by Hub for toolset "my-agent" (2026-10-18T23:39:13+00:00).
# Credentials come from the Secret 'mcp-credentials' (kubectl create secret generic ... --from-env-file=.env).
# Each server under `servers` is one Deployment + Service; the keys after it configure
# upstream charts a worker verified.
servers:
pwno:
enabled: true
replicas: 1
port: 5500
path: /mcp
container:
name: pwno
image: CHANGE_ME
ports:
- containerPort: 5500
name: http
env: []
# helm install my-agent helm/my-agent -n mcp
Scanned github.com/pwno-io/pwno-mcp at 221da23ad62f with [email protected][email protected] on 2026-10-17 before the build: 20 dependencies, 68 known vulnerabilities (5 critical, 26 high, 31 medium, 6 low), nothing in the code that looks malicious.
in the cloud
one click: the provider's deploy form opens filled in, in your own account- koyeb
-
Koyeb builds the repository's Dockerfile from branch main, not commit 221da23ad62f, the one the worker scanned and built (it takes branches only); change the branch in the form if the default one has another name.
Clients connect to the service's https://…koyeb.app address plus /mcp.
- cloud run
-
Cloud Shell clones the repository, builds its Dockerfile and deploys it to Cloud Run.
pwno: Cloud Shell clones the default branch, not the commit the worker scanned and built (it takes branches only).
Cloud Run sends requests to $PORT (8080); the recipe expects :5500, so the server has to read PORT, or set the container port on the service afterwards.
connect to it
copy what your client needs{
"mcpServers": {
"pwno": {
"command": "CHANGE_ME",
"args": []
}
}
}
#!/usr/bin/env bash # Registers every server with Claude Code (run once; `claude mcp list` to check). set -euo pipefail set -a; [ -f .env ] && source .env; set +a claude mcp add pwno -- CHANGE_ME
{
"mcpServers": {
"pwno": {
"command": "CHANGE_ME",
"args": []
}
}
}
{
"servers": {
"pwno": {
"type": "stdio",
"command": "CHANGE_ME",
"args": []
}
}
}
name: my-agent target: local servers: - hub: io.github.pwno-io/pwno-mcp
- no tested recipe for target 'local' yet: build it from https://github.com/pwno-io/pwno-mcp by hand, or wait for the worker
tools · 36
attachAttach to an existing process by PID using GDB/MI. Args: pid: Target process ID to attach to. Returns: (result, context) where result is the MI attach result and context is a list of quick context snapshots (e.g., backtrace/heap) captured immediately after attach.Attach to an existing process by PID using GDB/MI. Args: pid: Target process ID to attach to. Returns: (result, context) where result is the MI attach result and context is a list of quick context snapshots (e.g., backtrace/heap) captured immediately after attach.
pin ab635a2f23fa11e38f74bdb412668d2d585a794ffcf844275fe0cb12db1f0158checkeventsRelease and return structured events from a session PwnPipe. Returns: {"success": True, "events": [...], "alive": bool, "exit_code": int|None}Release and return structured events from a session PwnPipe. Returns: {"success": True, "events": [...], "alive": bool, "exit_code": int|None}
pin adba0a0c96c7b3d838f0af01b934a8bb9f96d502492f59451c0d9d128cf83436checkoutputRelease and return accumulated output from a session PwnPipe. Returns: { "success": True, "output": str } on success, or a failure object when no pipe exists. The internal buffer is cleared by this call (subsequent calls only return new output).Release and return accumulated output from a session PwnPipe. Returns: { "success": True, "output": str } on success, or a failure object when no pipe exists. The internal buffer is cleared by this call (subsequent calls only return new output).
pin 35b023b6ffc9dfb144af10b1c92438a83c759235361edddc79d815fd8ff29611close_debug_sessionClose an active debug session and stop any attached pwncli driver.Close an active debug session and stop any attached pwncli driver.
pin 5f38fbd55ff8243f43821a58012a280ff145c948d0e451bdaa2054c68d774f5ecreate_debug_sessionCreate or return a debug session by id.Create or return a debug session by id.
pin fd3aafb8a493359cdb826a55e6af8e866df3983c5129726c59e562e0c6f925eeexecuteExecute an arbitrary GDB/pwndbg command. Args: command: Raw GDB/pwndbg command to execute (e.g., "info registers", "vmmap"). Returns: Dict containing the raw MI/console responses, a success flag, and the current GDB state.Execute an arbitrary GDB/pwndbg command. Args: command: Raw GDB/pwndbg command to execute (e.g., "info registers", "vmmap"). Returns: Dict containing the raw MI/console responses, a success flag, and the current GDB state.
pin 95dcead72eeb0d72a9eb2fcd08ba7f81ef50079be7b1d2015d5c7d22b16298a1execute_python_codeExecute Python code dynamically in the shared environment. Args: code: Python source code to run. cwd: Working directory (default /workspace). If provided, use a container-visible path under /workspace; relative paths resolve under /workspace. timeout: Seconds to wait before termination. Prefer this for quick probes and analysis, and only persist files in /workspace when the user explicitly asks.Execute Python code dynamically in the shared environment. Args: code: Python source code to run. cwd: Working directory (default /workspace). If provided, use a container-visible path under /workspace; relative paths resolve under /workspace. timeout: Seconds to wait before termination. Prefer this for quick probes and analysis, and only persist files in /workspace when the user explicitly asks.
pin aeec91a61aa5e01c1dc1c317a0fc6f86dbb2f91563d803eb19acd2ca35a52494execute_python_scriptExecute an existing Python script within the shared environment. Args: script_path: Path to the script. Use a container-visible path under /workspace; relative paths resolve under /workspace. args: Space-separated args for the script. cwd: Working directory (default /workspace). Use a container-visible path under /workspace; relative paths resolve under /workspace. timeout: Seconds to wait before termination.Execute an existing Python script within the shared environment. Args: script_path: Path to the script. Use a container-visible path under /workspace; relative paths resolve under /workspace. args: Space-separated args for the script. cwd: Working directory (default /workspace). Use a container-visible path under /workspace; relative paths resolve under /workspace. timeout: Seconds to wait before termination.
pin 321046f0ffeb4ea34b145b0fbe78085f18458a6287adf40dfc64f8ac32ebbfd9fetch_repoFetch a git repository into /workspace. Args: repo_url: Repository URL (https or ssh). version: Branch/tag/commit to checkout (None = default branch). target_dir: Optional specific directory; defaults to a name derived from the URL. When provided, it must be inside the container under /workspace; relative paths resolve under /workspace. shallow: Whether to clone shallowly.Fetch a git repository into /workspace. Args: repo_url: Repository URL (https or ssh). version: Branch/tag/commit to checkout (None = default branch). target_dir: Optional specific directory; defaults to a name derived from the URL. When provided, it must be inside the container under /workspace; relative paths resolve under /workspace. shallow: Whether to clone shallowly.
pin 56fe7b5943ecfaa5262ea156784339c2cb9b3999de75a8002bd26d9ed21a89affinishRun until the current function returns (MI -exec-finish).Run until the current function returns (MI -exec-finish).
pin ad20f7a44f5162671af16f8877106ea3589595db7d87cbe1b900eb5bd9789acdgdb_interruptInterrupt the inferior and drain async notifications. Args: timeout: Maximum time to wait (seconds) for stop notifications.Interrupt the inferior and drain async notifications. Args: timeout: Maximum time to wait (seconds) for stop notifications.
pin cb9c4f505be82f5b6b5dbc2a93cdecbfc0d293522e722685d834ca36dd43a70agdb_pollDrain pending async GDB notifications. Args: timeout: Maximum time to wait (seconds) for the first event.Drain pending async GDB notifications. Args: timeout: Maximum time to wait (seconds) for the first event.
pin fecbff4cfef2ebc18abcb94ad0b726b3f76892c74ba4f7676b5e8ea6b37df3d0get_contextGet the current debugging context. Args: context_type: "all" for a quick MI snapshot, or one of {regs, stack, disasm, code, backtrace} to request a specific pwndbg context.Get the current debugging context. Args: context_type: "all" for a quick MI snapshot, or one of {regs, stack, disasm, code, backtrace} to request a specific pwndbg context.
pin 497fa08d8296cff1f4a6e73476e26e659a97925edda37714013d195f49c79fe8get_decompiled_codeReturn RetDec decompiled C code if available, or a status describing why not.Return RetDec decompiled C code if available, or a status describing why not.
pin 5b6c680ba91cc88ccabedba72fd919dc02e81d4580c6f6056a3c1d01f338c7a5get_memoryRead memory at the specified address. Args: address: Start address expression (e.g., "$rsp", "0xdeadbeef"). size: Number of bytes to read. format: "hex" for raw bytes (fast path), "string" for x/s, otherwise MI grid format.Read memory at the specified address. Args: address: Start address expression (e.g., "$rsp", "0xdeadbeef"). size: Number of bytes to read. format: "hex" for raw bytes (fast path), "string" for x/s, otherwise MI grid format.
pin b4ff29887a11698b1025d6bdb41784fc2a90ca9fb806a13956d950b294d11789get_processGet information about a tracked background process by PID.Get information about a tracked background process by PID.
pin 55e2ce0df0ca707fb7738b70d5348561d442d46a2ee49d71beb680a215e88a64get_retdec_statusGet the current RetDec decompilation status, lazily initializing as needed.Get the current RetDec decompilation status, lazily initializing as needed.
pin 92514560133a16a52efd9ba2e66a6aa71eb879bc2678313ad9de70a87859d0bfget_session_infoReturn current session info (session state + GDB state) without issuing new GDB commands.Return current session info (session state + GDB state) without issuing new GDB commands.
pin b2030bfab2b143f06f8c555cf7083a31190f2133071bce03e9477c066c7591a0install_python_packagesInstall additional Python packages using the shared package manager (uv). Args: packages: Space-separated package list. upgrade: If True, perform upgrades when applicable.Install additional Python packages using the shared package manager (uv). Args: packages: Space-separated package list. upgrade: If True, perform upgrades when applicable.
pin ac765d410862985c8c2f2673a9ba4ba157a092a355e9f31538250e2df55d9c83jumpResume execution at a specified location (MI -exec-jump). Args: locspec: Location such as a symbol name, file:line, or address (*0x... ).Resume execution at a specified location (MI -exec-jump). Args: locspec: Location such as a symbol name, file:line, or address (*0x... ).
pin b4e240ae26c58148f8ce007782177d39c523963378f620ebb07da27ec8c42f85kill_processSend a signal to a tracked background process (default SIGTERM=15).Send a signal to a tracked background process (default SIGTERM=15).
pin f180521790d708a90e8667aeda10d016c34f70ce98bae70a6884781bec8e5797list_debug_sessionsList all active debug sessions and metadata.List all active debug sessions and metadata.
pin 44b3bae2e55857ad6b1f79655e2893184644f33651157a1a7f8194f60dd04faflist_processesList all tracked background processes and their metadata (PID, command, log paths).List all tracked background processes and their metadata (PID, command, log paths).
pin c96655f080fa97e97c8ea2c9c8a2a3333744f0bfec53f5c001a5868d81445486list_pwncli_sessionsList all active pwncli driver sessions.List all active pwncli driver sessions.
pin 24f0b2ddb354524b0fba8810cbbe89ae273c44412fb70630b7fc7c762eac95b0list_python_packagesList all packages installed in the shared Python environment.List all packages installed in the shared Python environment.
pin a31b829c3739fef0732785556bf4f7a8f2bb5304187abdeb1c3ef2cdba9531ccpwncliRun a pwncli exploit script for a specific debug session. Behavior: - Writes the provided script content to a per-session runtime directory - Launches: uv run <session-script> debug <resolved binary> <argument> - Maintains one PwnPipe per debug session - Detects a single-line marker printed by pwncli after attach: "PWNCLI_ATTACH_RESULT:{...json...}" and exposes it as attachment.result - Waits up to wait_timeout seconds for attach/output/exit before returning - Stores inline script content in session runtime state; only create persistent /workspace scripts when the user explicitly requests it Args: file: Full contents of a pwncli-style Python script. argument: Additional pwncli arguments after "debug <binary>". wait_timeout: Max time (seconds) to wait for initial attach/output/exit signal. binary_path: Optional target binary path (resolved under /workspace). Use a container-visible path under /workspace; relative paths resolve under /workspace. session_id: Debug session id. Returns: { "io": { "pipeinput": bool, # whether stdin is available "pipeoutput": bool, # whether output collection succeeded for this call "current_output": str # any currently buffered output consumed by this call }, "attachment": { "result": dict | None # parsed attach result from the marker if present } }Run a pwncli exploit script for a specific debug session. Behavior: - Writes the provided script content to a per-session runtime directory - Launches: uv run <session-script> debug <resolved binary> <argument> - Maintains one PwnPipe per debug session - Detects a single-line marker printed by pwncli after attach: "PWNCLI_ATTACH_RESULT:{...json...}" and exposes it as attachment.result - Waits up to wait_timeout seconds for attach/output/exit before returning - Stores inline script content in session runtime state; only create persistent /workspace scripts when the user explicitly requests it Args: file: Full contents of a pwncli-style Python script. argument: Additional pwncli arguments after "debug <binary>". wait_timeout: Max time (seconds) to wait for initial attach/output/exit signal. binary_path: Optional target binary path (resolved under /workspace). Use a container-visible path under /workspace; relative paths resolve under /workspace. session_id: Debug session id. Returns: { "io": { "pipeinput": bool, # whether stdin is available "pipeoutput": bool, # whether output collection succeeded for this call "current_output": str # any currently buffered output consumed by this call }, "attachment": { "result": dict | None # parsed attach result from the marker if present } }
pin e639a5b6601a8a54a924f028ae5b94d19dd8bea93620e05cec7bbc300143b1ebpwncli_stopStop a pwncli driver session and clear its session pipe.Stop a pwncli driver session and clear its session pipe.
pin e09e3b80052b88edae8790383205ce6c17134486fe4199b4f29bfcbf89c0165areturn_from_functionForce the current function to return immediately (MI -exec-return).Force the current function to return immediately (MI -exec-return).
pin 7bb59aa069a6e61538b3e51bdc0344b995221aac43fdd9abe4b672778220cb1brunRun the loaded program under GDB control. Args: args: Argument string passed to the inferior. start: If True, stop at the program entry (equivalent to --start). Returns: MI run/continue results and state.Run the loaded program under GDB control. Args: args: Argument string passed to the inferior. start: If True, stop at the program entry (equivalent to --start). Returns: MI run/continue results and state.
pin b32ecfcaaa2b4a7867393ab0acc7ae006c052ebb04fe118146ef3909e191928drun_commandExecute a system command and wait for completion. Note: Use this for build and helper commands. Do not use this to run the target binary under analysis. Use set_file + run (or attach) for the target. Use execute_python_code instead of ``python -c``. Use pwncli for interactive exploit-driver workflows. Args: command: Shell command to run. cwd: Working directory (defaults to /workspace). Use a container-visible path under /workspace; relative paths resolve under /workspace. timeout: Timeout in seconds. Returns: JSON string with stdout/stderr/exit code.Execute a system command and wait for completion. Note: Use this for build and helper commands. Do not use this to run the target binary under analysis. Use set_file + run (or attach) for the target. Use execute_python_code instead of ``python -c``. Use pwncli for interactive exploit-driver workflows. Args: command: Shell command to run. cwd: Working directory (defaults to /workspace). Use a container-visible path under /workspace; relative paths resolve under /workspace. timeout: Timeout in seconds. Returns: JSON string with stdout/stderr/exit code.
pin 849eb276fa0a624252d6e949d60fa8f58e9201a4cf2216e2101d0ea4caf08795sendinputSend raw input to a session-scoped pwncli process stdin. Important: This call does not append a newline. If the target expects a line, include " " yourself. Args: data: Raw text to write to stdin. Returns: { "success": bool } indicating whether the input was written successfully.Send raw input to a session-scoped pwncli process stdin. Important: This call does not append a newline. If the target expects a line, include " " yourself. Args: data: Raw text to write to stdin. Returns: { "success": bool } indicating whether the input was written successfully.
pin 07fa57c18e4cf8a36b8fd3e7a242308f5e82cf701cfaf2d20c1028a0d3accdb0set_breakpointSet a breakpoint using MI (-break-insert). Args: location: Breakpoint location (symbol/address/file:line). condition: Optional breakpoint condition expression.Set a breakpoint using MI (-break-insert). Args: location: Breakpoint location (symbol/address/file:line). condition: Optional breakpoint condition expression.
pin ed8c7911627d914765d93e57af61117cf6600e5fa1ba44e5c6381a03307083e1set_fileLoad an executable file into GDB/pwndbg for debugging. Args: binary_path: Absolute path to the ELF to debug. Use the container-visible path under /workspace; relative paths resolve under /workspace. If your host file is ./workspace/chal, pass /workspace/chal here. Returns: Dict with MI command responses and state.Load an executable file into GDB/pwndbg for debugging. Args: binary_path: Absolute path to the ELF to debug. Use the container-visible path under /workspace; relative paths resolve under /workspace. If your host file is ./workspace/chal, pass /workspace/chal here. Returns: Dict with MI command responses and state.
pin 3ce471746656d433c3a22ffce84f66d8064178a240a31a265110f04fb865faadspawn_processSpawn a long-running background process and return its PID and log paths. Note: Use this for helper services. Do not use this to run the target binary under analysis. Use set_file + run (or attach) for debugger workflows. Use pwncli for exploit interaction. Args: command: Shell command to spawn. cwd: Working directory (defaults to /workspace). Use a container-visible path under /workspace; relative paths resolve under /workspace.Spawn a long-running background process and return its PID and log paths. Note: Use this for helper services. Do not use this to run the target binary under analysis. Use set_file + run (or attach) for debugger workflows. Use pwncli for exploit interaction. Args: command: Shell command to spawn. cwd: Working directory (defaults to /workspace). Use a container-visible path under /workspace; relative paths resolve under /workspace.
pin ff6007132992f90d19ef19e0836defdb2d49da305ea73dac96465668f49d7d22step_controlExecute a stepping command (c, n, s, ni, si). Args: command: One of {c, n, s, ni, si} or their long forms. Returns: Dict with MI responses and state.Execute a stepping command (c, n, s, ni, si). Args: command: One of {c, n, s, ni, si} or their long forms. Returns: Dict with MI responses and state.
pin 1669e8f594ca83a2ff5c9f83c21d1b72ab420dfdc3da3dc1cd70af3067083e5buntilRun until a specified location or next source line (MI -exec-until).Run until a specified location or next source line (MI -exec-until).
pin 020fbfd29989ab5d73f3f0066b839bfa110a8170756c254a5d59252835a03292
runs · 1
the latest tests of this entry by the hub and its workers, newest first| date | worker | method | status | sandbox | reason |
|---|---|---|---|---|---|
| 2026-10-17 13:22 | local-mac-vm | dockermcp 2025-11-25 | ok36 tools | gvisor | — |