April 2026 - downstream view

Claude Anthropic news, April 2026, read from the one ship the roundups missed

Every April 2026 news roundup covered the same ten items: Opus 4.7, Claude Design, Cowork, Mythos Preview, Project Glasswing, the Claude Code Pro pricing test, an admitted quality stretch, the ACP upgrades, Haiku 4.5 region expansion, dynamic model discovery. This guide is about the eleventh. On April 20, 2026, a shipping Mac Claude client quietly adopted Claude Code's MCP server config shape byte-for-byte, so your existing Claude Code mcpServers block drops into ~/.fazm/mcp-servers.json and runs.

Download Fazm for Mac
M
Matthew Diakonov
11 min
4.9from early Fazm users
Source: MCPServerManager.swift and acp-bridge/src/index.ts
Shipped in Fazm 2.4.0 on April 20, 2026
Claude Code mcpServers config drops in unchanged

What every roundup covered

Opus 4.7 GAClaude DesignClaude CoworkMythos PreviewProject GlasswingClaude Code Pro pricing testAdmitted quality regressionACP v0.29.2Claude Haiku 4.5 region expansionDynamic model discovery

The anchor fact, on disk

The file lives at ~/.fazm/mcp-servers.json. The path is computed in MCPServerManager.swift at line 42, the directory is created on first save, and the Settings UI in SettingsPage.swift line 1841 surfaces the path verbatim with an Open-in-Finder shortcut. The JSON shape is the one sentence at the top of the file:

Format mirrors Claude Code's mcpServers: { "name": { "command": "...", "args": [...], "env": {...}, "enabled": true } }
MCPServerManager.swift
acp-bridge/src/index.ts

Where user servers meet built-in servers

The bridge builds one list per session. Built-in servers are pushed first in a fixed order; user entries are appended from ~/.fazm/mcp-servers.json. The merged list is emitted to the Swift side as an mcp_servers event and surfaced in Settings with a split header.

buildMcpServers() at acp-bridge/src/index.ts:992

fazm_tools
playwright
macos-use
whatsapp
google-workspace
~/.fazm/mcp-servers.json
ACP bridge
Claude session
tool calls
Settings UI
0Built-in MCP servers in the bundle
0Lines in the user-config loader
0Fields per entry (command, args, env, enabled)
0App restarts required to reload

The example config

Three entries. Two active, one disabled via enabled: false. The shape is the same one Claude Code consumes, so this file also runs in a Claude Code install without any edits.

~/.fazm/mcp-servers.json

What happens at session start

The bridge logs every server it loads and every entry it skips. The resulting merged list is what the Claude session sees and what the Settings UI mirrors back to you.

acp-bridge stderr, session=chat

What buildMcpServers() does with your user config

  • Reads ~/.fazm/mcp-servers.json via readFileSync(utf-8) if it exists
  • Parses with JSON.parse into Record<string, { command, args?, env?, enabled? }>
  • Skips any entry where cfg.enabled === false (explicit check at line 1115)
  • Skips any entry with a missing command and logs 'User MCP server skipped: missing command'
  • Flattens cfg.env into the { name, value } shape ACP expects
  • Pushes each entry onto the built-in list and logs 'User MCP server loaded'
  • Emits the merged list up to the Swift side via the mcp_servers event

Built-in appears first in a fixed order. Custom servers from ~/.fazm/mcp-servers.json are appended at the end of the list.

The five built-in servers, plus yours

fazm_tools

stdio server that exposes execute_sql, complete_task, and the app's own bridge. Always on.

playwright

Chromium automation via the Playwright MCP CLI, wired to the user's real Chrome extension token when present.

macos-use

Native macOS accessibility automation. Reads the AX tree, clicks by element, types into real text fields.

whatsapp

Native automation of the WhatsApp Catalyst app via accessibility APIs. Send, read, search, open.

google-workspace

Python stdio server for Gmail, Calendar, Drive, Docs, and Sheets. Uses the user's own OAuth app.

+ your own

Any Claude Code compatible MCP server config you drop into ~/.fazm/mcp-servers.json. Merged into the list above at the next session.

1 JSON shape, 2 Claude clients

The comment at the top of MCPServerManager.swift says it out loud: Format mirrors Claude Code's mcpServers. Everything downstream follows.

