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

File Contents

# User Rev Content
1 root 1.2 Revision history for AnyEvent::MCP
2    
3 root 1.64 0.83 (unreleased)
4 root 1.86 - 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 root 1.85 - refuse mcp-imap mailbox DELETE when STATUS reports messages;
7     expunge first or explicitly pass force to delete a nonempty mailbox.
8 root 1.84 - 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 root 1.83 - 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 root 1.82 - 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 root 1.80 - 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 root 1.81 - 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 root 1.79 - 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 root 1.78 - 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 root 1.77 - 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 root 1.76 - 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 root 1.75 - 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 root 1.74 - 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 root 1.72 - 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 root 1.69 - 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 root 1.71 - 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 root 1.70 - 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 root 1.68 - 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 root 1.67 - 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 root 1.66 - log ordinary HTTP 404 responses at trace rather than warn,
107     including GET /; keep other HTTP rejection warnings.
108 root 1.73 - 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 root 1.65 - 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 root 1.64 - 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 root 1.63 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 root 1.62 - 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 root 1.60 - log rejected HTTP requests (status 400 and above) with method,
136     status and peer information, without leaking URL tokens; demote
137 root 1.61 ordinary connection/TLS errors to trace.
138 root 1.62 - 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 root 1.57 - 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 root 1.58 - format mcp-fs sandbox grants, tools, trusted configuration keys
146     and permission action classes as individually searchable POD items.
147 root 1.62 - 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 root 1.57
153 root 1.56 0.81 Thu 05 Nov 2026 04:51:59 CET
154 root 1.55 - 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 root 1.56 - 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 root 1.55 - 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 root 1.56 workdir IDs for identical logical paths across local and remote
173 root 1.55 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 root 1.53 0.8 Thu 05 Nov 2026 01:52:48 CET
180 root 1.49 - INCOMPATIBLE CHANGE: due to the added user management, existing
181     url tokens have been invalidated.
182 root 1.54 - limit distribution permission normalization to its staging
183     directory, and supply proper CPAN author and abstract metadata.
184 root 1.52 - 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 root 1.51 - 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 root 1.50 - 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 root 1.49 - 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 root 1.51 - defer outgoing mail submission research (mcp-smtp or mcp-imap)
200     in TODO.md.
201 root 1.48 - 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 root 1.47 - 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 root 1.46 - number the user management test consecutively as t/27_users.t.
224 root 1.45 - 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 root 1.44 - 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 root 1.43 - 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 root 1.42 - treat empty directory paths as "." in mcp-fs list, find, grep and
246     VCS cwd, without accepting empty filenames.
247 root 1.41 - 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 root 1.39 - 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 root 1.38 - 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 root 1.37 - 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 root 1.36 0.71 Fri 30 Oct 2026 18:01:51 CET
264 root 1.35 - make multibroker-spawned children ask for permissions through MCP,
265     independently of the multibroker's own permission prompt mode.
266 root 1.36 - 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 root 1.35
281 root 1.34 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 root 1.33 - 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 root 1.32 - 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 root 1.31 mcp-webbrowser prefers any JavaScript in the current tab, while the
293     independent origin dimension remains scoped to the current origin.
294 root 1.30 - 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 root 1.31 Allow generic key=value context in the shared mcp_log_request formatter.
297 root 1.29 - silently treat invalid saved permission-rule files as empty, prompting
298     instead of aborting broker startup; subsequent saves replace the old file.
299 root 1.30 - 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 root 1.29 Direct rule saves no longer perform semantic validation.
308 root 1.28 - 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 root 1.27 - preserve selected origin scopes when external permission helpers
313     forward persistent decisions through native MCP elicitation.
314 root 1.26 - add origin-scoped MCP permission rules, selectable independently of
315 root 1.30 code/tab scopes; mcp-webbrowser derives browser origins for
316 root 1.26 JavaScript and tab operations, with exact, any-port and any-origin
317     choices. Existing rules without origins continue to match all origins.
318 root 1.25 - 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 root 1.23 - 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 root 1.22 - 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 root 1.21 - 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 root 1.18 - xpcse: forward Vim's :write! flag through mcp-vim to browser
340     uploads, without changing upload behavior yet.
341 root 1.19 - 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 root 1.18
345 root 1.17 0.65 Fri 23 Oct 2026 22:41:32 CEST
346 root 1.14 - fix mcp-webbrowser userscript title indicator duplicating prefixes on empty titles.
347 root 1.17 - use built scripts in make test PATH, avoiding source shebangs and
348     accidentally installed helpers in rule management tests.
349 root 1.15 - clarify browser execute code wrapper and reject function/symbol return
350     values instead of silently converting them to null.
351 root 1.17 - fix many bugs in the testsuite.
352 root 1.13
353 root 1.12 0.62 Thu 22 Oct 2026 13:32:52 CEST
354 root 1.16 - INCOMPATIBLE API CHANGE: mcp_getoptions now returns a hash reference instead of
355     a key/value list.
356 root 1.11 - 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 root 1.8 - accept a missing trailing slash on HTTP MCP endpoint URLs, working
362 root 1.10 around Claude's MCP connector wrongly dropping it from the configured URL,
363 root 1.18 thus corrupting it.
364 root 1.7 - allow omitted ports in reverse extension URLs, defaulting to port 80.
365 root 1.9 - fix MCP client/server version fields serialized as JSON numbers in 0.61.
366 root 1.7
367 root 1.6 0.61 Thu 22 Oct 2026 08:57:42 CEST
368 root 1.5 - resolve bind hostnames via AnyEvent::Socket instead of Socket::getaddrinfo.
369 root 1.4 - 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 root 1.3 0.6 Wed 21 Oct 2026 20:43:20 CEST
376 root 1.2 - 34k LOC of pure llm madness. but seems to work. yay.
377 root 1.1
378     0.0 Sat 03 Oct 2026 07:29:39 CEST
379     - original version, an AnyEvent::HTTP clone.