Skip to main content
Glama
Charles MCP Server
by ExQA

Charles MCP Server

Версія Ліцензія Python

English README | Документація | Посібник для агентів | Мапінг і перезапуск Charles | Контракт інструментів | AGENTS | Сценарії для агента | Встановлення для команди

Дайте ШІ-агенту доступ до Charles Proxy. Агент сам знаходить потрібні запити мобільного застосунку, пояснює, що пішло не так, і підміняє відповіді для тестування — без копіювання трафіку в чат і без ручних правил у Charles.

Charles MCP: застосунок, 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, який увімкнув сам.

Як це працює

Як працює підміна: Map Remote, диспетчер, правила

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

Приклад

Три стани екрана гаманця: справжня відповідь, баланс 0, помилка 500

Ви: На екрані гаманця баланс 10.50. Зроби, щоб get_balance повертав 0, а init — помилку 500.

Агент:

  1. start_live_capture і mock_discover_variants — бачить POST /api/v1/wallet з двома варіантами action: init і get_balance.

  2. mock_rule_create_from_entry двічі: для get_balance — правка /data/balance у справжній відповіді, для init — знята відповідь зі статусом 500.

  3. mock_dispatcher(action="start"); ви оновлюєте екран.

  4. 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 Web Interface Menu

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

Charles Web Interface Settings

Ще два налаштування Charles, обидва робляться один раз:

  • Виключіть власні запити сервера із запису. Відкрийте Proxy -> Recording Settings -> Exclude, натисніть Add і вкажіть Host control.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-mcp

Claude 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_USER

admin

Ім'я користувача Charles Web Interface

CHARLES_PASS

123456

Пароль Charles Web Interface

CHARLES_PROXY_HOST

127.0.0.1

Хост проксі Charles

CHARLES_PROXY_PORT

8888

Порт проксі Charles

CHARLES_CONFIG_PATH

автовизначення

Шлях до файлу конфігурації Charles

CHARLES_REQUEST_TIMEOUT

10

Тайм-аут HTTP-запитів до Charles у секундах

CHARLES_MANAGE_LIFECYCLE

false

Чи має MCP-сервер запускати і зупиняти Charles

CHARLES_RETENTION_DAYS

0

Скільки днів зберігати знімки, дані reverse-аналізу і бекапи конфігу; старші видаляються під час старту сервера. 0 вимикає

CHARLES_REVERSE_STATE_DIR

${CHARLES_STATE_DIR}/reverse

Каталог стану reverse-аналізу: артефакти і база SQLite

CHARLES_MOCK_DIR

~/charles-mocks

Корінь сховища моків Map Local; Charles мапить https://<host>/* у <CHARLES_MOCK_DIR>/<host>/. Правила диспетчера лежать у <CHARLES_MOCK_DIR>/_rules/

CHARLES_DISPATCHER_PORT

18080

Порт локального диспетчера, на який указують правила Map Remote

CHARLES_DISPATCHER_TIMEOUT

20

Тайм-аут у секундах для запитів, які диспетчер пересилає на сервер

Рекомендовані сценарії

Live-аналіз

  1. start_live_capture

  2. group_capture_analysis

  3. query_live_capture_entries

  4. get_traffic_entry_detail

  5. stop_live_capture

Цей шлях дозволяє спершу знайти гарячі точки з мінімальною витратою токенів, а потім розкрити один підтверджений запит.

Аналіз історії

  1. list_recordings

  2. analyze_recorded_traffic

  3. group_capture_analysis(source="history")

  4. get_traffic_entry_detail

Цей шлях підходить, щоб переглянути збережені записи і потім заглибитися в обрані запити.

Підміна відповідей через Map Local

Як влаштовані правила в Charles, коли і як Charles перезапускається, відкат і діагностика — у docs/charles-mapping.uk.md.

  1. mock_setup_host — один раз на хост: створює <CHARLES_MOCK_DIR>/<host>/ і правила Charles. З apply=true (Charles має бути закритий) записує їх у конфіг Charles, інакше повертає інструкцію для ручного налаштування.

  2. start_live_capture + query_live_capture_entries — знайти справжню відповідь.

  3. mock_create_from_entry з правками patches у форматі JSON Pointer (або mock_write, щоб написати відповідь з нуля).

  4. Застосунок повторює запит; перевірте результат через query_live_capture_entries(response_header_name="X-Charles-Map-Local").

  5. 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 і хости під маршрутом — лише дані, а запити без правила йдуть на справжній сервер без змін.

