Repository navigation
Conversation
teknium1
left a comment
There was a problem hiding this comment.
Thanks for adding native macOS MCP coverage through the existing catalog path.
Problems
optional-mcps/apple-{mail,notes,numbers,photos}/manifest.yamluses barenpx -y <package>arguments (for exampleapple-mail:24). Current catalog policy requires pinned transport details and says MCPs are never auto-updated (hermes_cli/mcp_catalog.py:13-15), while the security-audit test documents that bare npx packages resolvelatestand are not auditable (tests/hermes_cli/test_security_audit.py:76-78). Pin each package to the exact version validated on macOS.apple-maildocuments destructive mail operations but has notools.default_enabled. If probing fails, the installer intentionally writes no filter and all tools become enabled later (hermes_cli/mcp_catalog.py:554-583); non-TTY installs do the same (:604-615). Add a read-only default allow-list so the advertised safe pruning also holds on those paths.
Suggested changes
- Use versioned npx package specs and add a catalog regression test for pinned/auditable npx arguments.
- Add conservative default tool lists for mutation-capable entries.
Automated hermes-sweeper review.
| auth: | ||
| type: none | ||
|
|
||
| post_install: | |
There was a problem hiding this comment.
Please pin this npx package to the exact macOS-validated version (and do the same for the other three manifests). Bare npx packages resolve latest at runtime, contrary to the catalog's no-auto-update contract, and current MCP dependency auditing intentionally cannot identify unversioned packages.
| Requires macOS — the server controls Apple Mail via AppleScript and will | ||
| prompt for Automation access to Mail on first use. It exposes send / reply / | ||
| forward / delete / move tools that act on your real mailbox; the install-time | ||
| checklist lets you prune those if you want a read-only surface. |
There was a problem hiding this comment.
Please add tools.default_enabled containing only the intended read-only tools. With no manifest default, a probe failure or non-TTY install writes no filter and enables every tool later (hermes_cli/mcp_catalog.py:554-583,604-615), including the send/delete/move operations documented below.
|
Both review points addressed in af7101d:
|
…s, photos) Host: robs-work-mbpromax
…ists Address hermes-sweeper review on NousResearch#51466: - Pin all four npx packages to the exact macOS-validated versions (apple-mail-mcp@2.8.6, apple-notes-mcp@2.5.12, apple-numbers-mcp@1.1.7, apple-photos-mcp@2.1.0) per the catalog's no-auto-update policy; bare specs resolve 'latest' and are invisible to the security audit. Pins satisfy the catalog-wide exact-pin enforcement landed in 9df5f87. - Add tools.default_enabled read-only allow-lists to all four manifests so a failed tool probe or non-TTY install yields a safe, non-mutating surface (mail: browse/search/read/diagnostics only; notes/numbers: reads; photos: reads — its write tools are additionally env-gated server-side). - Update post_install texts to describe the read-only default posture. Host: robs-work-mbpromax
af7101d to
503a31e
Compare
|
Rebased onto current main — the branch had gone conflicting after 9df5f87 (catalog-wide exact-pin enforcement) landed. Since that commit ships a stricter version of the regression test I'd added (it also rejects dist-tags and ranges), I dropped mine in favor of yours; the four pinned manifests pass |
…eases The pins added in 503a31e have aged out while this PR was in review: apple-mail-mcp 2.8.6 -> 2.9.1 apple-notes-mcp 2.5.12 -> 2.6.11 apple-numbers-mcp 1.1.7 -> 1.1.10 apple-photos-mcp 2.1.0 -> 2.1.5 The mail pin is the one that matters: 2.8.6 predates 2.8.16, which fixed an IMAP socket leak where dropPool left ESTABLISHED connections behind and eventually tripped Gmail's per-account simultaneous-connection cap. Merging the old pin would have shipped that to every Hermes user who enabled the entry. Each version was validated on macOS before pinning: `npx -y <pkg>@<ver>` boots, completes an MCP initialize handshake reporting the matching serverInfo version, and returns a full tools/list with every tool described (mail 50, notes 36, numbers 26, photos 21). The read-only `tools.default_enabled` allow-lists are unchanged and were re-verified against the new tool surfaces — every allow-listed name still resolves in the version now pinned. New tools added since the old pins are excluded by default, which is the intended behavior of a positive allow-list. Host: robs-work-mbpromax
|
Refreshed the version pins in 92f0b20 — the ones from 503a31e have aged out during review:
The mail pin is the one worth flagging: 2.8.6 predates 2.8.16, which fixed an IMAP socket leak where Validation for each new pin, on macOS: The read-only
Happy to re-pin again if this sits longer — just say the word rather than merging a stale pin. |
2.6.11 predates a silent data-loss fix in export-notes-json: notes sharing an exact title collapsed to one repeated note, with the others absent and no error or count mismatch. Verified on a 359-note library — 2.6.11 exported 359 entries carrying only 351 distinct ids (8 notes lost); 2.6.12 exports 359 for 359. Validated on macOS per catalog policy: npx -y apple-notes-mcp@2.6.12 boots, completes an MCP initialize handshake reporting serverInfo.version 2.6.12, and returns 36 tools each carrying a description. All 20 tools.default_enabled entries still resolve against the new surface, so no allow-listed name went stale; the 16 tools outside the allow-list stay disabled by design. Host: robs-homeoffice-mbpromax
|
Re-pinned This one is worth flagging rather than treating as routine churn, same as the mail pin last time: 2.6.11 predates a silent data-loss fix. Measured on a real 359-note library:
Merging the old pin would have shipped that to anyone enabling the entry. Validation for the new pin, on macOS, per the catalog's "version validated on macOS" policy: The read-only
Net diff is still the four manifests only. Happy to re-pin again if this sits longer — just say the word rather than merging a stale pin. |
apple-mail-mcp 2.9.1 -> 2.10.3 apple-notes-mcp 2.6.12 -> 2.6.13 apple-numbers-mcp 1.1.10 -> 1.1.11 apple-photos-mcp 2.1.5 -> 2.1.6 The mail pin is the one worth flagging: 2.9.1 predates 2.10.2, which floors fast-uri and ip-address. Both are inlined into the shipped bundle and carried high-severity advisories (GHSA-7p8r-x3mc-p8w7, GHSA-mwp4-54f8-5fhr), so merging as-pinned would have shipped them. Validated on macOS per catalog policy: npx -y <pkg>@<ver> boots, completes an MCP initialize handshake reporting the matching serverInfo.version, and returns a full tools/list with every tool carrying a description — mail 50, notes 36, numbers 26, photos 21. tools.default_enabled is unchanged in all four. Every allow-listed name still resolves against the new surfaces (18/20/7/13), so nothing went stale across the bump, and no newly added tool was pulled into a default surface. tests/hermes_cli/test_mcp_catalog.py and test_security_audit.py pass (65). Host: robs-homeoffice-mbpromax
|
Refreshed all four pins — the previous set has aged out during review.
The mail pin is the one that matters.
Merging the old pin would have shipped both to anyone who enabled the entry, so this is a correctness fix rather than routine version churn. (The cause is worth knowing if you carry similar overrides: the repo's own The other three are documentation-accuracy releases from a full audit of every doc surface against the live tool inventory — notably a Validation for each new pin, on macOS, per the catalog's "version validated on macOS" policy:
Net diff remains the four manifests only. Happy to re-pin again if this sits longer — just say the word rather than merging a stale pin. |
apple-mail-mcp 2.10.3 -> 2.10.4 apple-notes-mcp 2.6.13 -> 2.6.14 apple-numbers-mcp 1.1.11 -> 1.1.12 apple-photos-mcp 2.1.6 -> 2.1.7 These clear every open advisory across the four servers: fast-uri (GHSA-7p8r-x3mc-p8w7, high), ip-address (GHSA-mwp4-54f8-5fhr, high, + two moderate), hono (GHSA-8j4g-w8fx-2239) and postcss. fast-uri is inlined into the shipped bundles, so the earlier pins carried it. pnpm audit now reports no known vulnerabilities in all four. Validated on macOS per catalog policy: each version boots under npx, completes an MCP initialize handshake reporting the matching serverInfo.version, and returns a full tools/list with every tool described — 50/36/26/21, unchanged. tools.default_enabled is unchanged and every allow-listed name still resolves. tests/hermes_cli/test_mcp_catalog.py + test_security_audit.py pass (65). Host: robs-homeoffice-mbpromax
|
Re-pinned once more — these are security releases, so worth flagging rather than letting the earlier pins ride.
Between them these clear every open advisory across all four servers —
If you carry similar transitive overrides, the
Validation per the catalog's "version validated on macOS" policy, for each new pin:
|
…p detection fix 1.1.12 predates 1.1.13, which fixes a macOS-visible defect this manifest's own post_install text depends on: doctor reported "Numbers.app not found" on every Mac that had taken Apple's 2026 rename, because the check tested the hard-coded /Applications/Numbers.app path. The AppleScript formula and formatting tools therefore looked unavailable on an up-to-date machine -- exactly the surface post_install tells users to enable. Deliberately NOT bumped to 1.1.14 (latest). 1.1.14 is a dependency-only Dependabot bump published today, so it buys nothing here and is strictly worse against the catalog's 2-week pin-age rule. Same reasoning leaves the other three pins alone: apple-mail-mcp@2.10.4, apple-notes-mcp@2.6.14 and apple-photos-mcp@2.1.7 already carry every security and correctness fix, and their newer releases are deps-only. Validated 1.1.13 per catalog policy: npm-installed the published artifact, drove an MCP initialize handshake (serverInfo.version == 1.1.13, protocolVersion 2025-06-18), and confirmed tools/list returns the full 26-tool surface. Re-checked every tools.default_enabled entry against that surface -- all 7 resolve, none is mutating, and the 19 write/format tools stay disabled. tests/hermes_cli/test_mcp_catalog.py: 39 passed. Host: robs-work-mbpromax
|
Re-pinned The one pin change
The other three are unchanged — Validated 1.1.13 per catalog policy: installed the published artifact, drove an MCP The tension: I have been violating your 2-week pin-age rule
The reason it kept happening is that the rule and the security posture are in direct conflict for these four packages right now. Newest release that is ≥14 days old today, versus what it would ship:
There is no version of any of the four that is both ≥14 days old and free of known advisories — the fixes landed 2026-08-03/04. Strict compliance today means knowingly shipping high-severity vulnerabilities in the bundle; compliance-by-waiting means the pins go stale again the moment the next fix lands. I am not going to resolve that unilaterally in your repo, so: how do you want it handled? Three options I can see, happy to implement whichever you pick (or something else):
My preference is 1, falling back to 3. One process note either way: these have now been re-pinned four times across three weeks of review, and each round has been a real fix rather than churn — the 08-01 round caught a pin predating the Gmail connection-cap fix, 08-04 caught one predating two high advisories, this one catches the Numbers.app detection bug. That pattern is a symptom of the pins aging faster than review, so whichever option you choose, it is worth deciding it before merge rather than after. |
get-mail-stats is in this entry's default_enabled allow-list, and on 2.10.4 it fails on every call path for anyone with IMAP configured: scoped calls are rejected client-side with -32602 (the tool emits a field its advertised outputSchema didn't enumerate, and a bare zod shape renders as additionalProperties:false), unscoped calls time out because the all-accounts fan-out counted accounts sequentially. Both fixed in 2.10.6 (sweetrb/apple-mail-mcp#135). Validated on macOS per catalog policy: npx -y apple-mail-mcp@2.10.6 completes the MCP initialize handshake with serverInfo.version 2.10.6, tools/list returns all 50 tools each with a description, and all 16 default_enabled entries still resolve against the new surface (no renames). Newly added tools are left out of the allow-list deliberately. Host: robs-work-mbpromax
|
Re-pinned
Both fixed in 2.10.6 (sweetrb/apple-mail-mcp#135, reported by a user hitting it on a four-account setup). Since the entry advertises Validated on macOS per the catalog policy before re-pinning: The other three pins ( Still open from my last comment: the ≥2-weeks-old pin rule in |
…ot churn apple-mail 2.10.6 -> 2.10.8, apple-notes 2.6.14 -> 2.6.16, apple-numbers 1.1.13 -> 1.1.15, apple-photos 2.1.7 -> 2.1.9. Every bump fixes a defect in a tool this entry's own default_enabled allow-list advertises: - All four: every tool advertised outputSchema additionalProperties:false, so any handler emitting an undeclared key had its correct result rejected client-side with -32602. Latent in notes/numbers/photos; not latent in mail, where it broke get-mail-stats outright. - apple-mail 2.10.7: IMAP accounts were deduplicated by LABEL, so one mailbox declared under two nicknames was counted twice -- get-unread-count reported 23 against a true 15. Both tools are allow-listed here. - apple-mail 2.10.8: get-mail-stats with no account could still die as a bare -32001 returning nothing, because the per-account budget never covered the Mail.app account enumeration that precedes the fan-out. The deps-only releases in between (notes 2.6.15, numbers 1.1.14, photos 2.1.8) are deliberately skipped -- a release landing on npm is not by itself a reason to move a pin. Validated each new pin on macOS per catalog policy: npx -y <pkg>@<ver> boots, initialize reports the matching serverInfo.version, and tools/list returns the full surface with every tool described (50/36/26/21, unchanged). All 58 default_enabled entries re-verified against the new surfaces -- every one still resolves, and newly added tools are left out. tests/hermes_cli/test_mcp_catalog.py (39) and test_security_audit.py (26) pass. Host: robs-work-mbpromax
|
Re-pinned all four in
All four — advertised output schemas rejected undeclared keys. The MCP client validates
Deliberately skipped: Validation per the catalog's "version validated on macOS" policy, for each new pin:
Still open from my earlier comments: the ≥2-weeks-old pin rule ( |
…s the call 2.10.8's overall deadline for get-mail-stats did not cover time the call spent queued behind other tool calls, so a concurrent caller could see a call outlive the deadline entirely and report complete data (measured: 15.9s against a 6s deadline). get-mail-stats is in this entry's own default_enabled allow-list, so the stale pin ships that to anyone enabling it. 2.10.9 anchors the deadline at request arrival. The other three pins are unchanged and still current. Host: robs-work-mbpromax
|
Re-pinned
The other three pins are unchanged and still current releases — Validated on macOS per the catalog's "version validated on macOS" policy:
Still open from my earlier comments: the ≥2-weeks-old pin rule ( |
… shape changed
apple-notes-mcp 2.6.16 -> 2.7.0. Flagging rather than quietly bumping,
because this one changes a tool in this entry's own default_enabled
allow-list rather than fixing a defect behind it.
`list-notes` now returns `notes: Array<{title, id}>` where it returned
`string[]`. The reason is an identity bug: AppleScript's `note "<name>"`
specifier resolves a duplicated title to the same one note every time, so
anything that listed titles and then re-resolved each one by title silently
fetched one note twice and never reached the other. Ids in the listing close
that. The human-readable line is now ` - <title> [id: <id>]`, matching
`search-notes`.
Validated on macOS per catalog policy: `npx -y apple-notes-mcp@2.7.0`,
MCP initialize handshake returns serverInfo.version 2.7.0, tools/list
returns all 36 tools, and all 20 default_enabled entries still resolve —
no renames, nothing dropped. Guard tests pass (tests/hermes_cli/
test_mcp_catalog.py 39 passed, tests/ci/test_classify_changes.py 21 passed).
default_enabled is unchanged: 2.7.0 adds no tools, and widening this entry's
default surface isn't mine to decide.
Host: robs-homeoffice-mbpromax
|
Pin refresh, 2026-09-23. notes This is the same carve-out as
Changes outside the default surface are listed in the manifest comment: the readback entity-decoding fix (#211), and fail-closed Recently Deleted guards on Validated on macOS per catalog policy: |
get-note-content (default_enabled) failed outright on notes with a large embedded image; 2.9.12 raises the AppleScript output cap from 64MB to 512MB so the read succeeds. Validated: initialize handshake reports 2.9.12, 77 tools, all 20 default_enabled entries resolve. test_mcp_catalog.py 39/39.
|
Re-pinned `apple-notes-mcp` `2.8.49` → `2.9.12`: `get-note-content` (a Validated on macOS: mail ( |
|
Re-checked at head One statement in the manifest is not accurate, and I'd fix it before merge.
That is a behaviour change on the default surface, not an additive JSON field. Cross-checking the manifest's own This doesn't argue against the pin; 2.9.25 is a fix worth having. It argues against the manifest asserting no other default-surface behaviour changed in that range, because that's the sentence a future reader will rely on when deciding whether a future bump is safe. Second, smaller: the notes for numbers I could not verify the pre-flight logs (they're on your side, not in the repo). I also did not run |
…eleases Addresses review on NousResearch#51466. - apple-notes: drop the claim that nothing else in 2.9.1-2.9.30 touches a default_enabled tool. 2.9.25 (NousResearch#185, NousResearch#190) changes error classification on seven default-enabled read tools. That is a behaviour change, in the safer direction. It is newer than the 2.9.12 pin, so the pinned surface is unaffected, and a future bump past it must account for it. Also notes 2.9.27's change to the opt-in search-notes wordCount. - apple-numbers 1.2.3 / apple-photos 2.1.13: described as declined under the defect-only carve-out, not as cosmetic. Both carry a transitive qs security override (numbers#77, photos#84) and hono/js-yaml floors (numbers#80, photos#85), and photos 2.1.13 adds an opt-in SWR cache. - apple-mail: 2.19.7 and 2.19.9 do touch default_enabled tools (additively), 2.19.12 was unlisted, and mail#246 is closed, not reopened. No pin changes. Host: robs-work-mbpromax
|
@Enough1122, thank you for pulling the 2.9.25 CHANGELOG entry and checking it against the manifest's own
New head: |
Checked the new head The 2.9.25 claim is gone — "nothing else in 2.9.1–2.9.30 touches a default_enabled tool as a defect fix" no longer appears. In its place the new "Newer than this pin, so NOT in the pinned surface" block does the useful thing: it names 2.9.25 as a behaviour change on the default surface, cites #185 and #190, and lists the seven affected default-enabled tools. That is exactly the sentence a future bump decision needs, and it's now scoped to the pin rather than asserting a negative about a range. You also caught 2.9.27's opt-in On the 2.9.25 decision itself: keeping the pin at 2.9.12 and taking 2.9.25 in a separately validated bump is the right call. 2.9.25 does qualify under the carve-out, but "allows" and "requires" are different, and taking a behaviour change on seven default tools in the same commit that fixes a different thing would make both harder to review. One note for the manifest's own consistency: the notes block still reads Nothing else from me. This thread looks ready. |
apple-mail: 2.19.15 (mailbox-name NFC/NFD matching) and 2.19.16 (iCloud \Deleted-but-never-expunged messages fabricating search totals) both fix defects in default_enabled tools (list-messages/search-messages/get-thread), sweetrb/apple-mail-mcp#246. apple-notes: 2.9.25 fixes error-code misclassification (note titles containing words like "timeout"/"denied" were misread as connection/ permission failures) across 7 default_enabled tools, sweetrb/apple-notes-mcp NousResearch#185/NousResearch#190. Pinned straight to 2.9.30 (current npm), the rest of the range being additive fields, docs, or non-default-enabled tools. Both validated on macOS: initialize handshake confirms serverInfo.version, tools/list count, and all default_enabled entries resolve; 39/39 test_mcp_catalog.py pass.
|
Re-pinned two of the four servers (validated on macOS today):
apple-numbers-mcp ( Both re-pins validated: MCP |
|
Re-verified at The two held-back pins are the evidence that the carve-out is real. "cosmetic-only" and "a fix gated behind an off-by-default flag" are exactly the two categories the rule excludes, and you checked npm-current (1.2.3, 2.1.13) rather than assuming the pins were still current. If the reason for not bumping were "I did not look", the comment would read differently; naming the specific disqualifying property of each is what makes it checkable.
Two prior behaviour changes are documented in the same style, which is what makes these blocks useful rather than decorative. The scope accounting is the part I would keep an eye on, since it is where a re-pin usually goes wrong. "20 default_enabled entries, 51 tools" and "77 tools, all 20 default_enabled entries resolve" for the two versions, with 11 tools added since 2.8.49 and none removed — and One observation, not a request: the notes changelog block is now long enough that the version history is doing real work — it is what a future bump will be diffed against. Keeping the per-version reasoning in the manifest is the right place for it (a separate file would drift), but it does mean the block grows monotonically. If it ever gets hard to find the current version's justification in, a Nothing outstanding from me. Your carve-out reasoning holds in both directions — the two bumped servers clear it, the two held-back ones demonstrably do not. I am not a maintainer and my review is not maintainer approval. |
…head (apple-mail-mcp 2.19.14->2.19.16, apple-notes-mcp 2.9.12->2.9.30)
apple-mail 2.19.17/2.19.18 fix default_enabled tools (list-messages, search-messages, get-thread) against real huge iCloud mailboxes (sweetrb/apple-mail-mcp#256): whole-mailbox SEARCH failing outright above ~250k messages, and a page silently coming back short when imapflow can't parse a deeply-nested FETCH response. apple-notes 2.9.31 fixes get-note-content (default_enabled) for clients that only see a tool result's text, not structuredContent -- contentHash and related fields now also appear as a text block, unblocking every guarded write gated on expectedContentHash for those clients (sweetrb/apple-notes-mcp#264). Validated on macOS: both MCP initialize handshakes report the pinned serverInfo.version, tools/list is unchanged in count from the prior pin, every default_enabled entry resolves, and test_mcp_catalog.py is 39/39. Host: robs-work-mbpromax
|
Re-pinned two of the four servers again (validated on macOS today, commit
Validated: MCP |
…51466 head apple-mail 2.19.18: huge-mailbox list/search paging + failed-SEARCH error surfacing (sweetrb/apple-mail-mcp#256, @j5pu); apple-notes 2.9.31: revision fields now also in the text block for text-only clients (sweetrb/apple-notes-mcp#264). numbers/photos already current at that head.
Fixes a follow-up defect in default_enabled tools list-messages/ search-messages/get-thread (sweetrb/apple-mail-mcp#256): a deep unfiltered offset on a large mailbox still cost more the deeper it went even after 2.19.17/18. 2.19.19 computes the page's sequence range directly instead of scanning every skipped message. Validated on macOS: initialize handshake reports serverInfo.version 2.19.19, tools/list returns 52 tools, all 18 default_enabled entries resolve; test_mcp_catalog.py 39/39. Host: robs-work-mbpromax
|
Re-pinned apple-mail-mcp Validated on macOS: |
Fixes two defects in default_enabled attachment tools (sweetrb/apple-mail-mcp#270): list-attachments reported each attachment's base64-encoded size instead of its decoded byte count (a 29-byte file listed as 40), and fetch-attachment over IMAP checked its 25 MiB limit against that encoded size, refusing base64 attachments of ~19-25 MiB before download. Riding along: bundled fast-uri (high) and ip-address (medium) advisory floors from 2.19.20/2.19.22; 2.19.21 and 2.20.0 touch only disabled send/mutation tools. Validated on macOS: initialize handshake reports serverInfo.version 2.20.1, tools/list returns 52 tools (all described, unchanged from 2.19.19), all 18 default_enabled entries resolve; test_mcp_catalog.py 39/39 on this branch and 42/42 against current main. Host: robs-work-mbpromax
|
Re-pinned apple-mail-mcp Validated on macOS: |
|
| Requires macOS, Python 3.11+, and Full Disk Access for the process that | ||
| launches Hermes — the Photos library database lives in a protected location. |
There was a problem hiding this comment.
The setup text tells users to give Full Disk Access to the process that launches Hermes. If they grant access only to that launcher, the Photos tools can still be denied access: Hermes starts the server through npx, and the catalog’s Notes guidance says macOS checks the grant on the Node binary. Tell users which executable needs the grant.
How this was verified: The Photos instructions name the Hermes launcher, while the catalog’s Node-based permission guidance identifies the Node binary as the checked process.
Prompt To Fix With AI
This is a comment left during a code review.
Path: optional-mcps/apple-photos/manifest.yaml
Line: 76-77
Comment:
**Photos access stays denied**
The setup text tells users to give Full Disk Access to the process that launches Hermes. If they grant access only to that launcher, the Photos tools can still be denied access: Hermes starts the server through `npx`, and the catalog’s Notes guidance says macOS checks the grant on the Node binary. Tell users which executable needs the grant.
**How this was verified:** The Photos instructions name the Hermes launcher, while the catalog’s Node-based permission guidance identifies the Node binary as the checked process.
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.There was a problem hiding this comment.
Fixed in 651163e. "The Node binary" is only part of the answer, though: macOS checks Full Disk Access on the responsible process. When Hermes runs from a terminal (the usual case), the terminal app is responsible for everything it spawns, npx and node included, so granting Terminal/iTerm is correct there and a grant on node alone would not be what is checked. The Node binary becomes the checked identity only when the launcher disclaims responsibility (Claude Desktop does; that is the case the apple-notes #220 note describes) or there is no terminal in the chain. post_install now names both cases: grant the terminal, or grant the path from realpath "$(command -v node)", noting that a version-managed or ad-hoc-signed Node loses that grant on upgrade. It also says how to read the checked binary (responsible_path) from the TCC log. The apple-notes #220 note is reworded so the catalog no longer says the Node binary is always the one checked, and apple-notes' post_install carries the same guidance for its optional FDA reads.
| # On macOS, `npx -y apple-notes-mcp@2.9.30`: | ||
| # - completes an MCP `initialize` handshake reporting serverInfo.version | ||
| # 2.9.30 — i.e. the bytes npx resolved are the bytes pinned here; | ||
| # - returns a full `tools/list` of 83 tools, every one carrying a description; | ||
| # - resolves all 20 `tools.default_enabled` entries below against that | ||
| # list, so no allow-listed name went stale across the bump. |
There was a problem hiding this comment.
Notes checks cover older version
The recorded macOS checks ran against apple-notes-mcp@2.9.30, but the manifest launches apple-notes-mcp@2.9.31. Those results do not show whether the version users install starts or exposes the listed tools. Run the checks against the pinned version and update the record.
Prompt To Fix With AI
This is a comment left during a code review.
Path: optional-mcps/apple-notes/manifest.yaml
Line: 17-22
Comment:
**Notes checks cover older version**
The recorded macOS checks ran against `apple-notes-mcp@2.9.30`, but the manifest launches `apple-notes-mcp@2.9.31`. Those results do not show whether the version users install starts or exposes the listed tools. Run the checks against the pinned version and update the record.
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.There was a problem hiding this comment.
Fixed in 651163e. Re-ran the checks against 2.9.31 exactly: serverInfo.version 2.9.31, 83 tools, all described, 20/20 default_enabled entries resolve. In the same pass the pin moved to 2.9.32, because 2.9.31 inlines fast-uri 3.1.6, the only 3.x release affected by GHSA-58mr-gqgx-xq4g (high, reachable via ajv on every tool call). The 2.9.32 bundle diff is confined to that module. The validation record now names 2.9.32 (same results: 83 tools, 20/20) and mentions both runs. apple-photos (2.1.12 -> 2.1.14) and apple-numbers (1.2.2 -> 1.2.4) had the same bundled fast-uri 3.1.6 and were re-pinned and validated the same way.
…fast-uri GHSA-58mr-gqgx-xq4g Full Disk Access (review feedback): macOS checks the grant on the responsible process, not on whatever executable happens to read the file. Under a terminal - the usual way Hermes runs - the terminal app is responsible for npx/node and is what needs the grant. Launched any other way (GUI wrapper, launchd service), nothing passes a terminal's grant down and the check can land on the node binary npx runs. apple-photos' post_install now names both cases, how to find the real node path (realpath "$(command -v node)"), that version-managed or ad-hoc-signed Node loses the grant on upgrade, and how to read the authoritative answer from the TCC log. apple-notes gets the same guidance for its optional FDA reads, and its NousResearch#220 history note no longer says the Node binary is always the one checked (that is Claude Desktop's case, whose launcher disclaims responsibility). apple-mail (no FDA) and apple-numbers (no FDA claim) already agree. Re-pins (security footing, as with the earlier fast-uri re-pins): apple-notes 2.9.31 -> 2.9.32, apple-photos 2.1.12 -> 2.1.14, apple-numbers 1.2.2 -> 1.2.4. Each old pin inlines fast-uri 3.1.6 into build/index.js - the only 3.x release affected by GHSA-58mr-gqgx-xq4g (high), reachable via ajv on every tool call. Each new pin bundles 3.1.8, and its build/index.js diff from the preceding release is confined to the inlined fast-uri module. apple-mail already carries the fix (2.19.20). Later releases are declined in the manifests with reasons. Validated on macOS (npx -y <pkg>@<ver>, initialize + tools/list only): apple-notes 2.9.31 and 2.9.32 both report their own serverInfo.version, 83 tools, all described, all 20 default_enabled resolve; apple-photos 2.1.14: 21 tools, 13/13; apple-numbers 1.2.4: 26 tools, 6/6. test_mcp_catalog.py 39/39 on this branch and 42/42 against current main. Host: robs-work-mbpromax
Fixes two defects in default_enabled tools, both on huge iCloud mailboxes. By-id reads (get-message, get-thread's seed lookup, the attachment tools' source reads) on a numeric id that missed fell back to an unbounded every-mailbox AppleScript scan taking 21-53 s and timing out (sweetrb/apple-mail-mcp#270, fixed in 2.20.4 via NousResearch#278): an explicit account+mailbox miss now returns not-found immediately and the unscoped fallback is bounded (APPLE_MAIL_MAX_BYID_SCAN_MAILBOX, 9 s budget). And one slow IMAP search-messages held the serialized call queue for 130+ s so every following call timed out behind it (NousResearch#276, fixed in 2.20.5 via NousResearch#279): cancellation is honoured and a per-call deadline (APPLE_MAIL_MCP_SEARCH_DEADLINE_MS, default 45 s) returns partial results with timedOutMailboxes. Riding along: 2.20.2 Dependabot bump (MCP SDK 1.31.0, nodemailer, lint tooling), 2.20.3 15 s fail-fast on by-id reads, 2.20.4 dev-only source-map-js floor. Validated on macOS: initialize handshake reports serverInfo.version 2.20.5, tools/list returns 52 tools (all described, unchanged from 2.20.1), all 18 default_enabled entries resolve; test_mcp_catalog.py 39/39 on this branch and 42/42 against current main. Host: robs-work-mbpromax
|
Re-pinned apple-mail-mcp Validated on macOS: |
What does this PR do?
Adds four macOS MCP servers to the
optional-mcps/catalog so Hermes users can install them withhermes mcp install <name>:.numbers) spreadsheetsAll four are published, MIT-licensed npm packages maintained under github.com/sweetrb, with CI on
macos-latest(Node 20 + 22). Each manifest is a plain stdio entry that launches the published package vianpx -y <pkg>— noinstall/clone step (per the npm/uvx note in the n8n manifest) andauth: none(everything is local). They already support Hermes today viahermes mcp add; this just makes them one-command installable from the catalog.Related Issue
None — new catalog entries.
Type of Change
Changes Made
optional-mcps/apple-mail/manifest.yamloptional-mcps/apple-notes/manifest.yamloptional-mcps/apple-numbers/manifest.yamloptional-mcps/apple-photos/manifest.yamlHow to Test
On macOS:
hermes mcp install apple-notes(orapple-mail/apple-numbers/apple-photos)npx -y apple-<app>-mcp. First use prompts for macOS Automation access (AppleScript);apple-photosadditionally needs Full Disk Access. Tools then load (e.g.apple-notes:create-note,search-notes,list-notes, …).Platforms tested: macOS (each server's own CI runs on
macos-latest, Node 20 + 22).apple-numbersandapple-photosuse a Python 3.11+ sidecar (numbers-parser/osxphotos) that bootstraps a local venv on first run.Notes
post_installcalls out.apple-mailexposes send/delete/move tools that act on the real mailbox; the install-time checklist lets users prune to a read-only surface. The others are read-mostly (apple-photosis read-only exceptexport).Happy to adjust naming, descriptions, or split into separate PRs if you'd prefer.