Charles MCP Server
Charles MCP Server gives AI agents MCP-based access to inspect, analyze, replay, and mock Charles Proxy traffic.
Capture, read, peek, query, group, and drill into live Charles traffic with token-efficient summaries and filters.
Analyze saved
.chlsjrecordings, list recordings, and load recording snapshots.Create and manage Map Local mocks from captured responses, JSON Pointer patches, or raw fixtures.
Use a body-aware local dispatcher with Map Remote rules to mock specific request variants by method, path, query, and body fields.
Support patch mode against the real server or fixture mode with custom status codes, delays, request header edits, and request/response patches.
Reverse-analyze imported sessions: query entries, decode bodies including protobuf, replay requests, discover signature candidates, and run live login/API/signature workflows.
Check Charles connectivity/config status, manage throttling, configure recording exclusions, clean stored data, or reset the environment.
Preserve safe defaults such as adopting existing live sessions without clearing traffic and avoiding Charles lifecycle control unless explicitly configured.
Integrates with Charles Proxy to inspect live HTTP traffic, analyze saved recordings, create and manage mocks, replay requests, and perform reverse-engineering workflows for APIs, authentication, and request signatures.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Charles MCP Server summarize the last 10 minutes of traffic"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Charles MCP Server
English README | Документація | Посібник для агентів | Мапінг і перезапуск Charles | Контракт інструментів | AGENTS | Сценарії для агента | Встановлення для команди
Дайте ШІ-агенту доступ до Charles Proxy. Агент сам знаходить потрібні запити мобільного застосунку, пояснює, що пішло не так, і підміняє відповіді для тестування — без копіювання трафіку в чат і без ручних правил у Charles.

Навіщо
Коли тестуєш мобільний клієнт через Charles, більшість часу йде на рутину:
знайти серед сотень записів один запит і скопіювати його в чат з агентом;
підмінити одне поле у відповіді, а Map Local вміє лише «один файл на весь URL»: не розрізняє POST-запити з різним
actionу тілі й завжди віддає 200;перевірити екран помилки, порожній стан чи повільний ендпоінт — і не забути потім усе вимкнути.
charles-mcp — MCP-сервер, через який агент (Claude Code, Cursor, Codex, Kiro та інші MCP-клієнти) робить це сам: читає сесію Charles, знаходить запит, будує мок зі справжньої відповіді, змінюючи лише названі поля, і перевіряє, що застосунок отримав підмінену відповідь.
Related MCP server: mitmproxy-mcp
Що вміє
Читати трафік стисло. Агент спершу бачить групи й короткі зведення, а не сирий дамп, і відкриває один запит лише тоді, коли треба. Працює і з живою сесією, і зі збереженими
.chlsj.Підміняти відповіді за тілом запиту. Локальний диспетчер за одним правилом Map Remote розрізняє запити за методом, шляхом, query і полями тіла (
{"action": "get_balance"}). Режими: правка полів справжньої відповіді або фікстура з будь-яким статусом (500, 401) і затримкою.Моки — це дані, а не код. Правила й фікстури лежать у
~/charles-mocks, поза репозиторіями; у Charles налаштовується одне правило на домен.Реверс-аналіз. Імпорт сесій, декодування тіл (зокрема protobuf), повтор запиту зі змінами, пошук полів-підписів.
Безпечні значення за замовчуванням. Не очищає сесію Charles, не пише його конфіг, поки Charles працює, і вимикає Map Remote, який увімкнув сам.
Як це працює

Застосунок ходить у мережу через Charles, як завжди. Сервер читає сесію Charles через його Web Interface. Для моків Charles одним правилом Map Remote відправляє запити домену в локальний диспетчер: той відповідає за правилом (фікстура або правка справжньої відповіді), а все без правила пропускає на справжній сервер без змін. Кожна відповідь несе заголовок X-Charles-MCP-Rule, тож агент перевіряє результат по свіжому трафіку.
Приклад

Ви: На екрані гаманця баланс 10.50. Зроби, щоб
get_balanceповертав 0, аinit— помилку 500.
Агент:
start_live_captureіmock_discover_variants— бачитьPOST /api/v1/walletз двома варіантамиaction:initіget_balance.mock_rule_create_from_entryдвічі: дляget_balance— правка/data/balanceу справжній відповіді, дляinit— знята відповідь зі статусом 500.mock_dispatcher(action="start"); ви оновлюєте екран.query_live_capture_entries(response_header_name="X-Charles-MCP-Rule")— відповіді прийшли від обох правил, решта запитів пішла на сервер без змін.
Швидкий старт
1. Увімкніть Charles Web Interface
У Charles відкрийте: Proxy -> Web Interface Settings
Перевірте, що:
позначено
Enable web interface;ім'я користувача
admin;пароль
123456.
Значення
admin/123456використовуються за замовчуванням в усіх прикладах. Для справжньої роботи задайте свій пароль і передайте його черезCHARLES_USER/CHARLES_PASS.
Де розташований пункт меню:

Вікно налаштувань:

