inferwatch-mcp
inferwatch
Метрики в реальном времени и за прошлые периоды для локально развёрнутых LLM — Ollama и vLLM — с браузерным дашбордом, экраном настроек и MCP-сервером, чтобы агент мог запрашивать те же данные.
Один процесс Python, один файл SQLite. Никаких Docker, Node, Prometheus и внешних сервисов. Он никогда не находится на пути запроса, поэтому не может замедлить или нарушить инференс.
┌── Ollama ──────────────┐ ┌── vLLM ────────────────┐
│ journald / file / │ │ GET /metrics │
│ docker logs │ │ (native Prometheus) │
└──────────┬─────────────┘ └──────────┬─────────────┘
│ per-request rows │ pre-aggregated
▼ ▼
┌──────────────── SQLite (WAL) ────────────────┐
│ requests · rollups · vllm_samples/hist │
└───────┬──────────────────────────┬───────────┘
▼ ▼
dashboard :7070 MCP server (stdio)Два движка несимметричны, и инструмент не утверждает обратного
Это центральный факт архитектуры, поэтому его стоит сформулировать прямо.
Ollama | vLLM | |
Источник | его журнал |
|
Строки по запросам | да | нет — собирать нечего |
TTFT / задержка | точные, по каждому запросу | только гистограммы |
Токены | по запросу | кумулятивные счётчики |
Ошибки | HTTP-статус по каждому запросу |
|
Адрес клиента | да | нет |
Перцентили | точные в пределах срока хранения | верхние границы корзин; средние точны |
Уникальные дополнения | повторное использование кэша промпта, принятие черновика, время холодной загрузки | заполненность KV-кэша, вытеснения, заполненность батча, ожидание по причинам |
Обе вкладки показывают загрузку GPU, видеопамять, температуру и потребляемую мощность, поскольку они измеряются через nvidia-smi, а не каким-либо из движков. Температура и мощность получают отдельные графики, а не общую ось, и каждая агрегируется так, как требует её единица измерения: загрузка усредняется по картам, видеопамять и ватты суммируются, температура показывает самую горячую карту. Температура — единственный ряд, который строится не от нуля: диапазон 33–68 °C, начинающийся с 0, занимал бы большую часть графика впустую.
Поэтому для них предусмотрены отдельные вкладки дашборда, отдельные таблицы и отдельные MCP-инструменты. Не предпринимается попыток восстановить построчные данные по запросам для vLLM путём вычитания счётчиков: невозможно определить, какому запросу принадлежал тот или иной TTFT, а подделка поставила бы выдуманные строки рядом с настоящими.
Ollama: откуда берутся числа
Ollama не предоставляет эндпоинт /metrics (проверено — такого маршрута нет в бинарнике). При OLLAMA_DEBUG=1 встроенный llama.cpp печатает блок таймингов для каждого запроса, который объединяется со строкой доступа и строкой планировщика:
slot print_timing: id 0 | task 6763 | prompt eval time = 1254.52 ms / 55 tokens
slot print_timing: id 0 | task 6763 | eval time = 14591.31 ms / 416 tokens
[GIN] ... | 200 | 16.862061865s | 192.0.2.10 | POST "/v1/chat/completions"
time=... msg="context for request finished" runner.name=.../llama3.2:3bЭто даёт TTFT, разбивку prefill/decode, количество токенов, скорость декодирования, статус, клиента, эндпоинт и модель — для каждого запроса, от любого клиента, не затрагивая путь запроса. Из объединения получаются два числа, которых нет ни у одного источника по отдельности:
ожидание в очереди = реальная задержка − время работы раннера: время, потраченное на ожидание, а не на генерацию. Прокси не может разделить эти величины.
повторное использование кэша промпта = полная длина промпта − фактически обработанные токены.
Требуется OLLAMA_DEBUG=1. Без него llama.cpp не печатает строки таймингов: частоты запросов, статусы и метрики GPU по-прежнему работают, но TTFT и количество токенов остаются пустыми. Дашборд сообщает об этом в баннере, а не показывает нули.
# /etc/systemd/system/ollama.service.d/override.conf
[Service]
Environment="OLLAMA_DEBUG=1"vLLM: откуда берутся числа
Собственный эндпоинт Prometheus у vLLM опрашивается каждые collection.scrape_interval_s (по умолчанию 10 с). Кумулятивные счётчики преобразуются в разности; корзины гистограмм — в разности по каждой корзине; и то и другое сохраняется агрегированно по минутам, потому что хранение каждого опроса добавляло бы миллионы строк в месяц с разрешением, которое не использует ни один график.
Три детали, о которых стоит знать:
Собственные границы корзин vLLM хранятся вместе со счётчиками. Его границы идут с шагом 1мс/20мс/250мс/2,5с/40с/640с; у Ollama шаг 25мс/200мс/1,5с/15с/60с. Ни одна не является уточнением другой, поэтому перекладывание одной в другую потребовало бы интерполяции между границами — то есть выдумывания чисел. Перцентили вычисляются по собственным границам каждого источника и сообщаются как верхние границы корзин.
_sumи_countточны, поэтому среднее точно. Поскольку корзины vLLM грубые в диапазоне секунд, дашборд и MCP-инструменты выводят на первое место среднее, а перцентили помечают как «не более».Перезапуски обнаруживаются через
process_start_time_seconds(а также по счётчику, идущему в обратную сторону). Интервал, охватывающий перезапуск, отбрасывается, а не выдаётся как ложная дельта.
Межтокенная задержка в разных версиях vLLM называлась time_per_output_token_seconds, inter_token_latency_seconds и request_time_per_output_token_seconds. Собираются все варианты, и используется тот, в котором есть данные, так что это работает со старыми и новыми серверами без настройки.
Related MCP server: System Monitor MCP Server
Установка
Требуется Python 3.10 или новее — не из-за этого кода (он совместим с 3.9), а потому что fastapi, uvicorn, starlette и mcp требуют именно его.
pip install git+https://github.com/floatsmyboat/inferwatch # or:
git clone https://github.com/floatsmyboat/inferwatch && cd inferwatch
python3 -m venv --upgrade-deps .venv && .venv/bin/pip install -e ".[dev]"Установка даёт вам две команды:
Команда | Что это такое |
| коллектор, дашборд и API ( |
| MCP-сервер, через stdio |
Пока нет на PyPI; устанавливайте из git.
Выполните обратное заполнение из уже имеющегося журнала, затем посмотрите базу данных:
inferwatch ingest --since 2d # or: python -m inferwatch.main ingest
inferwatch statsЗапустите:
inferwatch serve # http://127.0.0.1:7070Как служба — юнит формируется из systemd/inferwatch.service.in для текущего пользователя, пути к checkout и интерпретатора, так что ничего не зашито жёстко:
./scripts/install-systemd.sh # system service (uses sudo)
sudo systemctl enable --now inferwatch
./scripts/install-systemd.sh --user # or per-user, no sudo
systemctl --user enable --now inferwatchПереопределите с помощью HOST=0.0.0.0 PORT=7070 DATADIR=... ./scripts/install-systemd.sh.
Доступ по сети
Аутентификации нет. Дашборд доступен только для чтения (только GET) и не хранит тексты промптов и ответов — только счётчики, тайминги, имена моделей и адреса клиентов. Ограничьте доступ на межсетевом экране:
sudo ufw allow from 192.168.1.0/24 to any port 7070 proto tcp comment "inferwatch"Настройка того, что отслеживается
Всё можно изменить на вкладке Настройки дашборда или из CLI:
python -m inferwatch.main sources # list
python -m inferwatch.main sources add --kind vllm --name qwen \
--set url=http://127.0.0.1:8000
python -m inferwatch.main sources add --kind ollama --name box \
--set reader=file --set path=~/.ollama/logs/server.log
python -m inferwatch.main sources disable qwenЧитатели журналов Ollama. Не все запускают Ollama под systemd:
reader | для чего | точность временных меток |
|
| микросекунда, из journald |
|
| производная; см. ниже |
| Ollama в контейнере | построчно, из |
Читатель file следит за файлом как tail -F, переживая ротацию (смену inode) и усечение, и сохраняет смещение, чтобы перезапуск не приводил к повторному чтению. Go-строки Ollama содержат time=, но строки slot от llama.cpp — те, что содержат количество токенов, — не имеют временной метки, поэтому переносится самая последняя из виденных. Порядок, от которого зависят объединения, сохраняется всегда; абсолютная точность ниже, чем у journald, а строка [GIN] с разрешением в секунду поджимается вперёд, чтобы время никогда не выглядело идущим назад.
Приоритет настроек
spec default < database (Settings tab) < environment < command lineКлюч, заданный через переменную окружения или флаг, отображается только для чтения на вкладке «Настройки» с указанием источника, потому что процессу было сказано использовать его, и браузер не должен молча это переопределять. Сохранение выполняется по принципу «всё или ничего», поэтому опечатка в одном поле не может оставить частично применённую конфигурацию. Изменения источников, интервалов и срока хранения применяются без перезапуска; server.host и server.port помечены как требующие перезапуска, и API сообщает об этом после сохранения.
Справочник по конфигурации
Каждый параметр ниже можно изменить на вкладке «Настройки», задать через переменную окружения, а некоторые можно задать флагом. Таблицы генерируются из кода (scripts/gen-config-docs.py), поэтому они не могут разойтись с тем, что программа действительно принимает.
Сгенерировано scripts/gen-config-docs.py — не редактируйте вручную.
Сбор данных
Параметр | По умолчанию | Допустимые значения | Переменная окружения | Примечания |
|
| 1–300 |
| Как часто опрашиваются nvidia-smi и собственный эндпоинт статуса движка. |
|
| 1–300 |
| Как часто читается эндпоинт /metrics каждого экземпляра vLLM. Счётчики vLLM кумулятивные, поэтому это задаёт разрешение для всех производных скоростей и гистограмм. |
|
|
|
| требуется перезапуск — Насколько далеко назад читать при первом запуске, до появления состояния возобновления. Принимает 7d / 6h или форму journalctl, например '-2 days'. |
|
| 10–3600 |
| Как часто пересчитываются агрегаты за 1 минуту и 1 час. |
Хранение
Параметр | По умолчанию | Допустимые значения | Переменная окружения | Примечания |
|
| 0.5–3650 |
| Детализация по запросам старше этого срока удаляется. Агрегаты хранятся бессрочно независимо от этого, так что долгосрочные графики сохраняются. |
|
| 0.5–3650 |
| Выборки GPU, выборки движков и журнал событий обрезаются до этого срока. |
Дашборд
Настройка | По умолчанию | Принимает | Переменная окружения | Примечания |
|
|
|
| Диапазон, выбранный при открытии дашборда. |
|
| — |
| Включает HEAD / и опрос статуса в частоту запросов. По умолчанию выключено, потому что на опрашиваемом экземпляре это может составлять 90%+ обращений. |
|
| 2–600 |
| Как часто открытый дашборд перезапрашивает данные. Живой поток запросов передаётся отдельно и не зависит от этого. |
Сервер
Настройка | По умолчанию | Принимает | Переменная окружения | Примечания |
|
| — |
| требуется перезапуск — 0.0.0.0 открывает дашборд в сети. Аутентификации нет, поэтому ограничьте доступ на межсетевом экране. |
|
| 1–65535 |
| требуется перезапуск — порт, на котором слушают дашборд и API. |
Поля источника
Задайте их с помощью --set key=value в sources add или на вкладке Settings.
Ollama (--kind ollama)
Поле | По умолчанию | Обязательно при | Примечания |
|
| — | Откуда читать лог ollama. Метрики по запросам берутся из отладочных строк llama.cpp, поэтому один из этих источников обязателен. Один из: |
|
|
| |
| — |
| Отслеживается как tail -F, поэтому ротация и усечение обрабатываются. |
|
|
| |
|
| — | Используется для опроса /api/ps для резидентных моделей. |
| — | — | Необязательно. Разрешает дайджесты blob в имена моделей при событиях загрузки. По умолчанию — $OLLAMA_MODELS или ~/.ollama/models. |
vLLM (--kind vllm)
Поле | По умолчанию | Обязательно при | Примечания |
|
| — | Корень сервера, совместимого с OpenAI. /metrics читается отсюда. |
| — | — | Если задано, журнал также читается для HTTP-статусов, адресов клиентов и ошибок движка, которые /metrics не показывает. |
| — | — | Отправляется как bearer-токен, если сервер требует его. |
Флаги командной строки
Флаг | Назначение | Закрепляет настройку |
| — | — |
| systemd-юнит для начального источника Ollama / для приёма данных | — |
| — | — |
| каталог моделей ollama (разрешает дайджесты blob в имена моделей) | — |
| приём: читать этот файл лога вместо журнала | — |
| окно обратного заполнения лога, например '-2 days' |
|
| срок хранения сырых запросов; сводки хранятся бессрочно |
|
| — |
|
| — |
|
| — |
|
| — |
|
| — | — |
Флаги, которые закрепляют настройку, имеют приоритет над переменными окружения и вкладкой Settings; вкладка показывает эти ключи только для чтения с указанием источника.
Область действия: один источник Ollama, много источников vLLM
Строки vLLM везде привязаны к источнику, поэтому можно одновременно отслеживать любое количество экземпляров vLLM. Таблицы Ollama (requests, events, ps_samples) не разделены по источникам, поэтому одновременно работает ровно один источник Ollama; включение второго приводит к предупреждению и игнорированию, а не к незаметному смешиванию двух экземпляров в один набор чисел. Разделение этих таблиц — изменение схемы, которое стоит сделать осознанно.
Дашборд
http://127.0.0.1:7070 — три вкладки: Ollama, vLLM, Settings.
Какие GPU принадлежат какому движку
На хосте часто работает несколько движков, поэтому отображение каждой карты на панели экземпляра означало бы, что он использует все. GPU каждого экземпляра vLLM определяются по процессам: порт, который он обслуживает → pid, слушающий порт → его потомки → пересечение с вычислительными процессами nvidia-smi → карты, которые они занимают. Карты экземпляра несут цвет серии, и плитка VRAM учитывает только их; остальные карты хоста остаются видимыми серым цветом с подписью «другой движок».
Для атрибуции нужны ss, локальный экземпляр и видимость процессов nvidia-smi (часто отсутствует внутри контейнеров). Если чего-то из этого нет, панель сообщает об этом и показывает все карты без выделения, а не угадывает.
Одна строка фильтра ограничивает всё, что ниже. У каждого графика есть переключатель Table, показывающий те же ряды в виде чисел, так что ни одно значение не доступно только при наведении. Живой SSE-поток управляет бегущей строкой запросов и показателем текущей скорости.
Параметры URL: ?tab=vllm, ?window=6h, ?model=llama3.2:3b, ?source=name, ?nostream=1 (отключает живой поток — полезно для киосков и инструментов создания скриншотов, которые иначе ждут вечно открытый поток).
API
Endpoint | Возвращает |
| всё, что нужно вкладке Ollama, один временной срез |
| то же для одного экземпляра vLLM |
| разбивки Ollama |
| разбивки vLLM |
| сырые строки и временные ряды |
| настройки |
| отслеживаемые движки |
| настройки дашборда по умолчанию, состояние сборщика |
| живой SSE-поток |
/api/sources/probe проверяет определение до сохранения, поэтому опечатка проявится там, а не как тишина на графиках.
MCP-сервер
./scripts/install-mcp.sh # writes .mcp.json for this checkout (gitignored)или claude mcp add inferwatch -- /path/to/.venv/bin/python -m inferwatch.mcp_server.
Открывает тот же файл SQLite только для чтения (mode=ro плюс PRAGMA query_only) и отвечает через тот же слой запросов, что и дашборд, поэтому число, которое он сообщает, всегда совпадает с числом на экране.
Инструмент | Назначение |
| основные метрики и ряды Ollama |
| разбивка по моделям; что находится в памяти |
| детализация по запросам Ollama |
| холодные загрузки, вытеснения, усечения, предупреждения |
| метрики vLLM, доступность, атрибуция GPU |
| по устройствам: утилизация/VRAM/температура/мощность |
| что отслеживается и как это настроено |
| работает ли сбор, включено ли отладочное логирование |
| запасной выход для SELECT только для чтения, с единицами измерения |
Хранение данных
Сырые строки по запросам (Ollama): 7 дней (
retention.raw_days).Сэмплы GPU, события, строки vLLM: 30 дней (
retention.sample_days).rollup_1mиrollup_1h: хранятся бессрочно.
Сводки хранят гистограммы TTFT и задержки с фиксированными корзинами, а не предвычисленные процентили. Гистограммы суммируются, поэтому процентиль за любой диапазон вычисляется суммированием корзин и переходом к целевому рангу. Процентили от процентилей были бы бессмысленны; здесь это не так.
Запросы в пределах raw-окна возвращают точные процентили; за его пределами они берутся из
гистограмм и сообщаются как верхняя граница содержащего бакета.
Каждый ответ несёт exact: true|false.
Перезапуски и перезагрузки
Состояние возобновления задаётся по источнику — курсор journald, inode+offset файла или временная метка docker — и сбрасывается при SIGTERM. Два обстоятельства делают это безопасным, а не просто вероятным:
Записи идемпотентны. Каждая строка запроса и события несёт dedupe_key
под UNIQUE-индексом, а вставки выполняются через INSERT OR IGNORE. Повторное чтение строк,
которые уже были сохранены, — no-op, так что ingest можно запускать многократно,
и возобновление может безопасно перекрываться.
Курсор, который нельзя использовать, не считается доверенным. Если журнал, на который указывает курсор, был ротирован, journalctl молча перепозиционируется, используя временную метку, встроенную в курсор, и корректно возобновляет работу. Но курсор, помеченный временной меткой в будущем (сдвиг часов, восстановленная база данных), заставляет journalctl ждать записи, которые не появятся, молча останавливая сбор; такой курсор отклоняется при запуске. Попытка follow, не давшая результата дважды подряд, делает то же самое.
systemctl stop завершается значительно быстрее секунды. systemd фиксирует
ExecMainStatus=15 рядом с Result=success: uvicorn намеренно повторно
возбуждает сигнал после завершения работы, так что выход по SIGTERM — ожидаемое поведение, а не сбой.
Честные ограничения
Атрибуция при параллелизме (Ollama). Идентификатор задачи в строках таймингов llama.cpp
и статус в строке доступа никогда не появляются вместе, поэтому они объединяются по
порядку прибытия. При одном выполняющемся запросе это точно. Когда два завершаются до того, как
печатается любая строка доступа, ничто в логе их не различает — такие строки
сохраняются как attribution='ambiguous', а не угадываются. Значения: exact,
ambiguous, none (сбой до достижения runner — модель также не угадывается),
orphan (тайминги без строки доступа). Двухдневный backfill на
хосте разработки дал 174 exact, 9 ambiguous, 4 orphan, при
действующем OLLAMA_NUM_PARALLEL=1; ожидайте большую долю ambiguous при большем
числе одновременных запросов.
Счётчики токенов и запросов vLLM не выровнены по запросам.
generation_tokens_total увеличивается по мере потоковой передачи токенов; request_success_total
увеличивается только по завершении запроса. За короткое окно они поэтому
описывают перекрывающиеся, но разные наборы запросов, и деление одного на
другое не даёт токены на запрос. API помечает это через
counters_aligned: false, и дашборд сообщает об этом на вкладке vLLM.
Никаких по-запросных данных для vLLM. Рассмотрено выше. Если вам нужны по-запросные детали из vLLM, его по-уровневый лог — единственный источник, и он логирует текст промпта — который этот инструмент намеренно никогда не хранит.
Логи — это источник, а не архив. Журнал может хранить лишь день или два в
зависимости от journald.conf; файл SQLite — историк. Если логи ротируются
быстрее, чем запускается inferwatch, этот разрыв невосстановим.
Два байт-идентичных события в одну и ту же микросекунду схлопываются в одно. Ключ дедупликации для событий строится из их значений, поэтому идентичное предупреждение, записанное дважды в пределах микросекунды, сохраняет одну строку. Это осознанный компромисс ради гарантированной идемпотентности — потеря повторного предупреждения лучше дублирования истории.
Трафик проверок здоровья отделён, но не подсчитывается. HEAD / и GET /api/ps
составляли 96% запросов на хосте разработки. Они хранятся с
class='health' и исключаются из частот вывода, если только
dashboard.include_health не включён; requests_all всегда включает их.
Зависит от форматов логов и имён метрик. Строки таймингов Ollama — это отладочный
вывод, а не контракт, и vLLM переименовывает метрики между релизами.
tests/test_parse.py содержит дословные строки-фикстуры, а tests/test_vllm.py — реальный
фрагмент /metrics; если обновление ломает парсинг, эти тесты падают и показывают,
что изменилось.
Тесты
python -m unittest discover -s tests -t .CI запускается на Python 3.10 — 3.14, плюс задание по упаковке, которое собирает
wheel, проверяет, что HTML дашборда внутри него, и устанавливает его в чистое
окружение из пустой директории, чтобы дерево исходников не могло замаскировать ошибку
упаковки. Сеть, GPU и движок не требуются. Фикстуры парсера — это дословные реальные строки логов и
реальный фрагмент /metrics. Покрытие включает объединение коррелятора и
его случаи ambiguous/orphan/failed, процентили гистограмм и идемпотентность свёртки,
миграцию схемы, безопасные к сигналам коммиты, валидацию курсора, ротацию и усечение
файлов, монотонность временных меток, обнаружение сброса счётчиков, а также
приоритет и блокировку конфигурации. Справочник конфигурации в этом файле генерируется
из спецификации, и тест падает, если он расходится. JavaScript дашборда проверяется
на синтаксис чистым Python-парсером, а его форматтеры выполняются в реальном
JS-движке (оба опциональны — Node не требуется).
.venv/bin/python scripts/gen-config-docs.py --check # docs match the code?Структура
inferwatch/parse.py ollama log line parsers (pure, fixture-tested)
inferwatch/readers.py journald / file / docker log readers
inferwatch/collect.py correlator, GPU + model pollers, maintainer
inferwatch/vllm.py Prometheus scraper, delta and reset handling
inferwatch/gpuproc.py maps GPUs to the process tree holding them
inferwatch/vllm_metrics.py vLLM query layer
inferwatch/metrics.py ollama query layer (shared by API and MCP)
inferwatch/store.py SQLite schema, rollups, histograms, retention
inferwatch/config.py typed settings spec, precedence, source validation
inferwatch/supervisor.py builds and rebuilds collectors from the sources table
inferwatch/api.py FastAPI endpoints + SSE
inferwatch/web/index.html dashboard (single file, no CDN, no build step)
inferwatch/mcp_server.py MCP server (read-only)
inferwatch/main.py serve / ingest / stats / sourcesУчастие
Приветствуются issues и pull request'ы. Две вещи делают изменение легко принимаемым:
python -m unittest discover -s tests -t .проходит.Если вы трогали
inferwatch/config.py, запуститеpython scripts/gen-config-docs.py, чтобы справочник конфигурации в README соответствовал коду — тест это обеспечивает.
Изменения парсера должны сопровождаться строкой-фикстурой, скопированной дословно из реального вывода движка, как это делают существующие тесты. Форматы логов и имена метрик — не контракты, и реальная фикстура — это то, что делает будущий сбой очевидным.
Лицензия
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 Servers
- FlicenseAqualityDmaintenanceEnables AI agents to query Prometheus metrics and Loki logs for intelligent alert investigation and troubleshooting. Provides service discovery, metric querying, log searching, and correlation tools to help identify root causes of issues.9
- FlicenseNot gradedqualityDmaintenanceGives AI agents real-time access to system metrics, process management, and container orchestration.
- AlicenseNot gradedqualityDmaintenanceProvides AI assistants with direct access to Red Hat OpenShift AI observability data, enabling querying of Prometheus metrics, Alertmanager alerts, Loki logs, Grafana dashboards, and Kubernetes cluster state to troubleshoot vLLM inference workloads.4MIT
- FlicenseNot gradedqualityBmaintenanceEnables AI assistants to monitor real-time CPU, RAM, and disk usage on the local machine.
Related MCP Connectors
Provide real-time data querying and visualization by integrating Tako with your agents. Generate o…
Gateway between LLM agents and world data through eight tools and a bundled endpoint catalog.
See, price, and control every tool call your AI agents make: policy checks, cost, and audit tools.
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/floatsmyboat/inferwatch'
If you have feedback or need assistance with the MCP directory API, please join our Discord server