@mmerterden/multi-agent-toolkit-mcp 3.12.0 → 3.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -19,6 +19,160 @@ Releases before this file exists are recorded in the git tags and commit history
19
19
 
20
20
  ---
21
21
 
22
+ ## 3.13.1 - 2026-09-21
23
+
24
+ Fixes to the web and context families, each held by a gate proven to fail
25
+ without it. The acceptance numbers at the end were measured against live sites.
26
+
27
+ ### Fixed
28
+
29
+ - **A question asked of the index returned nothing at all.** FTS5 reads the
30
+ space between two terms as AND, so a nine-word question demanded all nine
31
+ words from one chunk. `context_search` now runs the every-term query first,
32
+ because a caller who typed all the terms meant all of them, and falls back to
33
+ an any-term query when that finds nothing; `bm25` then ranks by how many of
34
+ the terms a chunk carries and how rare each one is. A log line still matches
35
+ exactly as before.
36
+ - **`web_crawl`, `web_extract` and `web_map` crawled `about:blank`.** Run before
37
+ the session has navigated, extraction succeeded and returned nothing: the
38
+ crawl reported one page, the index gained an empty document, and the next
39
+ search ranked it. The three now name the missing `web_goto` instead of
40
+ returning an empty success.
41
+ - **A bounded crawl spent its budget on site furniture.** Links were followed in
42
+ DOM order, so a global index, a feedback form and a breadcrumb came before the
43
+ second body link. Links inside the page's content region are handed back
44
+ first, and a link that differs from another only by its query string is
45
+ treated as the same document. Measured on a 20-page crawl of the Python
46
+ standard library index: 14 material pages before, 18 after.
47
+ - **Refs from inside a frame were never registered.** Playwright stamps a frame
48
+ generation onto refs handed out past the first navigation (`f2e8`, not `e8`),
49
+ so the registry accepted nothing from the second page onward and refused every
50
+ ref the snapshot plainly showed.
51
+ - **`web_click` reported a timeout without saying what caused it.** A refusal
52
+ now names the reason: disabled, not displayed, transparent, zero-sized,
53
+ off-viewport, `pointer-events: none`, or the element that is on top of it at
54
+ the click point.
55
+ - **Readable extraction fell back to the page source.** The Readability and
56
+ Turndown browser bundles are resolved by their browser filenames and injected
57
+ into the page; when neither is available the fallback reads the live content
58
+ container's rendered text and drops chrome line by line.
59
+ - **`context_search` said which lines matched but not which file.** Each hit now
60
+ carries its path.
61
+
62
+ ### Added
63
+
64
+ - **`web_crawl` feeds the full-text index.** Each page is written beside the
65
+ index and indexed under its URL, so twenty pages arrive searchable instead of
66
+ as a wall of text. Failure to index never fails the crawl.
67
+ - **An offloaded payload's summary carries its signal lines.** A head-and-tail
68
+ window keeps the two places a large payload is least likely to carry its
69
+ answer; the tool name is already known, so up to twenty matching lines are
70
+ surfaced with their line numbers - `FATAL` and `Abort trap` for a crash log,
71
+ `error:` and `Undefined symbol` for a build, tappable nodes for a UI dump,
72
+ measurements for a memory report. Patterns only, no model.
73
+ - **`@mozilla/readability` and `turndown` as optional peers**, alongside
74
+ `playwright`. Absent, extraction uses the fallback above.
75
+ - **`MCP_TOOLKIT_INDEX_DIR`** overrides where the index lives, so a gate ranks a
76
+ corpus it owns.
77
+
78
+ ### Acceptance
79
+
80
+ Run against live sites before release:
81
+
82
+ | Criterion | Result |
83
+ | ---------------------------------------------------------------------------------------- | --------------------- |
84
+ | Click by ref on ten real sites, asserting the page moved | 10/10 |
85
+ | Article body extracted from ten pages, no nav, cookie or footer text | 10/10 |
86
+ | `max_pages: 20` crawl of a documentation site, then five questions ranked from the index | 5/5 first-hit correct |
87
+
88
+ None of the five questions names the module it should find.
89
+
90
+ ---
91
+
92
+ ## 3.13.0 - 2026-09-20
93
+
94
+ ### Added
95
+
96
+ - **Web family grows from 8 tools to 18.** `web_snapshot` returns an
97
+ accessibility tree whose `ref` handles `web_click`, `web_type`,
98
+ `web_get_text` and `web_press_key` accept in place of a CSS selector, so a
99
+ caller targets what it just read rather than guessing a selector. Refs belong
100
+ to one snapshot: navigating invalidates the set, and a ref from before is
101
+ refused by name rather than resolving to whatever now sits at that position.
102
+ `web_console` and `web_network` report what the page logged and requested
103
+ since the last navigation. `web_tabs` and `web_storage_state` expose the
104
+ context. `web_extract` returns readable article text, `web_map` lists
105
+ same-origin links, `web_crawl` walks them under a page and depth bound that
106
+ respects robots.txt. `web_select_option` and `web_press_key` close the
107
+ interaction gaps. `web_goto` gained `timeout_ms`, `viewport`, `locale` and
108
+ `user_agent`.
109
+ - **Context index (3 tools).** A large result was already written to a file and
110
+ grepped with `agent_query_output`. It is now also chunked and indexed in
111
+ SQLite FTS5: `context_search` ranks passages with `bm25()` and answers in
112
+ roughly 50-100 tokens, `context_get` opens one passage by id, and the file
113
+ path still holds everything. Grep answers which lines contain a string;
114
+ ranking answers which part is about the subject. No new dependency -
115
+ `node:sqlite` ships with Node. `agent_query_output` is untouched; it is in the
116
+ cross-CLI contract.
117
+ - **Research (2 tools).** `research_search` normalizes Brave or Perplexity
118
+ results to {title, url, snippet}; `research_ask` returns a cited answer
119
+ through Sonar. Keys are read from the environment at call time and go straight
120
+ into a header. A literal key is not an accepted argument, so it cannot land in
121
+ a transcript, and an unset key is reported by VARIABLE name, never by value.
122
+ - **Media (1 tool).** `media_frames` pulls key frames out of a recording with
123
+ ffmpeg and drops near-duplicates, so the file `ios_record_video` and
124
+ `android_record_screen` produce becomes something a model can look at. Three
125
+ flat seconds yield one frame, not ninety.
126
+ - **Capability gating.** `MCP_TOOLKIT_CAPS` narrows the served surface to named
127
+ families (`ios`, `android`, `web`, `design`, `code`, `pass`, `agent`,
128
+ `context`, `research`, `media`). Unset serves all 115. Filtering happens when
129
+ `tools/list` is answered, so a frontend repo is not handed 71 simulator tools.
130
+ An unknown name warns on stderr and is ignored rather than emptying or
131
+ widening the surface.
132
+
133
+ ### Security
134
+
135
+ - **Extracted page text arrives fenced as data.** `web_extract` and `web_crawl`
136
+ are the only tools that put somebody else's writing into the caller's context.
137
+ A page reading "disregard every earlier instruction" used to arrive
138
+ indistinguishable from the server's own reply. It now arrives between explicit
139
+ markers naming its source. The fence does not make the text safe; it marks
140
+ where it begins and ends, which is the part a server can do. The fixture page
141
+ carries such a sentence and the gate asserts it lands inside.
142
+ - **Outbound hosts are declared and checked.** "stdio-only" used to carry two
143
+ claims: nothing listens, and nothing calls out. The research family ended the
144
+ second one. `audit-allowlist.mjs` now asserts them separately - no inbound
145
+ HTTP transport, and no absolute URL in shipped source beyond the two research
146
+ endpoints and two reference-only documentation hosts.
147
+
148
+ ### Fixed
149
+
150
+ - `web_goto` cleared console and network logs AFTER navigating, erasing exactly
151
+ the load-time messages `web_console` and `web_network` exist to report.
152
+ - `extractReadable` used `require.resolve` in an ES module, so the readability
153
+ path threw and every extraction silently fell back to plain text.
154
+ - `context_search` returned an id and a line range without saying which file
155
+ they belonged to, which is not enough to act on.
156
+
157
+ ### Testing
158
+
159
+ - `scripts/smoke-web.sh` (27 assertions) drives all 18 web tools against a
160
+ static fixture over `file://`, one call at a time through
161
+ `scripts/mcp-drive.mjs` - concurrent calls interleave on a shared page and a
162
+ selector times out because a later navigation moved it. Playwright missing is
163
+ reported as NOT MEASURED, not passed.
164
+ - `scripts/smoke-context.sh` (17 assertions) exercises context, research and
165
+ media through the MCP channel. Research runs with a planted fake key so the
166
+ failure path is the one under test, and the gate asserts no reply ever carried
167
+ the value.
168
+ - `tools/context/__tests__/context.test.mjs` (13 tests) covers chunk overlap,
169
+ re-index skip, stale-passage removal, the path filter, FTS5 syntax in a user
170
+ query, and snippet windowing.
171
+ - Gates 16 and 17 in `scripts/gates.sh` run both smokes and assert capability
172
+ gating narrows the surface at serve time.
173
+
174
+ ---
175
+
22
176
  ## 3.12.0
