{
  "markdown": "# database-mcp\n\n[![CI](https://github.com/arifulislamat/database-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/arifulislamat/database-mcp/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/github/license/arifulislamat/database-mcp)](LICENSE)\n[![npm](https://img.shields.io/npm/v/%40database-mcp%2Fcore?label=%40database-mcp%2Fcore)](https://www.npmjs.com/package/@database-mcp/core)\n[![PyPI](https://img.shields.io/pypi/v/database-mcp-core?label=database-mcp-core)](https://pypi.org/project/database-mcp-core/)\n[![Node >= 20](https://img.shields.io/node/v/%40database-mcp%2Fcore)](https://nodejs.org)\n\nMCP servers that give AI clients safe, structured access to SQL databases.\n\nOne installable package per database engine, in TypeScript (npm) and Python\n(PyPI). Every package exposes the same minimal two-tool surface,\n`execute_sql` and `search_objects`, with guardrails on by default: read-only\nmode, row caps, and statement timeouts.\n\n## Packages\n\n| Engine   | TypeScript (npm) | Python (PyPI) |\n| -------- | ---------------- | ------------- |\n| SQLite   | [`@database-mcp/sqlite`](https://www.npmjs.com/package/@database-mcp/sqlite) [![npm](https://img.shields.io/npm/v/%40database-mcp%2Fsqlite?label=)](https://www.npmjs.com/package/@database-mcp/sqlite)   | [`database-mcp-sqlite`](https://pypi.org/project/database-mcp-sqlite/) [![PyPI](https://img.shields.io/pypi/v/database-mcp-sqlite?label=)](https://pypi.org/project/database-mcp-sqlite/)   |\n| libSQL   | [`@database-mcp/libsql`](https://www.npmjs.com/package/@database-mcp/libsql) [![npm](https://img.shields.io/npm/v/%40database-mcp%2Flibsql?label=)](https://www.npmjs.com/package/@database-mcp/libsql)   | [`database-mcp-libsql`](https://pypi.org/project/database-mcp-libsql/) [![PyPI](https://img.shields.io/pypi/v/database-mcp-libsql?label=)](https://pypi.org/project/database-mcp-libsql/)   |\n| MySQL    | [`@database-mcp/mysql`](https://www.npmjs.com/package/@database-mcp/mysql) [![npm](https://img.shields.io/npm/v/%40database-mcp%2Fmysql?label=)](https://www.npmjs.com/package/@database-mcp/mysql)    | [`database-mcp-mysql`](https://pypi.org/project/database-mcp-mysql/) [![PyPI](https://img.shields.io/pypi/v/database-mcp-mysql?label=)](https://pypi.org/project/database-mcp-mysql/)    |\n| MariaDB  | [`@database-mcp/mariadb`](https://www.npmjs.com/package/@database-mcp/mariadb) [![npm](https://img.shields.io/npm/v/%40database-mcp%2Fmariadb?label=)](https://www.npmjs.com/package/@database-mcp/mariadb)  | [`database-mcp-mariadb`](https://pypi.org/project/database-mcp-mariadb/) [![PyPI](https://img.shields.io/pypi/v/database-mcp-mariadb?label=)](https://pypi.org/project/database-mcp-mariadb/)  |\n| Postgres | [`@database-mcp/postgres`](https://www.npmjs.com/package/@database-mcp/postgres) [![npm](https://img.shields.io/npm/v/%40database-mcp%2Fpostgres?label=)](https://www.npmjs.com/package/@database-mcp/postgres) | [`database-mcp-postgres`](https://pypi.org/project/database-mcp-postgres/) [![PyPI](https://img.shields.io/pypi/v/database-mcp-postgres?label=)](https://pypi.org/project/database-mcp-postgres/) |\n\nBoth lines are published and pass the same language-agnostic conformance\nsuite against real databases in CI, so behavior is identical regardless of\nlanguage. Every engine is also listed on the\n[MCP Registry](https://registry.modelcontextprotocol.io) with both install\noptions.\n\nGo and Rust implementations are planned.\n\n## Design principles\n\n- **Two tools, no more.** A tiny tool surface keeps the model's context window\n  clean. `search_objects` progressively discloses schema: call it with no\n  arguments to list tables, with a table name to get columns, indexes, and\n  foreign keys.\n- **Safe by default.** Read-only mode is enforced in two layers: a\n  conservative SQL guard, plus a session-level read-only setting in the\n  database itself. Rows are capped (default 1000) and statements time out\n  (default 30s).\n- **Configured at launch, never via chat.** Connection details come from\n  flags, a YAML config file, or environment variables. Credentials are never\n  accepted through a tool call.\n- **Secrets never appear in logs.** Passwords live in non-printable secret\n  types, DSNs are sanitized before logging, and a redaction filter guards the\n  log boundary.\n\n## Quick start\n\nPick your engine's package; each README has the full config surface. SQLite\nvia npm:\n\n```json\n{\n  \"mcpServers\": {\n    \"sqlite\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@database-mcp/sqlite\", \"--dsn\", \"/absolute/path/to/database.db\"]\n    }\n  }\n}\n```\n\nOr via PyPI: use `\"command\": \"uvx\"` and\n`\"args\": [\"database-mcp-sqlite\", \"--dsn\", \"/absolute/path/to/database.db\"]`.\nFlags, environment variables, and YAML config are identical across both\nlines.\n\nNetworked engines take credentials from the environment (`MYSQL_*`,\n`MARIADB_*`, `POSTGRES_*`/`DATABASE_URL`, `LIBSQL_URL`/`LIBSQL_AUTH_TOKEN`),\n`*_FILE` mounted secrets, or a YAML file via `--config`. Never from a chat\nprompt.\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md). The short version: the conformance\nsuite is the definition of done. A change is mergeable only when\n`conformance/run.mjs` passes against every affected server.\n\n## License\n\n[MIT](LICENSE)\n",
  "bytes": 5236,
  "sha": "89434501f745c7b70834dc4b9d9861e2ac3604857f0ce76bacad0894336a1707",
  "repo_slug": "arifulislamat/database-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_arifulislamat_database_mcp_pos_ff3bbc11/readme"
}