EdgeSentinel: an MCP server that turns raw Linux errors into remediation an AI client can trust

Sharvari Raut
Sharvari Raut
EdgeSentinel: an MCP server that turns raw Linux errors into remediation an AI client can trust
EdgeSentinel: an MCP server that turns raw Linux errors into remediation an AI client can trust

EdgeSentinel is an MCP server that diagnoses Linux problems on remote edge devices like IoT gateways, kiosks, Raspberry Pis, developer laptops, CI hosts and hands an AI client normalized health states instead of raw shell output, so someone with no Linux background can still get a usable answer.

What this enables

  • Diagnoses Bluetooth, network, service, and kernel-log issues without SSH access or shell fluency
  • Falls back to portable checks like /sys/class/net when a host is missing tools such as nmcli
  • Returns deterministic healthy / degraded / unavailable states instead of raw command errors
  • Keeps every diagnostic read-only by default and gates the one mutating action behind an explicit preflight
  • Runs against a hosted MCP endpoint or entirely offline against a local model

The edge device is a black box until someone SSHes in

A gateway or kiosk sitting in a warehouse or a rural site is usually fine until it isn't, and then someone has to reach it. The default path is SSH in, run a handful of commands, and read whatever the kernel or a service manager happens to print that day. That output is inconsistent across distributions and hardware, and it assumes the person on the other end already knows what a healthy NetworkManager state looks like.

Handing that raw output straight to an AI agent doesn't fix the problem it just moves the guessing from the operator to the model. An agent reasoning over unfiltered dmesg lines or a missing binary's stack trace can hallucinate a diagnosis as easily as a person can misread one. EdgeSentinel's premise is that the fix belongs at the data layer, not the prompt: normalize the host signal before an AI client ever sees it.

Discovering what the host can actually do

The read path starts with capability discovery rather than assuming a fixed toolchain. EdgeSentinel checks what's available on the box and falls back accordingly inspecting ip link or /sys/class/net when nmcli isn't installed, for example a minimal container image or a stripped-down IoT build doesn't just fail with "command not found." That matters for edge fleets specifically, since device images are rarely as complete as a developer's workstation.

Every tool response comes back through a Zod schema as one of a fixed set of states the healthy, degraded, unavailable which are paired with observations and remediation guidance. That's a deliberate trade: the server gives up some of the raw detail a seasoned SRE might want, in exchange for output an AI client and a non-technical operator reading its summary can interpret consistently every time.

Four tools, one resource, one prompt

TypeNamePurpose
Toolget_system_healthCollects portable host health telemetry
Toolcheck_hardware_stateInspects Bluetooth or network state
Toolaudit_edge_systemRuns an aggregate, read-only edge audit
Toolmanage_system_serviceInspects or explicitly restarts an allowlisted service after a preflight check
Resourcesyslog://dmesgFixed-size, sanitized kernel-log sample
Promptincident_triageGuides an agent through a safe diagnostic sequence

The split is deliberate. Three of the four tools are pure reads and can't touch anything. manage_system_service is the only one that can change host state, and it's restricted to four allowlisted services like bluetooth, NetworkManager, docker, sshd with commands resolved from fixed, bounded argument arrays rather than passed through as free text. Before it will restart anything, it requires a status check first; the demo workflow shows the AI client asking for explicit permission before that action runs. Raw host errors stay in server logs rather than reaching the model, so a bad command output can't become a bad model decision.

A typical incident sequence: call audit_edge_system, review the normalized status and remediation, use check_hardware_state on the affected subsystem, pull syslog://dmesg for kernel context if needed, and only after a status check and human confirmation does manage_system_service restart anything.

Where NitroStack fits

The server is built on the NitroStack SDK, which is where the Zod-validated tool schemas, the read/write boundary, and the resource and prompt definitions live as ordinary typed application code rather than ad hoc string parsing. During development, we tested the tool-calling path in NitroStudio's AI chat by asking it about a Bluetooth fault and confirming the server returned a readable diagnosis rather than a raw error before wiring the same server into other clients.

The project also runs the identical MCP server against Ollama for a fully offline setup, where the local model discovered all four tools correctly and still respected the same permission gate before restarting a service, which is useful evidence that the read-only-by-default design holds regardless of which client or model sits in front of it.

For production use, EdgeSentinel exposes its MCP interface through a hosted NitroCloud endpoint rather than requiring each device or client to run its own deployment path from a single remote URL that any HTTP-capable MCP client can point at.

It also lists an interactive Hardware HUD widget among its MCP capabilities, giving tool output a visual surface beyond plain chat text for cases where a dashboard view is more useful than a transcript.

The trade-off worth naming

Normalizing everything into three states is what makes the server safe to hand to a non-expert or an AI client but it does throw away some of the granularity a human SRE debugging directly on the box would want.

That's a reasonable trade for the target scenario for someone with no Linux background, no engineer on-site and a worse one if the intended user is already comfortable reading raw journal output. It is built for the former case, not as a replacement for direct terminal access when that's available.

What the build demonstrates

EdgeSentinel doesn't prove fleet-wide production adoption it's a working reference implementation, backed by a real repository, a hosted MCP endpoint, and demonstrated tool-calling against both a production AI client and a fully offline model. What it does show is that Linux diagnostics can be made safe enough to expose to a model directly: capability-aware reads that never assume a fixed toolchain, deterministic output instead of raw shell noise, and a single mutating action locked behind an explicit human approval step.

The reusable pattern

The interesting design decision here isn't "AI can restart a service." It's that the boundary between reading and acting is enforced by the tool split itself, not by prompting the model to be careful.

Three tools can only observe; one tool can act, and only after a forced status check. That pattern normalize untrusted system output before it reaches the model, and put a hard read/write wall around the one operation with consequences generalizes well beyond Linux troubleshooting to any MCP server sitting in front of infrastructure a model shouldn't be trusted to touch unsupervised.

If you want to see EdgeSentinel in action, check out the complete video here:

It walks through the MCP server, the diagnostic workflow, how the tools handle real Linux issues, and how the permission gate prevents an AI client from making changes without explicit approval.

To explore the implementation in more detail, head over to the NitroStack docs for guides on building tools, resources, prompts, testing MCP servers in NitroStudio, and deploying them through NitroCloud.

Check out the complete code over here. You can also read the source and build your own MCP application using the same SDK and workflow at nitrostack.ai.