@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 +177 -21
- package/README.md +6 -3
- package/README.tr.md +6 -3
- package/index.js +857 -14
- package/package.json +17 -4
- package/tools/context/index.js +192 -0
- package/tools/offload/index.js +57 -1
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
941
|
-
|
|
942
|
-
| Device Control (42 tools)
|
|
943
|
-
| Store Compliance (4 tools)
|
|
944
|
-
| iOS Tools (34), diagram (31) | 35
|
|
945
|
-
| 5 categories summing to 57
|
|
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 -
|
|
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 -
|
|
1432
|
-
results -
|
|
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
|
-
|
|
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
|
-
-
|
|
1444
|
-
|
|
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 -
|
|
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
|
-
**
|
|
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
|
-
**
|
|
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** (
|
|
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 **
|
|
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
|
-
**
|
|
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** (
|
|
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ıç
|