Client Setup¶
Every AI tool below starts PPEE the same way: it runs ppee-cli --mcp as a child process and talks to it over stdin/stdout. What differs is where each tool keeps its configuration and how you check that it worked. Find your tool in the table, then follow its section.
| Tool | Config lives in | Add it with | Verify with |
|---|---|---|---|
| Claude Desktop | claude_desktop_config.json | Settings → Developer → Edit Config | Connectors list; mcp-server-ppee.log |
| Claude Code | ~/.claude.json or .<abbr title="Model Context Protocol: an open protocol that lets AI assistants call external tools">MCP</abbr>.json | claude <abbr title="Model Context Protocol: an open protocol that lets AI assistants call external tools">MCP</abbr> add | claude <abbr title="Model Context Protocol: an open protocol that lets AI assistants call external tools">MCP</abbr> list, /mcp |
| VS Code + GitHub Copilot | .vscode/mcp.json or user mcp.json | MCP: Add Server | Configure Tools in Chat |
| Copilot in JetBrains / Visual Studio / Xcode / Eclipse | mcp.json | the IDE's Copilot MCP settings | tool list in Copilot Chat |
| Cursor | .cursor/mcp.json or ~/.cursor/mcp.json | edit the file | MCP toggle + MCP Logs |
| Windsurf | mcp_config.json | Cascade → Actions → Open MCP config file | tool list in Cascade |
| Cline | cline_mcp_settings.json | MCP Servers → Configure | MCP Servers panel |
| Zed | settings.json → context_servers | edit settings | green dot in Settings → AI |
| Continue | config.yaml → mcpServers | edit config | Agent mode tool list |
| Gemini CLI | ~/.gemini/settings.json | edit or gemini mcp add | gemini mcp list, /mcp |
| OpenAI Codex CLI | ~/.codex/config.toml | codex mcp add | codex mcp list |
| opencode | opencode.json → mcp | edit the file | opencode mcp list |
| Kilo Code | kilo.jsonc → mcp | Settings → Agent Behaviour → MCP Servers | server status in the same panel |
| OpenClaw | mcp.servers in the OpenClaw config | openclaw mcp add | openclaw mcp doctor ppee --probe |
| Hermes Agent | ~/.hermes/config.yaml → mcp_servers | edit the file | hermes mcp test ppee, /reload-mcp |
| JetBrains AI Assistant | IDE settings | Settings → Tools → AI Assistant → MCP | server status after Apply |
Tool not listed?
Most MCP clients use the same JSON shape: "mcpServers": { "ppee": { "command": "<full path to ppee-cli>", "args": ["--mcp"] } }. Copy the Claude Desktop snippet and adapt it, or see Other clients.
Before you start¶
1. Get ppee-cli 2.0.0 or newer (install) and check that MCP mode is there:
$ ppee-cli --help | grep mcp
ppee-cli --mcp [--mcp-allow-write]
--mcp run as a Model Context Protocol server on stdin/stdout
--mcp-allow-write with --mcp: also expose the patch_pe (write) tool
2. Note the absolute path to the executable. Tools rarely inherit your shell's PATH, so a bare ppee-cli often fails.
| Platform | Example path |
|---|---|
| Windows | C:\Tools\ppee\ppee-cli.exe |
| Linux | /opt/ppee/ppee-cli |
| macOS | run the CLI through Docker (there is no native macOS build) |
Optional: keep Suspicious.txt in the same folder as ppee-cli. It is the keyword list behind the suspicious strings group (get_strings); without it that group is empty and the response says so (suspiciousNote). Builds and the container image put it there already.
3. Test the server outside any AI tool (30 seconds, saves a lot of guessing):
You should see a ready on stdio line on stderr and a JSON reply listing the tools. If not, fix this first; no client will do better.
Windows and JSON: escape backslashes
In every JSON file below, write Windows paths with double backslashes (C:\\Tools\\ppee\\ppee-cli.exe) or with forward slashes (C:/Tools/ppee/ppee-cli.exe). A single backslash makes the file invalid and the tool will silently show no servers.
Two rules that apply to every tool
- Paths you give the assistant are read by the server, on the machine or container where it runs. Use
C:\Samples\a.exefor a native server, or the container path (/samples/a.exe) for a Docker server. - The server can read any file your account can read. For untrusted samples, prefer Docker with a read-only samples folder (Security).
- Restart or reload after editing a config file, unless the tool says it reloads by itself.
Claude Desktop¶
Windows and macOS. Claude Desktop is not offered on Linux; use Claude Code there.
- Open Settings → Developer and click Edit Config. This opens (or creates)
claude_desktop_config.json:- Windows:
%APPDATA%\Claude\claude_desktop_config.json - macOS:
~/Library/Application Support/Claude/claude_desktop_config.json
- Windows:
-
Add the
ppeeserver:If the file already has other servers, add
ppeenext to them inside the samemcpServersobject. 3. Quit Claude Desktop completely (not just close the window) and start it again. 4. In a new chat, open the Add files, connectors, and more control near the message box, go to Connectors, and confirm ppee is listed with its tools.
If it doesn't show up: open the logs (%APPDATA%\Claude\logs on Windows, ~/Library/Logs/Claude on macOS). mcp.log records connection failures, and mcp-server-ppee.log holds PPEE's stderr, where you should find MCP server ready on stdio. Claude asks for your approval before each tool call; approving get_hashes or check_signature is fine, but read the security model before allowing anything that writes.
Official guide: Connect to local MCP servers
Claude Code¶
Windows, Linux, macOS (terminal). Two rules from the CLI: put options before the server name, and put -- before the server command so --mcp goes to PPEE instead of being read by claude.
# available in every project of your user
claude mcp add --scope user ppee -- /opt/ppee/ppee-cli --mcp
# or only for the current project, kept private (default scope)
claude mcp add ppee -- /opt/ppee/ppee-cli --mcp
# or shared with the team through the repo (writes .mcp.json)
claude mcp add --scope project ppee -- /opt/ppee/ppee-cli --mcp
Check it:
Inside a session, type /mcp to see the status (✔ Connected, ✘ Failed) and tool counts, and to disable or enable the server for that project.
| Scope | Stored in | Shared? |
|---|---|---|
local (default) | ~/.claude.json, for this project | No |
project | .mcp.json in the repo | Yes, through git |
user | ~/.claude.json, all projects | No |
- A project-scoped server from
.mcp.jsonasks for your approval the first time;claude mcp reset-project-choicesasks again. - Already set up Claude Desktop?
claude mcp add-from-claude-desktopimports its servers. - Prefer JSON?
claude mcp add-json ppee '{"command":"/opt/ppee/ppee-cli","args":["--mcp"]}'
Official guide: Claude Code MCP
Visual Studio Code (GitHub Copilot)¶
- Run MCP: Add Server from the Command Palette (Ctrl+Shift+P) and choose the local command (stdio) option, or edit the file directly. Pick Workspace to share it with the repo or Global for all workspaces (MCP: Open User Configuration opens the global file).
-
The file is
.vscode/mcp.json(top-level keyservers): -
The first time the server starts, VS Code shows a trust dialog. Select the link to review the command, then confirm.
- Open the Chat view, switch to Agent mode, and select Configure Tools in the chat input: the
ppeetools should be listed, and you can switch individual ones off (for examplepatch_pe).
Command-line shortcut:
Copilot Business / Enterprise
If your organization manages Copilot, an administrator must enable the "MCP servers in Copilot" policy. It doesn't apply to individual Copilot plans.
Official guide: MCP servers in VS Code
GitHub Copilot in other IDEs¶
Copilot in JetBrains IDEs, Visual Studio, Xcode and Eclipse supports local stdio servers with the same mcp.json shape as VS Code (top-level servers). Open the IDE's Copilot MCP configuration and add:
{
"servers": {
"ppee": {
"command": "C:\\Tools\\ppee\\ppee-cli.exe",
"args": ["--mcp"]
}
}
}
In Visual Studio add "type": "stdio" to the entry. Then start a Copilot Chat in agent mode and check that the ppee tools are offered. The organization policy in the VS Code section applies here too.
Official guide: Extend Copilot Chat with MCP
Cursor¶
- Create the config file. Per project:
.cursor/mcp.jsonin the project root. For every project:~/.cursor/mcp.json(on Windows,%USERPROFILE%\.cursor\mcp.json). -
Add the server (top-level key
mcpServers): -
Open Cursor's MCP settings (in the sidebar's Customize area in current versions) and make sure the ppee toggle is on. A disabled server doesn't load and its tools don't appear in chat.
- Ask something in Agent chat. To see what happened, open the Output panel (Ctrl+Shift+U) and pick MCP Logs.
Official guide: Cursor MCP
Windsurf¶
- In the Cascade panel, click the … (Actions) menu and choose Open MCP config file. This opens the right file for your version; on current builds it is
~/.config/devin/mcp_config.json(macOS/Linux) or%APPDATA%\devin\mcp_config.json(Windows). -
Add the server (top-level key
mcpServers): -
Save the file. Changes take effect on save; there is no marketplace or one-click install for custom servers, so this manual edit is the way.
Official guide: Cascade MCP
Cline¶
The Cline extension for VS Code.
- Open the Cline panel and click the MCP Servers icon in its top toolbar.
- Go to the Configure tab and click Configure MCP Servers. This opens
cline_mcp_settings.json. -
Add the server:
-
Save. The server appears in the MCP Servers panel; run a small request to confirm.
Leave autoApprove empty for anything that writes
autoApprove lists tools Cline may run without asking. Adding get_hashes, list_imports or check_signature is reasonable. Never add patch_pe.
Official guide: Configuring MCP servers in Cline
Zed¶
Zed calls MCP servers context servers. Open your settings (zed: open settings) and add:
{
"context_servers": {
"ppee": {
"command": "/opt/ppee/ppee-cli",
"args": ["--mcp"],
"env": {}
}
}
}
Verify in Settings → AI → MCP Servers (or run agent: open settings and pick MCP Servers): a green dot with the tooltip Server is active means it is running. Other colors or tooltips explain what failed.
Official guide: MCP in Zed
Continue¶
Add PPEE under mcpServers in config.yaml (a file under .continue/mcpServers/ works too; see Continue's docs for its file header):
Agent mode only
Continue can use MCP tools only in Agent mode. In Chat or Edit mode the ppee tools are not available.
Official guide: MCP in Continue
Gemini CLI¶
Edit ~/.gemini/settings.json (for all projects) or .gemini/settings.json (this project only):
{
"mcpServers": {
"ppee": {
"command": "/opt/ppee/ppee-cli",
"args": ["--mcp"],
"trust": false
}
}
}
Then check it:
gemini mcp list # from the shell: connection status and tools
/mcp # the same, inside a Gemini session
Keep trust false
"trust": true skips the confirmation prompts for this server's tools. For PPEE, leave it false (the default), especially if you enable patch_pe.
Official guide: Gemini CLI MCP servers
OpenAI Codex CLI¶
The file is ~/.codex/config.toml; a project can carry its own .codex/config.toml if the project is trusted. codex mcp --help lists the other subcommands.
Official guide: Codex MCP
opencode¶
opencode's format differs from most tools: the executable and its arguments go together in one command array, and each entry needs "type": "local".
- Create or edit the config:
opencode.json(oropencode.jsonc) in the project root for one project, or the global config in~/.config/opencode/. -
Add the server under the top-level
mcpkey: -
Start opencode and check the server:
opencode mcp listshows the registered servers and their status.
"enabled": false keeps the entry without loading it. To use --mcp-allow-write, add it as another element of the command array (["…/ppee-cli", "--mcp", "--mcp-allow-write"]).
Official guide: opencode MCP servers
Kilo Code¶
Kilo Code (the VS Code and JetBrains extension, and the kilo CLI) uses the same format as opencode: one command array holds the executable and its arguments, under a top-level mcp key, with "type": "local".
- Open the config in either of these ways:
- From the UI: Settings (gear icon) → Agent Behaviour → MCP Servers → Add Server → Local (stdio).
- By editing the file:
kilo.jsoncin the project root (or.kilo/kilo.jsonc) for one project, or~/.config/kilo/kilo.jsoncfor all projects.
-
Add the server:
-
Check the server under Settings → Agent Behaviour → MCP Servers. A
failedstatus means the server didn't start: check the path, and run the command by hand (see Testing without an AI tool).
The default start-up timeout for local servers is 10 seconds (10000 ms). Raise it for Docker, as in the example above, if the image has to start first.
Auto-approval. Kilo Code approves tools through the top-level permission key, by name in the form <server>_<tool>. Approve only the read-only tools, and never ppee_patch_pe or a ppee_* wildcard if the server runs with --mcp-allow-write:
To use --mcp-allow-write, add it to the command array (["…/ppee-cli", "--mcp", "--mcp-allow-write"]).
Official guide: Using MCP in Kilo Code
OpenClaw¶
OpenClaw runs MCP servers from its Gateway process, and saves them under mcp.servers in the OpenClaw configuration (not in separate files).
The path must exist on the Gateway host
The Gateway starts ppee-cli, so command and every file path you give the assistant refer to the machine (or container) where the Gateway runs. If the Gateway is on a server or in Docker and your samples are elsewhere, copy the samples there or mount them into the container.
If your shell or OpenClaw reads --mcp as one of its own options, set the whole entry as JSON instead:
Then verify and manage it:
openclaw mcp doctor ppee --probe # connects, and lists what the server advertises
openclaw mcp status --verbose # all servers and their state
openclaw mcp show ppee # the stored entry
openclaw mcp unset ppee # remove it
With Gateway hot reload enabled, a new or changed server is picked up on the next turn without a restart. If it doesn't appear, restart the Gateway. For stdio servers, look for the Gateway's debug output prefixed bundle-mcp:ppee:, and check that the command resolves in the Gateway's environment.
Limit what the agent can call. OpenClaw can filter a server's tools, which suits PPEE well: expose only the read-only analysis tools.
openclaw mcp tools ppee --include 'analyze_pe,get_hashes,list_imports,list_exports,check_signature,get_strings'
or in the entry: toolFilter: { include: ["analyze_pe", "get_*", "list_*", "check_signature"] }. (patch_pe only exists when you start PPEE with --mcp-allow-write, so leaving that flag off is the first safeguard; see the security model.)
Official guides: Connect MCP servers · Manage saved MCP servers
Hermes Agent¶
Hermes Agent (Nous Research) reads MCP servers from mcp_servers in ~/.hermes/config.yaml, starts them when it starts, and registers each tool as mcp_<server>_<tool>: with the server named ppee, the assistant sees mcp_ppee_triage_pe, mcp_ppee_get_hashes and so on.
Then check the connection, and load the change into a running session:
In a Hermes session, /reload-mcp reloads the servers without a restart.
Limit what the agent can call. Hermes filters a server's tools under tools, so you can expose only the analysis tools you want:
mcp_servers:
ppee:
command: "/opt/ppee/ppee-cli"
args: ["--mcp"]
tools:
include: ["triage_pe", "analyze_pe", "get_*", "list_*", "check_signature"]
(patch_pe only exists when you start PPEE with --mcp-allow-write, so leaving that flag off is the first safeguard; see the security model.)
Official guide: MCP in Hermes Agent
JetBrains AI Assistant¶
- Open Settings → Tools → AI Assistant → Model Context Protocol (MCP) and click Add.
- Choose STDIO as the transport.
-
Paste the JSON configuration:
-
Set the server level: Global (all projects) or Project. Leave Working directory empty unless you use relative paths.
- Click OK, then Apply. Applying starts the server; its status shows in the same list.
Official guide: MCP in JetBrains AI Assistant
Other clients¶
Any client that can launch a local stdio MCP server works. What you always provide is the same two things:
| Setting | Value |
|---|---|
| Command | absolute path to ppee-cli (or docker) |
| Arguments | --mcp (or the docker run … arguments below) |
| Transport | stdio |
Look for a JSON key named mcpServers or servers (or context_servers, or a TOML [mcp_servers.*] table). The rest of this page applies unchanged.
Browser-based chat apps
Chat apps that run purely in the browser can only reach MCP servers exposed over HTTPS. ppee-cli --mcp speaks stdio only, so connect PPEE from one of the desktop apps, IDEs or terminal tools above.
Docker¶
Running the server in a container isolates it completely. In any config above, replace the command and arguments with:
"command": "docker",
"args": ["run", "--rm", "-i", "--network", "none",
"-v", "C:/Samples:/samples:ro",
"ppee-cli", "--mcp"]
| Flag | Why |
|---|---|
-i | Required: MCP talks over stdin |
--rm | Remove the container when the session ends |
--network none | PPEE needs no network |
-v /host/samples:/samples:ro | The only files the assistant can reach. On Windows use forward slashes (C:/Samples) inside JSON |
--read-only | Harden further. check_similarity then reports "available": false (the DB can't be created) |
Tell the assistant to use container paths (/samples/x.exe). Build the image first (see Docker); its name here is ppee-cli.
Enabling the write tool¶
Add --mcp-allow-write to the arguments to expose patch_pe:
Read the security model first, and do not auto-approve this tool in any client (Cline's autoApprove, Gemini CLI's trust, or an "always allow" choice in an approval prompt).
First prompts to try¶
Once the tools appear, start with one of these (adjust the path):
- "Use ppee to triage
C:\Samples\invoice.exe." (runstriage_pe: a ranked list of what looks unusual) - "Use ppee to get the hashes of
C:\Samples\invoice.exe." - "Is
setup.exesigned, and was it modified after signing?" - "List the imports of
agent.dlland group them by capability." - "What was
agent.dllbuilt with, and does its metadata reveal any configuration?" (uses runtime analysis)
More ideas: tool reference → example prompts.
Testing without an AI tool¶
This opens a web UI where you can list tools and call them by hand.
printf '%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"t","version":"1"}}}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"get_hashes","arguments":{"path":"/samples/x.exe"}}}' \
| ppee-cli --mcp
Troubleshooting¶
| Symptom | Fix |
|---|---|
| The server doesn't appear at all | Check the JSON/YAML/TOML syntax (Windows backslashes are the usual culprit), use an absolute command path, and restart the tool |
| It appears but shows as failed | Run the exact command in a terminal (ppee-cli --mcp) and type Ctrl+D: it should start and print MCP server ready on stdio on stderr. Then read the tool's MCP log |
| Where is the log? | Claude Desktop: %APPDATA%\Claude\logs\mcp-server-ppee.log. Cursor: Output panel → MCP Logs. Claude Code: /mcp. Zed: Settings → AI → MCP Servers |
| Tools are visible but the assistant doesn't use them | Switch the tool to its agent mode (VS Code, Cursor, Continue), and mention "use ppee" once in your prompt |
failed to load '<path>' | The path must exist where the server runs. For Docker, use the container path |
| Docker server exits immediately | Add -i |
unknown option: --mcp | Upgrade to ppee-cli 2.0.0 or newer |
| A path with non-ASCII characters fails on Windows | MCP paths arrive as UTF-8 and are converted to the system ANSI code page, as with CLI arguments. Characters outside that code page can't be opened; rename the file or use a short (8.3) path |
| The tool asks for approval on every call | That is expected and good. Approve read-only tools per call, and leave patch_pe disabled unless you need it |
Next: Tool reference → · Security model →