# podkop-mcp (pypi · podkop-mcp)

MCP server for managing Podkop and Forkop on OpenWrt over SSH

- Trust score: 75/100 (medium)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- pypi · `podkop-mcp`: 75/100 (this document), [markdown](https://verifymcp.io/servers/mikel38487-podkop-mcp/podkop-mcp.md), [page](https://verifymcp.io/servers/mikel38487-podkop-mcp/podkop-mcp)

## Channel facts

- Registry: `pypi`
- Package: `podkop-mcp`
- Version: `0.2.2`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 100/100
  - No malware found by supply-chain analysis.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs hatchling.build at install time, a recognised build step with no custom scripting around it.
  - 1 of 35 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 100/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to mikel38487/podkop-mcp).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 3 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 58/100
  - AI-judged instruction clarity (fair).
  - Tool/resource definitions use about 3828 tokens (~81/item across 47 items; 47 tools + 0 resources), lean.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability not yet verified: not enough scan history yet (needs a 30-day window).
- **Tool Coverage**: 71/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 0% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 75/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - 0 of 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "podkop_option_delete" implies "delete" and declares no destructiveHint at all, which the MCP spec reads as destructive by default.
  - An AI judge read all 48 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the podkop-mcp server?

podkop-mcp runs locally as a PyPI package, launched with uvx podkop-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add mikel38487-podkop-mcp -- uvx podkop-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "mikel38487-podkop-mcp": {
      "command": "uvx",
      "args": [
        "podkop-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "mikel38487-podkop-mcp": {
      "command": "uvx",
      "args": [
        "podkop-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add mikel38487-podkop-mcp -- uvx podkop-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "mikel38487-podkop-mcp": {
      "type": "local",
      "command": [
        "uvx",
        "podkop-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add mikel38487-podkop-mcp --command uvx --arg podkop-mcp
```

### Hermes

```yaml
mcp_servers:
  mikel38487-podkop-mcp:
    command: "uvx"
    args: ["podkop-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "mikel38487-podkop-mcp": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "podkop-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add mikel38487-podkop-mcp -t stdio -c uvx -a podkop-mcp
```

### Other

```json
{
  "mcpServers": {
    "mikel38487-podkop-mcp": {
      "command": "uvx",
      "args": [
        "podkop-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-05 (score 75, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-11-04 (score 60, −15)

- [security regression] Malware scan: pass → unverified

### 2026-11-03 (score 75, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-11-01 (score 60)

First indexed and scored.

## MCP tools (47)

### `podkop_doctor` (~60 tokens)

Check MCP configuration, SSH connectivity, backend and capabilities.

Use this first when something does not work: it explains missing
environment variables, SSH key problems and the detected Podkop/Forkop
version without changing the router.

Input parameters:

- `target`

### `podkop_status` (~28 tokens)

Return service, sing-box, DNS and version status of the router.

Input parameters:

- `target`

### `podkop_core_features` (~30 tokens)

Return sing-box features compiled into the installed Forkop core (read-only).

Input parameters:

- `target`

### `podkop_import_check` (~38 tokens)

Validate a Forkop config file on the router without applying it (read-only).

Input parameters:

- `path` (string, required)
- `target`

### `podkop_installer_status` (~37 tokens)

Return the status of the last Forkop installer run (read-only).

Input parameters:

- `offset` (integer)
- `target`

### `podkop_installer_log` (~30 tokens)

Return the last Forkop installer log, redacted (read-only).

Input parameters:

- `target`

### `podkop_system_info` (~34 tokens)

Return model, OpenWrt version, kernel, load, memory, disk and WAN info.

Input parameters:

- `target`

### `podkop_health` (~70 tokens)

Run read-only health checks: sing-box, nftables, FakeIP and DNS.

\``full=true`` additionally runs the global network check, which can
take up to a minute because it tests real connectivity.

Input parameters:

- `full` (boolean)
- `target`
- `timeout` (number)

### `podkop_logs` (~72 tokens)

Return recent router logs, filtered and redacted.

\``source`` selects Forkop/Podkop journal, sing-box journal or the whole
system log. Secrets in URLs are masked before returning.

Input parameters:

- `filter`
- `lines` (integer)
- `source` (string)
- `target`

### `podkop_cli` (~110 tokens)

Run a read-only Forkop/Podkop CLI command from the allowlist.

Mutating commands (start, stop, reload, list_update, subscription_update,
component actions) are rejected: use dedicated tools so that backups and
rollback are applied. Output is redacted unless reveal_secrets=true.

Input parameters:

- `args`
- `command` (string, required)
- `parse_json` (boolean)
- `reveal_secrets` (boolean)
- `target`
- `timeout` (number)

### `podkop_config_get` (~95 tokens)

Return the full UCI configuration as structured JSON.

Secrets (subscription URLs, proxy strings, keys) are masked unless
reveal_secrets=true. The structure is identical for Forkop 1.x/2.x and
Podkop; use podkop_sections_list for a compact view.

Input parameters:

- `include_raw` (boolean)
- `package`
- `reveal_secrets` (boolean)
- `target`

### `podkop_config_export` (~70 tokens)

Export the UCI config as text (backup-style).

\``raw`` requires reveal_secrets=true because it contains proxy URLs and
keys. By default the masked export from Forkop is returned.

Input parameters:

- `mode` (string)
- `reveal_secrets` (boolean)
- `target`

### `podkop_option_get` (~50 tokens)

Read a single UCI option or section by path, e.g. forkop.main.domain.

Input parameters:

- `path` (string, required)
- `reveal_secrets` (boolean)
- `target`

### `podkop_option_set` (~110 tokens)

Set a UCI option or list. Dry-run by default; apply=true writes, backs up and reloads.

\``value_type=auto`` sets a list when ``value`` is a list, otherwise an
option. The tool preserves the backend package and never touches other
OpenWrt packages.

Input parameters:

- `apply` (boolean)
- `path` (string, required)
- `reason` (string)
- `target`
- `value` (required)
- `value_type` (string)

### `podkop_option_delete` (~53 tokens)

Delete a UCI option. Dry-run by default; apply=true writes with backup.

Input parameters:

- `apply` (boolean)
- `path` (string, required)
- `reason` (string)
- `target`

### `podkop_backup_create` (~42 tokens)

Create a config backup on the router (dry-run by default).

Input parameters:

- `apply` (boolean)
- `reason` (string)
- `target`

### `podkop_backup_list` (~30 tokens)

List config backups stored on the router.

Input parameters:

- `limit` (integer)
- `target`

### `podkop_backup_restore` (~50 tokens)

Restore a config backup by id. Dry-run shows the action; apply=true restores and reloads.

Input parameters:

- `apply` (boolean)
- `backup_id` (string, required)
- `target`

### `podkop_sections_list` (~88 tokens)

List routing sections with action, enabled flag, domain counts and lists.

This is the fastest overview of what Forkop/Podkop is doing. Child UCI
sections (subscriptions, URLTest groups, links) are counted; set
include_children=true to return them too.

Input parameters:

- `include_children` (boolean)
- `reveal_secrets` (boolean)
- `target`

### `podkop_section_get` (~50 tokens)

Return all options of one section plus its child items.

Input parameters:

- `include_children` (boolean)
- `reveal_secrets` (boolean)
- `section` (string, required)
- `target`

### `podkop_section_create` (~112 tokens)

Create a new routing section. Dry-run by default.

Minimal defaults are backend-specific: Forkop gets enabled=1 and the
requested action; Podkop gets connection_type=proxy. For zapret2 on
Forkop 1.x you must pass nfqws2_opt in options, otherwise the generated
config will be rejected by the core.

Input parameters:

- `action` (string)
- `apply` (boolean)
- `name` (string, required)
- `options`
- `target`

### `podkop_tunnel_create` (~120 tokens)

Create a Forkop 2.x tunnel child (WARP/WireGuard/OpenVPN/...). Dry-run by default.

\``kind`` is one of warp, wireguard, amneziawg, tailscale,
openvpn-client, openconnect, json. Extra backend options are passed
through; secrets in preview are masked.

Input parameters:

- `apply` (boolean)
- `kind` (string, required)
- `label`
- `name` (string, required)
- `options`
- `section` (string, required)
- `target`

### `podkop_child_create` (~111 tokens)

Create a generic Forkop 2.x child (urltest/fallback_group/link/interface/json/tunnel_peer).

This is a low-level escape hatch for new 2.0 entities; domain tools and
podkop_subscription_add remain the safe high-level paths. Dry-run by default.

Input parameters:

- `apply` (boolean)
- `child_type` (string, required)
- `label`
- `name` (string, required)
- `options`
- `section` (string, required)
- `target`

### `podkop_section_update` (~74 tokens)

Update selected options of a section (partial update). Dry-run by default.

Use podkop_domains_add/remove for domain lists: this tool writes raw
values but does not normalize domain syntax.

Input parameters:

- `apply` (boolean)
- `options` (object, required)
- `section` (string, required)
- `target`

### `podkop_section_delete` (~80 tokens)

Delete a section. Child items are deleted when cascade=true.

Deleting the main section is refused unless allow_main=true; it is
usually a configuration error. Dry-run by default.

Input parameters:

- `allow_main` (boolean)
- `apply` (boolean)
- `cascade` (boolean)
- `section` (string, required)
- `target`

### `podkop_section_enable` (~45 tokens)

Enable or disable a section without deleting it.

Input parameters:

- `apply` (boolean)
- `enabled` (boolean, required)
- `section` (string, required)
- `target`

### `podkop_domains_list` (~99 tokens)

List domains of one section, normalized plus the raw stored value.

Works for all backends: Forkop 1.x keeps domain as one space-separated
string, Forkop 2.x keeps one entry per line in destinations, Podkop uses
the user_domains UCI list. Use the returned storage/option values to
understand why entries are written the way they are.

Input parameters:

- `section` (string)
- `target`

### `podkop_domains_add` (~180 tokens)

Add domains to a section preserving the backend storage type.

Forkop 1.x keeps section.domain as a single string: the tool never turns
it into a UCI list (that would break domain_suffix matching). Forkop 2.x
writes multiline destinations, Podkop uses the user_domains list.
Duplicates are reported and not written again; invalid entries raise an
error. Dry-run by default: the diff and UCI preview are returned and the
router is untouched. With apply=true the config is written, the service
is reloaded and, if verify=true, the first added domain is resolved via
the router DNS to confirm it maps to a FakeIP address.

Input parameters:

- `apply` (boolean)
- `domains` (array, required)
- `section` (string, required)
- `target`
- `verify` (boolean)

### `podkop_domains_remove` (~72 tokens)

Remove domains from a section, keeping the storage type intact.

Domains that are not present are reported in not_found and do not make
the call fail. Dry-run by default.

Input parameters:

- `apply` (boolean)
- `domains` (array, required)
- `section` (string, required)
- `target`

### `podkop_domains_replace` (~90 tokens)

Replace the whole domain set of a section.

Every entry is validated first; on Forkop 2.x comments and blank lines of
the existing destinations block are preserved. Use podkop_domains_add or
podkop_domains_remove for incremental changes. Dry-run by default.

Input parameters:

- `apply` (boolean)
- `domains` (array, required)
- `section` (string, required)
- `target`

### `podkop_domains_find` (~91 tokens)

Find where a domain is covered by section entries.

Checks every top-level section and returns exact matches with the entry
kind (domain, zone, full, keyword, regex, ip). possible_lists shows
community lists selected in sections: their content lives on the router
as rule-sets, so the server cannot match a domain against them.

Input parameters:

- `domain` (string, required)
- `target`

### `podkop_domains_suggest` (~115 tokens)

Suggest hosts seen in live connections but not covered by any section.

Groups hosts from the Clash API by traffic, skips IP addresses,
localhost and already covered hosts. With only_direct=true (default) only
hosts whose chain is direct are suggested, i.e. traffic that currently
bypasses the proxy and may need a rule. Feed the result to
podkop_domains_add (suggested_section is usually main).

Input parameters:

- `limit` (integer)
- `only_direct` (boolean)
- `target`

### `podkop_domain_check` (~127 tokens)

Check one domain: DNS resolution, FakeIP, section coverage, HTTPS probe.

Resolves the domain through the router DNS (127.0.0.1) without touching
the configuration. fakeip=true means the domain maps to 198.18.x.x or
fc00::/18 (sing-box FakeIP ranges) and therefore goes through the proxy.
probe_http runs a curl HEAD request on the router; curl failures are
reported in http_error instead of raising.

Input parameters:

- `domain` (string, required)
- `probe_http` (boolean)
- `target`

### `podkop_community_lists_get` (~84 tokens)

Return selected and available community lists of sections.

With section: the selected lists of that section plus the built-in
catalogue of known names. Without section: a map for every top-level
section. Names outside the catalogue are reported in unknown (custom
rule-sets are allowed and never removed automatically).

Input parameters:

- `section`
- `target`

### `podkop_community_lists_update` (~139 tokens)

Add or remove community lists of one section as a UCI list.

Names must match ^[a-z0-9_]+$; duplicates are dropped and the order of
existing lists is preserved. The whole list is written at once, so no
per-item add_list/del_list calls are issued. Names outside the built-in
catalogue are reported in unknown but accepted. Dry-run by default;
apply=true writes the config, creates a backup and reloads the service.

Input parameters:

- `add`
- `apply` (boolean)
- `remove`
- `section` (string, required)
- `target`

### `podkop_connections_config` (~80 tokens)

List routing sections with subscriptions, urltest groups, links and tunnels.

Subscription URLs and proxy strings are masked unless
reveal_secrets=true. This is a read-only map of how connections are
configured; use podkop_subscription_* to modify them.

Input parameters:

- `reveal_secrets` (boolean)
- `section`
- `target`

### `podkop_subscription_add` (~100 tokens)

Add a subscription to a section. Dry-run by default; apply=true writes.

Accepts http(s):// URLs or local absolute paths (max 4096 chars).
Forkop creates a child section {section}_sub_N with sensible defaults;
Podkop writes subscription_url inline into the section.

Input parameters:

- `apply` (boolean)
- `options`
- `section` (string, required)
- `target`
- `url` (string, required)

### `podkop_subscription_delete` (~79 tokens)

Delete a subscription by name, 1-based index, tag or raw URL.

When ``section`` is given, only its children are considered. Podkop
removes the subscription_url option instead. Dry-run by default.

Input parameters:

- `apply` (boolean)
- `identifier` (string, required)
- `section`
- `target`

### `podkop_subscription_update` (~82 tokens)

Refresh subscription cache on the router (apply must be true).

Uses async update with status polling when the backend supports it,
otherwise runs the blocking subscription_update command. Bounded by
\``timeout`` seconds.

Input parameters:

- `apply` (boolean)
- `section`
- `target`
- `timeout` (number)
- `wait` (boolean)

### `podkop_proxies_list` (~53 tokens)

List Clash proxy groups and nodes with delays.

With ``group``, returns that group's members (all) and its current
selection (now). Read-only.

Input parameters:

- `group`
- `target`

### `podkop_proxy_select` (~88 tokens)

Select a proxy inside a Clash group (runtime change, not config).

Dry-run shows what would be selected. apply=true performs the switch;
on Forkop 1.x this raises BackendError because runtime selection is
not supported there — that is expected behaviour.

Input parameters:

- `apply` (boolean)
- `group` (string, required)
- `proxy` (string, required)
- `target`

### `podkop_proxy_test` (~50 tokens)

Run read-only proxy check and report selected-group delays.

Calls check_proxy via CLI when available; falls back to reporting
delays of currently selected proxies from Clash API history.

Input parameters:

- `target`

### `podkop_monitor_snapshot` (~79 tokens)

Return a monitoring snapshot: service, system, proxies, connections, traffic.

Collects everything available in one call; each part fails
independently (errors are reported in check_errors instead of raising).
Read-only and safe to call repeatedly.

Input parameters:

- `include_connections` (boolean)
- `target`
- `top` (integer)

### `podkop_connections_live` (~96 tokens)

List live connections with optional filters (host, source_ip, chain).

\``host`` and ``chain`` are case-insensitive substrings; ``source_ip``
matches exactly or as a network prefix ("192.0.2." matches all
clients in that subnet). Read-only.

Input parameters:

- `chain`
- `host`
- `limit` (integer)
- `source_ip`
- `target`

### `podkop_traffic` (~85 tokens)

Measure traffic rate by sampling Clash connections twice.

Returns download/upload bps, per-connection deltas and the top
consumers. ``sample_seconds`` is clamped to 0.5..10 s. Read-only; the
call blocks for the sampling interval.

Input parameters:

- `sample_seconds` (number)
- `target`
- `top` (integer)

### `podkop_service_action` (~97 tokens)

Start, stop, restart, reload or toggle autostart of Podkop/Forkop.

Dry-run by default. ``stop`` is refused in read-only mode. Use
podkop_apply-style tools for config changes; this tool only controls the
service lifecycle.

Input parameters:

- `action` (string, required)
- `apply` (boolean)
- `target`
- `timeout` (number)
- `wait` (boolean)

### `podkop_lists_update` (~77 tokens)

Update built-in lists and/or subscriptions.

This changes the router's downloaded rule sets and subscription cache,
so apply=true is required. Long operations are bounded by ``timeout``.

Input parameters:

- `apply` (boolean)
- `kind` (string)
- `target`
- `timeout` (number)
- `wait` (boolean)

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/mikel38487-podkop-mcp/podkop-mcp#diagnostics

## Score history

- 2026-11-05: 75
- 2026-11-04: 60
- 2026-11-03: 75
- 2026-11-02: 60
- 2026-11-01: 60

## Common questions

### What is the podkop-mcp server?

podkop-mcp is listed in the public MCP registry as io.github.mikel38487/podkop-mcp. MCP server for managing Podkop and Forkop on OpenWrt over SSH. This page covers its PyPI package (podkop-mcp).

### Is the podkop-mcp server safe to use?

podkop-mcp scores 75 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 5 November 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the podkop-mcp server expose?

podkop-mcp exposes 47 tools: podkop_doctor, podkop_status, podkop_core_features, podkop_import_check, podkop_installer_status, and 42 more. Their descriptions and schemas cost roughly 3,652 tokens of context every time the server is loaded.

### Is the podkop-mcp server still maintained?

podkop-mcp is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the podkop-mcp server under?

podkop-mcp declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- PyPI project: https://pypi.org/project/podkop-mcp/
- Socket report: https://socket.dev/pypi/package/podkop-mcp
- Repository: https://github.com/mikel38487/podkop-mcp
- Changelog RSS feed: https://verifymcp.io/servers/mikel38487-podkop-mcp/podkop-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/mikel38487-podkop-mcp/podkop-mcp.json
- HTML version of this page: https://verifymcp.io/servers/mikel38487-podkop-mcp/podkop-mcp
