GitHub
server ทางการของ GitHub ให้ AI อ่านและจัดการโค้ด issue และ pull request ในบัญชีของคุณได้ ใช้ผ่านคลาวด์ของ GitHub หรือรันในเครื่องด้วย Docker ก็ได้
คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)
MCP server for managing Podkop and Forkop on OpenWrt over SSH
สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน
ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry
เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง
PODKOP_MCP_SSH_HOST, PODKOP_MCP_SSH_USER, PODKOP_MCP_SSH_KEY_PATH, PODKOP_MCP_HOST_KEY_POLICY, PODKOP_MCP_READ_ONLYต้องเตรียมก่อน
คุณใช้แอปไหน
เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”
เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json
{
"mcpServers": {
"podkop": {
"command": "uvx",
"args": [
"podkop-mcp"
],
"env": {
"PODKOP_MCP_SSH_HOST": "ใส่ค่าของคุณ",
"PODKOP_MCP_SSH_USER": "ใส่ค่าของคุณ",
"PODKOP_MCP_SSH_KEY_PATH": "ใส่ค่าของคุณ",
"PODKOP_MCP_HOST_KEY_POLICY": "ใส่ค่าของคุณ",
"PODKOP_MCP_READ_ONLY": "ใส่ค่าของคุณ"
}
}
}
}พิมพ์คำสั่งนี้ใน Terminal
claude mcp add podkop --env PODKOP_MCP_SSH_HOST='ใส่ค่าของคุณ' --env PODKOP_MCP_SSH_USER='ใส่ค่าของคุณ' --env PODKOP_MCP_SSH_KEY_PATH='ใส่ค่าของคุณ' --env PODKOP_MCP_HOST_KEY_POLICY='ใส่ค่าของคุณ' --env PODKOP_MCP_READ_ONLY='ใส่ค่าของคุณ' -- uvx podkop-mcpเติมค่าที่เว้นว่างไว้ก่อนรัน
วางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json
{
"mcpServers": {
"podkop": {
"command": "uvx",
"args": [
"podkop-mcp"
],
"env": {
"PODKOP_MCP_SSH_HOST": "ใส่ค่าของคุณ",
"PODKOP_MCP_SSH_USER": "ใส่ค่าของคุณ",
"PODKOP_MCP_SSH_KEY_PATH": "ใส่ค่าของคุณ",
"PODKOP_MCP_HOST_KEY_POLICY": "ใส่ค่าของคุณ",
"PODKOP_MCP_READ_ONLY": "ใส่ค่าของคุณ"
}
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
วางในไฟล์ .vscode/mcp.json ของโปรเจกต์
{
"servers": {
"podkop": {
"type": "stdio",
"command": "uvx",
"args": [
"podkop-mcp"
],
"env": {
"PODKOP_MCP_SSH_HOST": "ใส่ค่าของคุณ",
"PODKOP_MCP_SSH_USER": "ใส่ค่าของคุณ",
"PODKOP_MCP_SSH_KEY_PATH": "ใส่ค่าของคุณ",
"PODKOP_MCP_HOST_KEY_POLICY": "ใส่ค่าของคุณ",
"PODKOP_MCP_READ_ONLY": "ใส่ค่าของคุณ"
}
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น
ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี
PODKOP_MCP_SSH_USER envPODKOP_MCP_SSH_KEY_PATH envPODKOP_MCP_HOST_KEY_POLICY envPODKOP_MCP_READ_ONLY envค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README
รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง
เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 8 พ.ย. 2569
ชื่อใน registry ยืนยันด้วยบัญชี GitHub mikel38487 ซึ่งเป็นเจ้าของ repo
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต
ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน
รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต
เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo
จากการตรวจเบื้องต้นของเรา ผ่าน 1 จาก 1 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น
ต้องใส่ค่าเหล่านี้: PODKOP_MCP_SSH_HOST
รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)
repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (0.2.2) เข้า registry 7 วันที่ผ่านมา
โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Python (uv) ในเครื่องด้วย
ในหมวดเดียวกันมี GitHub, Desktop Commander, Cloudflare MCP
server หมวดเดียวกันจากผู้ทำคนอื่น เรียงตามดาว
อ่านการ์ด:↓ ดาวน์โหลดต่อสัปดาห์i★ ดาว GitHubiสามเสา: รีวิว · ผลตรวจ · การใช้งานiอัปเดต = วันที่ส่งรุ่นล่าสุดเข้า registryi
server ทางการของ GitHub ให้ AI อ่านและจัดการโค้ด issue และ pull request ในบัญชีของคุณได้ ใช้ผ่านคลาวด์ของ GitHub หรือรันในเครื่องด้วย Docker ก็ได้
MCP server for terminal commands, file operations, and process management
ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ
MCP server for managing [Podkop](https://github.com/itdoginfo/podkop) and [Forkop](https://github.com/ushan0v/forkop) on OpenWrt over SSH.
Stop editing UCI by hand, remembering the uci add_list trap and passing base64-wrapped scripts to PowerShell. Ask your MCP client to add domains, list sections, inspect live connections, reload the service and roll back a bad change — with dry-run, backups and redaction built in.
Status: alpha. Live read-only tested against Forkop 1.0.5 and Forkop 2.0.0
(OpenWrt 25.12.6). Write/apply paths were verified in disposable OpenWrt
Docker containers with real Forkop 2.0.0 and Podkop 0.7.24. Backend schema is
revalidated every
PODKOP_MCP_PROFILE_TTLseconds (default 30).
Managing Podkop/Forkop by hand is error-prone:
section.domain). One uci add_list turns it into an exact-match domain list and subdomains silently stop being routed.section.destinations text with # comments.section.user_domains).Unlike MCP servers that run on the router itself, podkop-mcp runs on the administrator's machine, talks to OpenWrt over SSH and understands Podkop/Forkop semantics: dry-run, backups, rollback and secret redaction. All of that is hidden behind typed MCP tools.
~/.ssh/config alias. Host key verification, keepalive, timeouts.ubus call uci get JSON and uci for writes. Any option can be read or changed; the package is restricted to forkop/podkop.apply=true creates a router-side backup, commits UCI, reloads and verifies. On failure the backup is restored automatically. PODKOP_MCP_READ_ONLY=1 blocks all writes.proxy_string, keys, tokens. Raw export requires reveal_secrets=true.| Capability | Forkop 1.x | Forkop 2.x | Podkop |
|---|---|---|---|
| UCI package | forkop | forkop | podkop |
| Domain option | domain (string) | destinations (multiline) | user_domains (list) |
| Community lists | yes | yes | yes |
| Rule sets | no | yes | yes |
| Clash API | action CLI | HTTP CLI | action CLI |
| Proxy runtime select | — | yes | — |
| Read-only monitoring | yes | yes | yes |
Requirements:
Install from PyPI:
pip install podkop-mcp
uvx podkop-mcp
Install from source:
git clone https://github.com/mikel38487/podkop-mcp.git
cd podkop-mcp python -m venv .venv . .venv/bin/activate # Windows: .venv\Scripts\activate pip install -e .
Configure your MCP client (Claude Desktop, Cursor, DSH, etc.):
{
"mcpServers": { "podkop": { "command": "podkop-mcp", "env": { "PODKOP_MCP_SSH_HOST": "192.168.1.1", "PODKOP_MCP_SSH_USER": "root", "PODKOP_MCP_SSH_KEY_PATH": "C:/Users/ /.ssh/router_key", "PODKOP_MCP_KNOWN_HOSTS": "C:/Users/ /.ssh/known_hosts", "PODKOP_MCP_HOST_KEY_POLICY": "reject" } } } }
Or use an existing ~/.ssh/config alias:
"env": {
"PODKOP_MCP_SSH_CONFIG_HOST": "router-home", "PODKOP_MCP_SSH_KEY_PATH": "C:/Users/ /.ssh/router_key", "PODKOP_MCP_HOST_KEY_POLICY": "reject" }
Host key policy defaults to reject. Add the router key to known_hosts first (for example with a normal ssh login). accept-new is a one-time TOFU convenience for a new router; it does not protect against a MITM on the first connection.
Ask the model:
podkop_doctor and show the backend version.”example.com and cdn.example.com to main; show me the diff first.”youtube section and reload.”dry-run (default)
→ read config, compute normalized diff, show uci commands
apply=true → cp /etc/config/ /etc/podkop-mcp/backups/ - .uci → uci set/add_list/delete (package restricted to forkop/podkop) → uci commit → /etc/init.d/ reload → poll get_status up to ~35 s → on failure: restore backup, commit, reload → return diff, backup id, health summary
No command is executed through a shell string built from user input; values are shell-quoted with shlex and the script is sent to sh via stdin. Paths are validated; no base64 applet is required on the router.
| Group | Tools |
|---|---|
| System | podkop_doctor, podkop_status, podkop_system_info, podkop_health, podkop_logs, podkop_cli, podkop_core_features, podkop_import_check, podkop_installer_status, podkop_installer_log |
| Config | podkop_config_get, podkop_config_export, podkop_option_get/set/delete, podkop_backup_create/list/restore |
| Sections | podkop_sections_list, podkop_section_get/create/update/delete/enable, podkop_tunnel_create, podkop_child_create |
| Domains | podkop_domains_list/add/remove/replace/find/suggest, podkop_domain_check |
| Lists | podkop_community_lists_get/update |
| Connections | podkop_connections_config, podkop_subscription_add/delete/update, podkop_proxies_list, podkop_proxy_select/test |
| Monitoring | podkop_monitor_snapshot, podkop_connections_live, podkop_traffic |
| Service | podkop_service_action, podkop_lists_update |
Full reference: docs/tools.md.
| Variable | Default | Meaning |
|---|---|---|
PODKOP_MCP_SSH_HOST | — | Router address |
PODKOP_MCP_SSH_PORT | 22 | SSH port |
PODKOP_MCP_SSH_USER | root | SSH user |
PODKOP_MCP_SSH_KEY_PATH | — | Private key path |
PODKOP_MCP_SSH_KEY | — | Inline private key (PEM) |
PODKOP_MCP_SSH_KEY_B64 | — | Inline key, base64 |
PODKOP_MCP_SSH_KEY_PASSPHRASE | — | Key passphrase |
PODKOP_MCP_SSH_PASSWORD | — | Password instead of a key (secret: pass it through the environment, never commit it) |
PODKOP_MCP_SSH_CONFIG_HOST | — | Alias from ~/.ssh/config |
PODKOP_MCP_KNOWN_HOSTS | ~/.ssh/known_hosts | Host key file |
PODKOP_MCP_HOST_KEY_POLICY | reject | reject, accept-new, ignore |
PODKOP_MCP_CONNECT_TIMEOUT | 8 | SSH connect timeout, seconds |
PODKOP_MCP_COMMAND_TIMEOUT | 45 | Command timeout, seconds |
PODKOP_MCP_BACKEND | auto | auto, forkop or podkop; the requested CLI must be installed |
PODKOP_MCP_READ_ONLY | 0 | Block all writes |
PODKOP_MCP_BACKUP_DIR | /etc/podkop-mcp/backups | Router-side backups |
PODKOP_MCP_BACKUP_KEEP | 30 | Number of backups to keep |
PODKOP_MCP_MAX_OUTPUT_BYTES | 200000 | Cap on captured command output, bytes |
PODKOP_MCP_LOG_LEVEL | INFO | Server log level on stderr (DEBUG, INFO, WARNING, ERROR, CRITICAL) |
PODKOP_MCP_PROFILE_TTL | 30 | Seconds before the backend profile is revalidated against the router |
PODKOP_MCP_TARGETS | — | JSON with multiple routers |
PODKOP_MCP_CONFIG | — | Path to a JSON file with multiple routers; takes precedence over PODKOP_MCP_TARGETS and the single-router variables |
PODKOP_MCP_TARGET_NAME | router | Name of the single router defined by PODKOP_MCP_SSH_HOST / PODKOP_MCP_SSH_CONFIG_HOST; ignored when a JSON target list is used |
To manage several routers, put them in a JSON file and point PODKOP_MCP_CONFIG at it:
{
"targets": { "home": {"host": "192.0.2.10"}, "office": {"host": "192.0.2.11", "port": 2222} }, "default_target": "home" }
"env": {
"PODKOP_MCP_CONFIG": "~/.config/podkop-mcp/targets.json" }
The default_target router (or the first one when it is omitted) is used when a tool call does not pass target; pass "target": "office" to use the other router. PODKOP_MCP_TARGET_NAME does not select a target from this file — it only names the single router defined by PODKOP_MCP_SSH_HOST / PODKOP_MCP_SSH_CONFIG_HOST.
python -m pytest -q # unit + fake router + live/docker skipped
python scripts/smoke_mcp.py # MCP stdio handshake PODKOP_MCP_LIVE=1 python -m pytest -q -m live # read-only, real router
For the real SSH/UCI/apply path there is an OpenWrt Docker container: real openwrt/rootfs userland, real ubus/rpcd/dropbear/uci, with stubs for the Forkop CLI/init (no sing-box/nft).
.\scripts\openwrt-docker.ps1
. .\.tmp\openwrt-env.ps1 .\.venv\Scripts\python.exe -m pytest -q -m docker_ssh .\scripts\openwrt-docker.ps1 -Stop
This is a contai
ตัดมาแค่ช่วงต้น อ่านต่อใน repo