MCP Servers for Coding Agents
Four streamable-HTTP Model Context Protocol servers that give Claude Code, OpenCode, Cursor and any MCP-aware client typed access to language toolchains and spatial databases — without ever executing user code in-process.
By the numbers
MCP servers spanning languages and databases
Typed tools across the suite
User code executed in-process
Public endpoints already live
Four servers, one protocol
Each server is its own project with its own site, Dockerfile, examples, and integration tests. Together they cover the most common surfaces an LLM coding agent needs: language toolchains for code review, and read-only databases for data exploration.
python-docsbox-mcp
Python toolkit for LLM agents
Docs lookup, ruff lint and format, pyright type-check, PEP and PyPI metadata, AST dump.
python-mcp.afterrealism.comrust-docsbox-mcp
Rust toolchain over MCP
Std + crate docs, cargo clippy and rustfmt, official Rust Playground, crates.io search, rustc explain.
rust-mcp.afterrealism.compostgres-postgis-docsbox-mcp
Read-only Postgres + PostGIS
Schema introspection, bounded SELECT/EXPLAIN with sqlglot validation, GeoJSON-wrapped geometry, PostGIS recipes.
pg-mcp.afterrealism.comduckdb-spatial-docsbox-mcp
Read-only DuckDB + spatial
In-process spatial analytics over Parquet/CSV/GeoJSON/SHP/GPKG with R-Tree, ST_Read, and bounded queries.
duckdb-mcp.afterrealism.comDefence in depth, by design
A generic "psql MCP" or "duckdb MCP" with raw CLI access is a footgun. These servers take the opposite stance: refuse anything that isn't read-only, validate statically before the database sees it, and never execute user code in-process.
Static SQL Validation
sqlglot parse with a denylist of statement kinds, dangerous functions, and multi-statement payloads. Refuses anything that isn't top-level SELECT/WITH/EXPLAIN. Auto-injects LIMIT.
Read-Only at Storage Layer
Postgres queries run in SET TRANSACTION READ ONLY with statement_timeout, lock_timeout, idle_in_tx_timeout. DuckDB file-mode databases open with read_only=True.
Bounded Results
Row caps, per-cell byte caps, geometry wrapped to GeoJSON via ST_AsGeoJSON. 1 MiB body cap on Rust. 15-60s subprocess timeouts. Containers run as non-root.
No Code in Process
Linters, formatters and type-checkers run against tempdirs with bounded captured output. Snippet execution for Rust delegates to play.rust-lang.org. The server never links or runs the user's code.
Plan-Only Local Execution
When something genuinely needs a shell, run_locally returns a deterministic step plan. The calling agent dispatches the steps through its own host bash tool, keeping the trust boundary at the agent.
Streamable HTTP Transport
Implements the MCP streamable-HTTP spec (2025-06-18). Drop the URL into Claude Code, OpenCode, Cursor or Continue and the tools register automatically. No SDK install, no daemon to babysit.
Server categories
Python
10 tools
Rust
11 tools
PostGIS
12 tools
DuckDB
13 tools
Highlights
Developer Experience
- One config block in your editor — no SDK install, no background daemon to babysit
- All four endpoints already live — python-mcp, rust-mcp, pg-mcp, duckdb-mcp. Just add the URL
- Dockerfile and integration tests in every repo for self-hosting
- Each tool ships with worked examples in the docstring; the agent doesn't have to guess
Trust Model
- Server never executes user code — lint, format, type-check only
- Database servers refuse DDL, DML, ATTACH, COPY...TO PROGRAM, INSTALL, EXPORT
- Geometry wrapped to GeoJSON via ST_AsGeoJSON for safe inspection
- run_locally is plan-only — the calling agent owns the shell, not the MCP service
Plug them into your editor
Each server lives on its own site with install instructions for Claude Code, OpenCode, Cursor, and any MCP-aware client.