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.
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.
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 |
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.
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.).
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.
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 |
If setting up Claude on a new Mac from scratch:
- Install prerequisites:
brew install syncthing python node - Configure Syncthing: Add the four folder syncs (
claude-config,claude-ed,mcp-servers,farm-data-sync) pointing to the Mac Studio - Wait for initial sync to complete (check Syncthing UI)
- Symlink the Desktop config:
ln -sf ~/Sync/ED/config/claude_desktop_config.json \ ~/Library/Application\ Support/Claude/claude_desktop_config.json - Build MCP venvs:
~/scripts/rebuild-mcp-venvs.sh - 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 - Push the Cowork snapshot: Run
sync-cowork-snapshot.shon the Mac Studio - 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).
“Claude has no MCPs” on the MacBook:
- Check Syncthing is running:
brew services list | grep syncthing - Verify
~/Sync/ED/.claude-context.mdexists (Syncthing working?) - Check
~/.mcp-servers/farm-data/.venv/exists (venvs built?) - Verify the Desktop config symlink:
ls -la ~/Library/Application\ Support/Claude/claude_desktop_config.json - Restart Claude Desktop (Cmd+Q, reopen)
Skills missing in Cowork:
- Check
~/Sync/ED/skills/has content (Syncthing working?) - Run
sync-cowork-snapshot.shon the Mac Studio - Open a NEW Cowork session (existing sessions can’t be fixed mid-flight)
MCP server fails to start:
- Check the venv exists:
ls ~/.mcp-servers/SERVER_NAME/.venv/ - Check Python version:
.venv/bin/python3 --version(must be 3.10+) - Rebuild:
cd ~/.mcp-servers/SERVER_NAME && rm -rf .venv && ~/scripts/rebuild-mcp-venvs.sh - Check network:
nc -z 192.168.8.100 5432(for farm-data โ needs CT100 reachable)
Syncthing sync stuck:
- Check both Syncthing UIs for errors
- Verify folder IDs match on both machines
- Check
.stignoreisn’t filtering the missing files - Force rescan:
curl -X POST http://localhost:8384/rest/db/scan -H "X-API-Key: KEY" -d 'folder=FOLDER_ID'
| 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/ |