Appknox MCP Server
An MCP server that connects your AI coding agent to Appknox KnoxIQ, so it can fetch the vulnerabilities Appknox found in your app, fix them in your repo, and verify each fix with the finding's own proof-of-concept — without leaving your editor.
Works with any MCP-capable agent. Verified with Claude, Codex, Copilot, Cursor, and Windsurf — anything else that speaks MCP should work too.
Install
Two ways: ask your agent (no clone, recommended) or run the guided script.
Option A — Ask your agent (no clone)
If you already have an AI coding agent running (Claude Code, Cursor, Codex, …), paste this — the install guide bundled in the package has every remaining step (credentials, client config, the Claude Code plugin, restarting), so there's nothing else to keep in sync here:
Install the appknox-mcp MCP server for me:
1. `uv tool install --reinstall appknox-mcp` —
**always include `--reinstall`**: without it, `uv` silently does nothing if
any version is already installed, even a stale one missing this exact flag.
2. Run `appknox-mcp --install-guide` and follow it exactly.
That's it — the agent installs it, reads the guide, asks you for credentials, writes the config, and tells you to restart the client.
Option B — Guided script (auto-detects your clients)
Prefer a deterministic install? Clone and run the installer — macOS, Linux, and
Windows all get the identical flow and write identical config, just via a
.sh or .ps1 wrapper around the same Python backend:
macOS / Linux / WSL / Git Bash:
git clone git@github.com:appknox/appknox-mcp.git
cd appknox-mcp
./scripts/install.sh
Windows (PowerShell):
git clone git@github.com:appknox/appknox-mcp.git
cd appknox-mcp
.\scripts\install.ps1
It installs uv if missing, auto-detects the MCP clients on your machine, and
lets you pick which to configure (space-separated numbers, a for all, or m for
manual steps). It prompts for your token (hidden input) and your base URL (no
default offered — always ask, since white-labeled deployments use a different
host), merges the server into each selected client's config without touching
anything else, and git-ignores any token-bearing config. If Claude Code is
selected, it also installs the plugin (claude plugin marketplace add +
claude plugin install, user scope) so the /appknox:* slash commands and the
fixer agent are available from any repo, not just this one. Then restart the
client(s).
Name clients directly to skip detection:
./scripts/install.sh cursor codex(or.\scripts\install.ps1 cursor codexon Windows). SetAPPKNOX_ACCESS_TOKEN/APPKNOX_BASE_URLbeforehand to skip the prompts.
Full step-by-step, per-client config paths, and by-hand setup: INSTALL.md.
Verify it's connected
MCP servers only load at startup, so restart the client first, then check
it picked up appknox:
Claude Code
Run /mcp in any session — it's registered at user scope, so this works in
any project, not just one repo — you should see appknox listed with ~9
tools. If you also installed the plugin, try /appknox:triage to confirm the
slash commands loaded (this needs the plugin's own credentials — see
INSTALL.md for the env-var export it relies on).
Claude Desktop
Fully quit (Cmd+Q) and reopen — it only reads config at launch. Then either:
- click the hammer/tools icon in the chat input and look for
resolve_latest_file,list_analyses, etc., or - click + below the chat box → Connectors, or
- go to Settings → Developer to see the server's status and logs.
Codex CLI
Restart the Codex session, then run /mcp — appknox should appear in the
server list.
GitHub Copilot CLI
Restart your copilot session, then run /mcp inside it — or run
copilot mcp list directly from your shell. Either should show appknox.
Also run with --allow-all-mcp-server-instructions (v1.0.66+) if you want
the guided workflow (resolve → triage → fix → verify, exploitability shown by
default, etc.) — Copilot CLI doesn't feed any MCP server's instructions to the
model without it, so without this flag it'll still call the tools correctly
but skip the intended flow unless you spell each step out yourself.
Cursor
Restart Cursor, then open Settings → MCP. appknox should show a green
dot with a tool count next to it. (Green dot but 0 tools? Cursor caps tools at
40 across all enabled servers combined — check what else you have enabled.)
Windsurf
Restart Windsurf, then click the MCPs icon in the top-right of the Cascade
panel — appknox should show a green status indicator with its tools listed
underneath.
VS Code (incl. Copilot Chat)
Reload the window (Command Palette → Developer: Reload Window), then
Command Palette → MCP: List Servers — appknox should appear with
start/stop/restart options. Once started, open Copilot Chat and check the
tools icon next to the model picker — appknox's tools should be listed and
toggled on there.
Usage
Inside your app's repository, once the server is connected:
First run — resolving which build to check
The tools work against a specific Appknox file_id (a scanned build). You don't need to look one up:
- Don't mention one and the agent detects your app's
package_name(and Android/iOS platform) from the repo, resolves it to the latest scanned build on Appknox, and tells you which build it found before doing anything else — confirm it or point it at a different one. - Already have a file_id (e.g. checking an older build on purpose)? Just say so — it's used directly, after a quick check that it's still current.
You: Find and fix the Appknox vulnerabilities in this repo.
Agent: No file_id given — I'll detect this app from the repo and use its
latest scanned build. Found com.appknox.demo (Android), latest is
file_id 48213 (v3.2.1, scanned 2 days ago). Use this one?
You: Yes.
Agent: [checks scan readiness, then lists vulnerabilities by exploitability…]
Claude Code
| Command | What it does |
|---|---|
/appknox:triage |
Lists KnoxIQ vulnerabilities for the latest scanned build and — on your selection — fixes them, verifying each with its PoC. |
/appknox:fix <selection> |
Fixes the finding(s) you name — a single analysis_id, all, a severity, or an exploitability range (highly exploitable) — and verifies each with its PoC. Optional file_id second arg. |
/appknox:upload <binary-path> |
Uploads a built binary (APK/IPA/…) to Appknox and starts a fresh scan; returns the new file_id. |
/appknox:verify <new_file_id> [old_file_id] |
Compares the re-scanned build to report which vulnerabilities are resolved vs still open. |
No file_id needed for triage/fix — the app is resolved from the repo's
package_name. If KnoxIQ isn't enabled or the scan isn't ready, the command says
so instead of showing an empty list.
Full loop: /appknox:triage → fix → build → /appknox:upload → /appknox:verify.
Any other client (Codex, Cursor, Claude Desktop, …)
No slash commands, but the same workflow is built into the server, so just ask:
- "Find and fix the Appknox vulnerabilities in this repo."
- "Fix Appknox analysis 405." / "Fix all highly exploitable findings."
- "Upload build/app-release.apk to Appknox."
- "Did my fixes work? Compare build 987 against 950."
The fixes are left staged for you to review — the commands never commit. A local PoC check is confidence, not proof; the Appknox re-scan is the ground truth.
Credentials
Create a service account in the Appknox dashboard under Service Accounts and
copy the Access Key ID and Secret Access Token. The token format is
<Access Key ID>:<Secret Access Key>.
| Environment Variable | Required | Default | Description |
|---|---|---|---|
APPKNOX_ACCESS_TOKEN |
Yes | — | <Access Key ID>:<Secret Access Key> |
APPKNOX_BASE_URL |
No | https://publicapi.appknox.com |
API host (use staging while KnoxIQ is in beta) |
Per-client config file paths and shapes: INSTALL.md.
Uninstall
Installed via Option A (no clone)? Use the bundled command — it needs nothing but the package you already have:
appknox-mcp --remove-client cursor # same client names as install
Then, to remove the package itself: uv tool uninstall appknox-mcp.
Installed via Option B (cloned the repo)? Use the installer scripts — functionally identical, just also cleans up the Claude Code plugin registration:
./scripts/uninstall.sh cursor # same client names as install
.\scripts\uninstall.ps1 cursor # Windows
Either way, only the appknox entry is removed from that client's config;
nothing else is touched. Restart the client afterwards.
Release files for appknox-mcp 1.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| appknox_mcp-1.0.1.tar.gz | 59.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| appknox_mcp-1.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 106.5 kB
Release files / appknox_mcp-1.0.1.tar.gz
| Download URL | appknox_mcp-1.0.1.tar.gz |
|---|---|
| Size | 59.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
faafb84d1d208cd3cabcb52730f5e5020ea19341053ca445a00f04dda72c3c92
|
|
BLAKE2b-256 checksum How to use checksums |
d6100a07b9782adb5c7bc8c2f0800f89b165a4eb9102c6f181c4b5958ad8dfa5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.15 {"installer":{"name":"uv","version":"0.12.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / appknox_mcp-1.0.1-py3-none-any.whl
| Download URL | appknox_mcp-1.0.1-py3-none-any.whl |
|---|---|
| Size | 47.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
bebf45977e7a076862efac60e0919c68b3d4da44ddc5b484ca4ca979dded8339
|
|
BLAKE2b-256 checksum How to use checksums |
7e7d57a9b94eeb19c82e9702dd64bd9910d84508b71474b431d60c47103dbfac
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.12.15 {"installer":{"name":"uv","version":"0.12.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|