| 1 | # Webcam MCP |
| 2 | |
| 3 | > **Сплит на отдельные репо:** логика разнесена на [webcam-mcp-shared](../webcam-mcp-shared), [webcam-capture-mcp](../webcam-capture-mcp) и [webcam-analysis-mcp](../webcam-analysis-mcp). Этот каталог можно считать монолитом для обратной совместимости; для новых установок предпочтительны два MCP-сервера из `capture` и `analysis`. |
| 4 | |
| 5 | MCP-сервер для **ручного** захвата с камеры и микрофона и передачи данных агенту для анализа. |
| 6 | Поддерживает одиночный кадр, burst-серии и аудио-burst в WAV. |
| 7 | |
| 8 | ## Модульная раскладка |
| 9 | |
| 10 | Тот же функционал в стеке **financial-open** разнесён по трём сабмодулям (источник правды — GitLab; на GitHub — зеркала): |
| 11 | |
| 12 | - [webcam-mcp-shared](https://github.com/KarataevDmitry/webcam-mcp-shared) — общая библиотека |
| 13 | - [webcam-capture-mcp](https://github.com/KarataevDmitry/webcam-capture-mcp) — захват (камера, экран, аудио, A/V) |
| 14 | - [webcam-analysis-mcp](https://github.com/KarataevDmitry/webcam-analysis-mcp) — анализ, OCR, Whisper |
| 15 | |
| 16 | **Этот репозиторий** — один процесс со **всеми** тулами в одном MCP; если так проще подключать в `mcp.json`, это остаётся нормальным вариантом. |
| 17 | |
| 18 | ## Стек |
| 19 | |
| 20 | - C#, .NET 10, win-x64, self-contained |
| 21 | - `ModelContextProtocol` (C# SDK) |
| 22 | - `OpenCvSharp4` + `OpenCvSharp4.runtime.win` |
| 23 | - `NAudio` |
| 24 | - `Whisper.net` + `Whisper.net.Runtime` |
| 25 | |
| 26 | ## Лицензия |
| 27 | |
| 28 | MIT (см. `LICENSE`). |
| 29 | |
| 30 | ## Публикация |
| 31 | |
| 32 | ```bash |
| 33 | dotnet publish -c Release -o publish |
| 34 | ``` |
| 35 | |
| 36 | Для подключения удобно использовать фиксированный путь к exe (например через junction), затем добавить сервер в `mcp.json`. |
| 37 | |
| 38 | ## Пример `mcp.json` |
| 39 | |
| 40 | ```json |
| 41 | { |
| 42 | "mcpServers": { |
| 43 | "webcam-mcp": { |
| 44 | "command": "D:\\webcam-mcp\\WebcamMcp.exe", |
| 45 | "args": [] |
| 46 | } |
| 47 | } |
| 48 | } |
| 49 | ``` |
| 50 | |
| 51 | ## Tool |
| 52 | |
| 53 | ### `capture_webcam_frame` |
| 54 | |
| 55 | Делает одиночный снимок с выбранной камеры и сохраняет изображение в workspace. |
| 56 | |
| 57 | Обязательный параметр: |
| 58 | |
| 59 | - `workspace_path` — путь к workspace. |
| 60 | |
| 61 | Опциональные параметры: |
| 62 | |
| 63 | - `camera_index` (int, default `0`) |
| 64 | - `width` / `height` (int) |
| 65 | - `warmup_frames` (int, default `5`) |
| 66 | - `image_format` (`jpg` | `png`, default `jpg`) |
| 67 | - `jpeg_quality` (int `1..100`, default `92`) |
| 68 | - `output_subdir` (relative path, default `.cascade-ide\\webcam-captures`) |
| 69 | - `file_name` (без расширения) |
| 70 | |
| 71 | Ответ: JSON-строка с `file_path`, `width`, `height`, `camera_index`, `image_format`, `captured_at_utc`. |
| 72 | |
| 73 | ### `capture_webcam_burst` |
| 74 | |
| 75 | Делает серию кадров с камеры в течение заданной длительности. |
| 76 | |
| 77 | Обязательный параметр: |
| 78 | |
| 79 | - `workspace_path` — путь к workspace. |
| 80 | |
| 81 | Опциональные параметры: |
| 82 | |
| 83 | - `camera_index` (int, default `0`) |
| 84 | - `width` / `height` (int) |
| 85 | - `warmup_frames` (int, default `5`) |
| 86 | - `duration_sec` (int, default `2`) |
| 87 | - `target_fps` (int, default `24`) |
| 88 | - `image_format` (`jpg` | `png`, default `jpg`) |
| 89 | - `jpeg_quality` (int `1..100`, default `92`) |
| 90 | - `output_subdir` (relative path, default `.cascade-ide\\webcam-captures`) |
| 91 | - `burst_name` (имя серии, опционально) |
| 92 | - `save_video` (bool, default `false`) |
| 93 | - `video_fps` (int, default `24`) |
| 94 | - `video_format` (`mp4` | `avi`, default `mp4`) |
| 95 | |
| 96 | Ответ: JSON-строка с `burst_dir`, `frames_captured`, `target_fps`, `actual_fps`, `video_path` (если включено), и метаданными кадра. |
| 97 | |
| 98 | ### `capture_screen_burst` |
| 99 | |
| 100 | Делает серию кадров с экрана в течение заданной длительности (вместо веб-камеры). |
| 101 | |
| 102 | Обязательный параметр: |
| 103 | |
| 104 | - `workspace_path` — путь к workspace. |
| 105 | |
| 106 | Опциональные параметры: |
| 107 | |
| 108 | - `monitor` (int 1-based слева направо **или** `all`; если указан и `x/y/width/height` не переданы, регион берётся по выбранному монитору; `all` = весь виртуальный экран) |
| 109 | - `x` / `y` (int, default: начало виртуального экрана) |
| 110 | - `width` / `height` (int, default: размер виртуального экрана) |
| 111 | - `duration_sec` (int, default `2`) |
| 112 | - `target_fps` (int, default `24`) |
| 113 | - `image_format` (`jpg` | `png`, default `jpg`) |
| 114 | - `jpeg_quality` (int `1..100`, default `92`) |
| 115 | - `output_subdir` (relative path, default `.cascade-ide\\screen-captures`) |
| 116 | - `burst_name` (имя серии, опционально) |
| 117 | - `save_video` (bool, default `false`) |
| 118 | - `video_fps` (int, default `24`) |
| 119 | - `video_format` (`mp4` | `avi`, default `mp4`) |
| 120 | |
| 121 | Ответ: JSON-строка с `burst_dir`, `frames_captured`, `target_fps`, `actual_fps`, `capture_region`, `video_path` (если включено) и временем захвата. |
| 122 | |
| 123 | ### `analyze_burst_sequence` |
| 124 | |
| 125 | Анализирует папку burst как последовательность кадров и возвращает структурный отчёт о динамике. |
| 126 | |
| 127 | Обязательные параметры: |
| 128 | |
| 129 | - `workspace_path` — путь к workspace. |
| 130 | - `burst_dir` — путь к папке burst (абсолютный или относительный к workspace). |
| 131 | |
| 132 | Опциональные параметры: |
| 133 | |
| 134 | - `sample_every` (int, default `1`) — анализировать каждый N-й кадр |
| 135 | - `max_frames` (int, default `3000`) — лимит кадров |
| 136 | - `scene_cut_threshold` (number `1..255`, default `35`) — порог «резкой смены сцены» |
| 137 | |
| 138 | Ответ содержит: |
| 139 | |
| 140 | - `avg_motion_score`, `min_motion_score`, `max_motion_score` |
| 141 | - `scene_cut_count` |
| 142 | - `top_motion_peaks` |
| 143 | - `timeline` (переходы между кадрами с оценкой движения) |
| 144 | - краткий `summary` |
| 145 | |
| 146 | ### `capture_audio_burst` |
| 147 | |
| 148 | Записывает короткий WAV-фрагмент с микрофона по явной команде. |
| 149 | |
| 150 | Обязательный параметр: |
| 151 | |
| 152 | - `workspace_path` — путь к workspace. |
| 153 | |
| 154 | Опциональные параметры: |
| 155 | |
| 156 | - `duration_sec` (int, default `10`) |
| 157 | - `sample_rate` (int, default `16000`) |
| 158 | - `channels` (int, default `1`) |
| 159 | - `device_number` (int, default `0`) |
| 160 | - `output_subdir` (relative path, default `.cascade-ide\\audio-captures`) |
| 161 | - `file_name` (имя файла без расширения) |
| 162 | |
| 163 | Ответ содержит путь к WAV и параметры записи. |
| 164 | |
| 165 | ### `analyze_audio_sequence` |
| 166 | |
| 167 | Анализирует WAV-файл и возвращает таймлайн по окнам громкости. |
| 168 | |
| 169 | Обязательные параметры: |
| 170 | |
| 171 | - `workspace_path` |
| 172 | - `audio_path` (абсолютный или относительный к workspace) |
| 173 | |
| 174 | Опциональные параметры: |
| 175 | |
| 176 | - `frame_ms` (int, default `50`) |
| 177 | - `silence_threshold_db` (number, default `-45`) |
| 178 | |
| 179 | Ответ содержит: |
| 180 | |
| 181 | - `duration_sec`, `peak_dbfs`, `avg_rms`, `activity_ratio`, `silence_ratio` |
| 182 | - `zero_crossings_per_sec` |
| 183 | - `timeline` и краткий `summary` |
| 184 | |
| 185 | ### `transcribe_audio_whisper` |
| 186 | |
| 187 | Локальная транскрипция аудио через Whisper.net (на базе whisper.cpp runtime). |
| 188 | |
| 189 | Поддерживаемые форматы: **WAV** (напрямую); **WebM, MP4, M4A** и др. — через конвертацию в WAV с помощью **FFmpeg** (должен быть в PATH). Без FFmpeg для не-WAV файлов вернётся ошибка с подсказкой. |
| 190 | |
| 191 | Обязательные параметры: |
| 192 | |
| 193 | - `workspace_path` |
| 194 | - `audio_path` |
| 195 | |
| 196 | Опциональные параметры: |
| 197 | |
| 198 | - `model_path` — путь к локальной модели Whisper (`ggml/gguf`) |
| 199 | - `language` — `auto` (по умолчанию), `ru`, `en`, ... |
| 200 | - `max_segments` — лимит сегментов в ответе |
| 201 | |
| 202 | Если `model_path` не передан, используется переменная окружения: |
| 203 | |
| 204 | - `WHISPER_MODEL_PATH` |
| 205 | |
| 206 | Ответ содержит: |
| 207 | |
| 208 | - `transcript` (полный текст) |
| 209 | - `segments` (таймкоды + текст) |
| 210 | |
| 211 | ### `capture_av_burst` |
| 212 | |
| 213 | Снимает короткую синхронную A/V-сессию: |
| 214 | |
| 215 | - кадры с камеры в `frames/` |
| 216 | - аудио в `audio.wav` |
| 217 | - метаданные тайминга в `metadata.json` |
| 218 | - опционально `video.mp4` |
| 219 | |
| 220 | Обязательный параметр: |
| 221 | |
| 222 | - `workspace_path` |
| 223 | |
| 224 | Опциональные параметры: |
| 225 | |
| 226 | - `duration_sec` (int, default `10`) |
| 227 | - `target_fps` (int, default `24`) |
| 228 | - `camera_index` (int, default `0`) |
| 229 | - `audio_device_number` (int, default `0`) |
| 230 | - `width` / `height` (int) |
| 231 | - `audio_sample_rate` (int, default `16000`) |
| 232 | - `audio_channels` (int, default `1`) |
| 233 | - `warmup_frames` (int, default `5`) |
| 234 | - `image_format` (`jpg` | `png`) |
| 235 | - `jpeg_quality` (int `1..100`) |
| 236 | - `output_subdir` (default `.cascade-ide\\av-captures`) |
| 237 | - `session_name` (опционально) |
| 238 | - `save_video` (bool, default `true`) |
| 239 | - `video_fps` (int, default `24`) |
| 240 | |
| 241 | ### `capture_screen_av_burst` |
| 242 | |
| 243 | Одновременная запись короткой A/V-сессии: кадры с экрана + WAV с микрофона + метаданные синхронизации. |
| 244 | |
| 245 | Обязательный параметр: |
| 246 | |
| 247 | - `workspace_path` — путь к workspace. |
| 248 | |
| 249 | Опциональные параметры: |
| 250 | |
| 251 | - `duration_sec` (int, default `10`) |
| 252 | - `target_fps` (int, default `24`) |
| 253 | - `audio_device_number` (int, default `0`) |
| 254 | - `monitor` (int 1-based слева направо **или** `all`; если указан и `x/y/width/height` не переданы, регион берётся по выбранному монитору; `all` = весь виртуальный экран) |
| 255 | - `x` / `y` (int, default: начало виртуального экрана) |
| 256 | - `width` / `height` (int, default: размер виртуального экрана) |
| 257 | - `audio_sample_rate` (int, default `16000`) |
| 258 | - `audio_channels` (int, default `1`) |
| 259 | - `image_format` (`jpg` | `png`, default `jpg`) |
| 260 | - `jpeg_quality` (int `1..100`, default `92`) |
| 261 | - `output_subdir` (relative path, default `.cascade-ide\\av-captures`) |
| 262 | - `session_name` (имя сессии, опционально) |
| 263 | - `save_video` (bool, default `true`) |
| 264 | - `video_fps` (int, default `24`) |
| 265 | |
| 266 | Ответ: JSON-строка с `session_dir`, `frames_dir`, `audio_path`, `video_path`, `metadata_path`, `frame_count`, `actual_fps`, `capture_region`. |
| 267 | |
| 268 | ### `analyze_av_sequence` |
| 269 | |
| 270 | Комплексный отчёт по A/V-сессии: объединяет видео- и аудио-анализ. |
| 271 | |
| 272 | Обязательные параметры: |
| 273 | |
| 274 | - `workspace_path` |
| 275 | - `session_dir` |
| 276 | |
| 277 | Опциональные параметры: |
| 278 | |
| 279 | - `sample_every`, `max_frames`, `scene_cut_threshold` (для видео) |
| 280 | - `audio_frame_ms`, `silence_threshold_db` (для аудио) |
| 281 | |
| 282 | Ответ содержит: |
| 283 | |
| 284 | - `av_profile` (интегральный тип сцены) |
| 285 | - `summary` |
| 286 | - `video_analysis` |
| 287 | - `audio_analysis` |
| 288 | |
| 289 | ## Приватность и безопасность |
| 290 | |
| 291 | - Съёмка выполняется **только** при явном вызове tool. |
| 292 | - Файлы сохраняются только внутри `workspace_path` (попытки выхода наружу блокируются). |
| 293 | |