23
177
 
24
178
  The CI matrix had been red for five runs. Every fix below is something the red
@@ -93,8 +247,7 @@ because the thing that broke was the assumption that the host is a Mac.
93
247
  `pass_inspect`, `pass_certificates`. Build, sign, validate and inspect Apple
94
248
  Wallet passes; offline, deterministic, and generic by construction. All five
95
249
  of Apple's styles are first-class with a per-style image contract, and no
96
- brand, airline or project appears anywhere in the directory. 95 tools become
97
- 99. Three are read-only; `pass_build` writes the file the caller named.
250
+ brand, airline or project appears anywhere in the directory. 95 tools become 99. Three are read-only; `pass_build` writes the file the caller named.
98
251
 
99
252
  **A literal passphrase is not an accepted input.** The caller names an
100
253
  environment variable (`passphrase_env`) or a keychain entry, and the value
@@ -492,7 +645,7 @@ unverifiable without a device or emulator to run adb against.
492
645
 
493
646
  - **The accessibility audits reported a clean screen they had never read.** On a
494
647
  tree that came back empty they returned `elements_scanned: 0, total_issues: 0,
495
- critical: 0, important: 0, warning: 0` - a full clean bill of health,
648
+ critical: 0, important: 0, warning: 0` - a full clean bill of health,
496
649
  indistinguishable from an accessible screen, and the first reading is the one
497
650
  anyone believes. Both audits now carry `measurable` and a `reason`, and an
498
651
  unmeasurable run reports `total_issues: null`, never 0. A count of zero is a
@@ -620,7 +773,7 @@ declare `>= 3.1.0`.
620
773
  `~/.claude/logs/multi-agent-toolkit/<tool>-<timestamp>.txt`, and the tool
621
774
  returns a head + tail window with the line count and the path.
622
775
  `agent_query_output {pattern, path?, context_lines?, max_matches?,
623
- ignore_case?}` searches that file and returns matching lines with numbered
776
+ ignore_case?}` searches that file and returns matching lines with numbered
624
777
  context, so a follow-up question does not mean re-running an expensive tool -
