Odel
sysmcp

sysmcp

Local
@arunmm8335GoMITUpdated 1mo ago

Live Linux host signal (CPU, memory, processes, network, optional eBPF) for MCP clients.

sysmcp

MCP server that exposes live host signal — CPU, memory, processes, network — to Cursor / Claude. Default path is /proc (no root). Optional eBPF tools activate when CAP_BPF / CAP_PERFMON is available.

Repo: https://github.com/arunmm8335/sysmcp · Version: 0.5.0

Tools

ToolWhat it returns
host_dashboardFull snapshot (CPU, mem, top procs, listeners, eBPF)
poll_host_statsLightweight CPU/mem/process snapshot for auto-refresh
system_statsCPU %, memory %, load averages, NIC rx/tx B/s
top_processesTop PIDs by CPU % over a sample window, plus skipped_count
network_connectionsIPv4+IPv6 TCP/UDP; filters + resolve_pid; row limit (default 200)
cgroup_cpuTop cgroups by CPU % (cgroup v2 cpu.stat)
iface_ratesPer-interface byte/packet rates (/proc/net/dev)
ebpf_statusWhether eBPF works; includes how_to_enable when not
ebpf_activityFork + sched_switch rates via eBPF, or available: false
ebpf_trafficKernel RX/TX packet rates (netif_receive_skb / net_dev_xmit)

True per-connection byte counters need sock-level eBPF; iface_rates + ebpf_traffic are the practical deeper network signal today.

Browser dashboard (HTTP)

go build -o sysmcp ./cmd/sysmcp
./sysmcp serve
# open http://127.0.0.1:8787/

Optional: ./sysmcp serve -addr 127.0.0.1:9000

APIs: /api/dashboard, /api/poll (JSON).

Interactive views in Cursor

Ask “Open the host dashboard” / “Refresh the host dashboard”. The agent calls host_dashboard and opens a Cursor Canvas beside the chat.

MCP Apps resource ui://sysmcp/dashboard remains for hosts that render Apps iframes. Cursor often uses Canvas + JSON instead.

network_connections filters

ArgEffect
listen_onlyTCP LISTEN + unbound UDP
protocoltcp / udp
familyipv4 / ipv6
statee.g. ESTABLISHED, LISTEN
local_portfilter by local port
pidowning PID (implies resolve_pid)
limitmax rows (default 200, max 1000); truncated in result

Install

Release binaries (linux amd64 / arm64) ship on each v* tag:

https://github.com/arunmm8335/sysmcp/releases

# example amd64
curl -fsSL -o sysmcp.tgz \
  https://github.com/arunmm8335/sysmcp/releases/download/v0.5.0/sysmcp_0.5.0_linux_amd64.tar.gz
tar -xzf sysmcp.tgz

Or from source:

go install github.com/arunmm8335/sysmcp/cmd/sysmcp@latest
# or
git clone https://github.com/arunmm8335/sysmcp.git
cd sysmcp
go build -o sysmcp ./cmd/sysmcp

MCP Registry (one-click)

Namespace: io.github.arunmm8335/sysmcp. Tag releases build .mcpb assets and attempt an OIDC publish via mcp-publisher. To publish manually after a release (recommended if OIDC is not set up):

# fill fileSha256 in server.json from the release *.mcpb.sha256 files, then:
curl -fsSL -o mcp-publisher.tgz \
  https://github.com/modelcontextprotocol/registry/releases/download/v1.8.0/mcp-publisher_linux_amd64.tar.gz
tar -xzf mcp-publisher.tgz mcp-publisher
./mcp-publisher login github
./mcp-publisher publish ./server.json

See https://modelcontextprotocol.io/registry/quickstart

Cursor / Claude MCP config

{
  "mcpServers": {
    "sysmcp": {
      "command": "/absolute/path/to/sysmcp"
    }
  }
}

Enable eBPF (optional)

go build -o sysmcp ./cmd/sysmcp
./scripts/grant-caps.sh ./sysmcp
# sets: cap_bpf,cap_perfmon+ep

Restart the MCP server after granting caps. Without caps, eBPF tools return available: false/proc tools still work.

Demo

go test ./... -count=1
go build -o sysmcp ./cmd/sysmcp
go run ./scripts/smoke.go ./sysmcp
./sysmcp serve   # then open http://127.0.0.1:8787/

License

MIT