Claude Multi-Machine Setup Keeping Claude Desktop / Cowork identical across Mac Studio and MacBook

Full-parity Claude experience across Mac Studio (192.168.8.180) and MacBook (192.168.8.218). Both machines run Claude Desktop with Cowork mode, the same MCP servers, same skills, same context, same memory. Established 2026-05-19.

Architecture Overview

The goal: open a Cowork session on either machine and get the same experience โ€” same skills, same MCPs, same context bundle, same memory graph, same tasks. No “Claude doesn’t know what I’m talking about” on the MacBook.

Six layers that must stay in sync:

Layer What Where Sync Method
1. Claude Code config Plugin list, marketplaces, MCP registrations ~/.claude/settings.json Syncthing claude-config
2. Claude Desktop config Desktop-app MCP servers (tana, firecrawl, farm-data) ~/Sync/ED/config/claude_desktop_config.json (symlinked) Syncthing claude-ed
3. Working directory Context bundle, TASKS.md, SECRETS.md, scripts, homelab docs ~/Sync/ED/ Syncthing claude-ed
4. MCP server code Custom Python/Node MCP servers ~/.mcp-servers/ Syncthing mcp-servers
5. MCP Python venvs Per-server virtual environments ~/.mcp-servers/*/. venv/ launchd auto-rebuild
6. Cowork skills snapshot Cached skill definitions Cowork reads at session start ~/Library/Application Support/Claude/.../skills-plugin/ sync-cowork-snapshot.sh

Layers 1โ€“5 are fully automatic. Layer 6 requires running sync-cowork-snapshot.sh on the Mac Studio after editing skills โ€” it pushes to the MacBook if reachable.

Syncthing Folder Configuration

Four Syncthing folders handle the Mac-to-Mac sync (all bidirectional, no Proxmox relay):

Folder ID Path .stignore Notes
claude-config ~/.claude/ 19 patterns (sessions, cache, telemetry, etc.) Settings, plugins, Claude Code MCP config
claude-ed ~/Sync/ED/ None Context bundle, tasks, secrets, skills source, memory, homelab docs
mcp-servers ~/.mcp-servers/ .venv, __pycache__, node_modules, .DS_Store, *.pyc MCP server source code only โ€” venvs excluded
farm-data-sync ~/Sync/farm/ None Emlid exports, voice memos

Device IDs:

Device Syncthing ID
Mac Studio UXJMRP2-N2ZX2B7-KWI6OO2-IT7W5LC-GESRIJC-JV2DGTD-FEND4MO-F46LPAS
MacBook VLIWDBL-5VD3VSC-XQTOXYS-EGU3NSB-BCHQOML-ACRYBI3-VFT2SPR-WDNBEAF

API keys (for programmatic Syncthing management):

Device API Key
Mac Studio CCuJcwA9wTsfDecNXtymtZwfpQvYWAU7
MacBook WY4Wrco6VnUsYJLzyDa5djTMni4fYz4L
Claude Desktop Config (Symlink)

The Claude Desktop app reads its MCP server configuration from ~/Library/Application Support/Claude/claude_desktop_config.json. To keep this in sync, the actual file lives in the Syncthing’d directory and both machines symlink to it:

~/Library/Application Support/Claude/claude_desktop_config.json
  โ†’ ~/Sync/ED/config/claude_desktop_config.json  (symlink)

This file defines three MCP servers:

Server Command Notes
tana-local HTTP to 127.0.0.1:8262 Only works if Tana app is running locally
firecrawl npx -y firecrawl-mcp Cloud API, works anywhere
farm-data python3 ~/.mcp-servers/farm-data/server.py Needs network access to CT100 PostgreSQL

All paths use /Users/bee/.mcp-servers/ (with leading dot). Both machines have the same username (bee) so paths are identical.

MCP Servers

All custom MCP servers live in ~/.mcp-servers/. Source code syncs via Syncthing; venvs are built locally per-machine.

Server Type Dependencies Purpose
farm-data Python asyncpg, mcp[cli] PostgreSQL farm database queries
homelab-snapshot Python fastmcp Proxmox/Docker infrastructure status
structured-bash Python fastmcp Shell execution with structured argv (no quoting hell)
nws-weather Python mcp[cli], httpx National Weather Service forecasts
inaturalist Python mcp[cli], httpx Species identification via iNaturalist API
usda-plants Python mcp[cli], httpx USDA plant database lookups
wallabag Python mcp[cli], httpx Read-later article management
tidal-mcp Python (uv) โ€” Tidal music service
cron-validator โ€” โ€” Cron expression validation
diff-preview โ€” โ€” Diff preview tool
git-semantic โ€” โ€” Git semantic search
image-gen โ€” โ€” Image generation
json-schema โ€” โ€” JSON Schema validation
mermaid-render โ€” โ€” Mermaid diagram rendering

Python version requirement: MCP SDK requires Python 3.10+. The MacBook’s system Python is 3.9 (Xcode). All venvs are built with /opt/homebrew/bin/python3 (currently 3.14).

Venv auto-rebuild (MacBook only):

A launchd agent watches ~/.mcp-servers/ and rebuilds venvs when Syncthing delivers new code:

Setting Value
Plist ~/Library/LaunchAgents/com.bee.rebuild-mcp-venvs.plist
Script ~/scripts/rebuild-mcp-venvs.sh
Trigger WatchPaths on ~/.mcp-servers/
Throttle 300 seconds (max once per 5 minutes)
Log ~/.mcp-servers/.venv-rebuild.log

The script only rebuilds venvs that are missing or have a requirements.txt newer than the existing .venv/. It maps server names to their dependencies (farm-data โ†’ asyncpg, homelab-snapshot โ†’ fastmcp, etc.).

Cowork Skills

Skills source lives in ~/Sync/ED/skills/ (synced via claude-ed). The plugin is registered as bee-farm-skills in ~/.claude/settings.json with source type directory.

The snapshot problem: Cowork doesn’t read skills from the source directory at session start. It reads from a per-account snapshot cached at:

~/Library/Application Support/Claude/local-agent-mode-sessions/skills-plugin/
  8d800cde-a725-4eaf-a5d9-0c44525af93d/
    3364911c-2ed9-4d54-8786-41d805a22426/
      skills/

This snapshot is keyed on stable account+plugin UUIDs and is NOT refreshed by restarting Claude Desktop or reinstalling the plugin. The only way to update it is sync-cowork-snapshot.sh.

After editing any SKILL.md:

~/scripts/sync-cowork-snapshot.sh

This script validates all skills, rsyncs from source to snapshot, and (as of 2026-05-19) pushes the snapshot to the MacBook if it’s reachable. Then open a new Cowork session on both machines.

Key Files on ~/Sync/ED/

These files are critical for Claude context and must be present on both machines:

File Purpose
.claude-context.md Deterministic session prime โ€” who Ed is, preferences, conventions, active focus
TASKS.md Master task list
SECRETS.md Credential consumer map and rotation runbook
SKILLS_INDEX.md Auto-generated skills inventory
CRON_AND_SERVICES.md Automation registry summary
BEE_HUB_INDEX.md Bee Hub page lookup index
memory/knowledge.json Memory MCP knowledge graph
config/claude_desktop_config.json Shared Claude Desktop MCP config (symlinked on both machines)
skills/ All custom Cowork skills source code
Initial Setup (New Machine)

If setting up Claude on a new Mac from scratch:

  1. Install prerequisites: brew install syncthing python node
  2. Configure Syncthing: Add the four folder syncs (claude-config, claude-ed, mcp-servers, farm-data-sync) pointing to the Mac Studio
  3. Wait for initial sync to complete (check Syncthing UI)
  4. Symlink the Desktop config:
    ln -sf ~/Sync/ED/config/claude_desktop_config.json \
      ~/Library/Application\ Support/Claude/claude_desktop_config.json
    
  5. Build MCP venvs: ~/scripts/rebuild-mcp-venvs.sh
  6. Install the venv rebuild launchd agent:
    cp ~/scripts/com.bee.rebuild-mcp-venvs.plist ~/Library/LaunchAgents/
    launchctl load ~/Library/LaunchAgents/com.bee.rebuild-mcp-venvs.plist
    
  7. Push the Cowork snapshot: Run sync-cowork-snapshot.sh on the Mac Studio
  8. Restart Claude Desktop (Cmd+Q, reopen)

Alternatively, run the all-in-one setup script:

bash ~/Sync/ED/setup-macbook-claude.sh

This handles steps 4โ€“6 automatically (assuming Syncthing is already configured).

Troubleshooting

“Claude has no MCPs” on the MacBook:

  1. Check Syncthing is running: brew services list | grep syncthing
  2. Verify ~/Sync/ED/.claude-context.md exists (Syncthing working?)
  3. Check ~/.mcp-servers/farm-data/.venv/ exists (venvs built?)
  4. Verify the Desktop config symlink: ls -la ~/Library/Application\ Support/Claude/claude_desktop_config.json
  5. Restart Claude Desktop (Cmd+Q, reopen)

Skills missing in Cowork:

  1. Check ~/Sync/ED/skills/ has content (Syncthing working?)
  2. Run sync-cowork-snapshot.sh on the Mac Studio
  3. Open a NEW Cowork session (existing sessions can’t be fixed mid-flight)

MCP server fails to start:

  1. Check the venv exists: ls ~/.mcp-servers/SERVER_NAME/.venv/
  2. Check Python version: .venv/bin/python3 --version (must be 3.10+)
  3. Rebuild: cd ~/.mcp-servers/SERVER_NAME && rm -rf .venv && ~/scripts/rebuild-mcp-venvs.sh
  4. Check network: nc -z 192.168.8.100 5432 (for farm-data โ€” needs CT100 reachable)

Syncthing sync stuck:

  1. Check both Syncthing UIs for errors
  2. Verify folder IDs match on both machines
  3. Check .stignore isn’t filtering the missing files
  4. Force rescan: curl -X POST http://localhost:8384/rest/db/scan -H "X-API-Key: KEY" -d 'folder=FOLDER_ID'
History
Date Change
2026-05-12 Initial Claude sync: three subfolder Syncthing syncs (claude-config, claude-memory, claude-skills)
2026-05-19 Replaced subfolder syncs with parent claude-ed for all of ~/Sync/ED/
2026-05-19 Added mcp-servers Syncthing folder with .stignore for venvs
2026-05-19 Consolidated ~/mcp-servers/ and ~/.mcp-servers/ into ~/.mcp-servers/ on Mac Studio
2026-05-19 Symlinked claude_desktop_config.json into ~/Sync/ED/config/ for automatic sync
2026-05-19 Created rebuild-mcp-venvs.sh + launchd agent for auto venv rebuild on MacBook
2026-05-19 Updated sync-cowork-snapshot.sh to push snapshot to MacBook
2026-05-19 Fixed claude_desktop_config.json path from ~/mcp-servers/ to ~/.mcp-servers/