A small, production-minded MCP server (Model Context Protocol) that gives an AI agent —
Claude Desktop, Claude Code, or any MCP client — safe, read-only SQL access to a SQLite
database. Point it at a .db file and the agent can explore schemas and run SELECT queries —
but never write, drop, or escape the database.
Built on the official MCP Python SDK (
FastMCP). The read-only safety core has zero MCP dependency and is unit-tested on its own — the server is a thin, auditable wrapper.
Handing an LLM a raw database connection is how you get a DROP TABLE in production. This server
enforces read-only at two independent layers:
- OS-level — the connection is opened with SQLite
?mode=ro+PRAGMA query_only, so any write fails at the engine. - Statement-level —
queryrejects anything that isn't a singleSELECT/WITH(no multi-statements, noINSERT/UPDATE/DELETE/DROP/PRAGMAwrites), and caps row counts.
Defense in depth: even if one layer is bypassed, the other still holds. (There's a test that proves it.)
| Primitive | Name | Does |
|---|---|---|
| 🔧 tool | list_tables |
List the tables in the database |
| 🔧 tool | describe_table |
Column schema (name, type, nullability, PK) |
| 🔧 tool | query |
Run a single read-only SELECT/WITH, capped at max_rows |
| 📄 resource | schema://tables |
The whole DB schema as text |
| 💬 prompt | explore_database |
A ready-made "explore this DB" prompt |
git clone https://github.com/skycandykey1/mcp-sqlite-server
cd mcp-sqlite-server
pip install -r requirements.txt
# make a sample DB to play with
python examples/make_sample_db.py
# inspect it live in the MCP dev inspector
SQLITE_DB_PATH=examples/sample.db mcp dev mcp_sqlite/server.py
# ...or run the server directly
SQLITE_DB_PATH=examples/sample.db python -m mcp_sqlite.serverAdd this to your Claude Desktop config (Settings → Developer → Edit Config), using absolute paths —
see examples/claude_desktop_config.example.json:
{
"mcpServers": {
"sqlite-readonly": {
"command": "python",
"args": ["-m", "mcp_sqlite.server"],
"cwd": "/absolute/path/to/mcp-sqlite-server",
"env": { "SQLITE_DB_PATH": "/absolute/path/to/your.db" }
}
}
}Restart Claude Desktop, then ask: "What tables are in my database? Show me the top 5 orders by amount."
MCP client (Claude Desktop / Claude Code)
│ MCP over stdio
▼
mcp_sqlite/server.py ← thin FastMCP wrapper (tools / resource / prompt)
│
▼
mcp_sqlite/db.py ← read-only core (no MCP dep, fully unit-tested)
│ ?mode=ro + query_only + SELECT-only guard
▼
your .db (read-only)
pip install -r requirements-dev.txt
python -m pytest -q # offline — no MCP client, no API key neededMIT — see LICENSE.
💼 Built by
skycandykey1— available for AI agent & automation contract work. I build agents, MCP servers, and LLM automation. →skycandykey456@gmail.com·https://github.com/skycandykey1