625
778
  and for a UI dump a second run is not even the same evidence.
626
779
 
@@ -703,7 +856,7 @@ removed (still 83); input handling is tightened but stays backward-compatible.
703
856
  - `ios_record_video` and `android_record_screen` actually record. Both previously
704
857
  returned a literal "Run: ..." instruction for the caller to execute by hand. Now
705
858
  `action:"start"` spawns the recorder (`simctl io recordVideo` / `adb shell
706
- screenrecord`) in the background with PID tracking and returns immediately;
859
+ screenrecord`) in the background with PID tracking and returns immediately;
707
860
  `action:"stop"` interrupts it (SIGINT, so the mp4 container is finalized), pulls
708
861
  the file off the device on Android, and returns the local path. One recording
709
862
  per device; a stop with nothing running is an error.
@@ -922,10 +1075,11 @@ Documentation that claimed more than it checked, and the gate that let it.
922
1075
 
923
1076
  **Editor support is now stated as verified vs compatible.** The README opened with
924
1077
  "Works with Claude Code, Copilot CLI, Cursor, Antigravity, and VS Code Copilot Chat
1078
+
925
1079
  - the multi-agent-pipeline's full-orchestration targets". That parenthetical stopped
926
- being true in pipeline v10.7.0, when the Cursor / Antigravity / Codex / Copilot Chat
927
- adapters were deleted; the pipeline has targeted Claude Code and Copilot CLI only
928
- ever since.
1080
+ being true in pipeline v10.7.0, when the Cursor / Antigravity / Codex / Copilot Chat
1081
+ adapters were deleted; the pipeline has targeted Claude Code and Copilot CLI only
1082
+ ever since.
929
1083
 
930
1084
  The list is not simply wrong, though: this is a plain stdio MCP server, so it does
931
1085
  run in any MCP client, and the config snippets for those clients stay. What was
@@ -937,12 +1091,12 @@ of the 78 - in the primary host, for two releases, with every gate green.
937
1091
  **Gate 3b: per-family counts, not just the headline.** Gate 3 checked the two
938
1092
  headline numbers and nothing else, so every subcount drifted behind a green check:
939
1093
 
940
- | README said | reality |
941
- |---|---|
942
- | Device Control (42 tools) | 58 |
943
- | Store Compliance (4 tools) | 3 |
944
- | iOS Tools (34), diagram (31) | 35 |
945
- | 5 categories summing to 57 | 78 |
1094
+ | README said | reality |
1095
+ | ---------------------------- | ------- |
1096
+ | Device Control (42 tools) | 58 |
1097
+ | Store Compliance (4 tools) | 3 |
1098
+ | iOS Tools (34), diagram (31) | 35 |
1099
+ | 5 categories summing to 57 | 78 |
946
1100
 
947
1101
  The last row is the interesting one: the whole `design_*` family, six tools, was
948
1102
  missing from the category list entirely, which is why the listed categories could
@@ -1169,12 +1323,14 @@ content beside it. 14 gates, all green.
1169
1323
  ## [3.0.0] - 2026-08-22
1170
1324
 
1171
1325
  ### Changed
1326
+
1172
1327
  - **Renamed to `@mmerterden/multi-agent-toolkit-mcp`.** The old name read as internal scaffolding for one pipeline; this server is a standalone MCP over stdio with three runtime dependencies and no coupling to any orchestrator, and the name now says which family it belongs to. Major, because a package rename breaks every consumer that resolves it by name.
1173
1328
  - **The MCP server identity reported over the protocol is now `multi-agent-toolkit-mcp`.** Hosts key their registration off this, so an existing `dev-toolkit` entry does not upgrade in place - it has to be removed and re-added. The pipeline installer does that automatically; a hand-registered client needs `<cli> mcp remove dev-toolkit` once.
1174
1329
  - **`dev-toolkit-mcp` is kept as a second `bin` alias** so a script that invokes the old binary name keeps working through the transition.
1175
1330
  - Package description and keywords lead with what the server does (iOS Simulator, Android Emulator, headless web, 83 tools) rather than with the family it ships in, because that is what someone searching for it will search for.
1176
1331
 
1177
1332
  ### Migration
1333
+
1178
1334
  - `npm i -g @mmerterden/multi-agent-toolkit-mcp` then remove the old registration: `claude mcp remove dev-toolkit` (same for `copilot` / `codex`).
1179
1335
  - `@mmerterden/dev-toolkit-mcp` stays published at 2.26.0 and is deprecated with a pointer to the new name. Nothing is unpublished; a pinned consumer keeps resolving.
1180
1336
 
@@ -1396,7 +1552,7 @@ rarely the same size.
1396
1552
  size finding that buried the real defects. The comparison now reports
1397
1553
  per-element edge insets (left/right) rather than raw width, gaps between
1398
1554
  consecutive elements, vertical placement, and font size, family and text
1399
- colour sampled from the text ink rather than the box average - the box average
1555
+ colour sampled from the text ink rather than the box average - the box average
1400
1556
  previously returned the background colour and so passed every check. Pass
1401
1557
  `responsive: false` to restore the previous absolute-delta behaviour.
1402
1558
  - **Height is advisory.** It is still reported, but a content-driven height
@@ -1428,20 +1584,20 @@ because no failure ever carried `isError`, no host could tell.
1428
1584
  ### Fixed
1429
1585
 
1430
1586
  - **`isError` on every failure.** The `CallTool` dispatch returned command
1431
- failures as ordinary text, so a host - and the pipeline gates reading these
1432
- results - saw failure as success. Failures now return `isError: true`. Failing
1587
+ failures as ordinary text, so a host - and the pipeline gates reading these
1588
+ results - saw failure as success. Failures now return `isError: true`. Failing
1433
1589
  command output is also capped at 600 chars: a failed `simctl` call was
1434
1590
  inlining its entire ~3 KB usage page into the caller's context.
1435
1591
  - **`ios_biometric` was a no-op that claimed success.** `simctl keychain