Source: MCPServerManager.swift line 4

MCP config portability, across Claude clients

FeatureMost other Claude clientsFazm 2.4.0+
Config file pathPer-client (~/Library/.../claude_desktop_config.json, .cursor/mcp.json, etc.)~/.fazm/mcp-servers.json - mirrors Claude Code's mcpServers shape verbatim
JSON shape for a server entryClient-specific. Some use a servers array. Some use a sessions.mcp key. Few agree.{ command, args, env, enabled } - same keys Claude Code expects, optional fields default the same way
Disabled-without-deletion flagMixed. Some clients require removal, others use disabled, others use a capital-E Enabled.enabled: false - the bridge skips with 'if (cfg.enabled === false) continue' at index.ts:1115
Missing-command validationSilent failure, server just never starts, no log line.Logs 'User MCP server skipped: missing command' and moves on. Other servers keep loading.
Reload boundaryApp restart in most clients. Hot-reload watcher in a few.Next session. Quit chat, start a new one, list is re-read. No app restart required.
Built-in vs custom surfacingMixed one list, no way to tell which servers are yours.Settings UI shows two groups with a 'Built-in' / 'Custom' header, filtered by the bridge-reported builtin flag.

Comparison is against the typical shape of an MCP-aware Claude client circa April 2026. Specific clients may differ.

The seven-day timeline

Five ship dates, one narrative arc. The custom MCP config lands on day four, quietly, on the same day ACP jumps to v0.29.2 and the available model list starts populating dynamically.

1

April 7, 2026 - ACP v0.25.0

Anthropic ships the first Agent Client Protocol bump of the month. Fazm picks it up in v2.1.2 the same day, improving error handling for credit exhaustion and rate limits. No user-facing MCP config yet. Custom servers are still bridge-internal only.

2

April 11, 2026 - floating bar, custom API endpoint

Version 2.2.0 adds a global shortcut for new pop-out chat windows and a custom API endpoint setting for proxies and corporate gateways. The custom endpoint work is the first real sign that users want to configure the client, not just use it. That signal turns into an MCP spec the week after.

3

April 16, 2026 - Claude Opus 4.7 release candidate

Fazm v2.3.2 tightens privacy language from 'nothing leaves your device' to 'local-first.' The plumbing for v2.4.0 lands in review. MCPServerManager.swift is written as a standalone ObservableObject with load, save, toggle, and add/remove helpers. The acp-bridge loader is added in index.ts with the explicit comment 'Format mirrors Claude Code's mcpServers.'

4

April 20, 2026 - Fazm 2.4.0 ships

Custom MCP server support is live. ~/.fazm/mcp-servers.json is read on session start. Settings gets a new 'MCP servers' page with a Built-in group, a Custom group, an Add server sheet (MCPServerEditSheet.swift), and an Open-in-Finder shortcut. The ACP protocol upgrades to v0.29.2 and available models populate dynamically from the agent. Claude Code users paste their existing config and it runs.

5

April 22, 2026 - Opus 4.7 GA + Fazm 2.4.1

Anthropic flips Opus 4.7 to GA. Fazm 2.4.1 lands the same day with onboarding fixes and a sign-in retry correction. The MCP config loader from 2.4.0 is unchanged because it worked on day one. This guide documents why that is.

What this unlocks

Five concrete wins from mirroring the Claude Code shape instead of inventing a new one. Each one is a line or two in the loader, not a feature flag.

One JSON file, two clients

If you already maintain a Claude Code mcpServers block, the same block runs in Fazm. No shape translation, no credential re-entry, no duplicated env.

Disabled-not-deleted

Use enabled: false the same way Claude Code does. The bridge's one-line skip keeps the server entry around but inactive so you can flip it back later.

Loud failures

Missing command is logged, not silently dropped. Other servers keep loading. The Settings UI dims failed custom entries so you know which one tripped.

No restart

Changes take effect at the next session. Quit chat, start a new one. No app restart. The hint text in Settings spells this out verbatim.

Built-in and custom, clearly split

Fazm ships five built-in MCP servers. User entries appear under a Custom header, not interleaved, so it is obvious which servers come from the bundle and which come from you.

Adopt it in five steps

