Local MCP servers · rewritten in Rust

Your MCP servers are
eating your RAM.

Every local MCP server your agent spawns is a real, resident process. A Node one costs 100–300 MB before it does any work; one that drives a browser costs a gigabyte. These are the same seven servers, doing the same jobs, compiled.

$ git clone https://github.com/luka-loehr/rust-mcp-servers
$ cd rust-mcp-servers && cargo build --release
Servers
7
drop-in replacements
Idle RSS
3–9 MB
vs 115–620 MB
Biggest cut
~80×
n8n-mcp: 620 → 7.8 MB
Ready in
0.01 s
vs 0.4–1.6 s, warm
Browser, one page loaded
1,061 → 83 MB
8 processes → 1

This is the honest comparison, not the flattering one. Idle against idle it is only ~4×, because a native WKWebView window is already small. The gap opens once a page actually loads and Playwright launches a second Chromium process tree, while this one reuses the WebKit engine already resident in macOS.

Same machine, same day, Apple Silicon. RSS summed across the whole process tree, not just the top PID, and the Node and Python originals were run warm. Method and script in BENCHMARKS.md.

One paste

Let your agent swap them

Your agent already knows which MCP servers you run. Paste this and it builds the Rust ones, rewrites your config, and tells you where coverage differs — because on two of them, it does.

Paste into your agent
Swap my Node and Python MCP servers for the Rust ones in
luka-loehr/rust-mcp-servers. Run this first, then follow it exactly:

    curl -fsSL https://rmcp.lukaloehr.com/setup.txt

Ask me its first question before doing anything else. Do not remove a server
I still depend on without telling me what it does not cover.
Get started

Two steps

Ah, so you haven’t fallen for the vibe yet. Respect. I still read commands before I run them too.

01

Build them

One Cargo workspace. Binaries land in target/release/. Build a single one with cargo build --release -p <name>.

$ git clone https://github.com/luka-loehr/rust-mcp-servers
$ cd rust-mcp-servers && cargo build --release
02

Point your client at the binary

Instead of an npx or uvx command. Same tools, same JSON-RPC, no runtime underneath. filesystem-mcp-rs takes its allowed roots as arguments, exactly like the original.

$ claude mcp add time-rs \
    .../target/release/time-mcp-rs
$ claude mcp add filesystem-rs \
    .../target/release/filesystem-mcp-rs -- ~/code
The servers

Seven, and what each replaces

time-mcp-rs
mcp-server-time
Current time and timezone conversion by IANA name
sequential-thinking-mcp-rs
server-sequential-thinking
Externalised, revisable, branchable chain-of-thought
memory-mcp-rs
server-memory
Persistent local knowledge graph in a JSON file
filesystem-mcp-rs
server-filesystem
Sandboxed read, write, search and move over allow-listed roots
fetch-mcp-rs
mcp-server-fetch
Fetch a URL, HTML → Markdown, page through it
n8n-mcp-rs
n8n-mcp
The same 2,541-node catalog, opened with rusqlite
browser-mcp-rs
@playwright/mcp (partial)
Automation on macOS's own WKWebView — no bundled Chromium

Idle RSS, measured

time
9.0 MB
114.6 MB
~13×
sequential-thinking
3.4 MB
261.6 MB
~77×
memory
3.5 MB
262.4 MB
~75×
filesystem
3.5 MB
266.8 MB
~76×
fetch
4.4 MB
145.8 MB
~33×
n8n-mcp
7.8 MB
620.4 MB
~80×
browser, one page
82.8 MB
1,061.4 MB
~13×

Two of these are not full parity, and it matters. n8n-mcp-rs covers the node catalog, templates and validation, but does not proxy to a live n8n instance — keep the original alongside it if you create or execute workflows. browser-mcp-rs has no accessibility-tree snapshot, multi-tab, dialogs, file upload or network interception. If you need those, stay on Playwright.