{
  "markdown": "# MySQL MCP\n\n[![npm](https://img.shields.io/npm/v/mcp-mysql-client)](https://www.npmjs.com/package/mcp-mysql-client)\n[![CI](https://github.com/gistrec/mcp-mysql-client/actions/workflows/ci.yml/badge.svg)](https://github.com/gistrec/mcp-mysql-client/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE)\n\n**MySQL MCP** подключает AI-приложение к одной базе MySQL или MariaDB: посмотреть структуру, задать вопрос данным на естественном языке, разобраться в медленном запросе — и, если вы сами это разрешили, изменить данные.\n\nСервер привязан к одной базе: она задана конфигурацией, и ни один инструмент не может уйти в другую. По умолчанию доступно только чтение.\n\n- **6 инструментов.** Подключение и права, список таблиц, структура таблицы, читающий запрос, план запроса, изменяющий запрос.\n- **Тип запроса определяет сервер.** SQL разбирается до подключения: `DELETE` в читающем инструменте будет отклонён, даже если права на запись включены.\n- **Чтение не может писать.** Читающие запросы идут внутри `START TRANSACTION READ ONLY` — запись отклонит сама MySQL, даже если разбор SQL кто-то обманет.\n- **Ответ не переполнит контекст.** Строки читаются потоком и обрываются на лимите, а не выкачиваются целиком; в ответе честный признак `truncated`.\n- **Права только снаружи.** INSERT, UPDATE и DELETE включаются переменными окружения и требуют перезапуска — из диалога их получить нельзя. DDL недоступен всегда.\n\nНачните с запроса, который только читает данные:\n\n> Покажи структуру базы и посчитай, сколько записей появилось за последнюю неделю.\n\n---\n\n## Быстрый старт\n\nClaude Code:\n\n```bash\nclaude mcp add mysql-myapp \\\n  -e MYSQL_HOST=db.example.com \\\n  -e MYSQL_USER=myapp_ro \\\n  -e MYSQL_PASS='пароль' \\\n  -e MYSQL_DB=myapp \\\n  -e MYSQL_SSL=true \\\n  -- npx -y mcp-mysql-client\n```\n\nИли в `.mcp.json` / `claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"mysql-myapp\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-mysql-client\"],\n      \"env\": {\n        \"MYSQL_HOST\": \"db.example.com\",\n        \"MYSQL_PORT\": \"3306\",\n        \"MYSQL_USER\": \"myapp_ro\",\n        \"MYSQL_PASS\": \"пароль\",\n        \"MYSQL_DB\": \"myapp\",\n        \"MYSQL_SSL\": \"true\"\n      }\n    }\n  }\n}\n```\n\nОдин сервер — одна база. Нужно несколько баз: добавьте несколько записей со своими учётными данными; так права остаются изолированными, и сервер, подключённый к тестовой базе, физически не видит боевую.\n\n## Что можно поручить\n\n| Запрос | Что делает сервер |\n| --- | --- |\n| «Что вообще есть в этой базе?» | `list_tables` — таблицы, размеры, оценки числа строк |\n| «Как устроена таблица orders?» | `describe_table` — столбцы, индексы, внешние ключи в обе стороны |\n| «Сколько заказов за июль и на какую сумму?» | `query` — SELECT с агрегацией |\n| «Почему этот запрос медленный?» | `explain` — план, индексы, оценка строк |\n| «Под кем я подключён и что мне можно?» | `server_info` — база, пользователь, GRANT, лимиты сервера |\n| «Проставь статус отменённым заказам» | `execute` — только при `ALLOW_UPDATE_OPERATION=true` |\n\n## Что может измениться\n\nПо умолчанию — ничего: сервер стартует в режиме только чтения. Запись включается по одной операции:\n\n```json\n\"ALLOW_INSERT_OPERATION\": \"true\",\n\"ALLOW_UPDATE_OPERATION\": \"true\",\n\"ALLOW_DELETE_OPERATION\": \"false\"\n```\n\nЧто при этом остаётся невозможным:\n\n- **DDL** — `CREATE`, `ALTER`, `DROP`, `TRUNCATE`, `RENAME` — ни при каких настройках.\n- **Смена базы, `SET`, `CALL`, `PREPARE`, `LOAD DATA`, блокировки, `GRANT`** и прочее, что меняет смысл следующего запроса или выполняет непроверенный текст.\n- **`SELECT ... INTO OUTFILE`** — запись файла на сервер базы.\n- **`UPDATE` и `DELETE` без `WHERE`** — требуют явного подтверждения `allow_full_table=true` в вызове.\n- **Несколько инструкций в одном вызове** — выполняется ровно одна.\n\nПрава MySQL — отдельное ограничение поверх этого. Разрешение `ALLOW_UPDATE_OPERATION` ничего не добавляет пользователю, у которого нет `GRANT UPDATE`. Рабочая практика: отдельный пользователь с минимальными правами, а не `root`.\n\n## Переменные окружения\n\n| Переменная | По умолчанию | Назначение |\n| --- | --- | --- |\n| `MYSQL_HOST` | `127.0.0.1` | Хост сервера |\n| `MYSQL_PORT` | `3306` | Порт |\n| `MYSQL_SOCKET_PATH` | — | Unix-сокет вместо host/port |\n| `MYSQL_USER` | — | Пользователь (обязательно) |\n| `MYSQL_PASS` | — | Пароль (синоним `MYSQL_PASSWORD`) |\n| `MYSQL_PASS_FILE` | — | Прочитать пароль из файла вместо переменной |\n| `MYSQL_DB` | — | База данных (обязательно, синоним `MYSQL_DATABASE`) |\n| `MYSQL_SSL` | `false` | Требовать TLS |\n| `MYSQL_SSL_CA` | — | Путь к корневому сертификату; сам по себе включает TLS |\n| `MYSQL_SSL_REJECT_UNAUTHORIZED` | `true` | Проверять сертификат сервера |\n| `ALLOW_INSERT_OPERATION` | `false` | Разрешить INSERT |\n| `ALLOW_UPDATE_OPERATION` | `false` | Разрешить UPDATE |\n| `ALLOW_DELETE_OPERATION` | `false` | Разрешить DELETE |\n| `MYSQL_MAX_ROWS` | `1000` | Потолок строк в одном ответе |\n| `MYSQL_TIMEOUT_MS` | `30000` | Таймаут запроса |\n| `MYSQL_CONNECT_TIMEOUT_MS` | `10000` | Таймаут подключения |\n| `MYSQL_POOL_SIZE` | `3` | Соединений в пуле |\n| `MYSQL_MAX_RETRIES` | `2` | Повторы при обрыве связи и взаимных блокировках |\n| `MYSQL_READ_ONLY_TX` | `true` | Выполнять чтение в read-only транзакции |\n| `ASKADS_TELEMETRY` | — | `0` отключает анонимную статистику запусков |\n\nПароль в конфигурации MCP-клиента лежит открытым текстом. `MYSQL_PASS_FILE` позволяет держать его в файле с нужными правами.\n\n## Переход с `@benborla29/mcp-server-mysql`\n\nИмена переменных совпадают, поэтому достаточно заменить пакет в команде запуска:\n\n```diff\n-  \"args\": [\"-y\", \"@benborla29/mcp-server-mysql\"]\n+  \"args\": [\"-y\", \"mcp-mysql-client\"]\n```\n\nЧто изменится в поведении:\n\n- `MYSQL_DB` обязателен — сервер всегда привязан к одной базе;\n- ответы ограничены `MYSQL_MAX_ROWS` и помечаются `truncated`;\n- DDL недоступен даже при включённых правах на запись;\n- `UPDATE`/`DELETE` без `WHERE` требуют подтверждения в вызове;\n- набор инструментов другой: `query`, `execute`, `explain`, `list_tables`, `describe_table`, `server_info`.\n\n## Диагностика\n\nПервым делом — `server_info`: он покажет, к чему подключён сервер, какие права у пользователя MySQL и какие ограничения включены.\n\n| Симптом | Причина |\n| --- | --- |\n| `errno 1045` | Неверные `MYSQL_USER` / `MYSQL_PASS` |\n| `errno 1044` | Пользователь есть, прав на базу нет |\n| `errno 1142` | Не хватает `GRANT` на операцию или таблицу — `ALLOW_*` тут не поможет |\n| `errno 3159` | Сервер требует TLS: `MYSQL_SSL=true` |\n| `ECONNREFUSED` / `ETIMEDOUT` | Хост, порт, файрвол или неподнятый VPN |\n| `ER_NOT_SUPPORTED_AUTH_MODE` | Нужен TLS для `caching_sha2_password` |\n| Сервер не подключается | Ошибка конфигурации видна прямо в диалоге: сервер стартует даже без учётных данных и объясняет, чего не хватает |\n\n## Техническая документация\n\n- [Инструменты](docs/TOOLS.md) — параметры и ответы\n- [Разработка](docs/DEVELOPMENT.md) — сборка, тесты, живая проверка\n- [Публикация](docs/PUBLISHING.md) — релиз в npm и MCP-реестр\n- [CLAUDE.md](CLAUDE.md) — устройство репозитория для AI-агентов\n\n## Лицензия\n\n[MIT](./LICENSE)\n",
  "bytes": 7118,
  "sha": "9e097f957bc7da10cbf06b6f5ff6d7a1a0645519c5dde9756a11f1d65a917135",
  "repo_slug": "gistrec/mcp-mysql-client",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_gistrec_mcp_mysql_client_4444ec17/readme"
}