If you already maintain a Claude Code mcpServers block, the first four steps are a copy-paste. The fifth is the reload.

1

1. Install Fazm

Download the signed notarized build from fazm.ai/download. First launch opens an onboarding chat, grants accessibility permission, and creates ~/.fazm/.

2

2. Open Settings - MCP servers

Scroll to the MCP servers section. You will see a Built-in group with fazm_tools, playwright, macos-use, whatsapp, and google-workspace. Below it is a Custom group with an empty-state card and a config-file row.

3

3. Open ~/.fazm/mcp-servers.json

Click the Open button in the config-file row. Finder opens the ~/.fazm directory with the JSON file selected. The first time you touch it you may need to create the file. Any editor is fine.

4

4. Paste your Claude Code mcpServers entries

Copy the inside of the mcpServers object from your existing Claude Code config. Keep the top-level keys (server names) and the { command, args, env } values. Trailing commas and comments are not JSON and will cause a parse error.

5

5. Quit the current chat, start a new one

The ACP bridge builds its server list on session creation. The log line 'User MCP server loaded: <name> (<command>)' appears in the bridge's stderr stream. In the Settings UI, the Custom group shows your entries and the bridge-reported active count matches.

The number that made this ship

0 community MCP servers by April 2026

When the ecosystem crosses four digits, asking users to maintain a Fazm-specific JSON shape on top of a Claude Code one stops being reasonable. Picking the shape that already exists turns a long adoption curve into a paste.

Bring your Claude Code MCP setup to your Mac

We'll help you map your existing Claude Code mcpServers block into ~/.fazm/mcp-servers.json and verify it loads on the first session.

Frequently asked questions

What was Anthropic's Claude news in April 2026?

The loud headlines were Claude Opus 4.7 as the general-availability flagship on April 22, 2026, a new product surface called Claude Design for in-line charts and one-pagers, Claude Cowork going generally available on macOS and Windows as a persistent agent thread, the Mythos Preview on April 7 that fed into Project Glasswing for computer-security work, and a brief test where Claude Code was pulled from the $20 Pro plan for roughly 2 percent of new signups before being restored. The piece not covered by roundups is a downstream one: Fazm, a consumer Mac agent that talks to Claude over the Agent Client Protocol, shipped 2.4.0 on April 20 with a user-facing MCP server config whose JSON shape mirrors Claude Code's mcpServers exactly. For anyone who already maintains a Claude Code MCP config, that meant copy, paste, done.

Why does Claude Code's MCP config format showing up on a Mac agent matter?

Because MCP server configs are still mostly client-specific. Claude Desktop, Claude Code, Cursor, and every other Anthropic-speaking client pick their own JSON shape, their own storage path, and their own set of built-in servers. If you maintain a non-trivial MCP setup, you maintain N copies, one per client. Fazm 2.4.0 picks Claude Code's shape on purpose. The comment at the top of MCPServerManager.swift reads: Format mirrors Claude Code's mcpServers: { name: { command, args, env, enabled } }. The matching loader in acp-bridge/src/index.ts (lines 1102 to 1137) parses that shape and pushes each entry onto the live server list for the next session. One JSON file now covers two clients.

Where is the config file?

At ~/.fazm/mcp-servers.json. The path is computed inside MCPServerManager.swift at line 42 as FileManager.default.homeDirectoryForCurrentUser.appendingPathComponent(.fazm).appendingPathComponent(mcp-servers.json). The directory is created on first save with createDirectory(withIntermediateDirectories: true), so you do not need to mkdir it yourself. If the file does not exist, Fazm loads zero user servers and falls back to the built-in set. The Settings UI in SettingsPage.swift at line 1841 surfaces this path verbatim next to an Open button that reveals the file in Finder.

What is the exact JSON shape?

A top-level object whose keys are the server names and whose values have four fields: command (string, required), args (string array, optional, defaults to empty), env (map of string to string, optional, defaults to empty), and enabled (boolean, optional, defaults to true). The RawServerConfig struct in MCPServerManager.swift defines it explicitly. The acp-bridge loader in index.ts validates it, skips entries with enabled=false, and logs 'User MCP server skipped: missing command' and returns early if command is absent. Enabled is omitted from the on-disk JSON when it is true, so enabled:true is the default and only the opt-out case writes an extra field.