На кожну сесію.

  1. start_live_capture, потім пройдіть сценарій у застосунку.

  2. mock_discover_variants(source="live", capture_id) показує всю сесію: метод × хост × шлях × значення action (null для GET) з кількістю, прикладами entry_id і статусами. Фільтри — host_contains / path_contains.

  3. На кожну правку, яку просить користувач: 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); правка того самого поля замінює попередню.

  4. mock_dispatcher(action="start"), потім повторіть дії в застосунку.

  5. Перевірте через 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-захоплення

Інструмент

Що робить

Коли використовувати

start_live_capture

Запускає або підхоплює поточне live-захоплення і повертає capture_id; за замовчуванням adopt_existing=true, reset_session=false, не очищає вже записаний трафік Charles і завжди включає його в захоплення

Перед початком спостереження в реальному часі

read_live_capture

Читає нові записи за курсором і повертає лише короткі зведення маршрутів

Для безперервного читання нового трафіку, коли спершу потрібні лише host/path/status

peek_live_capture

Показує нові записи без зсуву курсора, лише короткі зведення маршрутів

Щоб зазирнути в новий трафік, не змінюючи позицію читання

stop_live_capture

Зупиняє захоплення і за потреби зберігає знімок

Під час завершення або експорту live-сесії

query_live_capture_entries

Видає структуроване зведення по live-захопленню без зсуву курсора; since_seconds=N обмежує трафік останніми N секундами

Для багаторазової фільтрації важливих запитів із поточного трафіку

Інструменти аналізу

Інструмент

Що робить

Коли використовувати

group_capture_analysis

Групує live- або history-трафік за ключем

Коли потрібен найощадливіший за токенами огляд гарячих точок

get_capture_analysis_stats

Повертає грубу статистику за класами трафіку

Щоб швидко побачити розподіл: API, статика, помилки

get_traffic_entry_detail

Завантажує деталі одного запису і попереджає про завелику відповідь

Коли entry_id цілі вже відомий

analyze_recorded_traffic

Видає структуроване зведення за збереженим записом із причинами збігу

Для аналізу знімка .chlsj

Інструменти історії

Інструмент

Що робить

Коли використовувати

list_recordings

Показує збережені файли записів

Перед вибором історичного знімка

get_recording_snapshot

Показує один збережений запис короткими зведеннями, посторінково, без тіл

Коли треба побачити, що лежить у збереженому знімку

query_recorded_traffic

Легка фільтрація останнього збереженого запису

Для швидкого пошуку за host, методом або регулярним виразом

Інструменти стану і керування

Інструмент

Що робить

Коли використовувати

charles_status

Показує зв'язок з Charles і стан активного захоплення; поле recommended_next_action підказує наступний крок

Щоб перевірити, чи доступний Charles і чи активне захоплення

throttling

Вмикає пресет сповільнення мережі в Charles

Для емуляції 3G, 4G, 5G або вимкнення сповільнення

reset_environment

Відновлює конфігурацію Charles і очищає поточне оточення

Коли треба повернутися до чистого стану

charles_recording_exclude

Додає хост (за замовчуванням control.charles) у Proxy → Recording Settings → Exclude: повертає кроки для UI або з apply=true записує конфіг, доки Charles закритий

Один раз під час налаштування, щоб Charles не записував власні вивантаження сервера

charles_config_summary

Читає конфіг Charles без секретів: правила Map Remote і Map Local з їхніми проблемами, хости SSL Proxying, виключення запису, назви наборів Rewrite, стан Web Interface

Коли правило не спрацьовує або трафік лишається зашифрованим — замість того, щоб відкривати файл конфігу

purge_stored_data

Видаляє збережені знімки, дані реверс-аналізу і бекапи конфігу, старші за поріг; за замовчуванням dry_run=true

Щоб прибрати збережений трафік

⚠️ reset_environment закриває Charles, перезаписує його конфіг із бекапа і видаляє каталог збережених записів. Викликайте його лише свідомо.

Інструменти реверс-аналізу

Інструмент

Що робить

Коли використовувати

reverse_import_session

Імпортує офіційну XML- або нативну сесію Charles у канонічне reverse-сховище

Щоб почати replay, декодування або аналіз підписів зі збережених експортів

reverse_list_captures

Показує імпортовані reverse-захоплення

Щоб обрати захоплення, яке вже лежить у reverse-SQLite

reverse_query_entries

Фільтрує імпортовані reverse-записи за полями маршруту

Щоб звузити набір кандидатів перед детальним переглядом або replay

reverse_get_entry_detail

Повертає канонічну деталізацію одного імпортованого запису

Для глибокого розбору одного базового запиту

reverse_decode_entry_body

Декодує збережене тіло запиту або відповіді, включно з protobuf за дескриптором

Коли треба зрозуміти структуру payload

reverse_replay_entry

Повторює один імпортований запит з необов'язковими мутаціями

Щоб перевірити, чи відтворюється запит і як він реагує на зміни

