Network Connectivity Checker (netcheck)
A premium, cross-platform, production-grade Network Intelligence Engine & CLI written in pure Python 3. Zero external dependencies. High-concurrency diagnostics, structured output (JSON/CSV/XML), watch/loop mode, shell completions, man page, and an integrated Model Context Protocol (MCP) Server for AI assistants.
🚀 Key Features
- Zero-Dependency Core — Built entirely on the Python standard library. No
pip installneeded to run. - Cross-Platform — Native support for Linux, macOS, and Windows with consistent terminal output.
- 11 Subcommands — Modular
tcp,dns,http,ssl,ping,interfaces,traceroute,scan,whois,udp,mtr. - Built-in Presets — Quick batch checks of cloud endpoints (
aws,gcp,azure,cloudflare,github, etc.). - Watch Mode — Any subcommand loops with
--watchand configurable--interval. - Structured Output — Every check returns
--format text|json|csv|xml. - No-Color Mode —
--no-colorandNO_COLORenv var support for CI/CD pipelines. - MCP Server — Turns
netcheckinto a local tool-server for Claude, ChatGPT, and other AI agents. - Lenient Parsing — Accepts CSVs, URLs, bracketed IPv6, IP ranges (
192.168.1.1-50), CIDR (10.0.0.0/24), port lists (80,443), port ranges (8000-8100), andip:portnotation. - Concurrent Batch Checks — Configurable thread pools (
--jobs, default 10) with real-time progress. - Environment Variables —
NETCHECK_TIMEOUT,NETCHECK_MAX_WORKERS,NO_COLORfor scripting. - Shell Completions — Bash and Zsh tab completion for all subcommands and flags.
- Man Page — Full
man netcheckdocumentation installed byinstall.sh.
📦 Installation
Option 1: pipx — Linux / macOS ✅ Recommended
pipx installs CLI tools in isolated environments and automatically handles PATH — no manual setup needed.
# Install pipx if you don't have it
python3 -m pip install --user pipx
python3 -m pipx ensurepath # adds ~/.local/bin to PATH (one-time)
# Then install netcheck
pipx install netcheckx
After
ensurepath, restart your terminal (or runsource ~/.bashrc). Then:netcheck --help
Option 1b: pip — Linux / macOS (alternative)
pip install netcheckx
Note: Package name is
netcheckx(to avoid PyPI conflict). Bothnetcheckandnetcheckxcommands work after install.
If you see a PATH warning after install, just run the bundled setup helper — it auto-patches your shell:
netcheck-setup # auto-adds ~/.local/bin to ~/.bashrc, ~/.zshrc, ~/.profile
source ~/.bashrc # reload shell
netcheck --help # done ✅
Or manually, if preferred:
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc && source ~/.bashrc
Option 2: Snap Store (Linux)
sudo snap install netcheck
sudo snap connect netcheck:network-observe # enables ping & interfaces
Option 3: Debian package (.deb)
sudo dpkg -i netcheck_2.5.0_amd64.deb
Option 4: Chocolatey (Windows)
choco install netcheck
Option 5: macOS .pkg
sudo installer -pkg netcheck-2.5.0.pkg -target /
Option 6: Linux installer (with shell completions + man page)
git clone https://github.com/farman20ali/netcheck.git
cd netcheck
sudo bash packaging/linux/install.sh
Option 7: Developer / local run (no install)
git clone https://github.com/farman20ali/netcheck.git
cd netcheck
pip install -e ".[dev]"
python3 -m netcheck --help
🛠️ CLI Reference
Subcommands
Watch Mode
Any subcommand can be looped with --watch:
netcheck tcp google.com 443 --watch --interval 2 # Refresh every 2s
netcheck http https://api.example.com -w -i 5 # Watch HTTP every 5s
netcheck dns github.com -w # Watch DNS (default 2s interval)
Press Ctrl+C to stop.
HTTP Subcommand Options
netcheck http https://api.example.com \
--method POST \
-H "Authorization: Bearer token123" \
-H "Accept: application/json" \
--auth user:pass
Interfaces / Public IP Options
netcheck interfaces # Show active interfaces only
netcheck interfaces --all # Show all interfaces (including inactive)
netcheck interfaces --public # Also fetch and display public WAN IP
netcheck --my-ip --public # Legacy flag with public IP
Output Filtering (--show)
netcheck tcp 192.168.1.1-50 22 --show success # Only successful connections
netcheck tcp 10.0.0.0/24 443 --show fail # Only failures
netcheck -q 192.168.1.1 80,443 --show success # Legacy quick-mode filtering
Global Flags
Environment Variables
NETCHECK_TIMEOUT=10 NETCHECK_MAX_WORKERS=50 netcheck scan 192.168.1.1
NO_COLOR=1 netcheck ssl google.com -f json
Legacy Flags (kept for backward compatibility)
🔍 Traceroute & Port Scan
Traceroute
netcheck traceroute google.com # Full path
netcheck traceroute 8.8.8.8 -m 15 # Limit to 15 hops
netcheck traceroute github.com -f json # JSON output
Uses raw ICMP sockets if run as root; otherwise falls back to system traceroute/tracepath (Linux/macOS) or tracert (Windows).
Port Scan
netcheck scan 192.168.1.1 # Scan ~44 common ports
netcheck scan google.com --ports 80,443,8080
netcheck scan 10.0.0.1 --ports 1-1024 --jobs 100
WHOIS / RDAP Lookup
netcheck whois google.com # Domain registrar + creation date
netcheck whois 8.8.8.8 # IP network block + organization
Uses modern RDAP (HTTP JSON API) first; falls back to classic WHOIS port 43.
🤖 MCP Server
netcheck ships an integrated Model Context Protocol server that exposes all diagnostic functions to AI assistants.
netcheck --mcp
# or
python3 -m netcheck.mcp.server
Claude Desktop claude_desktop_config.json:
{
"mcpServers": {
"netcheck": {
"command": "python3",
"args": ["-m", "netcheck.mcp.server"],
"env": { "PYTHONPATH": "/path/to/netcheck" }
}
}
}
Exposed MCP tools (v2.2.0):
🏗️ Building Packages
All packaging is orchestrated by build_packages.py. Templates live in packaging/.
packaging/
├── chocolatey/ ← Windows Chocolatey (.nupkg)
│ └── tools/
├── linux/ ← install.sh / uninstall.sh / netcheck.1 / completions
├── macos/ ← macOS .pkg scripts
├── snap/ ← snapcraft.yaml template
└── windows/ ← NSIS installer script (.nsi)
Common build commands
# Check available tools on this machine
python3 build_packages.py --check
# Sync a new version across all config files
python3 build_packages.py --sync-version 2.3.0
# Build all packages for the current OS
python3 build_packages.py --all
# Individual targets
python3 build_packages.py --pypi # wheel + sdist
python3 build_packages.py --deb # Debian .deb
python3 build_packages.py --snap # Snap .snap
python3 build_packages.py --win # Windows .exe + NSIS + Chocolatey
python3 build_packages.py --mac # macOS binary + .pkg
🔧 Shell Completions
Bash
# System-wide (requires root)
sudo cp packaging/linux/netcheck.bash-completion /etc/bash_completion.d/netcheck
# Per-user
mkdir -p ~/.local/share/bash-completion/completions
cp packaging/linux/netcheck.bash-completion ~/.local/share/bash-completion/completions/netcheck
Zsh
mkdir -p ~/.zsh/completions
cp packaging/linux/netcheck.zsh-completion ~/.zsh/completions/_netcheck
# Add to ~/.zshrc:
echo 'fpath=(~/.zsh/completions $fpath)' >> ~/.zshrc
echo 'autoload -U compinit && compinit' >> ~/.zshrc
The installer script (packaging/linux/install.sh) does all of this automatically.
⚙️ Alerting, Config & Prometheus (serve)
NetCheck features a robust, zero-dependency configuration, alerting, and Prometheus metrics engine.
1. Configuration Manager
Configure SMTP, Slack, Webhooks, and default check timeouts safely:
netcheck config init # Run interactive wizard to generate config
netcheck config show # Print current configuration + OS keychain status
netcheck config path # Print path to config.yaml file
netcheck config edit # Open config.yaml in your local $EDITOR
netcheck config purge # Delete config.yaml AND wipe all keychain secrets
Credential Safety (System Keychain):
All sensitive credentials are stored in the OS credential manager (Keychain on macOS, Credential Manager on Windows, GNOME Keyring/KWallet on Linux). config.yaml never stores secrets.
netcheck config set-password email # SMTP app-password
netcheck config set-password smtp_user # SMTP sender address
netcheck config set-password smtp_to # SMTP recipient address(es)
netcheck config set-password slack # Slack incoming webhook URL
netcheck config set-password webhook # Generic webhook bearer token
netcheck config clear-password email # Remove a specific keychain entry
Test your alert channels instantly:
netcheck config test-alert email # Send a real test email now
netcheck config test-alert slack # Post a test Slack message now
netcheck config test-alert desktop # Trigger a test desktop notification
netcheck config test-alert webhook # POST a test webhook payload
2. Alerting Engine
Trigger alerts on state changes (UP ⇄ DOWN transition) during watch or serve loops. This prevents alert storms from repeated failures.
Supported channels:
- SMTP Email — STARTTLS with Gmail App Password support; OS keychain credential lookup
- Slack — incoming webhook URL stored securely in OS keychain
- Generic Webhook — JSON POST with Bearer token stored in keychain and
{target}template substitution - Desktop Notifications — WinRT Action Center (Windows 10/11),
osascript(macOS),notify-send(Linux)
Alert flags:
Usage Examples:
# Alert via email and Slack on any TCP state change
netcheck tcp api.example.com 443 -w --alert email,slack
# Only alert when a target goes DOWN (suppress UP/recovery alerts)
netcheck tcp api.example.com 443 -w --alert slack --alert-on down
# Alert on recovery only, via desktop notification
netcheck http https://api.example.com -w --alert desktop --alert-on up
# Alert via desktop notifications on DNS changes, 5-minute cooldown
netcheck dns google.com -w --alert desktop --alert-cooldown 300
🧪 How to Test Alerts Locally
- Run the interactive config wizard and configure your alerting channels (e.g., Slack Webhook or Desktop):
netcheck config init - In Terminal A, start watching a local port with alerts enabled:
(NetCheck initially records the baseline state silently.)netcheck tcp localhost 9999 -w --alert slack,desktop --interval 2 - In Terminal B, simulate a service going UP by starting a quick local listener:
- Linux/macOS:
nc -lk 9999 - Windows (PowerShell):
$listener = [System.Net.Sockets.TcpListener]9999; $listener.Start()
localhost:9999as UP. - Linux/macOS:
- Simulate a service going DOWN by killing the listener in Terminal B (
Ctrl+Cor$listener.Stop()). NetCheck will detect the state change and immediately trigger a DOWN alert to Slack and Desktop:❌ Alert: localhost:9999 is DOWN (Connection refused)
- Restart the listener in Terminal B. NetCheck will detect the recovery and emit a RECOVERED alert:
✅ Alert: localhost:9999 is back UP
3. Prometheus Metrics Exporter (serve mode)
Run netcheck as a background daemon monitoring multiple targets and serving /metrics in the Prometheus text exposition format.
# Monitor hosts from a file and serve metrics on port 9090
netcheck serve --metrics --port 9090 hosts.txt
Exposed Metrics:
netcheck_scrape_count(Counter)netcheck_check_total{target, check_type}(Counter)netcheck_check_failures_total{target, check_type}(Counter)netcheck_latency_seconds{target, check_type}(Gauge)netcheck_up{target}(Gauge, 1 = UP, 0 = DOWN)netcheck_uptime_ratio{target, check_type}(Gauge, 0.0 - 1.0 ratio)
📡 How to Integrate with Prometheus
- Create a
targets.txtfile containing your endpoints:google.com:443 github.com:443 127.0.0.1:80 - Start the NetCheck daemon:
netcheck serve --metrics --port 9090 targets.txt --interval 10 - Verify that the metrics endpoint is outputting valid text format:
curl http://localhost:9090/metrics - Add the job to your
prometheus.ymlconfiguration:scrape_configs: - job_name: 'netcheck' scrape_interval: 10s static_configs: - targets: ['localhost:9090'] - You can now build Grafana dashboards or Alertmanager rules based on the
netcheck_upmetric:# Alertmanager rule example groups: - name: netcheck_alerts rules: - alert: EndpointDown expr: netcheck_up == 0 for: 1m labels: severity: page annotations: summary: "Endpoint {{ $labels.target }} is offline"
⚙️ CI/CD Integration
All subcommands produce machine-readable structured JSON output when -f json is set. Use this to build health-gate scripts, monitoring alerts, or GitHub Actions checks:
# Check if a TCP port is open — fail the step if not
netcheck tcp prod.example.com 443 -f json | python3 -c \
"import sys, json; d=json.load(sys.stdin); sys.exit(0 if d['results'][0]['status']=='success' else 1)"
# Extract DNS IPs with jq
netcheck dns api.example.com -f json | jq '.ips[]'
# List open ports as JSON array
netcheck scan 192.168.1.1 --ports 1-1024 -f json | jq '.open_ports[] | {port, service}'
# Get SSL days-until-expiry, alert if < 30
netcheck ssl prod.example.com -f json | jq -e '.days_until_expiry > 30'
# Traceroute hop count for latency monitoring
netcheck traceroute 8.8.8.8 -f json | jq '.hops | length'
# Listening ports as CSV for spreadsheet import
netcheck ports -f csv > listening_ports.csv
# Use NO_COLOR to suppress ANSI in logs
NO_COLOR=1 netcheck tcp prod.example.com 443
# Override timeout and workers for fast CI checks
NETCHECK_TIMEOUT=3 NETCHECK_MAX_WORKERS=50 netcheck scan 10.0.0.1 --ports 80,443,8080 -f json
Exit Codes
🧪 Running Tests
# Using Make
make test
# Using pytest directly
PYTHONPATH=. python3 -m pytest tests/ -v
# With coverage
PYTHONPATH=. python3 -m pytest tests/ --cov=netcheck --cov-report=term-missing
📁 Repository Structure
netcheck/
├── netcheck/ ← Python package
│ ├── __init__.py ← version string
│ ├── __main__.py ← python3 -m netcheck entry point
│ ├── cli.py ← CLI argument parsing & dispatch
│ ├── mcp/ ← MCP server + tool definitions
│ ├── modules/ ← dns, tcp, http, ssl, ping, interfaces,
│ │ traceroute, port_scanner, whois
│ └── utils/ ← formatters, retry, concurrency, services
├── packaging/ ← Platform packaging templates
│ ├── chocolatey/
│ ├── linux/ ← install.sh, netcheck.1, bash/zsh completions
│ ├── macos/
│ ├── snap/
│ └── windows/
├── tests/ ← pytest test suite (305 tests)
├── docs/ ← Guides and release notes
├── .github/workflows/ ← CI (ci.yml) + Release (release.yml)
├── build_packages.py ← Build orchestration script
├── pyproject.toml ← Package metadata & build config
├── python-requirements.txt ← Local dev setup shortcut
└── Makefile ← make install / test / clean
🚦 Exit Codes
NetCheck adheres to deterministic, script-friendly POSIX exit code conventions:
Graceful Cancellation: Pressing
Ctrl+Cimmediately cancels all running threads and active socket connections, cleans up terminal cursor lines, outputs a message tostderr, and exits cleanly with code130without traceback dumps.
🛡️ License
Distributed under the GNU General Public License v3 (GPL-3.0). See LICENSE for details.