| Filename | Latest commit message | Latest commit date |
|---|---|---|
The Windows WSL job is the critical path of every CI run (589 to 752 s). Its checkout sits on the Windows drive, which WSL reaches over 9P, and writing node_modules there is what makes npm ci take about three minutes where the Linux job takes 23 s. The step now copies the tree onto the distro's ext4 filesystem before installing and building, as Microsoft's WSL guidance recommends for I/O-heavy work. The e2e job downloaded the full Chromium build (about 165 MB) on every run, but a headless run with no channel launches chromium-headless-shell and never opens it. `--only-shell` skips that download. Every tsconfig now lists the @types packages it uses (node, bun, vite/client, dom-speech-recognition) instead of relying on TypeScript auto-including everything under node_modules/@types. On TypeScript 5.9 this is a no-op: identical diagnostics across all 48 projects and byte-identical emitted .d.ts files. It is a prerequisite for TypeScript 7, which drops the auto-inclusion; with these lists the Go compiler passes all 48 projects, so that upgrade becomes a version bump once TypeDoc supports it. Two cache-based approaches were evaluated and rejected: an npm cache for the WSL job (npm ci is slow there because of 9P, not downloads, and a prefix-restored cache grows without bound) and a Playwright browser cache (Playwright's docs advise against it; the download is under 10 s). |
||
| .. | ||
| src | ||
| .gitignore | ||
| grid-cell.png | ||
| main.ts | ||
| mcp-app.html | ||
| package.json | ||
| README.md | ||
| screenshot.png | ||
| server.ts | ||
| tsconfig.json | ||
| tsconfig.server.json | ||
| vite.config.ts | ||
Example: System Monitor App
A demo MCP App that displays real-time OS metrics with a stacked area chart for per-core CPU usage and a bar gauge for memory.
![]() |
![]() |
![]() |
MCP Client Configuration
Add to your MCP client configuration (stdio transport):
{
"mcpServers": {
"system-monitor": {
"command": "npx",
"args": [
"-y",
"--silent",
"--registry=https://registry.npmjs.org/",
"@modelcontextprotocol/server-system-monitor",
"--stdio"
]
}
}
}
Local Development
To test local modifications, use this configuration (replace ~/code/ext-apps with your clone path):
{
"mcpServers": {
"system-monitor": {
"command": "bash",
"args": [
"-c",
"cd ~/code/ext-apps/examples/system-monitor-server && npm run build >&2 && node dist/index.js --stdio"
]
}
}
}
Features
- Per-Core CPU Monitoring: Stacked area chart showing individual CPU core utilization over a 1-minute sliding window
- Memory Usage: Horizontal bar gauge with color-coded thresholds (green/yellow/red)
- System Info: Hostname, platform, and uptime display
- Auto-Polling: Automatically starts monitoring on load with 2-second refresh interval
- Theme Support: Adapts to light/dark mode preferences
Running
-
Install dependencies:
npm install -
Build and start the server:
npm run start:http # for Streamable HTTP transport # OR npm run start:stdio # for stdio transport -
View using the
basic-hostexample or another MCP Apps-compatible host.
Architecture
Server (server.ts)
Exposes two tools demonstrating a polling pattern:
-
get-system-info(Model-visible) — Returns static system configuration:- Hostname, platform, architecture
- CPU model and core count
- Total memory
-
poll-system-stats(App-only,visibility: ["app"]) — Returns dynamic metrics:- Per-core CPU timing data (idle/total counters)
- Memory usage (used/free/percentage)
- Uptime
The Model-visible tool is linked to a UI resource via _meta.ui.resourceUri.
App (src/mcp-app.ts)
- Receives static system info via
ontoolresultwhen the host sends theget-system-inforesult - Polls
poll-system-statsevery 2 seconds for dynamic metrics - Uses Chart.js for the stacked area chart visualization
- Computes CPU usage percentages client-side from timing deltas
- Maintains a 30-point history (1 minute at 2s intervals)


