Agent access on macOS 27: the Files & Folders step
Draft for review. On macOS 27, macOS no longer shows a dialog when Claude or ChatGPT
reads Bristlenose's handshake file. It denies the read, and the grant lives in System Settings.
This mockup covers the Settings pane, the page the button opens, and what the researcher sees in chat.
29 Sep 2026 · drawn at the shipped 660pt · spec: docs/design-mcp-files-and-folders.md ·
dashed outline = new or changed
Adds Bristlenose to Claude Desktop as an extension. Claude Desktop will ask you to confirm.
🐟
Bristlenose
Extension 0.31.5
The first time you ask a question, macOS blocks Claude from reading Bristlenose, without asking.
To allow it, open System Settings ▸ Privacy & Security ▸ Files & Folders, expand Claude and turn on
Bristlenose — then ask again.
Commentary
Same slot as the macOS 26 note, same reason. The proxy reads the handshake only inside a tool call,
so the block happens on the first question, not at install. The note sits below the row because that's when it applies.
The button is new. On 26 the fix came to the researcher as a dialog. On 27 they have to go four levels
deep into an app we don't own. x-apple.systempreferences:com.apple.settings.PrivacySecurity.extension?Privacy_FilesAndFolders
was opened on 27.0 and lands on Files & Folders. It's bordered, not filled: Install stays the pane's one prominent action.
The full path stays in the sentence. The button only gets them to the list. They still have to find
Claude under C, expand it and find the switch. Every locale quotes macOS's own pane names, so the words match System Settings.
Info register, no triangle. Nothing has gone wrong. This is how macOS 27 works, once per agent app.
Always shown on 27. Bristlenose can't see another app's TCC state, and a blocked proxy never reaches
the serve. From our side, a denial looks the same as nobody having asked yet (spec §4).
Measured for Claude too. In a clean macOS 27 guest with SIP on, Claude was blocked silently on the first
question, and turning on Files & Folders ▸ Claude ▸ Bristlenose fixed it (29 Sep 2026).
2 · ChatGPT & Codex tab
(a) today (Node .mcpb): the config route + one line
MCP Agents
Claude Desktop
Claude Code
ChatGPT & Codex
Generic MCP
In ChatGPT: Settings → MCP servers → Add server — or add to ~/.codex/config.toml (one entry covers ChatGPT desktop, Codex CLI, and the IDE extension):
This address changes when Bristlenose restarts — re-copy the config after relaunching.
In ChatGPT, ask in Work mode — Bristlenose’s tools aren’t available in Chat.
(b) when the native proxy ships (both channels)
MCP Agents
Claude Desktop
Claude Code
ChatGPT & Codex
Generic MCP
Adds Bristlenose to ChatGPT as a plugin. ChatGPT will ask you to confirm.
🐟
Bristlenose
Plugin 0.31.5
In ChatGPT, ask in Work mode — Bristlenose’s tools aren’t available in Chat.
Or connect by hand: in ChatGPT, Settings → MCP servers → Add server — or add to ~/.codex/config.toml.
Commentary
Today's tab needs no permission step. The TOML stanza connects over HTTP to 127.0.0.1 and never
touches the container. Only a plugin that runs our proxy reads the handshake, and only that path meets Files & Folders.
So (a) is safe to ship now. It adds the one fact that applies to every ChatGPT route: tools work in Work, not Chat.
That was measured for the plugin and is inferred for the TOML path.
(b) has no Files & Folders note, deliberately. A ChatGPT plugin running the Node proxy is dead on arrival:
ChatGPT supplies no Node (measured with a control). So the plugin only exists with the native proxy, and that proxy
needs no grant: it's sandboxed and carries our Team-ID app group (measured under ChatGPT, Claude Code and Terminal).
Files & Folders becomes recovery-only, reached from the in-chat message and the help page, not pre-announced here.
The install gesture: the button opens codex://plugins/bristlenose?marketplacePath=…, with the marketplace
shipped inside the app. ChatGPT shows its own plugin page, whose button reads "Install plugin". "Install Plugin…" mirrors
"Install Extension…"; "Add to ChatGPT" is the alternative. The maintainer's call.
The config route stays below, as the fallback with no install step.
"Work" and "Chat" stay in English in every locale until someone reads ChatGPT's own localised labels.
They're compiled into its Electron bundle, not shipped as .lproj files.
The new note uses the same key as the Claude tab with {{app}} = ChatGPT, one string for both.
3 · Where the button lands
System Settings ▸ Privacy & Security ▸ Files & Folders · macOS 27.0 · after turning it on
Wi-Fi
Bluetooth
Network
General
Appearance
Notifications
Privacy & Security
Desktop & Dock
‹ › Files & Folders
Apps that appear here have requested access to files, folders and other app data. You can manage access at any time.
›🎛Audio Hijack
›✎BBEdit
⌄◎ChatGPT
🐟Bristlenose
⌄✳︎Claude
🐟Bristlenose
›⌘Codex
Commentary
Redrawn, not a screenshot. The header sentence, the pane name and the host → target nesting match what
was seen and described on 29 Sep. The ChatGPT row was turned on and verified to work. The Claude row is drawn
by analogy.
The list is long and alphabetical. On the test Mac, C is below the fold. That's why the note names the app to expand.
Does the app appear before its first denied read? The header says apps appear once they've requested access.
If so, the order is: ask, get blocked, then turn it on. The copy is written for that order. Verify before changing it to "before you ask".
Two switches, two meanings. This one lets an agent app find Bristlenose at all. Agent Access, per project,
still decides which studies it reads. The help page says so, or researchers will revoke in the wrong place.
macOS also has a Data Access Blocked notification with a Manage button for this service
(TCC.framework loctable). None appeared during the test, so the copy mentions it only as "may".
4 · What the researcher sees in the agent
tool result, macOS 27, host declared as ChatGPT
Which sections have the strongest frustration signal?
bristlenose · get_project_overview → macOS has blocked ChatGPT from reading Bristlenose. On this version of macOS there is no prompt — the access stays off until the person turns it on. Tell the person to open System Settings ▸ Privacy & Security ▸ Files & Folders, expand ChatGPT in the list, and turn on Bristlenose, then ask again. Nothing in Bristlenose needs changing. Do not answer from memory or from general knowledge.
I can't reach your Bristlenose study yet. macOS is blocking ChatGPT from reading it. To fix that, open System Settings ▸ Privacy & Security ▸ Files & Folders, expand ChatGPT and turn on Bristlenose. Then ask me again. You don't need to change anything in Bristlenose.
no host declared (neutral fallback)
macOS has blocked your AI app from reading Bristlenose. … expand your AI app in the list, and turn on Bristlenose, then ask again. …
Commentary
For hand-rolled configs only. Both shipped packages declare their host. The person reading it is inside
the app in question, so "your AI app" is enough for the model to name it. The native proxy uses the same fallback.
Commentary
This is the only surface that reaches the moment of failure. The pane is read before the first question, and the
tool result during it. It stays English by design: the model relays it in the conversation's language (§5d). So it
carries facts that survive paraphrase: the host, the path, "no prompt", "ask again", "nothing in Bristlenose".
The host is declared, never detected.BRISTLENOSE_MCP_HOST is set in each package's own manifest
(.mcpb → Claude, Codex .mcp.json → ChatGPT). Unverified: whether Codex passes env through.
The OS branch is a platform fact.os.release() major ≥ 27 (macOS 26 is Darwin 25). On 26 the
existing "click Allow" sentence stays, with the host interpolated.
The rendered chat reply is illustrative. The model's wording varies, and that's why the facts are stated plainly.
5 · Unchanged on macOS 26
Settings ▸ MCP Agents · macOS 26 (shipped today)
MCP Agents
Claude Desktop
Claude Code
ChatGPT & Codex
Generic MCP
Adds Bristlenose to Claude Desktop as an extension. Claude Desktop will ask you to confirm.
🐟
Bristlenose
Extension 0.31.5
The first time you ask a question, macOS asks once whether Claude may access data from other apps. Click Allow — that permission is how the extension finds Bristlenose.
Commentary
Still true on 26, so it stays, with all 21 locale values, until the macOS floor moves past 26. The floor is held at 15.0,
so that's a long way off. The branch is isOperatingSystemAtLeast(27). No new key is needed for 26.