reverse_discover_signature_candidates

Порівнює кілька імпортованих записів і ранжує поля, схожі на підпис

Для пошуку динамічних параметрів авторизації або підпису

reverse_list_findings

Показує збережені результати replay і аналізу підписів

Щоб переглянути вже зібрані докази

reverse_charles_recording_status

Показує стан запису Charles і reverse live-сесії

Щоб перевірити готовність до live-реверс-аналізу

reverse_start_live_analysis

Запускає reverse live-сесію і знімає сесію Charles через офіційні сторінки експорту

Коли реверс-аналіз має стежити за свіжим трафіком

reverse_peek_live_entries

Читає нові reverse live-записи без зсуву курсора

Щоб подивитися новий трафік до його обробки

reverse_read_live_entries

Читає нові reverse live-записи і зсуває курсор

Щоб просунути reverse live-аналіз

reverse_stop_live_analysis

Зупиняє reverse live-сесію і за потреби відновлює запис

Для акуратного завершення reverse live-сесії

reverse_analyze_live_login_flow

Оцінює новий трафік на зв'язок із логіном і авторизацією та пропонує наступні кроки

Для розбору логіна, отримання токена, встановлення сесії

reverse_analyze_live_api_flow

Оцінює новий трафік як API-ланцюжок і пропонує наступні кроки

Для розбору ланцюжків бізнес-API

reverse_analyze_live_signature_flow

Фокусується на запитах, чутливих до підпису, і планує експерименти з мутаціями

Для розбору захистів на sign, nonce, timestamp

Інструменти моків Map Local

Інструмент

Що робить

Коли використовувати

mock_setup_host

Створює каталог моків для хоста і правила Map Local + Rewrite (інструкція для ручного налаштування або запис у конфіг з apply=true, доки Charles закритий)

Один раз на кожен API-хост

mock_create_from_entry

Перетворює захоплену відповідь на мок, застосовуючи правки JSON Pointer

Коли користувач хоче змінити дані, які отримав застосунок

mock_write

Пише мок із JSON-значення або сирого тексту

Коли справжньої відповіді ще немає

mock_list / mock_get

Список активних моків / вміст одного

Щоб подивитися, що зараз підміняється

mock_remove

Відправляє мок в архів, шлях знову йде на справжній сервер

Коли сценарій завершено

mock_set_enabled

Вмикає або вимикає весь Map Local через Web Interface

Щоб призупинити або відновити всі моки

Інструменти правил диспетчера

Інструмент

Що робить

Коли використовувати

mock_route_setup

Спрямовує хост або шаблон домену (за замовчуванням усі шляхи) через диспетчер і повертає одне правило Map Remote (з apply=true при закритому Charles записує його в конфіг)

Один раз на домен

mock_discover_variants

Групує всю сесію за методом, хостом, шляхом і полем тіла, наприклад /action

Одразу після читання сесії

mock_rule_create_from_entry

Створює або доповнює правило одного варіанта (метод + шлях + значення тіла/query): режим patch або fixture, будь-який статус, затримка, правка заголовків запиту, за замовчуванням на будь-якому хості

На кожну правку, яку назвав користувач

mock_rule_write

Пише документ правила напряму, за бажанням із фікстурою

Коли знятого запиту немає

mock_rule_list / mock_rule_get

Список маршрутів і правил / одне правило з фікстурою

Щоб подивитися, що замокано

mock_rule_set_enabled / mock_rule_remove

Призупинити правило / відправити в архів

Коли сценарій завершено

mock_dispatcher

Запускає, зупиняє або перевіряє локальний диспетчер; start/stop заразом вмикають і вимикають Map Remote у Charles, щоб трафік не впирався в зупинений диспетчер

Перед тестом і після

mock_scenario_save / mock_scenario_apply

Називає набір правил (цілий сценарій QA, наприклад «оплата падає після логіну») і вмикає його одним викликом; exclusive вимикає всі інші правила

Щоб перемикатися між сценаріями без залишків

mock_scenario_list / mock_scenario_remove

Показує сценарії і чи активні вони повністю / видаляє сценарій, не чіпаючи його правил

Щоб переглянути чи прибрати збережені сценарії

Ключова поведінка

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 видаляється.

Значення за замовчуванням невеликі, щоб берегти контекстне вікно:

Параметр

За замовчуванням

max_items

10

max_preview_chars

128

max_headers_per_side

6

max_body_chars

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 tools
analyze_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

    B3.1/5.0

    Scored across 47 tools

    Disambiguation3/5

    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.

    Naming Consistency4/5

    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.

    Tool Count2/5

    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.

    Completeness4/5

    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

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      C
      maintenance
      Integrates 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.
      18
      130 PyPI
      330
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      Enables 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 npm
      4
      MIT