{
  "markdown": "# MCP DB Connect\n\n[![npm version](https://img.shields.io/npm/v/mcp-db-connect.svg)](https://www.npmjs.com/package/mcp-db-connect)\n[![CI](https://github.com/phatngoit/MCP-DB/actions/workflows/ci.yml/badge.svg)](https://github.com/phatngoit/MCP-DB/actions/workflows/ci.yml)\n\nUniversal MCP server for readonly-first access to Oracle Database, Microsoft SQL Server, PostgreSQL, MySQL/MariaDB, SQLite, MongoDB, and Qdrant vector search.\n\nThis project is designed for AI tools that support the Model Context Protocol. Projects can install it, provide a YAML config, and expose safe database tools to their AI client.\n\nOracle connections use the Node.js `oracledb` Thin mode by default, so Oracle Instant Client is not required for most databases. Some Oracle databases use NCHAR character sets that Thin mode cannot handle; those databases require Oracle Thick mode with Oracle Client libraries.\n\nBy default, commands run from a project directory automatically use:\n\n- `mcp-db.local.yml`, then `mcp-db.yml`, then `mcp-db.yaml`\n- `.env`\n\n## Features\n\n- Oracle, MSSQL, PostgreSQL, MySQL/MariaDB, SQLite, MongoDB, and Qdrant connectors\n- Multiple named connections in one config file\n- Readonly by default\n- SQL multi-statement blocking\n- MongoDB `$out` and `$merge` blocking in readonly mode\n- Row limits and query timeouts\n- Markdown table output for query results\n- Schema/table allowlist and denylist\n- Sensitive field masking\n- JSONL audit logs\n- Interactive setup wizard for AI clients and database connections\n- CLI for setup, init, validation, connection testing, and stdio/HTTP server startup\n- Docker image (multi-stage `Dockerfile`, published to GHCR on release)\n\n## Install\n\n**1. Install the package**\n\nNode / TypeScript projects (local install):\n\n```bash\nnpm install --save-dev mcp-db-connect\n```\n\n.NET, Python, or other non-Node projects (global install):\n\n```bash\nnpm install -g mcp-db-connect\n```\n\n**2. Run the setup wizard**\n\n```bash\nnpx mcp-db-connect setup\n```\n\nThe wizard asks which AI clients and databases to configure, then asks for one connection string per database (the same string your DB host, hosting provider, or existing app config already gives you) and writes all config files automatically.\n\n**3. Test your connections**\n\n```bash\nnpx mcp-db-connect test-connections\n```\n\nThat's it — your AI client is now connected to your databases.\n\n### What the wizard creates\n\n```text\nmcp-db.local.yml       # database connection config\n.env                   # local secrets\n.gitignore             # keeps secrets and local config out of git\n.mcp.json              # Claude Code MCP config (if selected)\n.codex/config.toml     # Codex CLI config (if selected)\n.gemini/settings.json  # Gemini CLI config (if selected)\n.kimi/mcp.json         # Kimi CLI config (if selected)\n```\n\n### Other setup options\n\nSkip the wizard with explicit flags:\n\n```bash\nnpx mcp-db-connect setup --ai claude,codex --db mssql,mongodb\n```\n\nOverwrite existing config entries:\n\n```bash\nnpx mcp-db-connect setup --force\n```\n\nStart an HTTP MCP endpoint instead of stdio:\n\n```bash\nnpx mcp-db-connect serve-http --host 127.0.0.1 --port 3000\nnpx mcp-db-connect serve-http --api-key-env MCP_DB_HTTP_API_KEY\n```\n\n## AI Client Examples\n\nAll examples assume the AI CLI is started from your application project root.\n\n### Claude Code CLI\n\nRecommended automatic setup:\n\n```bash\nmcp-db-connect setup --ai claude --db mssql\n```\n\nThe generated `.mcp.json` uses `npx` so it works whether the package is installed globally or locally.\n\n#### Global install (`npm install -g mcp-db-connect`)\n\n`mcp-db-connect` is in PATH and can be used directly:\n\n```bash\nclaude mcp add --transport stdio db-connect --scope local -- mcp-db-connect start --project . --config ./mcp-db.local.yml --env ./.env\n```\n\n`.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"db-connect\": {\n      \"command\": \"mcp-db-connect\",\n      \"args\": [\"start\", \"--project\", \".\", \"--config\", \"./mcp-db.local.yml\", \"--env\", \"./.env\"],\n      \"env\": {\n        \"LOG_LEVEL\": \"silent\"\n      }\n    }\n  }\n}\n```\n\n#### Local install (`npm install --save-dev mcp-db-connect`)\n\nUse `npx` so Claude Code can find the binary inside `node_modules/.bin`:\n\n```bash\nclaude mcp add --transport stdio db-connect --scope local -- npx mcp-db-connect start --project . --config ./mcp-db.local.yml --env ./.env\n```\n\n`.mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"db-connect\": {\n      \"command\": \"npx\",\n      \"args\": [\"mcp-db-connect\", \"start\", \"--project\", \".\", \"--config\", \"./mcp-db.local.yml\", \"--env\", \"./.env\"],\n      \"env\": {\n        \"LOG_LEVEL\": \"silent\"\n      }\n    }\n  }\n}\n```\n\n### Codex CLI\n\nRecommended automatic setup:\n\n```bash\nmcp-db-connect setup --ai codex --db mssql,oracle,mongodb\nnpm --prefix .\\.mcp-tools\\db-connect install\ncodex\n```\n\nProject `.codex/config.toml`:\n\n```toml\n[mcp_servers.db-connect]\ncommand = '.\\.mcp-tools\\db-connect\\node_modules\\.bin\\mcp-db-connect.cmd'\nargs = [\"start\", \"--project\", \".\", \"--config\", '.\\mcp-db.local.yml', \"--env\", '.\\.env']\nenabled = true\n\n[mcp_servers.db-connect.env]\nLOG_LEVEL = \"silent\"\n```\n\nThe `.mcp-tools/db-connect/package.json` file created by the wizard uses `mcp-db-connect` from npm. Run the install command above once per project.\n\n### Gemini CLI\n\nRecommended automatic setup:\n\n```bash\nmcp-db-connect setup --ai gemini --db mongodb\ngemini\n```\n\nProject `.gemini/settings.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"db-connect\": {\n      \"command\": \"npx\",\n      \"args\": [\"mcp-db-connect\", \"start\", \"--project\", \".\", \"--config\", \"./mcp-db.local.yml\", \"--env\", \"./.env\"],\n      \"env\": {\n        \"LOG_LEVEL\": \"silent\"\n      }\n    }\n  }\n}\n```\n\n### Kimi CLI\n\nRecommended automatic setup:\n\n```bash\nmcp-db-connect setup --ai kimi --db oracle\nkimi --mcp-config-file .\\.kimi\\mcp.json\n```\n\nProject `.kimi/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"db-connect\": {\n      \"command\": \"npx\",\n      \"args\": [\"mcp-db-connect\", \"start\", \"--project\", \".\", \"--config\", \"./mcp-db.local.yml\", \"--env\", \"./.env\"],\n      \"env\": {\n        \"LOG_LEVEL\": \"silent\"\n      }\n    }\n  }\n}\n```\n\nKimi CLI can also manage global MCP servers with `kimi mcp add`, but the project-local file above keeps this database MCP scoped to one project.\n\n### Generic MCP JSON\n\nFor clients that accept the common MCP JSON format:\n\n```bash\nmcp-db-connect setup --ai generic --db mssql\n```\n\nUse `.mcp-db-connect/mcp.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"db-connect\": {\n      \"command\": \"npx\",\n      \"args\": [\"mcp-db-connect\", \"start\", \"--project\", \".\", \"--config\", \"./mcp-db.local.yml\", \"--env\", \"./.env\"],\n      \"env\": {\n        \"LOG_LEVEL\": \"silent\"\n      }\n    }\n  }\n}\n```\n\n## Streamable HTTP Client\n\nUse this endpoint for MCP clients or agents that support Streamable HTTP:\n\n```text\nhttp://127.0.0.1:3000/mcp\n```\n\nHealth check:\n\n```text\nhttp://127.0.0.1:3000/healthz\n```\n\n## Config\n\n```yaml\nsecurity:\n  defaultMaxRows: 100\n  queryTimeoutMs: 10000\n  blockMultiStatement: true\n  allowWriteOperations: false\n  maskColumns:\n    - password\n    - token\n    - secret\n    - api_key\n  auditLogPath: ./logs/mcp-db-connect.audit.jsonl\n\nconnections:\n  mssql_report:\n    type: mssql\n    host: 172.27.62.7\n    port: 1433\n    database: Internet\n    username: report_reader\n    passwordEnv: MSSQL_REPORT_PASSWORD\n    encrypt: true\n    trustServerCertificate: true\n    mode: readonly\n\n  mssql_write_model:\n    type: mssql\n    host: 172.27.62.8\n    port: 1444\n    database: InternetWrite\n    username: writer_user\n    passwordEnv: MSSQL_WRITE_PASSWORD\n    encrypt: true\n    trustServerCertificate: true\n    mode: readonly\n\n  oracle_local:\n    type: oracle\n    host: localhost\n    port: 1521\n    serviceName: ORCLPDB1\n    username: app_readonly\n    passwordEnv: ORACLE_PASSWORD\n    clientMode: thin\n    mode: readonly\n\n  mssql_local:\n    type: mssql\n    host: localhost\n    port: 1433\n    database: appdb\n    username: sa\n    passwordEnv: MSSQL_PASSWORD\n    encrypt: true\n    trustServerCertificate: true\n    mode: readonly\n\n  mongo_local:\n    type: mongodb\n    uriEnv: MONGODB_URI\n    database: appdb\n    mode: readonly\n\n  postgres_local:\n    type: postgres\n    host: localhost\n    port: 5432\n    database: appdb\n    username: app_readonly\n    passwordEnv: POSTGRES_PASSWORD\n    mode: readonly\n\n  mysql_local:\n    type: mysql\n    host: localhost\n    port: 3306\n    database: appdb\n    username: app_readonly\n    passwordEnv: MYSQL_PASSWORD\n    mode: readonly\n\n  qdrant_local:\n    type: qdrant\n    url: http://localhost:6333\n    apiKeyEnv: QDRANT_API_KEY\n    mode: readonly\n\n  sqlite_local:\n    type: sqlite\n    file: ./data/appdb.sqlite\n    mode: readonly\n```\n\nSQLite has no host/port/username — `file` is a path to the database file (relative paths resolve against the process's working directory), and `:memory:` is also accepted for an ephemeral in-process database.\n\nMongoDB stores the selected port inside the URI saved in `.env`, for example:\n\n```dotenv\nMONGODB_URI=mongodb://user:password@localhost:27018/appdb\n```\n\n### Oracle Thin vs Thick Mode\n\nDefault Oracle setup uses `clientMode: thin` and does not need Oracle Instant Client:\n\n```yaml\nconnections:\n  oracle_local:\n    type: oracle\n    host: localhost\n    port: 1521\n    serviceName: ORCLPDB1\n    username: app_readonly\n    passwordEnv: ORACLE_PASSWORD\n    clientMode: thin\n```\n\nOracle Instant Client is not required. If the database has `NCHAR`/`NVARCHAR2` columns with `NLS_NCHAR_CHARACTERSET = AL16UTF16`, the connector automatically rewrites the query to cast those columns to `VARCHAR2` server-side so Thin mode can handle them.\n\n### Connection strings instead of individual fields\n\nOracle, MSSQL, PostgreSQL, and MySQL/MariaDB also accept a raw connection string instead of `host`/`port`/`database`/`username`:\n\n```yaml\nconnections:\n  mssql_from_string:\n    type: mssql\n    connectionStringEnv: MSSQL_FROM_STRING_CONNECTION_STRING\n    mode: readonly\n\n  oracle_from_string:\n    type: oracle\n    connectDescriptor: (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=10.20.30.15)(PORT=1521)))(CONNECT_DATA=(SERVER=POOLED)(SERVICE_NAME=DEMOPDB1)))\n    username: demo_ora_user\n    passwordEnv: ORACLE_FROM_STRING_PASSWORD\n    mode: readonly\n\n  postgres_from_string:\n    type: postgres\n    connectionStringEnv: POSTGRES_FROM_STRING_CONNECTION_STRING\n    mode: readonly\n\n  mysql_from_string:\n    type: mysql\n    connectionStringEnv: MYSQL_FROM_STRING_CONNECTION_STRING\n    mode: readonly\n```\n\n`connectionStringEnv` points to a full ADO/tedious connection string (MSSQL), a `postgres://user:password@host:5432/database` URI (PostgreSQL), or a `mysql://user:password@host:3306/database` URI (MySQL/MariaDB) in `.env` (same convention as MongoDB's `uriEnv`). `connectDescriptor` holds an Oracle TNS connect descriptor or Easy Connect string and is not secret — only the password goes in `.env`. The setup wizard generates these automatically from a pasted connection string; both forms can also still be hand-written using the structured `host`/`port`/... fields shown above.\n\nPostgreSQL and MySQL/MariaDB connections also accept `ssl: true` (with `rejectUnauthorized: false` for self-signed certificates common on managed database providers).\n\n### Config via environment variable\n\nEvery command that loads config (`start`, `serve-http`, `validate-config`, `test-connections`) also accepts the entire config document — the same `security` + `connections` structure normally stored in `mcp-db.local.yml` — as YAML or JSON in the `MCP_DB_CONFIG` environment variable, instead of a file:\n\n```bash\nexport MCP_DB_CONFIG='\nconnections:\n  postgres_demo:\n    type: postgres\n    host: db.example.com\n    port: 5432\n    database: appdb\n    username: app_readonly\n    password: change-me\n    mode: readonly\n'\nmcp-db-connect serve-http --host 0.0.0.0 --port 3000\n```\n\nWhen `MCP_DB_CONFIG` is set, `--config`/`mcp-db.local.yml`/`mcp-db.yml`/`mcp-db.yaml` file discovery is skipped entirely — no file needs to exist. This is what lets container platforms that can't mount a project file into the container (Smithery.ai and similar hosted MCP platforms) run this server: they inject the whole config as one environment variable instead. Secrets can be embedded directly (as `password:`/`connectionString:` above) or still indirected through their own env var via `passwordEnv`/`connectionStringEnv`/etc. — both forms keep working exactly as they do with a file.\n\n## Tools\n\n### SQL (Oracle + MSSQL + PostgreSQL + MySQL/MariaDB + SQLite)\n\n- `db_list_connections` — List configured connections\n- `db_test_connection` — Test a connection\n- `db_list_schemas` — List schemas\n- `db_list_tables` — List tables\n- `db_describe_table` — Describe columns (including catalog comments where available), primary keys, foreign keys, and indexes\n- `db_query` — Run a readonly SQL query\n- `db_explain_query` — Return an execution plan for a SQL query\n- `db_count` — Count rows in a table with an optional WHERE clause\n\n`db_query` and `db_explain_query` accept an optional `params` array for bind parameters. Oracle and PostgreSQL use positional binds (`:1`, `:2`, ... for Oracle; `$1`, `$2`, ... for PostgreSQL); MySQL/MariaDB and SQLite use `?` placeholders in array order; MSSQL has no positional syntax, so params are bound as named parameters `@p1`, `@p2`, ... in the same order as the array.\n\nSQLite has no schema/database concept beyond `main` (plus any attached databases); `db_list_schemas` reflects that via `PRAGMA database_list`, and `db_explain_query` runs `EXPLAIN QUERY PLAN` rather than a cost-based plan.\n\n`db_describe_table` includes each column's catalog comment/description when the database has one set (Oracle `all_col_comments`, PostgreSQL `COMMENT ON COLUMN`, MySQL/MariaDB `COLUMN_COMMENT`, MSSQL `MS_Description` extended property) — the `comment` column in the output is only shown when at least one column actually has one. SQLite has no comment mechanism, so it's never populated there.\n\n### MongoDB\n\n- `db_list_connections` — List configured connections\n- `db_test_connection` — Test a connection\n- `db_list_schemas` — List databases\n- `db_list_tables` — List collections\n- `db_describe_table` — Sample collection fields\n- `db_mongo_find` — Run a readonly find operation\n- `db_mongo_aggregate` — Run a readonly aggregate pipeline\n- `db_mongo_count` — Count documents with an optional filter\n- `db_mongo_get_indexes` — List indexes for a collection\n- `db_mongo_explain_find` — Return an execution plan for a find operation\n- `db_mongo_explain_aggregate` — Return an execution plan for an aggregate pipeline\n- `db_mongo_insert` — Insert one or more documents\n- `db_mongo_update` — Update documents matching a filter (`many: true` for all matches, otherwise just the first)\n- `db_mongo_delete` — Delete documents matching a filter (`many: true` for all matches, otherwise just the first)\n\n`db_mongo_insert`/`db_mongo_update`/`db_mongo_delete` are blocked unless the connection has `mode: readwrite` **and** `security.allowWriteOperations: true` — mirroring how write SQL statements are gated for the SQL connectors. `db_mongo_update` and `db_mongo_delete` also require a non-empty `filter`, so a mistaken `{}` can't silently update or delete an entire collection.\n\n`db_describe_table` infers MongoDB column types by sampling documents. The sample size defaults to 20 and can be set per-connection with `describeSampleSize`, or overridden per call with the tool's `sampleSize` argument:\n\n```yaml\nconnections:\n  mongo_local:\n    type: mongodb\n    uriEnv: MONGODB_URI\n    database: appdb\n    describeSampleSize: 100\n    mode: readonly\n```\n\n`db_mongo_find` accepts an optional `skip` for pagination (skip the first N matching documents, then apply `maxRows` as the page size).\n\n### Qdrant (vector search)\n\n- `db_list_connections` — List configured connections\n- `db_test_connection` — Test a connection\n- `db_list_tables` — List collections\n- `db_describe_table` — Describe a collection's vector config and payload field types\n- `db_qdrant_search` — Run a vector similarity search with an optional filter and score threshold\n- `db_qdrant_scroll` — Browse or filter points without a vector search\n- `db_qdrant_count` — Count points with an optional filter\n\n`db_list_schemas` returns an empty list for Qdrant connections since Qdrant collections aren't grouped into schemas/databases.\n\n`db_qdrant_scroll` supports paging through an entire collection: each response includes a `Next offset` line when more points remain — pass that value back as the `offset` argument on the next call to continue. Omit `offset` to start from the beginning.\n\nQuery result tools return tables like:\n\n```text\nRows: 2\n\n| id | name |\n| --- | --- |\n| 1 | Alice |\n| 2 | Bob |\n```\n\n## CLI Commands\n\n- `mcp-db-connect setup`\n- `mcp-db-connect init`\n- `mcp-db-connect ai-config`\n- `mcp-db-connect validate-config`\n- `mcp-db-connect test-connections`\n- `mcp-db-connect start`\n- `mcp-db-connect serve-http --host 127.0.0.1 --port 3000`\n- `mcp-db-connect serve-http --api-key-env MCP_DB_HTTP_API_KEY`\n- `mcp-db-connect update`\n\n## Updating\n\n`start` and `serve-http` check npm once a day (cached, non-blocking, silently skipped if offline) for a newer version and print a notice to stderr if one is available — this never touches stdout, so it's safe on the stdio transport. The check only looks within `^<your current version>`, i.e. the current `0.x` minor line (for example, `0.1.21` only considers `0.1.22`, `0.1.23`, ... — never `0.2.0`). This project hasn't reached `1.0.0` yet, so a minor version bump could still contain breaking changes; the narrower range avoids silently jumping into one.\n\nRun the update yourself with:\n\n```bash\nmcp-db-connect update              # checks and installs, if available\nmcp-db-connect update --check-only # only checks, doesn't install\nmcp-db-connect update --range \"^0.2.0\"  # override the range, e.g. to opt into a new minor line deliberately\n```\n\nIt detects whether the package is installed globally or as a local project dependency and runs the matching `npm install` command. There is no fully silent background auto-install — updating always requires this one explicit command (or your own `npm install -g mcp-db-connect@latest` / `npm install --save-dev mcp-db-connect@latest`).\n\n## Docker\n\nA multi-stage `Dockerfile` at the repo root builds the CLI into a standalone image. The container needs your project's `mcp-db.local.yml` and `.env` mounted in, since connection config is file-based rather than baked into the image.\n\nPull the published image (built and pushed to GHCR on every release by `.github/workflows/release.yml`):\n\n```bash\ndocker pull ghcr.io/phatngoit/mcp-db-connect:latest\n```\n\nOr build it locally:\n\n```bash\ndocker build -t mcp-db-connect .\n```\n\nRun over stdio (for MCP clients that exec the container directly), mounting your project config. Replace `mcp-db-connect` with `ghcr.io/phatngoit/mcp-db-connect:latest` to use the published image instead of a local build:\n\n```bash\ndocker run -i --rm \\\n  -v \"$(pwd)/mcp-db.local.yml:/app/project/mcp-db.local.yml:ro\" \\\n  -v \"$(pwd)/.env:/app/project/.env:ro\" \\\n  mcp-db-connect start --project /app/project\n```\n\nRun the Streamable HTTP transport, publishing a port:\n\n```bash\ndocker run --rm -p 3000:3000 \\\n  -v \"$(pwd)/mcp-db.local.yml:/app/project/mcp-db.local.yml:ro\" \\\n  -v \"$(pwd)/.env:/app/project/.env:ro\" \\\n  mcp-db-connect serve-http --project /app/project --host 0.0.0.0 --port 3000\n```\n\nOr use the `examples/docker-compose.server.yml` example, which builds the image and mounts `mcp-db.local.yml`/`.env` from the current directory:\n\n```bash\ndocker compose -f examples/docker-compose.server.yml up --build\n```\n\n### Hosting on a cloud/container platform\n\nNo file mount is required if you set `MCP_DB_CONFIG` instead (see [Config via environment variable](#config-via-environment-variable)). The image's entrypoint (`docker-entrypoint.sh`) also auto-switches from stdio to the Streamable HTTP transport when a `PORT` environment variable is present — the convention used by Smithery.ai, Railway, Render, Fly.io, and similar platforms — binding to `0.0.0.0:$PORT` without any command override:\n\n```bash\ndocker run -e PORT=8080 -e MCP_DB_CONFIG=\"$(cat mcp-db.local.yml)\" -p 8080:8080 \\\n  ghcr.io/phatngoit/mcp-db-connect:latest\n```\n\n## Security Defaults\n\nThe server is intentionally conservative:\n\n- Connections default to `readonly`\n- SQL write and DDL keywords are blocked unless global and connection config allow writes\n- SQL multi-statement execution is blocked\n- MongoDB aggregate write stages and `db_mongo_insert`/`db_mongo_update`/`db_mongo_delete` are blocked unless global and connection config allow writes\n- `db_mongo_update`/`db_mongo_delete` require a non-empty filter, so they can't accidentally affect an entire collection\n- Result rows are capped by config\n- Sensitive fields are masked recursively\n\nUse database accounts with the smallest permissions possible. The MCP layer is a guardrail, not a replacement for DB-level permissions.\n\n## Registries\n\n- **[Official MCP Registry](https://registry.modelcontextprotocol.io)** — listed as `io.github.phatngoit/mcp-db-connect` via `server.json` at the repo root. The release workflow (`.github/workflows/release.yml`) publishes to this registry automatically after every npm release using GitHub Actions OIDC (no stored token needed).\n- **[Glama.ai](https://glama.ai/mcp/servers)** — indexed by crawling this repository; submitted manually, no manifest file required.\n- **Smithery.ai** — not yet submitted. The blockers are resolved: a `Dockerfile` (published to `ghcr.io/phatngoit/mcp-db-connect`), a `smithery.yaml` container-runtime manifest at the repo root, `MCP_DB_CONFIG` env-var config (no file mount needed), and a `PORT`-aware entrypoint that switches to the HTTP transport automatically. Submitting still requires a one-time manual step — connecting this repo through Smithery's GitHub App at `smithery.ai/new` — and `smithery.yaml`'s exact fields should be double-checked against Smithery's current docs first, since they weren't independently verifiable while writing it.\n\n## Roadmap\n\n- OpenTelemetry tracing\n- Secrets manager integrations (AWS Secrets Manager, Azure Key Vault, HashiCorp Vault)\n",
  "bytes": 22108,
  "sha": "ce5aa0a4f3f2f5f86611a4fc73ed002f83264c170ff1ae6d7ad6bfc67febb249",
  "repo_slug": "phatngoit/mcp-db",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_phatngoit_mcp_db_connect_4e6e1e9b/readme"
}