Minimal TeamSpeak/TypeScript setup that exposes a read-only database Model Context Protocol server and a small UI for managing DB configs, toggling light/dark mode, and viewing usage history.
- Node 18+
- A PostgreSQL or MySQL/MariaDB database user with read-only permissions
npm installServes the config/history API and the minimalist UI at http://localhost:4000.
npm run devThe MCP server reads the same saved configs from data/state.json and only exposes read-only tools.
npm run mcpTools exposed (over stdio):
list_tables— input{ db: "<configName>" }preview_table— input{ db: "<configName>", table: "table_name", limit?: number }run_select— input{ db: "<configName>", sql: "SELECT ..." }(rejects non-SELECT)
Use these tool names when connecting your model/agent to the MCP server.
- Start
npm run devand open the UI. Enter DB connection details and click Save config. Set SSL mode todisable,require, orno-verify(self-signed).- For MySQL/MariaDB TCP/IP, pick type “MySQL / MariaDB”.
- Select the saved config in “Use config” to list tables, preview a table, or run a SELECT.
- Each successful MCP/HTTP call records a history entry (DB name, tables touched, timestamp).
- In your agent, connect to the MCP server via stdio and call the tools using the saved
dbname; you only need to pass the friendly name, not the credentials.
- Configs and history live in
data/state.json. Delete that file to reset. - The server enforces read-only mode with
SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLYand rejects non-SELECT queries. - If your MCP SDK exports different helper names, adjust
src/mcp-server.tsregistration to match your SDK version. - Extend
src/db.tsto add other engines (MySQL, SQLite) while keeping read-only guards.