OIC Monitoring MCP Server
OIC Monitoring MCP Server
Сервер только для чтения для MCP для Oracle Integration Cloud (OIC). Подключите к нему MCP-клиент (Claude Code и т.п.) и задавайте вопросы об интеграциях, подключениях, экземплярах выполнения, ошибках и логах потоков на обычном языке — сервер преобразует их в вызовы REST API OIC и возвращает чистый, удобный для LLM JSON.
Создан на FastAPI + WebSocket, аутентификация через OAuth2 Client Credentials (IDCS/IAM).
Содержание
Требования
Параметр | Требование |
Python | 3.10 или новее (рекомендуется 3.11+). В коде используется синтаксис типов |
ОС | Windows 10/11, macOS 12+ или любой современный Linux |
Сеть | Исходящий HTTPS к вашему экземпляру OIC и к вашему URL получения токена IDCS/IAM |
Доступ к OIC | Конфиденциальное приложение (client ID + секрет) с ролью |
Место на диске требуется немного: виртуальное окружение занимает примерно 120 MB, а логи ограничены суммарно примерно 60 MB.
Установка
Процесс одинаков на всех платформах:
Установите Python 3.10+
Получите код
Создайте виртуальное окружение и установите зависимости
Создайте и заполните свой
.envЗапустите сервер и проверьте
В зависимости от ОС отличаются только шаг 1 и команда активации виртуального окружения.
Windows
1. Установка Python
Самый простой способ — через winget в PowerShell:
winget install -e --id Python.Python.3.12Или скачайте установщик с python.org/downloads/windows. Если используете установщик, отметьте галочкой «Add python.exe to PATH» на первом экране. Именно эта галочка — источник большинства последующих проблем вида «python is not recognized».
Закройте и снова откройте PowerShell, затем проверьте версию:
py -3 --versionВы должны увидеть Python 3.10.x или новее. Лаунчер py поставляется вместе с официальным установщиком и является самым надёжным способом запуска Python на Windows, поэтому в командах ниже используется именно он.
2. Получите код
git clone <your-repo-url> oic-mcp
cd oic-mcp3. Создайте виртуальное окружение и установите зависимости
py -3 -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install --upgrade pip
pip install -r requirements.txtЕсли PowerShell блокирует скрипт активации сообщением «running scripts is disabled», разрешите подписанные локальные скрипты для вашего пользователя (одноразово):
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSignedИспользуете cmd.exe вместо PowerShell? Активируйте через .venv\Scripts\activate.bat.
4. Настройка
Copy-Item .env.example .env
notepad .envЗаполните значения, описанные в разделе Конфигурация.
5. Запуск сервера
.\scripts\run-local.ps1macOS
1. Установка Python
В macOS есть системный Python, на который не стоит завязываться. Установите собственный Python через Homebrew:
brew install python@3.12Затем проверьте версию:
python3 --versionНет Homebrew? Либо сначала установите его, либо скачайте установщик для macOS с python.org/downloads/macos.
2. Получите код
git clone <your-repo-url> oic-mcp
cd oic-mcp3. Создайте виртуальное окружение и установите зависимости
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
pip install -r requirements.txt4. Настройка
cp .env.example .env
nano .env5. Запуск сервера
chmod +x scripts/*.sh
./scripts/run-local.shLinux
1. Установка Python
Debian / Ubuntu:
sudo apt update
sudo apt install -y python3 python3-venv python3-pip gitПакет python3-venv в дистрибутивах семейства Debian ставится отдельно, и его легко упустить. Без него команда python3 -m venv завершается ошибкой ensurepip is not available.
RHEL / Rocky / Alma / Fedora:
sudo dnf install -y python3.12 python3.12-devel gitПроверьте версию:
python3 --versionЕсли ваш дистрибутив застрял на версии ниже 3.10 (например RHEL 8, где поставляется Python 3.6), установите более новый интерпретатор рядом с системным (python3.11 или python3.12 из AppStream или deadsnakes) и используйте именно этот явно указанный бинарный файл при создании виртуального окружения, например python3.12 -m venv .venv.
2. Получите код
git clone <your-repo-url> oic-mcp
cd oic-mcp3. Создайте виртуальное окружение и установите зависимости
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
pip install -r requirements.txt4. Настройка
cp .env.example .env
nano .env5. Запуск сервера
chmod +x scripts/*.sh
./scripts/run-local.shПроверка установки
По умолчанию сервер слушает интерфейс ws://127.0.0.1:8085/ws. Теперь во втором терминале выполните:
python3 scripts/ws-call.py tools/listВ Windows:
.\.venv\Scripts\python.exe scripts\ws-call.py tools/listВы должны получить JSON-список из примерно 40 инструментов. Есть также обычная HTTP-проверка работоспособности, для которой не нужен WebSocket-клиент:
curl http://127.0.0.1:8085/healthz
# {"status": "ok"}Если возникла ошибка подключения или ответ 401, перейдите к разделу Устранение неполадок.
Изменение хоста и порта
Скрипты run-local.sh и run-local.ps1 оба читают переменную PORT и по умолчанию привязываются только к loopback, если не указано иное:
# Linux / macOS
PORT=8086 ./scripts/run-local.sh
HOST=0.0.0.0 PORT=8086 ./scripts/run-local.sh# Windows
$env:PORT="8086"; .\scripts\run-local.ps1
$env:MCP_HOST="0.0.0.0"; $env:PORT="8086"; .\scripts\run-local.ps1Или вызовите uvicorn напрямую — именно это скрипты и делают внутри:
uvicorn mcp_server.main:app --host 127.0.0.1 --port 8085 --ws websocketsПривязка к 0.0.0.0 открывает неаутентифицированный WebSocket для вашей сети. Попользуйте такую привязку только за TLS и брандмауэром, см. Защита продакшна.
Конфигурация (.env)
Скопируйте .env.example в .env и заполните:
Переменная | Обязательность | Примечания |
| да | например |
| рекомендуется | добавляется в каждый запрос как |
| да | например |
| да | client ID конфиденциального приложения |
| да | секрет конфиденциального приложения |
| иногда | нужен только если ваше приложение не предварительно сконфигурировано с ресурсом и областью OIC в IDCS — см. Устранение неполадок |
| нет | по умолчанию |
| нет | по умолчанию |
| нет | по умолчанию |
| нет | какой файл окружения загружает этот процесс, по умолчанию |
Клиенту вашего конфиденциального приложения также потребуется роль приложения ServiceUser, назначенная на ресурсное приложение экземпляра OIC в IDCS/IAM (не в самом клиентском приложении) — иначе каждый вызов будет завершаться с ошибкой 401 даже при валидном токене. См. Устранение неполадок.
Файлы .env и все .env.* находятся в .gitignore (в репозитории отслеживается только .env.example), поэтому ваши секреты не попадают в репозиторий.
Подключение MCP-клиента
Claude Code:
claude mcp add-json oic '{"type":"ws","url":"ws://127.0.0.1:8085/ws"}'Любому другому клиенту с поддержкой конфигурации в виде «сырого» JSON добавьте эту запись в конфигурацию его MCP-сервера (например в .mcp.json либо скопируйте mcp.json.example):
{
"mcpServers": {
"oic": {
"type": "ws",
"url": "ws://127.0.0.1:8085/ws"
}
}
}Этот сервер поддерживает только транспорт WebSocket — это не stdio-сервер, поэтому конфигурация с
"type": "stdio"или запуск через команду здесь не работают. Сначала запустите его как отдельный процесс, затем укажите клиенту на этот URL.
После подключения просто спрашивайте агента, например: "список активированных интеграций" или "покажи последние 20 экземпляров выполнения для INTEGRATION_CODE" — вам не нужно самому вызывать инструменты по имени.
Запуск нескольких окружений из одного репозитория
Не нужна вторая копия репозитория, чтобы мониторить Dev, Test и Prod. Один клон репозитория может запускать столько процессов, сколько нужно: каждый процесс указывает на свой файл окружения через переменную OIC_ENV_FILE и использует свой порт.
mcp_server/settings.py при запуске процесса читает OIC_ENV_FILE и загружает этот файл вместо .env. Всё остальное в процессе идентично: тот же код, те же инструменты.
1. Создайте по одному файлу окружения для каждой среды
cp .env.example .env.dev
cp .env.example .env.test
cp .env.example .env.prodЗаполните в каждом файле собственные OIC_BASE_URL, OIC_INSTANCE_NAME и OAuth-учётные данные этого окружения. Дайте каждому процессу отдельный файл логов, чтобы их журналы не перемешивались:
# in .env.prod
MCP_LOG_FILE=mcp_server.prod.log2. Запустите по одному процессу на каждое окружение, каждому — на своём порту
Linux / macOS:
OIC_ENV_FILE=.env.dev PORT=8085 ./scripts/run-local.sh
OIC_ENV_FILE=.env.test PORT=8086 ./scripts/run-local.sh
OIC_ENV_FILE=.env.prod PORT=8087 ./scripts/run-local.shWindows PowerShell — по одному процессу на терминал, поскольку каждый задаёт собственные переменные:
$env:OIC_ENV_FILE=".env.prod"; $env:PORT="8087"; .\scripts\run-local.ps1Или вызовите uvicorn напрямую:
OIC_ENV_FILE=.env.prod uvicorn mcp_server.main:app --host 127.0.0.1 --port 8087 --ws websockets3. Зарегистрируйте каждый процесс у вашего клиента под отдельным именем
{
"mcpServers": {
"oic-dev": { "type": "ws", "url": "ws://127.0.0.1:8085/ws" },
"oic-test": { "type": "ws", "url": "ws://127.0.0.1:8086/ws" },
"oic-prod": { "type": "ws", "url": "ws://127.0.0.1:8087/ws" }
}
}Тогда ваш агент увидит три набора инструментов с понятными именами, и вы сможете в одном диалоге попросить его сравнить одну и ту же интеграцию между окружениями.
Возможная схема:
Окружение | Файл окружения | Порт | Имя клиента | Файл логов |
Dev |
| 8085 |
|
|
Test |
| 8086 |
|
|
Prod |
| 8087 |
|
|
Полезно знать:
OIC_ENV_FILEчитается один раз при запуске процесса. Если изменить его значение или сам файл окружения, потребуется перезапуск этого процесса.Настоящие переменные окружения ОС имеют приоритет над любым содержимым файла окружения. Если у вас в профиле оболочки экспортирована
OIC_BASE_URL, то каждый процесс получит её независимо от того, какой файл окружения он загрузил. Такие переменные держите вне профиля оболочки.Каждый процесс нуждается в собственном порте. Два процесса на одном порту завершатся ошибкой «address already in use».
В Docker флаг
--env-fileподставляет настоящие переменные окружения, поэтомуOIC_ENV_FILEтам не нужен. Просто укажите--env-fileна нужный файл.Все инструменты здесь читают только данные, но принцип минимальных привилегий всё равно полезен: выдавайте OAuth-приложению каждого окружения только роль
ServiceUser.
Поддержание работы сервера
Поддерживаем два варианта. Выберите один осознанно, потому что при завершении сеанса они ведут себя совершенно по-раз ному.
Вариант A: только в рамках сеанса (процесс умирает при закрытии терминала)
Идеально подходит для разработки, разовых сеансов изучения данных и для ситуаций, когда вы не хотите, чтобы забытый процесс всю ночь держал учётные данные в памяти.
Запускайте его в активном (переднем) режиме, в своём отдельном терминале:
# Linux / macOS
./scripts/run-local.sh# Windows
.\scripts\run-local.ps1Это и есть весь способ. Процесс является потомком этого терминала:
Ctrl+Cостанавливает его мгновенно.Закрытие окна терминала, завершение SSH-сессии или выход из системы убивает процесс.
Он никогда не перезапускается сам и не появляется после перезагрузки.
Логи одновременно идут и в терминал, и в mcp_server.log, что делает этот вариант ещё и самым удобным для отладки.
Если выхотите вернуть командную строку, но при этом хотите чтобы процесс завершился вместе с сеансом, запустите его в фоне как задачу оболочки, а не демонизируйте:
./scripts/run-local.sh > uvicorn.log 2>&1 &
echo "started as PID $!"
# later, from the same shell
kill %1Не оборачивайте это в nohup, setsid, disown, screen или tmux, если вам нужно поведение, ограниченное сеансом. Все они существуют именно для того, чтобы отсоединить процесс от вашего сеанса, и будут держать его живым после вашего выхода из системы.
Чтобы убедиться, что ничего не осталось после закрытия сеанса:
# Linux / macOS
pgrep -af "mcp_server.main"# Windows
Get-CimInstance Win32_Process -Filter "Name='python.exe'" |
Where-Object { $_.CommandLine -like "*mcp_server.main*" } |
Select-Object ProcessId, CommandLineВариант B: постоянный фоновый сервис (переживает перезагрузку)
Лучше всего подходит для общего сервера или рабочей станции, где команда ожидает, что конечная точка MCP всегда доступна. Во всех приведённых ниже случаях сервис запускается при загрузке и автоматически перезапускается при сбое.
Не используйте для этого nohup ... & — он переживает выход из системы, но не перезагрузку, и никто не перезапустит его, если процесс умрёт. Используйте системный менеджер сервисов вашей ОС.
Linux (systemd)
Создайте /etc/systemd/system/oic-mcp.service:
[Unit]
Description=OIC Monitoring MCP Server
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=oicmcp
Group=oicmcp
WorkingDirectory=/opt/oic-mcp
Environment=OIC_ENV_FILE=/opt/oic-mcp/.env.prod
ExecStart=/opt/oic-mcp/.venv/bin/uvicorn mcp_server.main:app --host 127.0.0.1 --port 8085 --ws websockets
Restart=always
RestartSec=5
# Basic hardening
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
[Install]
WantedBy=multi-user.targetЗатем:
sudo useradd --system --home /opt/oic-mcp --shell /usr/sbin/nologin oicmcp
sudo chown -R oicmcp:oicmcp /opt/oic-mcp
sudo chmod 600 /opt/oic-mcp/.env.prod
sudo systemctl daemon-reload
sudo systemctl enable --now oic-mcp
sudo systemctl status oic-mcpenable — это то, что возвращает сервис после перезагрузки. Restart=always — это то, что возвращает его после сбоя. Нужны оба.
Журналы попадают в системный журнал:
journalctl -u oic-mcp -fДля второго окружения скопируйте unit-файл в oic-mcp-test.service, измените строку Environment=OIC_ENV_FILE= и --port, затем выполните sudo systemctl enable --now oic-mcp-test.
Предпочитаете запускать его от имени собственного пользователя? Поместите тот же unit-файл в ~/.config/systemd/user/oic-mcp.service, включите его с помощью systemctl --user enable --now oic-mcp и выполните sudo loginctl enable-linger $USER, чтобы он запускался при загрузке, а не при первом входе.
macOS (launchd)
Создайте ~/Library/LaunchAgents/com.oic.mcp.plist, заменив /Users/you/oic-mcp на ваш фактический путь:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.oic.mcp</string>
<key>ProgramArguments</key>
<array>
<string>/Users/you/oic-mcp/.venv/bin/uvicorn</string>
<string>mcp_server.main:app</string>
<string>--host</string><string>127.0.0.1</string>
<string>--port</string><string>8085</string>
<string>--ws</string><string>websockets</string>
</array>
<key>WorkingDirectory</key>
<string>/Users/you/oic-mcp</string>
<key>EnvironmentVariables</key>
<dict>
<key>OIC_ENV_FILE</key>
<string>/Users/you/oic-mcp/.env.prod</string>
</dict>
<key>RunAtLoad</key><true/>
<key>KeepAlive</key><true/>
<key>StandardOutPath</key>
<string>/Users/you/oic-mcp/launchd.out.log</string>
<key>StandardErrorPath</key>
<string>/Users/you/oic-mcp/launchd.err.log</string>
</dict>
</plist>Загрузите его:
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.oic.mcp.plist
launchctl print gui/$(id -u)/com.oic.mcp | head -20RunAtLoad запускает его немедленно и снова при каждом входе в систему. KeepAlive перезапускает его, если он завершается.
Чтобы остановить его или перезагрузить после изменения plist-файла:
launchctl bootout gui/$(id -u)/com.oic.mcp
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.oic.mcp.plistLaunchAgent в ~/Library/LaunchAgents запускается при входе вашего пользователя. Если машина должна отвечать на запросы до того, как кто-либо войдёт, поместите тот же plist-файл в /Library/LaunchDaemons/ (владелец root:wheel, режим 644), добавьте ключ UserName, чтобы сервис не запускался от имени root, и загрузите его командой sudo launchctl bootstrap system /Library/LaunchDaemons/com.oic.mcp.plist.
Для второго окружения продублируйте plist-файл с новым Label (com.oic.mcp.test), другим портом и другим OIC_ENV_FILE.
Windows (NSSM, рекомендуется)
NSSM оборачивает любой исполняемый файл в полноценную службу Windows. Установите его с помощью winget install nssm или choco install nssm, затем в PowerShell с правами администратора:
$proj = "D:\oic_mcp_git"
nssm install OicMcp "$proj\.venv\Scripts\uvicorn.exe" "mcp_server.main:app --host 127.0.0.1 --port 8085 --ws websockets"
nssm set OicMcp AppDirectory $proj
nssm set OicMcp AppEnvironmentExtra "OIC_ENV_FILE=$proj\.env.prod"
nssm set OicMcp Start SERVICE_AUTO_START
nssm set OicMcp AppStdout "$proj\service.out.log"
nssm set OicMcp AppStderr "$proj\service.err.log"
nssm set OicMcp AppExit Default Restart
nssm set OicMcp AppRestartDelay 5000
nssm start OicMcpSERVICE_AUTO_START — это то, что возвращает службу после перезагрузки, а AppExit Default Restart — то, что перезапускает её после сбоя.
Управляйте ей как любой другой службой:
Get-Service OicMcp
nssm restart OicMcp
nssm stop OicMcp
nssm remove OicMcp confirmДля второго окружения установите другую службу под другим именем (например, OicMcpTest) со своим портом и OIC_ENV_FILE.
Windows (Планировщик задач, без дополнительных инструментов)
Если вы не можете установить NSSM, Планировщик задач может запускать его при загрузке. Сначала создайте start-prod.bat в папке проекта, потому что запланированная задача не может легко задать рабочую директорию напрямую:
@echo off
cd /d D:\oic_mcp_git
set OIC_ENV_FILE=D:\oic_mcp_git\.env.prod
".venv\Scripts\python.exe" -m uvicorn mcp_server.main:app --host 127.0.0.1 --port 8085 --ws websocketsЗатем зарегистрируйте её в PowerShell от имени администратора:
schtasks /Create /TN "OIC MCP Server" /TR "D:\oic_mcp_git\start-prod.bat" /SC ONSTART /RU SYSTEM /RL HIGHEST /F
schtasks /Run /TN "OIC MCP Server"
schtasks /Query /TN "OIC MCP Server"Это запускает процесс при загрузке, но не перезапускает его при сбое по умолчанию. Добавьте это в Планировщике задач на вкладке Параметры: «Если задача не выполнена, перезапускать каждую 1 минуту», до 3 раз. NSSM справляется с этим лучше, поэтому он является рекомендуемым вариантом.
Docker (любая платформа)
Политика перезапуска выполняет ту же работу, что и сервис-менеджер, включая перезагрузки хоста, при условии, что сам демон Docker запускается при загрузке:
docker build -t oic-mcp:latest .
docker run -d \
--name oic-mcp-prod \
--restart unless-stopped \
-p 8085:8080 \
--env-file .env.prod \
oic-mcp:latestКонтейнер слушает порт 8080 на локальной стороне, поэтому сопоставьте с нужным вам портом хоста. Для запуска второгного окружения измените имя, порт хоста и файл окружения:
docker run -d --name oic-mcp-test --restart unless-stopped \
-p 8086:8080 --env-file .env.test oic-mcp:latestСледите за ним с помощью docker ps и docker logs -f oic-mcp-prod.
Какой вариант следует использовать?
Только сессия | Постоянный сервис | |
Переживает закрытие терминала | нет | да |
Переживает выход из системы | нет | да |
Переживает перезагрузку | нет | да |
Перезапускается после сбоя | нет | да |
Трудоёмкость настройки | не требуется | несколько минут, однократно |
Подходит для | разработки, разовых исследований | общих серверов, постоянной командной работы |
Инструменты
Все инструменты доступны через tools/list и доступны только для чтения. Многие принимают необязательный version; если он опущен, автоматически резолвится последняя версия.
Интеграции
list_integrations— необязательныеonlyActivated,limit,pagelist_activated_integrationsget_integration— поidentifierиversionget_integration_auto— параметры на этапе проектирования поcodeилиcode|version, автоматически разрешает последнюю версиюsearch_integration_by_name— поиск по полному каталогу (автомагистраниченная с текущей страницей), точное или частичное совпадение, всегда возвращает списокlist_integrations_search— клиент–поиск по страницам поcode/name/description/keywordsexport_integration— загрузка архива интеграции как base64 или параметрlistOnlyзаписей + превью
Мониторинг времени выполнения
list_instances— необязательныеintegrationId,status,startTime/endTime,timewindow,limitget_instance— полная детализация поinstanceIdget_instance_activity_stream— пошаговый журнал потока/выполнения для одного экземпляраlist_errors— необязательныеintegrationId,timewindow,limitlist_metrics— исторические метритеки отслеживания, по часам или днямlist_schedules/get_schedule— информация о планировщике для каждой интеграции
Подключения, пакеты и строительные блоки
list_connections/get_connection/get_connection_detaillist_packages/get_packagelist_lookups/get_lookupget_librarylist_adapters/get_adapterlist_agents/list_agent_groupslist_endpoints— конечные точки интеграции с ролью и подключением
Анализ на этапе проектирования
summarize_integration— сведение по триггеру, целям и переменным отслеживанияsummarize_integration_with_steps— то же плюс выбранные сводки ввода/вывода по шагамsummarize_flow_controls— подсчёт и образцы конструкций Switch/ForEach/Route/Fault/Scopesummarize_mappings— извлечение шагов маппингаdeep_flow_outline— компактное текстовое изложение всего потокаget_integration_step— необработанные JSON-подстроки, сопоставляющиеstepName(точное + нечёткое), а также соответствующие конечные точкиsummarize_step_io— предполагаемые SQL/запросные фрагменты и параметры дляstepName, если шаг не найден, фолбэк на соответствие конечной точки
Утилиты
fetch_raw_path— получить любой относительный путь OICsearch_json— подстрочный поиск по любой JSON-подобной структуре
Инструменты на этапе проектирования принимают необязательный designJsonPath для чтения ранее скачанного JSON-файла дизайна с диска вместо вызова OIC — полезно для оффлайн-анализации или уменьшения повторных вызовов при итерациях.
Формат ответа
Каждый результат tools/call следует загонной спецификации MCP {"content": [{"type":"text","text": "<json-or-plain-text>"}],"isError": false}. Фактическая полезная нагрузка инструмента сериализована JSON внутри text — разберите её один раз, чтобы получить структурированные данные:
python3 scripts/ws-call.py tools/call '{"name":"list_integrations","arguments":{"limit":3}}' \
| python3 -c "
import json, sys
resp = json.load(sys.stdin)
payload = json.loads(resp['result']['content'][0]['text'])
print(json.dumps(payload, indent=2))
"Ошибки выполнения инструмента (например, OIC недоступен, неверный идентификатор) возвращаются тем же способом с isError: true — учитывайте этот флаг, а не предполагайте успех. Настоящие ошибки протокола (неизвестный метод, неизвестное имя инструмента) используют настоящий объект error JSON-RPC. Большие нагрузки ограничены 100,000 символов и чётко помечаются [TRUNCATED...] при обрезе — никогда не на а тихо.
Как это работает
Сервер предоставляет одну конечную точку WebSocket, говорящую на JSON-RPC 2.0 / MCP. Клиенты вызывают
tools/listдля получения списка инструментов иtools/callдля их запуска.При каждом вызове он получает инции через REST API OIC посредством аутентифицированного
httpx.AsyncClient. Токен OAuth кешируется и автоматически обновляется по истечении срока.Рукопожатие WebSocket согласует подоген
mcp, когда клиент предлагает его, аinitializeвозвращает соответствующийprotocolVersionиcapabilitiesс типом object — это требуется для строгих клиентов вроде Claude Desktop для принятия соединения.Перенаправления обрабатываются вручную, а не через встроенную обработку httpx: шлюз Time-Design от OIC делает 307-переадресацию на другой хост, чем
OIC_BASE_URL, и httpx по умолчанию удаляет заголовокAuthorizationпри любом перезанятой между хостами. Ручная обработка сохраняет его для этого известного доверенного перехода.
Логирование
Логи записываются в mcp_server.log (переопределяется через MCP_LOG_FILE), автоматически циклируются по 10 МБ на файл с нулевым резервным копированием (~60 МБ потолоку) — они никогда не растут бесконечно. Не требуется logrotate, cron или sudo ни на какой платформе; приложение само управляет размером логов.
При запуске одного процесса на одно окружение задавайте отдельный MCP_LOG_FILE в каждом env-файле, чтобы логи оставались раздельными.
Производственная защ укрепление
Запускайте за TLS (обратный прокси типа Nginx/Traefik) и ограничивайте сетевой доступ. Конечная точка WebSocket не имеет собственной аутонтификации, поэтому никогда не подставляйтее её напцрямую в недостоверную сеть.
Держите адрес привязки на
127.0.0.1, если нет особой прицыны.Храните секреты в vault, никогда комить не
.env. На LInux выполнитеchmod 600на env-файл и сделайте владелемьном пользователем сервиса.Выдайте OAuth-клиенту минимальную роль из необходимых (
ServiceUser— read-only; избегайтеServiceDeveloper, если не нужны именно инструменты создания/импорта).Испольмзуйте менеджер процессов (systemd, launchd, NSSM), чтобы переживать перезагрузки, см. Вариант Б.
Следите из размерами полезной нагрузки на больших каталогах — предпочитаем
list_integrations_searchс узкими терминами и страничением, а не вытягивание целых списков.
устранение неполадок
Установка и заупск
pythonилиpyне распознается (Windows — Python установлен без 'Add python.exe to PATH' . Перезапустите установщик, выберите Modify, включите эту опцию или перезапустите черезwinget install --id Python.Python.3.12. Открой новый терминал.running scripts is disabled on this system(Windows)* — Политика выполнения PowerShell блокирует активацию виртуального окружения. ВыполнитеSet-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy.— используйте
cmd.exeс.venv\Scripts\activate.bat.* Rollback.ensurepip is not available(Debian/Ubuntu) — установите отделный пакетpython3-venv:sudo apt install python3-venv.TypeError: unsuported operand type(s) for |— у вас Python 3.9 или старше. Поставьте 3.10+ и пересоздайте virtualenv с новым интерпетатором.ValidationErrorпри запуске со си упоминаниемOIC_BASE_URLилиOAUTH_*— укажите env-файл не найден или неполный. Убедитесь, что вы скопировали.env.exampleв.env, что процесс запуска из директории проекта в том же месте, существует.address already in use— процесс держит порт. Найдите его с помощьюlsof -i :8085(Linux/macOS) илиnetstat -ano | findstr :8085(Windows), или начегов на другомPORT.
Аутентификация
401/403 от token URL — проверьте
OAUTH_CLIENT_ID/OAuth_CLIENT_SECRETи чтоOAURL_RENсоответствует вашему IDCS/IAM-доме.Запрос токена успешен (200), но каждая вызова OIC возвращает 401 — чаще всего это не хватает ролей в IDCS, а не плохой токен. В OCI Console → Identity & Security → Domains → ваш домейн → найдите ресурсное приложение самого экземпляра OIC (не ваше конфиденциальное клиентское приложение) → Application roles →
ServiceUser→ назначьте ваше конфиденциальное клиентское приложение как application. Получите свежий ток, поке наблюдая его — сущеествующий токен не получит ролей ретроспективно.
Подключeние
Отказ в соединении / WebSocket недоступен — убедитесь, что процесс сервера действительно запущен (
pgrep -af mcp_server.main,systemctl status oic-mcpилиGet-Service OicMcp) и что тот же порт не используется ничем другим. Быстрее всего проверить это командойcurl http://127. 0.0.1:8085 /healthz. Claude Code показывает сервер как «всё ещё подключающийся» или его инструменты так и не загружаются — сервер должен быть запущен до начала клиентской сессии; если он ещё не был запущен, автоматическое повторное подключение не происходит. Перезапустите клиент после того, как убедитесь, что сервер исправно работает. Возвращаются данные из неправильного окружения — переменная окружения реальной ОС переопределяет ваш env-файл, и эти переменные имеют приоритет. Проверьте с помощьюenv | grep OIC_(Linux/macOS) илиGet-ChildItem Env:OIC_*(Windows) и удалите все устаревшие из профиля оболочки.
Использование инструментов
404 на определённых путях flow/design — предпочитайте инструменты времени проектирования (
get_integration_auto,summarize_*) прямым запросам к путям; они сами обрабатывают разрешение версий и особенности известных конечных точек.Большие или медленные ответы — суживайте выборку с помощью
list_integrations_search/search_integration_by_nameи пагинации (perPage,maxPages) вместо загрузки полных каталогов.Проверка состояния здоровья —
GET /healthzвозвращает{"status": "ok" }, когда сам процесс запущен (отдельную связность с OIC не проверяет).
Лицензия
MIT
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Official Microsoft MCP Server to query Microsoft Entra data using natural language
A paid remote MCP for AI SDK data query MCP, built to return verdicts, receipts, usage logs, and aud
Search, document and execute authenticated API calls across 700+ apps via one MCP server
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/mkc110891/oic-monitoring-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server