ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/AnyEvent-MCP/Changes
Revision: 1.86
Committed: Sun Nov 8 18:50:37 2026 UTC (18 hours, 28 minutes ago) by root
Branch: MAIN
CVS Tags: HEAD
Changes since 1.85: +2 -0 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 Revision history for AnyEvent::MCP
2
3 0.83 (unreleased)
4 - raise mcp-imap messages page and explicit UID batch limits from 100
5 to 1000, with page size default 100 and matching tool schemas.
6 - refuse mcp-imap mailbox DELETE when STATUS reports messages;
7 expunge first or explicitly pass force to delete a nonempty mailbox.
8 - move INI parsing from AnyEvent::MCP into Config, add canonical
9 serializer and merge_sections utility. Shared grammar now handles
10 global settings, IMAP accounts and ordered permission rules; replace
11 create-user/revoke-user's independent line-editing parser with
12 Config load/modify/save under the existing lock. Rewrites normalize
13 formatting and discard comments; master-secret append is unchanged.
14 - split Config construction from loading and secret initialization;
15 global_config() is the initialized cached singleton, while new
16 has no file side effects and load/ensure_secret are explicit.
17 Make anyevent-mcp init idempotent and fail on secret persistence errors.
18 - send 30-second elapsed-time progress for outstanding tool calls,
19 forward downstream progress through mcp-multibroker, and stream
20 request-scoped notifications over modern HTTP POST/SSE before the
21 final result, retaining plain JSON for calls without notifications.
22 - make mcp-imap messages.more indicate any remaining search work,
23 including sparse UID ranges; document next_cursor as authoritative
24 and recommend threads for targeted whole-mailbox lookups.
25 - eliminate the last utf8::is_utf8-based encoding decision in OAuth2:
26 form values are Unicode text encoded to UTF-8 before percent escaping;
27 decode redirect and persisted refresh-token bytes explicitly.
28 - centralize UTF-8 configuration file I/O in file_load/file_save:
29 files contain UTF-8 bytes, parse_ini handles Unicode text, and all
30 config, rules and IMAP callers share the same conversion boundary.
31 Keep the atomic byte-oriented file_replace for JSON and raw streams;
32 preserve raw passwords and Base64/hex-encoded binary secrets.
33 - load Encode::MIME::Header explicitly in the mcp-imap worker; only
34 mcp-imap requires it, not other AnyEvent::MCP components.
35 - decode RFC 2047 encoded subject and address display fields in
36 mcp-imap ENVELOPE summaries; include attachment names, MIME types,
37 sizes and part numbers in read-only previews without extra FETCHes.
38 - make mcp-fs remote subprocess framing byte-only: explicitly UTF-8
39 encode MCP argv and Unicode paths at their source, preserve raw OS
40 executable/env paths and binary stdin, reject non-octet frame fields;
41 add remote and VCS Unicode path/argv regressions.
42 - log idle IMAP keepalive failure details at trace and suppress only
43 IMAPTalk's raw warning for our expected timeout exception.
44 - register installed optional Encode::HanExtra, Encode::JIS2K and
45 Encode::EUCJPASCII charsets for mcp-imap MIME decoding; advertise
46 them as runtime suggestions, not dependencies.
47 - split distribution tests into core cNN_ files run by default and
48 extended eNN_ files skipped without PERL_ANYEVENT_MCP_TESTS=1;
49 add independent core filesystem smoke tests while retaining the full
50 integration and failure-injection suite for development and releases.
51 - include mailbox, destination, operation, batch size, paging position
52 and bounded SEARCH criteria in mcp-imap request logs, without
53 logging message bodies or UID lists.
54 - keep remote filesystem tests valid with long CPAN tester Perl paths:
55 the mock rsh checks the short loader overhead without imposing
56 an artificial 256-byte limit on the executable pathname.
57 - shorten mcp-fs remote bootstrap: embed the launcher byte length with
58 sprintf and append source directly via sysread without extra argv.
59 - raise sort_create/sort_page UID page maximum from 100 to 1000,
60 keeping the default at 100 and leaving message fetching and MOVE
61 batches capped at 100.
62 - enable multibroker-managed idle exit in mcp-http and mcp-ask-user
63 after 300 seconds, and mcp-imap after 3600 seconds (mcp-fs already
64 supported 300 seconds). Retain ask-user continuations; disposable
65 IMAP SORT snapshots are lost on idle exit. Retry declined idle
66 shutdown after the interval.
67 - add worker-local immutable UID SORT (SUBJECT DATE) snapshots for
68 subject-grouped classification: sort_create returns the first 100
69 UIDs, sort_page pages without re-sorting, sort_discard frees the
70 snapshot; one snapshot per worker, invalidated on restart.
71 - expose read-only UID THREAD ORDEREDSUBJECT through mcp-imap:
72 group by base subject with optional SEARCH filter and UID range,
73 retaining the complete nested server order without pagination.
74 - keep mcp-imap connections alive with an idle NOOP (250 seconds by
75 default, configurable via --keepalive, 0 disables); stop pinging
76 on failure, and reconnect on the next tool call without retrying
77 interrupted operations.
78 - allow shell-friendly instance names (ASCII alphanumerics, underscore,
79 hyphen, dot, @ and +), with separate strict managed-user names.
80 - fold small state-file locking and atomic replacement helper into
81 MCP.pm instead of a separate AnyEvent::MCP::File module.
82 - make --ask a shared common option, with per-option exclusion;
83 add --ask none to deny unresolved permissions and decline
84 downstream elicitation without prompting.
85 - document mcp-imap login keys individually in --help and manpage;
86 support tls connect/starttls/none (including explicit unencrypted IMAP)
87 and reset default ports on TLS mode changes.
88 - report LOGINDISABLED with no supported SASL mechanism cleanly on
89 IMAP password login, without obscure Authen::SASL warnings.
90 - add mcp_permissions to Simple: default permission engine, explicit
91 object or explicit undef; apply --ask and automatic rule overrides
92 centrally without dropping application-supplied automatic rules.
93 - give mcp-fs writable private /tmp and /var/tmp (mode 1777) even
94 with world-read; only shared-tmp or world-write exposes host
95 temporary directories. Make world-write formally imply shared-tmp
96 for permission checks; document the private/host lifetime distinction.
97 - add read-only mcp-imap previews for 25 UIDs, with bounded partial
98 MIME decoding, HTML link preservation and grouped IMAP FETCH calls.
99 - allow mcp-imap messages to fetch selected UIDs without SEARCH.
100 - actually truncate bounded IMAP part/raw responses to max_bytes,
101 not just flag them as truncated.
102 - use a 15-second HTTP read-inactivity timeout by default, suspended
103 while processing complete requests; respect explicit handle rtimeout.
104 - load MIME::Base64 in the HTTP server itself for encoded modern
105 Mcp-Name headers, without depending on the HTTP client loading it.
106 - log ordinary HTTP 404 responses at trace rather than warn,
107 including GET /; keep other HTTP rejection warnings.
108 - return 404 to GET / even when / is the MCP POST endpoint; drop
109 the unhelpful connection object address from HTTP rejection logs
110 while retaining the remote address and sanitized URI.
111 - reuse the latest saved per-dimension scope as the next permission
112 rule editor's default where offered, otherwise keep the original
113 conservative choice; native, YAD and terminal forms agree.
114 - handle the common token-only HTTP endpoint in warning logs:
115 redact known tokens without misclassifying unrelated paths.
116 - include bounded, JSON-escaped request paths in rejected HTTP request
117 warnings; omit queries and redact configured and attempted URL tokens.
118 - show captured helper status, stderr and stdout when the permission
119 UI test fails, and report remote file-patch results and file content
120 when the mock remote filesystem test fails (CPAN Testers diagnostics).
121
122 0.82 Fri 06 Nov 2026 15:53:46 CET
123 - add a first-permission-dialog walkthrough to Intro.pod, explaining
124 one-time versus persistent grants, rule scopes and exec stdin risks;
125 correct its description of logical workdir IDs.
126 - add common repeatable -s/--set KEY=VALUE process-local overrides
127 for trusted instance configuration, after program/instance defaults.
128 - key remote mcp-fs host permissions by --host alone, independent of
129 --rsh; add independent local/remote host scopes (this host by
130 default, or all hosts), retaining old unscoped saved rules.
131 Workdir scopes remain plain paths, independent of host.
132 - omit single-choice permission scope selectors from native, YAD and
133 terminal rule dialogs, automatically retaining the sole match in
134 saved rules without broadening their applicability.
135 - log rejected HTTP requests (status 400 and above) with method,
136 status and peer information, without leaking URL tokens; demote
137 ordinary connection/TLS errors to trace.
138 - do not warn on routine GET / requests; keep the normal 404
139 response without exposing a server-identification page.
140 - preserve mcp-vim subprocess stderr when its JSONL initialization
141 fails, instead of hiding the failure behind EOF and SIGPIPE.
142 - bootstrap remote mcp-fs over a short Perl command, streaming the
143 launcher source over stdin. Avoid rsh command length limits and
144 preserve worker input across exec by using exact sysread.
145 - format mcp-fs sandbox grants, tools, trusted configuration keys
146 and permission action classes as individually searchable POD items.
147 - give the mock remote filesystem test its running Perl interpreter
148 explicitly, rather than assuming it is in a fixed Unix PATH.
149 - avoid locale-dependent TCP error strings in reverse-connection tests,
150 and skip mcp-imap provider CLI tests when optional fork modules
151 are unavailable while retaining standalone provider parser tests.
152
153 0.81 Thu 05 Nov 2026 04:51:59 CET
154 - keep OAuth2 tests working without optional Mail::IMAPTalk,
155 IO::Socket::SSL or Authen::SASL; skip only worker-specific checks.
156 - support optional `mount-try.SUFFIX = ro:/path` or `rw:/path` in
157 mcp-fs configuration. Pass these directly as bubblewrap
158 --ro-bind-try/--bind-try for each invocation, without startup path
159 checks, locally and remotely; required mount.* entries are unchanged.
160 - support one remote host per mcp-fs instance with -h/--host and
161 -e/--rsh; resolve remote workdirs and available tools in a single
162 startup probe, then execute existing workers through a binary-framed
163 remote Perl launcher without installing any MCP modules remotely.
164 - use logical absolute pathnames (without resolving symlinks) as compact
165 workdir IDs across hosts; qualify remote permission scopes independently.
166 Named profiles remain shared between instances. Report cached remote
167 VCS markers and remote umask.
168 - reserve -h for application-specific options; --help remains common.
169 - test remote workers, external GNU utilities, permission isolation,
170 shell argument quoting and startup probing using a mock remote shell
171 and bubblewrap, including unsandboxed/auto behavior. Verify matching
172 workdir IDs for identical logical paths across local and remote
173 instances.
174 - make mock remote-agent tests independent of a local SSH_AUTH_SOCK
175 inherited from the test runner (including CPAN Testers).
176 - document --eager when starting mcp-webbrowser through multibroker;
177 defer possible downstream preferences for --eager and --hidden.
178
179 0.8 Thu 05 Nov 2026 01:52:48 CET
180 - INCOMPATIBLE CHANGE: due to the added user management, existing
181 url tokens have been invalidated.
182 - limit distribution permission normalization to its staging
183 directory, and supply proper CPAN author and abstract metadata.
184 - give shared command-line switches their own reference in
185 Server::Simple; use individually indexed POD items for executable
186 options and application-specific shared-option behavior.
187 - refresh the introductory guide and mcp-imap/mcp-http manuals
188 with first-use workflows, OAuth2 setup, mailbox/search examples
189 and reverse-TLS troubleshooting; correct stale retry documentation.
190 - extend mcp-imap SEARCH filters with recursive AND/OR/NOT, header,
191 text/body, date, size and flag criteria; use explicitly quoted
192 IMAP arguments and bounded filter complexity.
193 - capture deliberately triggered connection errors in test assertions,
194 avoiding noisy successful test runs.
195 - expose IMAP LSUB to inspect subscribed mailboxes, alongside
196 subscribe/unsubscribe; return the same format as LIST.
197 - remove superseded IMAP OAuth provider and pagination prototypes
198 and their obsolete reference tests.
199 - defer outgoing mail submission research (mcp-smtp or mcp-imap)
200 in TODO.md.
201 - retry reverse connections only for TCP connection refusal and
202 unexpected disconnects; report and stop on other TCP errors or
203 TLS handshake/verification failures.
204 - force scalar context when checking Mail::IMAPTalk results;
205 list context truncated LIST responses and could corrupt SEARCH
206 results. Test with context-sensitive IMAP mocks.
207 - report HTTPS reverse-connection handshake failures rather than
208 silently retrying; send credentials only after verified TLS succeeds.
209 - omit pointless mailbox permission dimension for mcp-imap mailboxes.
210 - clarify expected OAuth redirect error page and account selection.
211 - implement mcp-imap OAuth2 authorization-code login with PKCE,
212 human-pasted headless browser redirect, HTTPS token exchange,
213 refresh-token persistence/rotation and IMAP SASL XOAUTH2.
214 Keep interactive credentials outside MCP tools and argv.
215 - omit unnecessary shell quotes in mcp-imap providers commands.
216 - expand mcp-imap providers with Thunderbird ISPDB domain search,
217 provider-hosted HTTPS autoconfig lookup and ISPDB fallback,
218 password-based IMAP alternatives and provider setup instructions;
219 continue printing optional OAuth configuration without saving it.
220 - add per-downstream --hidden to mcp-multibroker, omitting a
221 server's tools from normal discovery while retaining explicit
222 list-tools, discover-brokers and call-tool access.
223 - number the user management test consecutively as t/27_users.t.
224 - tidy Perl import grouping, internal comments and source layout
225 in the command-line tools and library modules.
226 - stop imposing an IMAP account file mode check; access is governed
227 by ordinary filesystem permissions.
228 - use the permission engine's literal matching convention for exact
229 user identities and test positive permission-scope validation.
230 - reject invalid browser WebSocket credentials via the documented
231 handshake exception interface, producing one specific warning.
232 - apply the same handshake rejection handling to Vim WebSocket
233 connections, including peer and invalid-token/path warnings.
234 - document user-management scopes and URL examples in command help.
235 - add scoped, revocable MCP users with HKDF-derived credentials,
236 an implicit global default user, and atomic user management;
237 list effective user URLs with --print-url[=USER], also accepting
238 --print-urls, without binding the advertised listener port.
239 - associate HTTP credentials with per-request users, bind user
240 identity to persistent permissions and permission continuations,
241 and delegate original users through trusted multibrokers.
242 - select the effective connect_user (default: default) for reverse
243 MCP, private Vim and browser connections, independently of normal
244 authenticated HTTP tool calls.
245 - treat empty directory paths as "." in mcp-fs list, find, grep and
246 VCS cwd, without accepting empty filenames.
247 - support opportunistic HTTP/HTTPS and reverse MCP connections on the
248 same listener, TLS certificate/key CLI options, and dual URL discovery;
249 support verified HTTPS for outgoing reverse connections.
250 - treat idle HTTP disconnects as normal EOF while retaining errors
251 for clients disconnecting during request headers or bodies.
252 - identify failing MCP connections by client name, remote address
253 and connection id, including modern per-request client metadata.
254 - trace local multibroker prompt starts, outcomes and cancellations
255 with elapsed time to diagnose disappearing permission dialogs.
256 - use an 8 MiB default MCP message size across JSONL and HTTP
257 clients and servers, allowing large base64 tool requests through
258 mcp-multibroker; log server transport errors at warn level
259 instead of silently closing connections.
260 - load AnyEvent::Log at compile time so its format_time call is parsed
261 as a function, fixing activity logging on Perl 5.10.
262
263 0.71 Fri 30 Oct 2026 18:01:51 CET
264 - make multibroker-spawned children ask for permissions through MCP,
265 independently of the multibroker's own permission prompt mode.
266 - log VCS backend and a bounded, JSON-quoted preview of filenames for
267 vcs-diff, vcs-status and vcs-log.
268 - load only core modules in t/00_load.t; optional IMAP dependencies
269 are tested separately when available.
270 - let the fake bubblewrap test use the host temporary directory on
271 systems without /tmp (notably Termux).
272 - suppress Perl startup locale warnings in sandbox workers when
273 the requested C.UTF-8 locale is unavailable.
274 - canonicalize temporary test paths to match mcp-fs on systems with
275 symlinked temp directories; diagnose failing filesystem assertions.
276 - test SSE notification ordering at client delivery rather than
277 server enqueue time, avoiding a network scheduling race.
278 - diagnose failing multibroker HTTP integration tests with preflight
279 responses, RPC results and bounded server startup diagnostics.
280
281 0.7 Fri 30 Oct 2026 14:56:18 CET
282 - WARNING: mcp-imap is unfinished and has not been tested against a real IMAP server.
283 - INCOMPATIBLE CHANGE: rules have changed, old rules will be erased.
284 - declare the same license terms as Perl itself in distribution metadata.
285 - new mcp servers in this release: mcp-http
286 - accept optional dimension default matcher for persistent-rule prompts;
287 - clarify that mcp-fs exec has private /tmp by default; shared-tmp
288 exposes host /tmp and is not needed for ordinary temporary files or IPC.
289 - add mcp-fs vcs-log for Git, SVN, CVS and Mercurial, reusing bounded
290 output and dedicated permission actions; SVN log receives network
291 and SSH-agent grants alongside CVS operations.
292 mcp-webbrowser prefers any JavaScript in the current tab, while the
293 independent origin dimension remains scoped to the current origin.
294 - log mcp-http requests with their method and a sanitized URL preview;
295 identify mcp-http/$VERSION in User-Agent unless overridden by the caller.
296 Allow generic key=value context in the shared mcp_log_request formatter.
297 - silently treat invalid saved permission-rule files as empty, prompting
298 instead of aborting broker startup; subsequent saves replace the old file.
299 - add mcp-http for arbitrary HTTP methods with URL-scoped approvals,
300 caller-managed cookie jars, bounded bodies and text grep/regex/substitution.
301 Disable redirects, retries and proxies; verify HTTPS certificates.
302 - derive browser permission origins from reported URLs, not a new
303 userscript field; keep older browser clients able to execute with
304 origin-scoped permissions.
305 - accept compatible browser-protocol minor versions; return empty
306 operation discovery for 1.0 clients instead of disconnecting them.
307 Direct rule saves no longer perform semantic validation.
308 - replace special-case subject, origin and workdir permission scopes with
309 named dimensions: metadata-driven prompts, generic match.NAME rule keys,
310 and engine-enforced matcher choices. Reject old request and rule fields;
311 no conversion or backward-compatible rule loading.
312 - preserve selected origin scopes when external permission helpers
313 forward persistent decisions through native MCP elicitation.
314 - add origin-scoped MCP permission rules, selectable independently of
315 code/tab scopes; mcp-webbrowser derives browser origins for
316 JavaScript and tab operations, with exact, any-port and any-origin
317 choices. Existing rules without origins continue to match all origins.
318 - use POSIX::uname instead of nonportable hostname -f for the XPCSE
319 browser nickname, consistent with HTTP URL wildcard host selection.
320 - make form helper test run via explicit ./ path, avoid early HTTP
321 timer races, and test filesystem discovery with optional tools absent.
322 - report browser protocol rejections through bounded WebSocket close
323 reasons; show abnormal disconnects in the userscript console and toast.
324 - document browser wire-protocol minor-version compatibility: accept
325 compatible older and newer clients without breaking base functionality.
326 - remove the obsolete private stdio permission-result bridge from
327 mcp-multibroker; use ordinary form elicitation.
328 - add per-tab operation discovery and calls to mcp-webbrowser, with
329 per-tab routing, ordinary MCP permissions and browser protocol 1.1;
330 the userscript initially advertises no extra operations.
331 - make the unsandboxed-warning test tolerate diagnostic output from
332 non-GNU utility probes (FreeBSD and BusyBox).
333 - add mcp-imap with one named password-authenticated account per instance,
334 bounded UID search, MIME reads, explicit mailbox/message mutations,
335 UIDPLUS-only targeted expunge, forked worker and MCP permissions.
336 - propagate XPCSE save response ETags back to Vim session metadata;
337 make stale upload HTTP status an editor error.
338 - require GNU sed in worker tool discovery; report missing-Perl diagnostics in tests.
339 - xpcse: forward Vim's :write! flag through mcp-vim to browser
340 uploads, without changing upload behavior yet.
341 - recommend rather than require WebSocket modules: only mcp-vim and
342 mcp-webbrowser use them; mcp-vim loads them only for browser clients,
343 and tests skip optional WebSocket coverage when unavailable.
344
345 0.65 Fri 23 Oct 2026 22:41:32 CEST
346 - fix mcp-webbrowser userscript title indicator duplicating prefixes on empty titles.
347 - use built scripts in make test PATH, avoiding source shebangs and
348 accidentally installed helpers in rule management tests.
349 - clarify browser execute code wrapper and reject function/symbol return
350 values instead of silently converting them to null.
351 - fix many bugs in the testsuite.
352
353 0.62 Thu 22 Oct 2026 13:32:52 CEST
354 - INCOMPATIBLE API CHANGE: mcp_getoptions now returns a hash reference instead of
355 a key/value list.
356 - Simple accepts server_name/server_version independently of the local
357 instance name, leaving server_info as an unmodified protocol override.
358 - query multibroker children in parallel for tool and broker discovery,
359 preserving tool order and returning partial results after 15 seconds
360 instead of blocking on an unresponsive child.
361 - accept a missing trailing slash on HTTP MCP endpoint URLs, working
362 around Claude's MCP connector wrongly dropping it from the configured URL,
363 thus corrupting it.
364 - allow omitted ports in reverse extension URLs, defaulting to port 80.
365 - fix MCP client/server version fields serialized as JSON numbers in 0.61.
366
367 0.61 Thu 22 Oct 2026 08:57:42 CEST
368 - resolve bind hostnames via AnyEvent::Socket instead of Socket::getaddrinfo.
369 - honor user-selected file permissions and preserve them across replacements.
370 - fix permission test fixture grants.
371 - fix activity log timestamp formatting on older perl versions.
372 - correct multibroker test tool count (including meta-instructions).
373 - fix perl 5.12 syntax errors in mcp-fs and mcp-vim.
374
375 0.6 Wed 21 Oct 2026 20:43:20 CEST
376 - 34k LOC of pure llm madness. but seems to work. yay.
377
378 0.0 Sat 03 Oct 2026 07:29:39 CEST
379 - original version, an AnyEvent::HTTP clone.