1436
- <device> biometric-enroll` / `biometric-match` do not exist - `keychain`
1592
+ <device> biometric-enroll` / `biometric-match` do not exist - `keychain`
1437
1593
  supports only `add-root-cert`, `add-cert`, `reset`. Now drives the BiometricKit
1438
1594
  notification via `notifyutil` inside the simulator, and because `notifyutil`
1439
1595
  exits 0 even when it cannot post the name, its output is inspected: a "Failed
1440
1596
  with code N" line is reported as a failure with next steps instead of
1441
1597
  "success simulated".
1442
1598
  - **`ios_go_home` was a no-op.** `simctl io <device> pressButton` does not exist
1443
- - `io` supports only `enumerate`, `poll`, `recordVideo`, `screenshot`,
1444
- `screenConfig`. Routed through `idb ui button HOME`, like tap/swipe/type.
1599
+ - `io` supports only `enumerate`, `poll`, `recordVideo`, `screenshot`,
1600
+ `screenConfig`. Routed through `idb ui button HOME`, like tap/swipe/type.
1445
1601
  - **`android_set_locale` reported success unconditionally.** It broadcast the
1446
1602
  dead pre-Android-7 `SET_LOCALE` intent with stderr sent to `/dev/null`, and
1447
1603
  `am broadcast` exits 0 even when nothing handles the intent. Now uses the