Ще два налаштування Charles, обидва робляться один раз:
Виключіть власні запити сервера із запису. Відкрийте
Proxy -> Recording Settings -> Exclude, натиснітьAddі вкажіть Hostcontrol.charles, решту полів залиште порожніми. Діє одразу, без перезапуску. Кожен виклик інструмента вивантажує сесію через проксі Charles; без цього виключення Charles записує кожне вивантаження з усією сесією як тілом, тож сесія зростає з кожним викликом (зі 100 КБ до 2 ГБ за один тестовий прогін), а інструменти сповільнюються до десятків секунд. Сервер попереджає про це черезcharles_records_own_exports.Увімкніть SSL Proxying для хостів, які хочете читати. Відкрийте
Proxy -> SSL Proxying Settings, додайте хост API і переконайтеся, що пристрій довіряє кореневому сертифікату Charles. Без цього Charles записує HTTPS-з'єднання як один непрозорий тунель, і інструментам нема чого показати — ні шляхів, ні тіл; вони повідомляють про це попередженнямssl_proxying_off.
2. Встановіть і налаштуйте MCP-клієнт
Потрібен лише uv. Клонувати нічого не треба: uvx сам завантажить сервер із цього репозиторію, один раз збере його й закешує (якщо ваш Python старіший за 3.10, uv підтягне свій). Перевірте, що він запускається:
uvx --from git+https://github.com/ExQA/charles-mcp charles-mcp --selftestКоманда виведе версію й кількість інструментів і завершиться рядком OK.
Не ставте
charles-mcpз PyPI (uvx charles-mcp,pip install charles-mcp): це інший, старіший проєкт (upstream 3.0.3) без інструментів моків.
Плагін для Claude Code (сервер і skill)
У Claude Code:
/plugin install charles-mcp --marketplace ExQA/charles-mcpУ Claude Code, старішому за 2.1.275, спершу виконайте /plugin marketplace add ExQA/charles-mcp, потім /plugin install charles-mcp@charles-mcp. Плагін спитає логін і пароль Charles Web Interface (пароль зберігається в системному сховищі ключів), додасть сервер і skill charles-proxy-qa, який підказує Claude, коли звертатися до Charles і в якому порядку викликати інструменти. Змінити облікові дані згодом можна командою /plugin configure charles-mcp@charles-mcp.
Claude Code CLI (лише сервер)
claude mcp add charles --scope user \
-e CHARLES_USER=your-login -e CHARLES_PASS=your-password -e CHARLES_MANAGE_LIFECYCLE=false \
-- uvx --from git+https://github.com/ExQA/charles-mcp charles-mcpClaude Desktop / Cursor / Kiro / загальний JSON-конфіг
{
"mcpServers": {
"charles": {
"command": "uvx",
"args": ["--from", "git+https://github.com/ExQA/charles-mcp", "charles-mcp"],
"env": {
"CHARLES_USER": "your-login",
"CHARLES_PASS": "your-password",
"CHARLES_MANAGE_LIFECYCLE": "false"
}
}
}
}Десктопні застосунки не завжди бачать PATH вашої оболонки: якщо сервер не стартує, впишіть у command повний шлях, який виводить which uvx. Kiro читає .kiro/settings/mcp.json у проєкті (він має перевагу) або ~/.kiro/settings/mcp.json.
Codex CLI
[mcp_servers.charles]
command = "uvx"
args = ["--from", "git+https://github.com/ExQA/charles-mcp", "charles-mcp"]
[mcp_servers.charles.env]
CHARLES_USER = "your-login"
CHARLES_PASS = "your-password"
CHARLES_MANAGE_LIFECYCLE = "false"Skill в інших агентах
plugin/skills/charles-proxy-qa — звичайний skill у форматі SKILL.md: скопіюйте теку туди, звідки ваш агент завантажує skills (для Codex це ~/.codex/skills/). Він працює з будь-яким із конфігів вище.
Оновлення і фіксація версії
uvx зберігає зібрану версію. Щоб отримати найновішу, запустіть перевірку з --refresh і перезапустіть агента:
uvx --refresh --from git+https://github.com/ExQA/charles-mcp charles-mcp --selftestЩоб лишатися на одному релізі, зафіксуйте його в кожному конфігу: git+https://github.com/ExQA/charles-mcp@v3.1.0rc2.
З вихідного коду або офлайн
Для розробки або щоб запускати саме заблоковані версії залежностей:
git clone https://github.com/ExQA/charles-mcp.git
cd charles-mcp && uv sync --locked
uv run charles-mcp --selftestУ конфігах вище замініть uvx і його аргументи на "command": "uv", "args": ["run", "--project", "<PATH>", "charles-mcp"], де <PATH> — абсолютний шлях до теки. Для машин без доступу до мережі є офлайн-архів із залежностями: docs/team-installation.uk.md.
Автовстановлення через AI-агента
Для локальної копії або офлайн-архіву дайте агенту промпт з INSTALL-PROMPT.md. Він встановить сервер із теки, перевірить збірку через --selftest і додасть сервер у конфіг вашого MCP-клієнта, не чіпаючи інших серверів.
Вимоги
uv (за потреби сам підтягне Python 3.10+)
запущений локально Charles Proxy
увімкнений Charles Web Interface
проксі Charles слухає
127.0.0.1:8888
Рекомендоване значення за замовчуванням — CHARLES_MANAGE_LIFECYCLE=false. Не дозволяйте MCP-серверу закривати ваш Charles, якщо ви явно не хочете, щоб він керував запуском і зупинкою Charles.
Змінні оточення
Змінна | За замовчуванням | Призначення |
|
| Ім'я користувача Charles Web Interface |
|
| Пароль Charles Web Interface |
|
| Хост проксі Charles |
|
| Порт проксі Charles |
| автовизначення | Шлях до файлу конфігурації Charles |
|
| Тайм-аут HTTP-запитів до Charles у секундах |
|
| Чи має MCP-сервер запускати і зупиняти Charles |
|
| Скільки днів зберігати знімки, дані reverse-аналізу і бекапи конфігу; старші видаляються під час старту сервера. |
|
| Каталог стану reverse-аналізу: артефакти і база SQLite |
|
| Корінь сховища моків Map Local; Charles мапить |
|
| Порт локального диспетчера, на який указують правила Map Remote |
|
| Тайм-аут у секундах для запитів, які диспетчер пересилає на сервер |
Рекомендовані сценарії
Live-аналіз
start_live_capturegroup_capture_analysisquery_live_capture_entriesget_traffic_entry_detailstop_live_capture
Цей шлях дозволяє спершу знайти гарячі точки з мінімальною витратою токенів, а потім розкрити один підтверджений запит.
Аналіз історії
list_recordingsanalyze_recorded_trafficgroup_capture_analysis(source="history")get_traffic_entry_detail
Цей шлях підходить, щоб переглянути збережені записи і потім заглибитися в обрані запити.
Підміна відповідей через Map Local
Як влаштовані правила в Charles, коли і як Charles перезапускається, відкат і діагностика — у docs/charles-mapping.uk.md.
mock_setup_host— один раз на хост: створює<CHARLES_MOCK_DIR>/<host>/і правила Charles. Зapply=true(Charles має бути закритий) записує їх у конфіг Charles, інакше повертає інструкцію для ручного налаштування.start_live_capture+query_live_capture_entries— знайти справжню відповідь.mock_create_from_entryз правкамиpatchesу форматі JSON Pointer (абоmock_write, щоб написати відповідь з нуля).Застосунок повторює запит; перевірте результат через
query_live_capture_entries(response_header_name="X-Charles-Map-Local").mock_remove— повернутися до справжнього сервера (файл іде в архів, а не видаляється);mock_set_enabled(false)— призупинити всі моки.
Мок — це просто файл за шляхом <CHARLES_MOCK_DIR>/<host>/<шлях запиту>. Доки файл існує, Charles віддає його і перечитує на кожен запит; якщо файлу немає, запит іде на справжній сервер.
Обмеження Map Local:
статус відповіді завжди 200;
query string і HTTP-метод ігноруються, тому всі варіанти одного шляху отримують той самий файл;
/usersі/users/42не можна замокати одночасно:usersне може бути водночас файлом і каталогом.
Налаштування також додає правило Rewrite, яке віддає моки як application/json: Charles позначає файли без розширення як text/plain.
Багато шляхів і action: правила диспетчера
Використовуйте для справжнього API: багато шляхів, POST-запити, де операцію обирає поле action, і те саме API на кількох хостах (dev, stage тощо). Map Local такі запити не розрізняє, диспетчер розрізняє. Обґрунтування — в ADR-0001.
Правило в Charles ставиться один раз на домен і потребує перезапуску Charles (або ручного введення в UI без перезапуску). Інструменти самі Charles не закривають і не запускають: порядок дій, що втрачається і як відкотити — у docs/charles-mapping.uk.md.
Один раз на домен. mock_route_setup(host="*.example.com", path="/api/*") заводить маршрут і повертає одне правило Map Remote для Charles: https://*.example.com/api/* → локальний диспетчер із порожнім шляхом призначення (Charles зберігає вихідний шлях) і ввімкненим «Preserve host header». apply=true записує його, доки Charles закритий. Після цього всі шляхи, action і хости під маршрутом — лише дані, а запити без правила йдуть на справжній сервер без змін.
На кожну сесію.
start_live_capture, потім пройдіть сценарій у застосунку.mock_discover_variants(source="live", capture_id)показує всю сесію: метод × хост × шлях × значенняaction(nullдля GET) з кількістю, прикладамиentry_idі статусами. Фільтри —host_contains/path_contains.На кожну правку, яку просить користувач:
mock_rule_create_from_entry(entry_id, match_body_fields=["/action"], response_patches=[...], request_patches=[...]).mode="patch"(за замовчуванням): відповідає справжній сервер, змінюються лише вказані поля запиту й відповіді.mode="fixture": знята відповідь із правками і будь-якимstatus, наприклад 500, без звернення до сервера.statusпідміняє код відповіді,delay_msзатримує її (0–60000 мс) — для перевірки лоадерів і тайм-аутів,request_headersзадає або видаляє заголовки запиту перед відправкою.Сегменти шляху, що залежать від платформи чи версії застосунку, замінюйте на
*черезmatch_path, наприклад/api/*/wallet.За замовчуванням правило діє на всіх хостах маршруту (
host_scope="any");host_scope="exact"абоhost="stage.example.com"звужують його, і правило для конкретного хоста перемагає загальне.Повторне прохання для того самого варіанта доповнює його правило (
merge=true); правка того самого поля замінює попередню.
mock_dispatcher(action="start"), потім повторіть дії в застосунку.Перевірте через
query_live_capture_entries(response_header_name="X-Charles-MCP-Rule"): у заголовку id правила абоpassthrough.
Зберігання в <CHARLES_MOCK_DIR>/_rules/: routes.json (маршрути), _any/ (правила для будь-якого хоста або шаблону хоста), <host>/ (правила для одного хоста), фікстури поруч із правилами як <rule_id>.body. Диспетчер перечитує їх на кожен запит, тому правки діють одразу. Він пересилає лише запити, покриті маршрутом, слухає 127.0.0.1 і має працювати, доки в Charles увімкнене правило Map Remote; для постійної роботи запустіть у терміналі uvx --from git+https://github.com/ExQA/charles-mcp charles-mcp-dispatcher --port 18080. Маршрут на весь хост (/*) пропускає через диспетчер і статику, і WebSocket: завантаження буферизуються, а WebSocket не підтримується, тому краще вказувати префікс API.
⚠️ Фікстури — це зняті справжні відповіді, у них можуть бути персональні та платіжні дані. Тримайте
CHARLES_MOCK_DIRпоза репозиторіями і нікому не пересилайте; діліться описами правил із синтетичними даними.
Каталог інструментів
Цей README описує весь публічний набір інструментів.
Інструменти live-захоплення
Інструмент | Що робить | Коли використовувати |
| Запускає або підхоплює поточне live-захоплення і повертає | Перед початком спостереження в реальному часі |
| Читає нові записи за курсором і повертає лише короткі зведення маршрутів | Для безперервного читання нового трафіку, коли спершу потрібні лише host/path/status |
| Показує нові записи без зсуву курсора, лише короткі зведення маршрутів | Щоб зазирнути в новий трафік, не змінюючи позицію читання |
| Зупиняє захоплення і за потреби зберігає знімок | Під час завершення або експорту live-сесії |
| Видає структуроване зведення по live-захопленню без зсуву курсора; | Для багаторазової фільтрації важливих запитів із поточного трафіку |
Інструменти аналізу
Інструмент | Що робить | Коли використовувати |
| Групує live- або history-трафік за ключем | Коли потрібен найощадливіший за токенами огляд гарячих точок |
| Повертає грубу статистику за класами трафіку | Щоб швидко побачити розподіл: API, статика, помилки |
| Завантажує деталі одного запису і попереджає про завелику відповідь | Коли |
| Видає структуроване зведення за збереженим записом із причинами збігу | Для аналізу знімка |
Інструменти історії
Інструмент | Що робить | Коли використовувати |
| Показує збережені файли записів | Перед вибором історичного знімка |
| Показує один збережений запис короткими зведеннями, посторінково, без тіл | Коли треба побачити, що лежить у збереженому знімку |
| Легка фільтрація останнього збереженого запису | Для швидкого пошуку за host, методом або регулярним виразом |
Інструменти стану і керування
Інструмент | Що робить | Коли використовувати |
| Показує зв'язок з Charles і стан активного захоплення; поле | Щоб перевірити, чи доступний Charles і чи активне захоплення |
| Вмикає пресет сповільнення мережі в Charles | Для емуляції 3G, 4G, 5G або вимкнення сповільнення |
| Відновлює конфігурацію Charles і очищає поточне оточення | Коли треба повернутися до чистого стану |
| Додає хост (за замовчуванням | Один раз під час налаштування, щоб Charles не записував власні вивантаження сервера |
| Читає конфіг Charles без секретів: правила Map Remote і Map Local з їхніми проблемами, хости SSL Proxying, виключення запису, назви наборів Rewrite, стан Web Interface | Коли правило не спрацьовує або трафік лишається зашифрованим — замість того, щоб відкривати файл конфігу |
| Видаляє збережені знімки, дані реверс-аналізу і бекапи конфігу, старші за поріг; за замовчуванням | Щоб прибрати збережений трафік |
⚠️
reset_environmentзакриває Charles, перезаписує його конфіг із бекапа і видаляє каталог збережених записів. Викликайте його лише свідомо.
Інструменти реверс-аналізу
Інструмент | Що робить | Коли використовувати |
| Імпортує офіційну XML- або нативну сесію Charles у канонічне reverse-сховище | Щоб почати replay, декодування або аналіз підписів зі збережених експортів |
| Показує імпортовані reverse-захоплення | Щоб обрати захоплення, яке вже лежить у reverse-SQLite |
| Фільтрує імпортовані reverse-записи за полями маршруту | Щоб звузити набір кандидатів перед детальним переглядом або replay |
| Повертає канонічну деталізацію одного імпортованого запису | Для глибокого розбору одного базового запиту |
| Декодує збережене тіло запиту або відповіді, включно з protobuf за дескриптором | Коли треба зрозуміти структуру payload |
| Повторює один імпортований запит з необов'язковими мутаціями | Щоб перевірити, чи відтворюється запит і як він реагує на зміни |
| Порівнює кілька імпортованих записів і ранжує поля, схожі на підпис | Для пошуку динамічних параметрів авторизації або підпису |
| Показує збережені результати replay і аналізу підписів | Щоб переглянути вже зібрані докази |
| Показує стан запису Charles і reverse live-сесії | Щоб перевірити готовність до live-реверс-аналізу |
| Запускає reverse live-сесію і знімає сесію Charles через офіційні сторінки експорту | Коли реверс-аналіз має стежити за свіжим трафіком |
| Читає нові reverse live-записи без зсуву курсора | Щоб подивитися новий трафік до його обробки |
| Читає нові reverse live-записи і зсуває курсор | Щоб просунути reverse live-аналіз |
| Зупиняє reverse live-сесію і за потреби відновлює запис | Для акуратного завершення reverse live-сесії |
| Оцінює новий трафік на зв'язок із логіном і авторизацією та пропонує наступні кроки | Для розбору логіна, отримання токена, встановлення сесії |
| Оцінює новий трафік як API-ланцюжок і пропонує наступні кроки | Для розбору ланцюжків бізнес-API |
| Фокусується на запитах, чутливих до підпису, і планує експерименти з мутаціями | Для розбору захистів на sign, nonce, timestamp |
Інструменти моків Map Local
Інструмент | Що робить | Коли використовувати |
| Створює каталог моків для хоста і правила Map Local + Rewrite (інструкція для ручного налаштування або запис у конфіг з | Один раз на кожен API-хост |
| Перетворює захоплену відповідь на мок, застосовуючи правки JSON Pointer | Коли користувач хоче змінити дані, які отримав застосунок |
| Пише мок із JSON-значення або сирого тексту | Коли справжньої відповіді ще немає |
| Список активних моків / вміст одного | Щоб подивитися, що зараз підміняється |
| Відправляє мок в архів, шлях знову йде на справжній сервер | Коли сценарій завершено |
| Вмикає або вимикає весь Map Local через Web Interface | Щоб призупинити або відновити всі моки |
Інструменти правил диспетчера
Інструмент | Що робить | Коли використовувати |
| Спрямовує хост або шаблон домену (за замовчуванням усі шляхи) через диспетчер і повертає одне правило Map Remote (з | Один раз на домен |
| Групує всю сесію за методом, хостом, шляхом і полем тіла, наприклад | Одразу після читання сесії |
| Створює або доповнює правило одного варіанта (метод + шлях + значення тіла/query): режим patch або fixture, будь-який статус, затримка, правка заголовків запиту, за замовчуванням на будь-якому хості | На кожну правку, яку назвав користувач |
| Пише документ правила напряму, за бажанням із фікстурою | Коли знятого запиту немає |
| Список маршрутів і правил / одне правило з фікстурою | Щоб подивитися, що замокано |
| Призупинити правило / відправити в архів | Коли сценарій завершено |
| Запускає, зупиняє або перевіряє локальний диспетчер; start/stop заразом вмикають і вимикають Map Remote у Charles, щоб трафік не впирався в зупинений диспетчер | Перед тестом і після |
| Називає набір правил (цілий сценарій QA, наприклад «оплата падає після логіну») і вмикає його одним викликом; | Щоб перемикатися між сценаріями без залишків |
| Показує сценарії і чи активні вони повністю / видаляє сценарій, не чіпаючи його правил | Щоб переглянути чи прибрати збережені сценарії |
Ключова поведінка
1. За замовчуванням повертаються сирі дані
Ця версія більше не маскує вміст запитів і відповідей:
зведення, деталі, live і history повертають сирі значення;
якщо потрібне маскування, його має робити MCP-клієнт або агент.
⚠️ Токени, cookie і персональні дані з трафіку потрапляють у контекст моделі як є. Використовуйте тестові акаунти і стенди.
2. Спочатку зведення, потім деталі
Спершу викликайте group_capture_analysis, query_live_capture_entries або analyze_recorded_traffic, і лише для підтвердженої цілі — get_traffic_entry_detail.
Не вмикайте include_full_body=true без явної причини.
3. Вивід оптимізований під бюджет токенів
Серіалізація всіх зведень і деталей полегшена:
внутрішні поля
header_map,parsed_json,parsed_form,lower_nameне потрапляють у вивід інструментів;значення
nullавтоматично прибираються під час серіалізації;якщо в детальному вигляді є
full_text, надлишковийpreview_textвидаляється.
Значення за замовчуванням невеликі, щоб берегти контекстне вікно:
Параметр | За замовчуванням |
| 10 |
| 128 |
| 6 |
| 2048 |
Якщо потрібен ширший огляд, більші значення так само можна передати явно.
4. Деталі з історії потребують стабільного ідентифікатора джерела
Зведення по історії повертають recording_path, зведення по live — capture_id.
Для get_traffic_entry_detail:
в історії передавайте
recording_path;у live передавайте
capture_id.
5. Збій stop_live_capture відновлюваний
У stop_live_capture два стабільні кінцеві стани:
status="stopped"— захоплення справді закрите;status="stop_failed"— короткий повтор теж не вдався, але захоплення збережене.
Якщо результат такий:
{
"status": "stop_failed",
"recoverable": true,
"active_capture_preserved": true
}означає, що захоплення так само можна читати, діагностувати і згодом зупинити повторно.
Розробка
CI пропускає зміни лише після успішного проходження ruff, mypy і pytest. Локально запускайте те саме:
python -m ruff check charles_mcp tests
python -m mypy charles_mcp
python -m pytest -qКорисні команди для локального запуску:
python charles-mcp-server.py
python -c "from charles_mcp.main import main; main()"Походження
Це форк heizaheiza/Charles-mcp (MIT). Форк додав підміну відповідей (Map Local і диспетчер правил), роботу з довгими сесіями та виправлення, описані в CHANGELOG.md. Подробиці — у PROVENANCE.md.
Див. також
Available Tools
47 toolsanalyze_recorded_trafficA
Analyze a saved recording snapshot with compact summaries. HISTORY-PLANE TOOL — only use when the user explicitly references a saved recording (.chlsj file). For ongoing / live traffic, prefer start_live_capture + query_live_capture_entries instead. Preserve recording_path for follow-up detail calls. Returns structured TrafficSummary items with matched_fields and match_reasons. Use get_traffic_entry_detail to drill down into a specific entry_id afterwards.
Inputs: preset, max_items, method_in, status_in, +19 more. Returns: items, source, warnings, truncated, +6 more
charles_statusA
Check Charles connectivity and active live-capture state. Returns recommended_next_action to nudge agents toward the live plane: when no active capture exists, agents should start_live_capture before falling back to history-plane tools.
Inputs: no named parameters. Returns: Structured status result for the Charles MCP server.
get_capture_analysis_statsC
Return coarse traffic class counts for a live capture or saved recording.
Inputs: source (required), preset, capture_id, scan_limit, +1 more. Returns: preset, source, warnings, total_items, +2 more
get_recording_snapshotA
Load a saved recording snapshot. This tool never reads the live Charles session. HISTORY-PLANE TOOL — only use when the user explicitly references a saved recording (.chlsj file).
Inputs: path. Returns: Structured result for loading a specific saved recording snapshot.
get_traffic_entry_detailA
Load one traffic entry detail view for drill-down inspection. Requires entry_id from a prior summary/query call. Use detail for one confirmed target, not bulk browsing. For history entries, pass recording_path from the summary. For live entries, pass capture_id from the summary. Keep include_full_body=false unless you specifically need the raw body text.
Inputs: source (required), entry_id (required), capture_id, max_body_chars, +2 more. Returns: detail, source, entry_id, warnings
group_capture_analysisC
Group analyzed traffic so the agent can inspect hot spots with lower token cost.
Inputs: source (required), group_by (required), preset, method_in, +21 more. Returns: groups, source, group_by, warnings, +6 more
list_recordingsA
List saved recording files using an explicit history-oriented tool name. HISTORY-PLANE TOOL — only use when the user explicitly references saved recordings (.chlsj files). For ongoing / live traffic, prefer start_live_capture instead. Start history analysis here, then preserve recording_path for summary/detail calls.
Inputs: no named parameters. Returns: Structured result for listing saved recordings.
mock_create_from_entryA
Turn a captured response into a Map Local mock, optionally editing it.
Take entry_id from query_live_capture_entries (pass capture_id) or a history
summary (pass recording_path). The mock is written for the entry's host and
path; a previous mock at that path is archived, never deleted.
Read warnings: Map Local always answers 200 and ignores method and query.
Inputs: source (required), entry_id (required), patches, capture_id, +1 more. Returns: mock, warnings, next_step, patches_applied, +2 more
mock_discover_variantsA
Overview of the whole captured session: API requests grouped by method, host, path and the value of a request-body field (default /action; "null" for GETs and bodies without it), with counts, sample entry_ids and response statuses. Use it right after reading a session so the user can name what to change. Filter with host_contains / path_contains / methods. live needs capture_id.
Inputs: source (required), limit, methods, body_field, +5 more. Returns: groups, scanned, warnings, body_field, +4 more
mock_dispatcherA
Start, stop or check the local dispatcher that Map Remote routes point to.
A dispatcher started here lives inside the MCP server and stops with it; for a
long-running one use the charles-mcp-dispatcher command. By default start also
enables Charles Map Remote and stop disables it (toggle_map_remote), so routed
requests never point at a stopped dispatcher; mock files and rules stay.
Inputs: port, action, toggle_map_remote. Returns: routes, address, message, running, +1 more
mock_getC
Show the content of one active mock.
Inputs: host (required), path (required), max_chars. Returns: mock, content, content_truncated
mock_listA
List active mock files, optionally for one host. Archived versions are not listed.
Inputs: host. Returns: items, total, mock_dir
mock_removeA
Stop mocking one path: the file moves to the archive and requests pass through to the real server again.
Inputs: host (required), path (required). Returns: host, path, next_step, archived_to
mock_route_setupA
Send a host (or domain glob) through the dispatcher; once per host/domain. One Charles Map Remote mapping (https:// -> local dispatcher, empty destination path, preserve host header) covers every path and action under it; after that, mocks are only data. Unmocked requests pass through unchanged. apply=true writes the mapping into the Charles config; only while Charles is closed, because Charles overwrites its config from memory on quit. This tool never quits or starts Charles: ask the user to save the session and quit Charles, not to reopen it until the write is done, then to start it. apply=false returns manual steps that work in the UI without a restart.
Inputs: host (required), path, port, apply, +1 more. Returns: host, path, applied, warnings, +6 more
mock_rule_create_from_entryA
Create or extend the rule for one request variant (method + path + body/query
values) from a captured entry.
match_body_fields picks the variant, e.g. ["/action"] for POSTs; leave it empty
for GETs. host_scope="any" (default) applies the rule on every routed host, since
the same API runs on several hosts; "exact" limits it to the entry's host, and
host accepts a glob such as .example.com. match_path replaces the entry's
exact path with a pattern where * stands for one segment or part of one, for
segments that differ by platform or app version: /api//payoneer covers
/api/p24-aos2/payoneer and its iOS twin. It must cover the entry's path.
mode="patch": the real server answers; request_patches edit the request body,
request_headers set (or remove with null) request headers before it is forwarded,
response_patches edit only the named response fields. mode="fixture": answer from
the captured response with any status (e.g. 500), never contacting the server
(request edits are ignored). status overrides the response code in either mode;
delay_ms waits that many milliseconds before answering, to test loaders and client
timeouts. merge=true adds to the variant's existing rule; a patch on the same
pointer replaces the old one. Patches are checked against the captured entry.
Inputs: source (required), entry_id (required), host, mode, +15 more. Returns: rule, warnings, next_step, rule_json, +2 more
mock_rule_getB
Show one rule document and, for fixture rules, the stored fixture.
Inputs: host (required), rule_id (required), max_chars. Returns: fixture, rule_json, fixture_truncated
mock_rule_listA
List dispatcher routes and rules, optionally for one host. Invalid rule
files are reported in errors and ignored by the dispatcher.
Inputs: host. Returns: items, total, errors, routes, +1 more
mock_rule_removeA
Archive one rule (and its fixture); matching requests pass through again.
Inputs: host (required), rule_id (required). Returns: id, host, next_step, archived_to
mock_rule_set_enabledB
Enable or disable one rule without deleting it.
Inputs: host (required), enabled (required), rule_id (required). Returns: id, file, host, path, +10 more
mock_rule_writeA
Write a rule document directly (advanced; prefer mock_rule_create_from_entry). Shape: {"id", "host", "match": {"method", "path", "query", "headers", "body": {"/action": "init"}}, "request": {"patches"}, "response": {"mode": "fixture"|"patch", "status", "headers", "patches"}, "priority", "enabled"}. Fixture rules need fixture_json or fixture_text unless a fixture exists.
Inputs: rule (required), fixture_json, fixture_text. Returns: rule, warnings, next_step, rule_json, +2 more
mock_set_enabledA
Turn the whole Charles Map Local tool on or off. Off means every request goes to real servers; mock files stay on disk.
Inputs: enabled (required). Returns: enabled, message, success
mock_setup_hostA
One-time setup per host: create the mock directory and the Charles rules (Map Local https:///* -> directory, Rewrite text/plain -> JSON type). After that, mocks are plain files: present = served by Charles, absent = real server. apply=false returns manual steps (UI, no restart); apply=true writes the rules into the Charles config and only works while Charles is closed (Charles overwrites its config on quit). This tool never quits or starts Charles: ask the user to save the session, quit Charles, and start it after the write. A config backup is made first.
Inputs: host (required), apply. Returns: host, applied, host_dir, warnings, +6 more
mock_writeA
Write a mock response from scratch. Pass body as a JSON value (written
pretty-printed) or body_text as raw text, not both. Prefer
mock_create_from_entry when a real response exists, so the shape stays valid.
Inputs: host (required), path (required), body, body_text. Returns: mock, warnings, next_step, patches_applied, +2 more
peek_live_captureA
Preview incremental traffic without advancing the cursor. Returns compact entry summaries (host/method/path/status only). This peek call does not consume the current increment. Safe to call repeatedly — does not consume items. Use query_live_capture_entries for structured filtering and analysis.
Inputs: capture_id (required), limit, cursor. Returns: Incremental live capture read result.
query_live_capture_entriesA
Analyze the active live capture with structured summary-first filtering. This is the RECOMMENDED tool for inspecting live / ongoing traffic. Prefer this over query_recorded_traffic / analyze_recorded_traffic unless the user explicitly names a saved recording (.chlsj). Use this summary path before calling get_traffic_entry_detail. Does NOT advance the cursor — safe to call repeatedly with different filters. Default cursor=0 scans all captured data from the beginning. Use get_traffic_entry_detail to drill down into a specific entry_id.
Pass since_seconds=N to look only at traffic captured in the last N
seconds (relative to "now" at query time). This is the preferred
shortcut when the user asks for "just now / recent" traffic and
removes the need to thread the cursor through follow-up calls.
Inputs: capture_id (required), cursor, preset, max_items, +21 more. Returns: items, source, warnings, truncated, +6 more
query_recorded_trafficA
Query the latest saved recording. This tool never reads the live Charles session. HISTORY-PLANE TOOL — only use when the user explicitly references a saved recording (.chlsj file). For ongoing / live traffic, prefer start_live_capture + query_live_capture_entries instead.
Inputs: http_method, keep_request, host_contains, keep_response, +1 more. Returns: Structured result for querying saved recording entries.
read_live_captureA
Read incremental traffic and advance the cursor. Returns compact entry summaries (host/method/path/status only). This read call consumes the current increment. Use query_live_capture_entries for structured filtering instead of this tool. This tool advances the internal cursor — repeated calls only return new items.
Inputs: capture_id (required), limit, cursor. Returns: Incremental live capture read result.
reset_environmentB
Reset the Charles environment and restore the saved configuration.
Inputs: no named parameters. Returns: result
reverse_analyze_live_api_flowC
Run a task-oriented live API reverse-analysis workflow on new traffic. Read summary/report first and expand evidence only as needed.
Inputs: live_session_id (required), limit, advance, run_replay, +8 more. Returns: object
reverse_analyze_live_login_flowB
Run a task-oriented live login/auth reverse-analysis workflow on new traffic. Read summary/report first and expand evidence only as needed.
Inputs: live_session_id (required), limit, advance, run_replay, +8 more. Returns: object
reverse_analyze_live_signature_flowC
Run a task-oriented live signature reverse-analysis workflow on new traffic. Read summary/report first and expand evidence only as needed.
Inputs: live_session_id (required), limit, advance, run_replay, +9 more. Returns: object
reverse_charles_recording_statusC
Inspect Charles recording state and optional reverse live-session state.
Inputs: live_session_id. Returns: object
reverse_decode_entry_bodyC
Decode a stored request/response body, including protobuf when a descriptor is provided.
Inputs: side (required), entry_id (required), message_type, descriptor_path. Returns: object
reverse_discover_signature_candidatesC
Compare multiple requests and rank fields that look signature-related.
Inputs: entry_ids (required). Returns: object
reverse_get_entry_detailA
Get the canonical detail view for one imported entry. Use after candidate selection; this is not a bulk-browsing endpoint.
Inputs: entry_id (required). Returns: object
reverse_import_sessionC
Import an official Charles XML/native session into the canonical reverse-analysis store.
Inputs: path (required), source_kind, source_format. Returns: object
reverse_list_capturesB
List imported captures from the local SQLite store.
Inputs: limit. Returns: result
reverse_list_findingsC
List persisted findings from replay or signature-candidate analysis.
Inputs: subject_id, subject_type. Returns: result
reverse_peek_live_entriesC
Snapshot the current Charles session and inspect only new entries without advancing the live cursor.
Inputs: live_session_id (required), limit, method_in, status_in, +3 more. Returns: object
reverse_query_entriesB
Query imported entries using route-level filters. Use this as the summary-first narrowing step for a reverse capture_id.
Inputs: capture_id (required), limit, offset, method_in, +3 more. Returns: object
reverse_read_live_entriesC
Snapshot the current Charles session and advance the live cursor to consume new entries.
Inputs: live_session_id (required), limit, method_in, status_in, +3 more. Returns: object
reverse_replay_entryC
Replay one imported entry with optional mutations and store the experiment result.
Inputs: entry_id (required), use_proxy, form_overrides, json_overrides, +4 more. Returns: object
reverse_start_live_analysisB
Start a near-real-time live analysis session without using undocumented JSON export. Preserve and reuse live_session_id for follow-up reverse live tools.
Inputs: reset_session, snapshot_format, start_recording_if_stopped. Returns: object
reverse_stop_live_analysisB
Stop a reverse live-analysis session and optionally restore Charles recording.
Inputs: live_session_id (required), restore_recording. Returns: object
start_live_captureA
Start or adopt a live capture session for incremental polling. PREFER THIS TOOL when the user wants to inspect ongoing / just-now traffic. This is the default entry point for live-plane analysis; do NOT default to list_recordings or query_recorded_traffic unless the user explicitly names a saved recording (.chlsj).
DEFAULT BEHAVIOR (safe): adopts the user's ongoing Charles session WITHOUT clearing the traffic that is already there, and ensures Charles is recording (start_recording is idempotent). The capture always includes the traffic recorded before this call, so query and read tools see the whole session: the first read_live_capture returns the existing entries, later reads return only new ones.
Pass reset_session=true ONLY when the user explicitly asks to clear / wipe the current Charles session before starting a fresh capture (e.g. debugging a single isolated flow). Reset is destructive and cannot be undone by this server.
Returns a capture_id required by all other live tools. Preserve and reuse capture_id across follow-up live calls.
Inputs: reset_session, adopt_existing, start_recording_if_stopped. Returns: Start or adopt a live capture session.
stop_live_captureA
Stop an active live capture and optionally persist the filtered snapshot. Only status='stopped' means the capture is fully closed.
Inputs: capture_id (required), persist. Returns: Stop a live capture session.
throttlingB
Set a network throttling preset in Charles.
Inputs: preset (required). Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 47 tools
Many tools have intentionally duplicated surfaces across live/history/reverse planes (read_live_capture vs reverse_read_live_entries, query_recorded_traffic vs analyze_recorded_traffic vs reverse_query_entries, mock_* vs mock_rule_*), and descriptions carry most of the burden. Prefixes like mock_ and reverse_ help, but an agent could easily select the wrong capture/read/query variant without reading deeply.
Most tools follow a consistent [domain]_[verb]_[object] pattern (start_live_capture, mock_get, reverse_replay_entry), and the mock_/reverse_ prefixes make families recognizable. Minor deviations like throttling, reset_environment, charles_status, and mock_dispatcher break the verb-first pattern but do not obscure meaning.
47 tools is well into the 'too many' range and reflects substantial duplication: several near-parallel subsystems (live/history/reverse/mock-rule) each re-implement list/read/query/stop-style operations. The broad Charles domain justifies many tools, but consolidation would meaningfully improve the surface.
The surface is broad and covers the main lifecycle: live capture, saved recordings, filtering/detail drill-down, mocking, replay, reverse analysis, and environment control. Minor gaps such as no way to start/quit Charles or delete recordings/imports can be worked around, but they are not fatal dead ends.
Maintenance
Related MCP Connectors
AI-callable tools for API mocking, testing, monitoring, security, and automation.
Debug webhooks from your AI agent: inspect and replay captured webhooks on localhost.
Capture, inspect, send and assert on webhooks and inbound email from your coding agent.
IP intelligence, network diagnostics, and AI service availability tools for AI agents.
Related MCP Servers
- AlicenseBqualityCmaintenanceIntegrates Charles Proxy with MCP clients to provide real-time and historical network traffic capture and structured analysis. It features a summary-first approach that filters noise and desensitizes data for efficient, low-token agent debugging and monitoring.18130 PyPI330MIT
- AlicenseCqualityBmaintenanceTransforms mitmproxy into a toolset for AI agents to inspect, modify, and replay HTTP/HTTPS traffic in real-time.25261 PyPI135MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI to analyze real-time HTTP(S) traffic captured by ProxyPin, with tools to browse, search, and inspect requests and responses, as well as access saved history sessions.15 npm4MIT
- AlicenseAqualityDmaintenanceEnables AI agents to interact with Charles Proxy for HTTP traffic analysis, supporting incremental harvest, checkpoint timelines, and rich filtering tools.138MIT