Дорис MCP Сервер
Doris MCP (Model Control Panel) Server — это бэкэнд-сервис, созданный с помощью Python и FastAPI. Он реализует протокол MCP (Model Control Panel), позволяя клиентам взаимодействовать с ним через определенные «Инструменты». Он в первую очередь предназначен для подключения к базам данных Apache Doris, потенциально используя большие языковые модели (LLM) для таких задач, как преобразование запросов на естественном языке в SQL (NL2SQL), выполнение запросов и выполнение управления и анализа метаданных.
Основные характеристики
Реализация протокола MCP : предоставляет стандартные интерфейсы MCP, поддерживающие вызовы инструментов, управление ресурсами и оперативное взаимодействие.
Несколько режимов связи :
SSE (события, отправленные сервером) : обслуживаются через конечные точки
/sse(инициализация) и/mcp/messages(связь) (src/sse_server.py).Потоковый HTTP : обслуживается через унифицированную конечную точку
/mcp, поддерживая запрос/ответ и потоковую передачу (src/streamable_server.py).(Необязательно) Stdio : взаимодействие возможно через стандартный ввод/вывод (
src/stdio_server.py), требуется определенная конфигурация запуска.
Интерфейс на основе инструментов : основные функции инкапсулированы в виде инструментов MCP, которые клиенты могут вызывать по мере необходимости. Доступные в настоящее время ключевые инструменты фокусируются на прямом взаимодействии с базой данных:
Выполнение SQL (
mcp_doris_exec_query)Список баз данных и таблиц (
mcp_doris_get_db_list,mcp_doris_get_db_table_list)Извлечение метаданных (
mcp_doris_get_table_schema,mcp_doris_get_table_comment,mcp_doris_get_table_column_comments,mcp_doris_get_table_indexes)Извлечение журнала аудита (
mcp_doris_get_recent_audit_logs) Примечание: текущие инструменты в основном ориентированы на прямые операции с базами данных.
Взаимодействие с базой данных : предоставляет функциональные возможности для подключения к Apache Doris (или другим совместимым базам данных) и выполнения запросов (
src/utils/db.py).Гибкая конфигурация : настраивается с помощью файла
.env, поддерживает настройки для подключений к базе данных, поставщиков/моделей LLM, ключей API, уровней ведения журнала и т. д.Извлечение метаданных : возможность извлечения метаданных базы данных (
src/utils/schema_extractor.py).
Related MCP server: Superset MCP Server
Системные требования
Питон 3.12+
Детали подключения к базе данных (например, Doris Host, Port, User, Password, Database)
Быстрый старт
1. Клонировать репозиторий
2. Установка зависимостей
3. Настройте переменные среды
Скопируйте файл .env.example в .env и измените настройки в соответствии с вашей средой:
Ключевые переменные среды:
Подключение к базе данных :
DB_HOST: Имя хоста базы данныхDB_PORT: порт базы данных (по умолчанию 9030)DB_USER: Имя пользователя базы данныхDB_PASSWORD: Пароль базы данныхDB_DATABASE: Имя базы данных по умолчанию
Конфигурация сервера :
SERVER_HOST: Адрес хоста, который прослушивает сервер (по умолчанию0.0.0.0)SERVER_PORT: Порт, который прослушивает сервер (по умолчанию3000)ALLOWED_ORIGINS: разрешенные CORS источники (через запятую,*разрешает все)MCP_ALLOW_CREDENTIALS: разрешать ли учетные данные CORS (по умолчаниюfalse)
Конфигурация ведения журнала :
LOG_DIR: Каталог для файлов журнала (по умолчанию./logs)LOG_LEVEL: Уровень журнала (например,INFO,DEBUG,WARNING,ERROR,INFOпо умолчанию)CONSOLE_LOGGING: Выводить ли журналы на консоль (по умолчаниюfalse)
Доступные инструменты MCP
В следующей таблице перечислены основные инструменты, доступные в настоящее время для вызова через клиент MCP:
Название инструмента | Описание | Параметры | Статус |
| Получить список всех имен баз данных на сервере. |
(строка, обязательно) | ✅ Активный |
| Получить список всех имен таблиц в указанной базе данных. |
(string, Обязательно),
(string, Необязательно, по умолчанию текущая база данных) | ✅ Активный |
| Получить подробную структуру указанной таблицы. |
(строка, Обязательно),
(строка, Обязательно),
(строка, Необязательно) | ✅ Активный |
| Получить комментарий к указанной таблице. |
(строка, Обязательно),
(строка, Обязательно),
(строка, Необязательно) | ✅ Активный |
| Получить комментарии для всех столбцов указанной таблицы. |
(строка, Обязательно),
(строка, Обязательно),
(строка, Необязательно) | ✅ Активный |
| Получить информацию об индексе для указанной таблицы. |
(строка, Обязательно),
(строка, Обязательно),
(строка, Необязательно) | ✅ Активный |
| Выполнить SQL-запрос и вернуть команду результата. |
(строка, Обязательно),
(строка, Обязательно),
(строка, Необязательно),
(целое число, Необязательно, по умолчанию 100),
(целое число, Необязательно, по умолчанию 30) | ✅ Активный |
| Получите записи журнала аудита за последний период. |
(строка, обязательно),
(целое число, необязательно, по умолчанию 7),
(целое число, необязательно, по умолчанию 100) | ✅ Активный |
Примечание: Все инструменты требуют параметр random_string в качестве идентификатора вызова, который обычно автоматически обрабатывается клиентом MCP. «Необязательный» и «Обязательный» относятся к внутренней логике инструмента; клиенту может потребоваться предоставить значения для всех параметров в зависимости от его реализации. Перечисленные здесь имена инструментов являются базовыми именами; клиенты могут видеть их с префиксом (например, mcp_doris_stdio3_get_db_list ) в зависимости от режима подключения.
4. Запустите службу
Если вы используете режим SSE, выполните следующую команду:
Эта команда запускает приложение FastAPI, предоставляя по умолчанию службы SSE и Streamable HTTP MCP.
Конечные точки обслуживания:
Инициализация SSE :
http://<host>:<port>/sseSSE-коммуникация :
http://<host>:<port>/mcp/messages(POST)Потоковое HTTP :
http://<host>:<port>/mcp(поддерживает GET, POST, DELETE, OPTIONS)Проверка работоспособности :
http://<host>:<port>/health(Потенциальная) проверка статуса :
http://<host>:<port>/status(подтвердите, если реализовано вmain.py)
Использование
Для взаимодействия с Doris MCP Server требуется MCP Client . Клиент подключается к конечным точкам SSE или Streamable HTTP сервера и отправляет запросы (например, tool_call ) в соответствии со спецификацией MCP для вызова инструментов сервера.
Основной поток взаимодействия:
Инициализация клиента : подключитесь к
/sse(SSE) или отправьте вызов методаinitializeв/mcp(потоковый).(Необязательно) Обнаружение инструментов : клиент может вызвать
mcp/listToolsилиmcp/listOfferingsчтобы получить список поддерживаемых инструментов, их описания и схемы параметров.Вызов инструмента : клиент отправляет сообщение/запрос
tool_call, указываяtool_nameиarguments.Пример: Получить схему таблицы
tool_name:mcp_doris_get_table_schema(или имя, специфичное для режима)arguments: включаютrandom_string,table_name,db_name.
Ответ на обработку :
Непотоковый : клиент получает ответ, содержащий
resultилиerror.Потоковая передача : клиент получает ряд уведомлений об
tools/progress, за которыми следует окончательный ответ, содержащийresultилиerror.
Конкретные названия инструментов и параметры должны быть указаны в коде src/tools/ или получены через механизмы обнаружения MCP.
Подключение с помощью курсора
Вы можете подключить Cursor к этому MCP-серверу, используя режим Stdio или SSE.
Режим Stdio
Режим stdio позволяет Cursor напрямую управлять процессом сервера. Конфигурация выполняется в файле настроек MCP Server Cursor (обычно ~/.cursor/mcp.json или аналогичном).
Если вы используете режим stdio, выполните следующую команду, чтобы загрузить и собрать пакет зависимостей среды, но учтите, что вам необходимо изменить путь к проекту на правильный адрес пути :
Настройте курсор: добавьте в конфигурацию Cursor MCP запись следующего вида:
{ "mcpServers": { "doris-stdio": { "command": "uv", "args": ["--project", "/path/to/your/doris-mcp-server", "run", "doris-mcp"], "env": { "DB_HOST": "127.0.0.1", "DB_PORT": "9030", "DB_USER": "root", "DB_PASSWORD": "your_db_password", "DB_DATABASE": "your_default_db" } }, // ... other server configurations ... } }Ключевые моменты:
Замените
/path/to/your/doris-mcpна фактический абсолютный путь к корневому каталогу проекта в вашей системе. Аргумент--projectимеет решающее значение дляuv, чтобы найтиpyproject.tomlи запустить правильную команду.commandустановлена наuv(предполагая, что вы используетеuvдля управления пакетами, как указано вuv.lock).argsвключают--project, путь,runиmcp-doris(который должен соответствовать скрипту, определенному в вашемpyproject.toml).Подробности подключения к базе данных (
DB_HOST,DB_PORT,DB_USER,DB_PASSWORD,DB_DATABASE) задаются непосредственно в блокеenvв файле конфигурации. Курсор передаст их серверному процессу. Для этого режима не требуется файл.envпри настройке через Курсор.
Режим SSE
Режим SSE требует, чтобы вы сначала запустили сервер MCP независимо, а затем указали Cursor, как к нему подключиться.
Настройте убедитесь, что учетные данные вашей базы данных и любые другие необходимые параметры (например,
SERVER_PORT, если не используется порт по умолчанию 3000) правильно настроены в файле.envв каталоге проекта.Запустите сервер: Запустите сервер из терминала в корневом каталоге проекта:
./start_server.shЭтот скрипт обычно считывает файл
.envи запускает сервер FastAPI в режиме SSE (проверьте скрипт иsse_server.py/main.pyдля получения подробной информации). Обратите внимание на хост и порт, которые прослушивает сервер (по умолчанию0.0.0.0:3000).Настройте курсор: добавьте в конфигурацию Cursor MCP запись следующего вида, указывающую на конечную точку SSE работающего сервера:
{ "mcpServers": { "doris-sse": { "url": "http://127.0.0.1:3000/sse" // Adjust host/port if your server runs elsewhere }, // ... other server configurations ... } }Примечание: в примере используется порт по умолчанию
После настройки любого из режимов в Cursor вы сможете выбрать сервер (например, doris-stdio или doris-sse ) и использовать его инструменты.
Структура каталога
Разработка новых инструментов
В этом разделе описывается процесс добавления новых инструментов MCP на сервер Doris MCP с учетом текущей структуры проекта.
1. Используйте служебные модули
Прежде чем писать новую логику взаимодействия с базой данных с нуля, проверьте существующие служебные модули:
doris_mcp_server/utils/db.py: предоставляет базовые функции для получения подключений к базе данных (get_db_connection) и выполнения необработанных запросов (execute_query,execute_query_df).doris_mcp_server/utils/schema_extractor.py: предлагает высокоуровневые методы для извлечения метаданных базы данных, такие как перечисление баз данных/таблиц (get_all_databases,get_database_tables), получение схем таблиц/комментариев/индексов (get_table_schema,get_table_comment,get_column_comments,get_table_indexes) и доступ к журналам аудита (get_recent_audit_logs). Включает механизмы кэширования.doris_mcp_server/utils/sql_executor_tools.py: предоставляет оболочку вокругdb.execute_query, которая включает проверки безопасности (необязательно, контролируется переменной окруженияENABLE_SQL_SECURITY_CHECK), добавляет автоматическийLIMITк запросам SELECT, обрабатывает сериализацию результатов (даты, десятичные числа) и форматирует вывод в стандартную структуру MCP success/error. Рекомендуется использовать это для выполнения предоставленного пользователем или сгенерированного SQL.
Вы можете импортировать и комбинировать функции этих модулей для создания своего нового инструмента.
2. Реализуйте логику инструмента
Реализуйте основную логику для вашего нового инструмента как async функцию в doris_mcp_server/tools/mcp_doris_tools.py . Это сохранит централизованность основных реализаций инструмента. Убедитесь, что ваша функция возвращает данные в формате, который можно легко обернуть в стандартную структуру ответа MCP (см. _format_response в том же файле для справки).
Пример: Давайте создадим простой инструмент get_server_time .
3. Зарегистрируйте инструмент (двойная регистрация)
Из-за раздельной обработки режимов SSE/Streamable и Stdio вам необходимо зарегистрировать инструмент в двух местах:
A. SSE/Streamable регистрация (
Импортируйте новую функцию инструмента из
mcp_doris_tools.py.Внутри функции
register_mcp_toolsдобавьте новую функцию-оболочку, декорированную@mcp.tool().Функция-оболочка должна вызывать функцию вашего основного инструмента.
Определите имя инструмента и предоставьте подробное описание (включая параметры, если таковые имеются) в декораторе. Не забудьте включить обязательное описание параметра
random_stringдля совместимости с клиентом, даже если ваша оболочка явно не использует его.
Пример (
B. Регистрация Stdio (
Аналогично SSE добавьте новую функцию-оболочку, декорированную
@stdio_mcp.tool().Важно: импортируйте основную функцию инструмента (
mcp_doris_get_server_time) внутрь функции-оболочки (в этом файле используется шаблон отложенного импорта).Обертка вызывает функцию основного инструмента. Сама обертка может потребовать
async defв зависимости от того, какFastMCPобрабатывает инструменты в режиме Stdio, даже если базовая функция проста (как видно из текущей структуры файла). Убедитесь, что вызов соответствует (например, используйтеawaitпри вызове асинхронной функции).
Пример (
4. Перезапуск и тестирование
После внедрения и регистрации инструмента в обоих файлах перезапустите сервер MCP (в режиме SSE через ./start_server.sh и убедитесь, что команда Stdio, используемая Cursor, обновлена при необходимости) и протестируйте новый инструмент с помощью клиента MCP (например, Cursor) в обоих режимах подключения.
Внося вклад
Приветствуются ваши вклады через Issues или Pull Requests.
Лицензия
Этот проект лицензирован по лицензии Apache 2.0. Подробности смотрите в файле LICENSE (если он существует).