@@ -1466,7 +1622,7 @@ because no failure ever carried `isError`, no host could tell.
1466
1622
 
1467
1623
  - **`sdk-floor` audit rule** (ITMS-90725), bringing `ios_app_store_audit` to
1468
1624
  **18 rules**. Asserts `DTSDKName` / `DTPlatformVersion` major >= 26 and
1469
- `DTXcode` >= 2600, the iOS 26 / Xcode 26 floor in force since 2026-04-28 - a
1625
+ `DTXcode` >= 2600, the iOS 26 / Xcode 26 floor in force since 2026-04-28 - a
1470
1626
  hard upload rejection that nothing checked. Grouped as `core` because it costs
1471
1627
  nothing to run. Reports a WARNING when an archive carries no build receipts at
1472
1628
  all, rather than passing silently.
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  🇹🇷 Türkçe: [README.tr.md](./README.tr.md)
9
9
 
10
- **99 tools** for iOS Simulator, Android Emulator, and headless web control. MCP server that lets your AI coding assistant see, interact with, and audit your mobile apps - plus drive browsers, run an 18-rule App Store compliance audit, and orchestrate multi-step batch flows.
10
+ **115 tools** for iOS Simulator, Android Emulator, and headless web control. MCP server that lets your AI coding assistant see, interact with, and audit your mobile apps - plus drive browsers, run an 18-rule App Store compliance audit, and orchestrate multi-step batch flows.
11
11
 
12
12
  Distributed on the **public npm registry** - `npx @mmerterden/multi-agent-toolkit-mcp` resolves with no auth, no token, no `~/.npmrc` setup.
13
13
 