Which built-in MCP servers does Fazm ship with, and do user servers replace them or add to them?

The built-in set is appended to, not replaced. buildMcpServers() in acp-bridge/src/index.ts starts by pushing fazm_tools (stdio, the bridge's own tool server that executes SQL against the user's local Fazm database and completes tasks), then appends Playwright MCP (browser automation, launched with an init-page that injects a 'controlled by Fazm' overlay), a native macOS accessibility automation server called macos-use, a native WhatsApp Catalyst automation server called whatsapp, and a Python Google Workspace MCP server. User entries from ~/.fazm/mcp-servers.json are appended after that list. The Settings UI groups them with a 'Built-in' header for the first five and a 'Custom' header for user servers.

What happens to a user server that has already run in Claude Code when I copy it into Fazm?

It runs. The command, args, and env fields are forwarded to the ACP bridge unchanged. The bridge spawns it as a stdio child process exactly the way Claude Code would. There is no translation step, no shim, no Fazm-specific subprocess wrapper. A server that reads its own credentials from an env var will see that env var because Fazm passes it through. A server that speaks the stdio MCP transport will do the same three-message handshake it does in Claude Code. The only constraint is that Fazm's bridge supports stdio and HTTP transports, which matches what Claude Code supports, so if your config runs in Claude Code it will run in Fazm.

When does a change to ~/.fazm/mcp-servers.json actually take effect?

At the next conversation. The hint text under the file path in Settings reads 'Uses the same format as Claude Code. Changes take effect on next conversation.' The bridge builds the server list each time a new session is requested, so quitting the current chat and starting a new one reloads the file. Restarting the app is not required. There is no file watcher, which is intentional: the reload boundary is the session, not the file-system event, so a half-saved JSON file never takes down the active conversation.

Can a server be disabled without deleting it from the file?

Yes. Set enabled:false on the entry. The acp-bridge loader at index.ts line 1115 reads 'if (cfg.enabled === false) continue;' before it does any other validation, so disabled servers are skipped with zero logging and zero side effects. The Settings UI exposes a toggle per custom server that calls MCPServerManager.toggleServer(named:), which flips the field and re-serializes the JSON. That is the same pattern Claude Code uses for its disabled flag, so a disabled-in-Claude-Code server stays disabled when you paste the same JSON into Fazm.

How is Fazm's active MCP server list reported back to the UI?

Through a side-channel. After the ACP bridge finishes negotiating a session it emits a 'mcp_servers' event with the parsed list (name, command, builtin flag) up to the Swift parent. ACPBridge.swift at line 1216 decodes that event into MCPServerManager.ActiveServer instances and pushes them via updateActiveServers() onto the @Published array that the Settings page observes. The 'Built-in' section of the Settings UI is the filtered slice where builtin=true, and it reflects what the bridge actually loaded, not what the Swift-side config thinks should load. This distinction matters when a user server silently fails validation: it is absent from the active list and the Settings page shows it dimmed in the Custom section.

Why did this ship in April 2026 specifically?

Because the April 2026 Anthropic release cycle pushed enough users onto the Agent Client Protocol that a shared MCP story stopped being optional. ACP rolled from v0.25.0 on April 7 to v0.29.2 on April 20. In the same window, MCP-aware servers kept multiplying: WhatsApp, Google Workspace, a dozen community entries. Asking users to maintain a Fazm-specific JSON shape on top of a Claude Code one would have been a tax for no reason. The path of least friction was to pick the shape that already existed and be a compatible client. Version 2.4.0 shipped the loader, the Settings UI, and the open-in-Finder shortcut on April 20, 2026.

Is any of this documented on Anthropic's side, or is it purely a Fazm decision?

Purely a Fazm decision, which is the point. MCP is a protocol, not a config-file spec, so Anthropic does not mandate a JSON shape. Each client can invent its own. Fazm chose to match the Claude Code shape because it is the one with the largest install base of MCP users, and because the team wants the jump between Claude Code on a developer's machine and Fazm on the same developer's (or their spouse's, or their parent's) machine to be as close to a copy-paste as possible. If Anthropic ever publishes a canonical MCP config format, the loader is 35 lines. It will be cheap to migrate.