Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)
MCP server for Juniper Networks device operations via junos-ops
สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน
ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry
เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง
ต้องเตรียมก่อน
คุณใช้แอปไหน
เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”
เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json
{
"mcpServers": {
"junos": {
"command": "uvx",
"args": [
"junos-mcp"
]
}
}
}พิมพ์คำสั่งนี้ใน Terminal
claude mcp add junos -- uvx junos-mcpวางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json
{
"mcpServers": {
"junos": {
"command": "uvx",
"args": [
"junos-mcp"
]
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
วางในไฟล์ .vscode/mcp.json ของโปรเจกต์
{
"servers": {
"junos": {
"type": "stdio",
"command": "uvx",
"args": [
"junos-mcp"
]
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น
ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี
ค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README
รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง
เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 7 พ.ย. 2569
ชื่อใน registry ยืนยันด้วยบัญชี GitHub shigechika ซึ่งเป็นเจ้าของ repo
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต
ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน
รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต
เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo
จากการตรวจเบื้องต้นของเรา ผ่าน 1 จาก 1 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น
registry ไม่ได้ระบุว่าต้องใช้กุญแจ แต่บางตัวจะขอให้ล็อกอินตอนใช้ครั้งแรก
รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)
repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (0.23.0) เข้า registry 20 วันที่ผ่านมา
โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Python (uv) ในเครื่องด้วย
ในหมวดเดียวกันมี Spec Driven Development, Remote Desktop Commander, Zendesk
server หมวดเดียวกันจากผู้ทำคนอื่น เรียงตามดาว
อ่านการ์ด:★ ดาว GitHubiสามเสา: รีวิว · ผลตรวจ · การใช้งานiอัปเดต = วันที่ส่งรุ่นล่าสุดเข้า registryi
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Zendesk MCP Pack — tickets, users, organizations via OAuth.
ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ
English | 日本語
MCP (Model Context Protocol) server for junos-ops.
Exposes Juniper Networks device operations to MCP-compatible AI assistants (Claude Desktop, Claude Code, OpenAI Codex, etc.) via STDIO transport. While junos-ops is the CLI tool for humans, junos-mcp is the AI-facing interface to the same powerful engine.
| Tool | Description | Connection |
|---|---|---|
get_device_facts | Get basic device information (model, hostname, serial, version) | Yes |
get_version | Get JUNOS version with upgrade status | Yes |
get_router_list | List routers from config.ini (optionally filtered by tags) | No |
health_check | Report server version + config status (router count, distinct tags). Lightweight; does NOT connect to any device | No |
| Tool | Description | Connection |
|---|---|---|
run_show_command | Run a single CLI show command (output_format: text/json/xml) | Yes |
run_show_commands | Run multiple CLI commands in a single session (output_format: text/json/xml) | Yes |
run_show_command_batch | Run a command on multiple devices in parallel (supports tag filter and grep_pattern) | Yes |
| Tool | Description | Connection |
|---|---|---|
get_config | Get device configuration (text/set/xml format) | Yes |
get_config_diff | Show config diff against a rollback version | Yes |
push_config | Push config with commit confirmed + health check | Yes |
push_config_start / push_config_result | The same push as a background job, for hosted clients that cut a call at about 60 s and for slow-committing models (SRX branch): push_config_start returns the diff and a job_id without waiting for the commit, which runs on the same locked session; poll push_config_result until it is no longer running | Yes |
| Tool | Description | Connection |
|---|---|---|
check_upgrade_readiness | Check if device is ready for upgrade | Yes |
compare_version | Compare two JUNOS version strings | No |
get_package_info | Get model-specific package file and hash | No |
list_remote_files | List files on remote device path | Yes |
copy_package | Copy firmware package via SCP with checksum | Yes |
install_package | Install firmware with pre-flight checks (unlink flag for EX2300/EX3400) | Yes |
rollback_package | Rollback to previous package version | Yes |
schedule_reboot | Schedule device reboot at specified time | Yes |
| Tool | Description | Connection |
|---|---|---|
collect_rsi | Collect RSI/SCF with model-specific timeouts | Yes |
collect_rsi_batch | Collect RSI/SCF from multiple devices in parallel (supports tag filter) | Yes |
Equivalent to the junos-ops check subcommand modes. All three reuse the junos-ops display layer for table rendering.
| Tool | Description | Connection |
|---|---|---|
check_reachability | Probe NETCONF reachability + available disk space per host (fast: no facts, 5s TCP probe) | Yes |
check_local_inventory | Verify local firmware checksums against config.ini inventory | No |
check_remote_packages | Verify staged firmware checksum + available disk space on devices (post-SCP verification) | Yes |
| Tool | Description | Connection |
|---|---|---|
daily_brief | Morning health check across multiple devices in parallel — alarms, interface up/down, syslog alert patterns within a look-back window (since_hours, default 18 h), dual-RE faults ([RE_FAULT]; skipped on SRX chassis clusters, whose facts misreport RE status — a failed cluster node surfaces via chassis alarms instead), and an optional inet.0 route-count baseline (route_baseline, e.g. tags=["main"], route_baseline=152). Returns a CRITICAL/WARNING/OK Markdown summary. | Yes |
daily_brief_start / daily_brief_result | Run the same sweep as a background job for fleets too large for one call (a hosted client's per-call limit is about 60 s): daily_brief_start returns a job_id at once, poll daily_brief_result until done. The synchronous daily_brief now stops after JUNOS_DEADLINE seconds (default 45; 0 disables) and lists unfinished hosts under NOT CHECKED. | Yes |
All destructive operations (push_config, copy_package, install_package, rollback_package, schedule_reboot) default to dry-run mode (dry_run=True). The AI assistant must explicitly set dry_run=False to make changes.
push_config provides additional safety features not found in other Junos MCP servers:
commit confirmed but intentionally skips the final commit. JUNOS auto-rolls back after confirm_timeout minutes. Useful for restarting services that lack a request ...restart command (e.g. syslog daemon on EX3400 post-upgrade).RPC timeout and the per-call deadline. Every load/commit RPC uses timeout from the host's config.ini section, else the junos-ops model default: 180 s on SRX branch models (SRX300/320/340/345 and the like, whose commits can exceed 30 s), 120 s otherwise. It is never shortened. With JUNOS_DEADLINE set (default 45 s; 0 disables), push_config runs the push as a background job and waits for it until shortly before the deadline: if it finishes, the answer is the same as without a deadline; if not, the answer says Still running with a job_id to poll with push_config_result. push_config_start returns the diff and the job_id without waiting for the commit; the job loads and diffs the change and then commits on the same locked session, so what is committed is exactly the diff returned. A failure after commit confirmed has been sent is reported as a possibly pending commit that rolls back on the device after confirm_timeout minutes. Only one push per host runs at a time; a second one is refused, and other tools on that host wait at most until the deadline and then answer host busy.
config.inipip install junos-mcp
Or for development:
git clone https://github.com/shigechika/junos-mcp.git
cd junos-mcp python3 -m venv .venv . .venv/bin/activate pip install -e ".[test]"
python -m junos_mcp --help
| Option | Description |
|---|---|
-V, --version | Print version and exit |
--check | Load config.ini, list routers, and exit (exit code 1 on error) |
--check-host HOSTNAME | With --check, also open a NETCONF session to verify reachability/auth |
--transport {stdio,streamable-http} | Transport protocol (default: stdio) |
--host HOST / --port PORT | streamable-http only: address and port to listen on (default: 127.0.0.1 / 8000). Use these rather than FASTMCP_HOST / FASTMCP_PORT, which MCP Python SDK 2.x no longer reads |
--check is handy to verify JUNOS_OPS_CONFIG and config.ini are reachable before registering the server with an AI assistant. Combine with --check-host rt1 to also confirm that credentials actually authenticate against a real device.
run_show_command_batch, collect_rsi_batch, and get_router_list accept an optional tags argument. The grammar matches the junos-ops --tags CLI flag (since junos-mcp 0.9.0 / junos-ops 0.16.6):
hostnames on batch tools, the result is the intersection (tags filter further narrowed by names). An empty intersection returns an error.# 1 group, 1 tag — hosts tagged "main"
run_show_command_batch(command="show route summary", tags=["main"])
collect_rsi_batch(tags=["tokyo,edge"])
get_router_list(tags=["main", "backup"])
run_show_command_batch(command="show version", tags=["tokyo,core", "backup"])
run_show_command_batch( command="show version", hostnames=["rt1.example.jp", "rt2.example.jp"], tags=["backup"], )
See the junos-ops tag documentation for how to tag sections in config.ini and for the matching CLI grammar.
run_show_command and run_show_commands accept an optional output_format parameter:
| Value | Description |
|---|---|
"text" | Default. Plain-text CLI output (same as typing the command) |
"json" | NETCONF JSON output — device returns a structured dict |
"xml" | NETCONF XML output — device returns pretty-printed XML |
Note: CLI pipe stages (| match, | last, | count, etc.) are silently dropped regardless of output_format. PyEZ's Device.cli() sends the command over NETCONF RPC, which JunOS does not pipe-process. Run the command without pipes and filter client-side instead. For a single command, run_show_command_batch's grep_pattern argument (see below) offers server-side-style filtering — even against a single host, by passing a one-element hostnames list — but it always fetches plain-text output internally (it cannot be combined with output_format="json"/"xml"), and it only accepts one command at a time, so it isn't a drop-in workaround for run_show_commands' multi-command case.
# Get structured BGP summary data
run_show_command("router-a", "show bgp summary", output_format="json")
run_show_command_batch accepts an optional grep_pattern argument (Python re pattern). When set, only lines matching the pattern are kept from each host's output. Header lines (starting with #) are always preserved. Hosts with no matching lines show (no match).
This reduces large batch results — for example, 93 routers × show route summary — from hundreds of KB to a few hundred bytes by extracting just the relevant lines:
# Extract only the inet.0 destination count from 93 routers
run_show_command_batch( command="show route summary", tags=["main"], grep_pattern=r"inet\.0:\s+\d+ destinations", )
junos-mcp maintains a per-host NETCONF connection pool. Reusing an idle Device avoids the TCP/NETCONF handshake on every tool call; the pool serialises concurrent operations on the same host through a per-host lock.
| Environment variable | Default | Description |
|---|---|---|
JUNOS_MCP_POOL | 1 (enabled) | Set to 0 to disable the pool and open a fresh connection per call |
JUNOS_MCP_POOL_IDLE | 60 | Idle timeout in seconds. Connections unused longer than this are closed on the next call. Set to 0 to disable eviction |
Security note: pooled connections are long-lived SSH sessions. In environments where session duration is restricted by policy, set JUNOS_MCP_POOL_IDLE to a value shorter than the inactivity limit, or set JUNOS_MCP_POOL=0 to disable the pool entirely.
ตัดมาแค่ช่วงต้น อ่านต่อใน repo