@@ -15,16 +15,19 @@ Distributed on the **public npm registry** - `npx @mmerterden/multi-agent-toolki
15
15
 
16
16
  That distinction is worth keeping straight. This line once called five hosts "the multi-agent-pipeline's full-orchestration targets", which stopped being true in pipeline v10.7.0 when the Cursor / Antigravity / Codex / Copilot Chat adapters were deleted. Codex CLI returned as a first-class target in pipeline v13.0.0 on capability - it now has skills, parallel sub-agents, hooks and MCP - and it is on the verified list only because a gate exercises it, not because it is supported elsewhere. Claiming hosts nobody exercises is not free either: 2.20.0 and 2.21.0 shipped an illegal `outputSchema` on the first tool, so Claude Code rejected the whole `tools/list` and served zero of the 78 - in the primary host, for two releases, with every gate in this repo green.
17
17
 
18
- **10 categories:**
18
+ **13 categories:**
19
19
  - **Device Control** (59 tools) - screenshot, tap, swipe, type, navigate, dark mode, locale, orientation, location, permissions, push notifications, real start/stop screen recording
20
20
  - **Memory** (2 tools) - `ios_leaks` runs /usr/bin/leaks against a simulator or host process, snapshot or diff against a saved memory graph; `android_meminfo` reads dumpsys meminfo, snapshot or diff. Both report `measurable:false` rather than a clean result when they could not look
21
21
  - **Crash Diagnostics** (2 tools) - `ios_list_crashes` reads the host's DiagnosticReports, `android_list_crashes` dumps the adb crash buffer, both tail-bounded
22
22
  - **Accessibility Audit** (3 tools) - `ios_accessibility_audit` / `android_accessibility_audit` read the live tree for missing labels, controls a screen reader cannot name, small tap targets, missing identifiers and a reading order that does not follow the visual layout. `ios_accessibility_audit_deep` runs Apple's own XCUIAccessibilityAudit through your XCUITest for the things a tree cannot show: contrast, Dynamic Type, clipped text. All three report `measurable:false` with a reason rather than a clean result when they could not look
23
23
  - **Store Compliance** (5 tools) - App Store / Play Store readiness; **18-rule deep `ios_app_store_audit`** cross-references Apple ITMS error codes + App Store Review Guidelines (privacy manifest, required-reason API, Info.plist, code signing, entitlements, embedded SDK, IPv6, debug-tool leak, ...)
24
- - **Web Automation** (8 tools) - Playwright-powered: goto, click (CSS selectors), type, eval JS, wait for selector, extract text, screenshot. Chromium / WebKit / Firefox engines. **Requires `playwright` peer dependency.**
24
+ - **Web Automation** (18 tools) - Playwright-powered: goto, click, type, press a key, select an option, eval JS, wait for a selector, extract text, screenshot, plus an accessibility snapshot whose `ref` handles the other tools accept in place of a CSS selector, console and network logs captured since the last navigation, tab and storage state, readable article extraction, same-origin link mapping and a bounded crawl. Chromium / WebKit / Firefox engines. **Requires `playwright` peer dependency.**
25
25
  - **Design Audit** (6 tools) - mock-mode vs Figma conformance: scenario inventory, mock detection, mock launch, live UI geometry, pixel/geometry/typography compare, and the HTML/PDF report with its coverage gate
26
26
  - **Code Intelligence** (8 tools) - compiler-grade answers about Swift and Kotlin source, over the language server each platform already ships: definition, references, hover, document and workspace symbols, diagnostics without a full build, plus `code_index_status` for whether this machine can answer at all. Cross-file answers need a background index, so they report whether it had settled instead of returning an empty list that reads as "unused"
27
27
  - **Wallet Passes** (4 tools) - build, sign, validate and inspect Apple Wallet passes. All five styles, offline and deterministic, and a literal passphrase is deliberately not an accepted input: the caller names an environment variable or a keychain entry. The validator grades by consequence, because the interesting failures are the silent ones - one unknown `PKPassengerCapability` value raises nothing and quietly drops an enhanced pass back to the old layout
28
+ - **Context Index** (3 tools) - a large result is not only written to a file, it is chunked and indexed in SQLite FTS5, so `context_search` ranks passages with bm25() and answers in roughly 50-100 tokens which part is about what. `context_get` opens one passage by id; the file path is still there for everything. Grep tells you which lines contain a string; ranking tells you which part is about the subject. No dependency: `node:sqlite` ships with Node
29
+ - **Research** (2 tools) - provider-backed web search normalized to {title, url, snippet}, and a cited answer through Perplexity Sonar. Keys are read from the environment at call time and go straight into a header; a literal key is not an accepted argument, the same contract the Wallet signer uses
30
+ - **Media** (1 tool) - `media_frames` pulls key frames out of a recording with ffmpeg, dropping near-duplicates, so the video `ios_record_video` just produced becomes something a model can actually look at
28
31
  - **Autonomous Agent DSL** (2 tools) - `agent_run_steps` executes a batch array of {tool, args, continue_on_error?, wait_ms?} steps in one MCP round trip. Ideal for scripted login flows, form fills, multi-step QA paths. `agent_query_output` searches the full output of an earlier call that was too large to return inline, so a follow-up question does not mean re-running an expensive tool.
29
32
 
30
33
  ## Quick Start
package/README.tr.md CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  🇬🇧 English: [README.md](./README.md)
9
9
 
10
- iOS Simulator, Android Emulator ve headless web kontrolü için **99 araç**. AI kodlama asistanının mobil uygulamalarını görmesini, onlarla etkileşime girmesini ve denetlemesini sağlayan bir MCP sunucusu - ayrıca tarayıcıları sürer, 18-kurallık bir App Store uyumluluk denetimi çalıştırır ve çok-adımlı batch akışlarını orkestre eder.
10
+ iOS Simulator, Android Emulator ve headless web kontrolü için **115 araç**. AI kodlama asistanının mobil uygulamalarını görmesini, onlarla etkileşime girmesini ve denetlemesini sağlayan bir MCP sunucusu - ayrıca tarayıcıları sürer, 18-kurallık bir App Store uyumluluk denetimi çalıştırır ve çok-adımlı batch akışlarını orkestre eder.
11
11
 
12
12
  **Public npm registry** üzerinden dağıtılır - `npx @mmerterden/multi-agent-toolkit-mcp`, auth'suz, token'sız, `~/.npmrc` ayarı gerekmeden çözülür.
13
13
 
@@ -15,16 +15,19 @@ iOS Simulator, Android Emulator ve headless web kontrolü için **99 araç**. AI
15
15
 
16
16
  Bu ayrımı net tutmakta fayda var. Bu satır bir zamanlar beş host'u "multi-agent-pipeline'ın tam-orkestrasyon hedefleri" olarak adlandırıyordu, bu da pipeline v10.7.0'da Cursor / Antigravity / Codex / Copilot Chat adaptörleri silindiğinde doğru olmaktan çıktı. Codex CLI, pipeline v13.0.0'da yetenek üzerinden birinci-sınıf bir hedef olarak geri döndü - artık skill'leri, paralel sub-agent'ları, hook'ları ve MCP'si var - ve doğrulanmış listede sadece bir kapı onu çalıştırdığı için yer alıyor, başka bir yerde desteklendiği için değil. Kimsenin çalıştırmadığı host'ları iddia etmek de bedavaya gelmiyor: 2.20.0 ve 2.21.0, ilk araçta yasa dışı bir `outputSchema` gönderdi, bu yüzden Claude Code tüm `tools/list`'i reddetti ve 78'in sıfırını sundu - birincil host'ta, iki release boyunca, bu repo'daki her kapı yeşilken.
17
17
 
18
- **10 kategori:**
18
+ **13 kategori:**
19
19
  - **Device Control** (59 araç) - screenshot, tap, swipe, type, navigate, dark mode, locale, orientation, location, permissions, push notifications, gerçek start/stop ekran kaydı
20
20
  - **Memory** (2 araç) - `ios_leaks`, bir simülatör ya da host süreci üzerinde /usr/bin/leaks çalıştırır; anlık görüntü alır ya da kayıtlı bir memory graph ile karşılaştırır. `android_meminfo`, dumpsys meminfo okur, aynı şekilde anlık görüntü ya da fark. İkisi de bakamadıklarında temiz bir sonuç değil `measurable:false` döner
21
21
  - **Crash Diagnostics** (2 araç) - `ios_list_crashes` host'un DiagnosticReports dizinini okur, `android_list_crashes` adb crash buffer'ını döker, ikisi de tail-sınırlı
22
22
  - **Accessibility Audit** (3 araç) - `ios_accessibility_audit` / `android_accessibility_audit` canlı ağacı okur: eksik label, ekran okuyucunun adlandıramadığı kontrol, küçük tap target, eksik identifier ve görsel düzeni izlemeyen okuma sırası. `ios_accessibility_audit_deep` ise ağacın gösteremeyeceği şeyler için Apple'ın kendi XCUIAccessibilityAudit'ini XCUITest'iniz üzerinden çalıştırır: kontrast, Dynamic Type, kırpılmış metin. Üçü de bakamadıklarında temiz bir sonuç değil, gerekçesiyle `measurable:false` döner
23
23
  - **Store Compliance** (5 araç) - App Store / Play Store hazırlığı; **18-kurallık derin `ios_app_store_audit`**, Apple ITMS hata kodları + App Store Review Guidelines'a çapraz referans verir (privacy manifest, required-reason API, Info.plist, code signing, entitlements, gömülü SDK, IPv6, debug-tool sızıntısı, ...)
24
- - **Web Automation** (8 araç) - Playwright-destekli: goto, click (CSS selector'lar), type, JS eval, selector bekleme, metin çıkarma, screenshot. Chromium / WebKit / Firefox motorları. **`playwright` peer dependency'si gerektirir.**
24
+ - **Web Automation** (18 araç) - Playwright-destekli: goto, click, type, tuş basma, seçenek seçme, JS eval, selector bekleme, metin çıkarma, screenshot; ayrıca diğer araçların CSS selector yerine kabul ettiği `ref` tutamaklarını üreten erişilebilirlik snapshot'ı, son navigasyondan beri toplanan console ve network kayıtları, sekme ve storage durumu, okunabilir makale çıkarımı, aynı-origin link haritası ve sınırlı bir crawl. Chromium / WebKit / Firefox motorları. **`playwright` peer dependency'si gerektirir.**
25
25
  - **Design Audit** (6 araç) - mock-mode vs Figma uygunluğu: scenario envanteri, mock tespiti, mock launch, canlı UI geometrisi, piksel/geometri/tipografi karşılaştırması, ve coverage kapısıyla birlikte HTML/PDF rapor
26
26
  - **Code Intelligence** (8 araç) - Swift ve Kotlin kaynağı hakkında derleyici seviyesinde cevaplar, her platformun zaten getirdiği dil sunucusu üzerinden: tanım, referanslar, hover, dosya ve proje geneli semboller, tam build olmadan tanılamalar, ve bu makinenin soruyu cevaplayıp cevaplayamayacağını söyleyen `code_index_status`. Çapraz dosya cevapları arka plan index'ine bağlı olduğu için, "kullanılmıyor" diye okunan boş bir liste yerine index'in oturup oturmadığını raporlar
27
27
  - **Wallet Passes** (4 araç) - Apple Wallet pass'i üret, imzala, doğrula ve incele. Beş stilin hepsi, çevrimdışı ve deterministik; düz metin parola bilerek kabul edilen bir girdi değil: çağıran taraf bir ortam değişkeninin adını ya da bir keychain kaydını verir. Doğrulayıcı bulguları sonucuna göre derecelendirir, çünkü asıl önemli hatalar sessiz olanlar - tanınmayan tek bir `PKPassengerCapability` değeri hiçbir uyarı üretmez ve gelişmiş pass'i sessizce eski düzene düşürür
28
+ - **Context Index** (3 araç) - büyük bir sonuç yalnızca dosyaya yazılmaz, parçalanıp SQLite FTS5'e indekslenir; `context_search` bm25() ile sıralar ve hangi parçanın neyle ilgili olduğunu yaklaşık 50-100 token'da söyler. `context_get` tek bir parçayı id ile açar, dosya yolu ise her şey için orada durur. Grep hangi satırların bir dizgiyi içerdiğini söyler; sıralama hangi parçanın o konuyla ilgili olduğunu. Bağımlılık yok: `node:sqlite` Node ile geliyor
29
+ - **Research** (2 araç) - sağlayıcı destekli web araması, {title, url, snippet} şemasına normalize edilmiş; ve Perplexity Sonar üzerinden atıflı cevap. Anahtarlar çağrı anında ortamdan okunup doğrudan bir başlığa gider; düz metin anahtar kabul edilen bir argüman değil - Wallet imzalayıcısının kullandığı sözleşmenin aynısı
30
+ - **Media** (1 araç) - `media_frames`, bir kaydın anahtar karelerini ffmpeg ile çıkarır ve birbirine benzeyenleri eler; böylece `ios_record_video`'nun ürettiği video bir modelin gerçekten bakabileceği bir şeye dönüşür
28
31
  - **Autonomous Agent DSL** (2 araç) - `agent_run_steps`, tek bir MCP round trip'inde {tool, args, continue_on_error?, wait_ms?} adımlarından oluşan bir batch dizisini çalıştırır. Scriptlenmiş login akışları, form doldurma, çok-adımlı QA yolları için ideal. `agent_query_output`, satır içi dönemeyecek kadar büyük olan önceki bir çağrının tam çıktısını arar; böylece bir takip sorusu pahalı aracı yeniden koşturmak anlamına gelmez.
29
32
 
30
33
  ## Hızlı Başlangıç