macOS menubar app that makes your screen readable by AI
Extracting text from windows via OCR, accessible through MCP (Model Context Protocol)
TxtSync is a lightweight menubar application that monitors selected windows and provides their text content to AI assistants like Claude Code via the Model Context Protocol (MCP).
Key Features:
- On-demand OCR - Only processes when AI requests, saving CPU & battery
- Multi-window support - Monitor multiple windows simultaneously
- Japanese & English - Full support for both languages
- Native macOS - Built with SwiftUI and Vision framework
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Your Screen │────▶│ TxtSync │────▶│ Claude Code │
│ (Slack, etc.) │ │ (Vision OCR) │ │ (via MCP) │
└─────────────────┘ └─────────────────┘ └─────────────────┘
- Select windows to monitor from the menubar
- AI requests window content through MCP
- TxtSync captures and OCRs the window (~1.5s)
- Text is returned to AI for analysis
# Clone
git clone https://github.com/tomohiro-owada/TxtSync.git
cd TxtSync
# Build
./scripts/build.sh
# Create app bundle
./scripts/bundle.sh
# Install
cp -r TxtSync.app /Applications/- Open TxtSync from Applications
- Grant Screen Recording permission when prompted
- Select windows to monitor from the menubar
Note: If window titles don't appear, reset permissions:
tccutil reset ScreenCapture com.txtsync.appThen relaunch TxtSync and grant permission again.
Add to your MCP configuration (~/.claude.json):
{
"mcpServers": {
"txtsync": {
"command": "/Applications/TxtSync.app/Contents/MacOS/TxtSyncMCP"
}
}
}| Tool | Description |
|---|---|
list_windows |
List monitored windows with IDs and titles |
get_window_text |
Get OCR text from a specific window |
get_all_text |
Get OCR text from all monitored windows |
search_text |
Search for text across all windows |
get_window_screenshot |
Save window screenshot to temp file (JPEG compressed for large images) |
You: What's in my Slack?
Claude: [calls get_window_text with app_name="Slack"]
Your Slack shows a thread in #general with messages about...
You: Search for "error" in my terminal
Claude: [calls search_text with query="error"]
Found "error" in Ghostty window: "npm ERR! code ENOENT..."
TxtSync/
├── Sources/
│ ├── TxtSync/ # Menubar app (SwiftUI)
│ │ ├── App/ # Entry point, state management
│ │ ├── Views/ # UI components
│ │ ├── Models/ # Data structures
│ │ ├── Services/ # Window management, permissions
│ │ └── Theme/ # Styling
│ └── TxtSyncMCP/ # MCP server (JSON-RPC over stdio)
├── Resources/
│ └── Info.plist
└── scripts/
├── build.sh
└── bundle.sh
- macOS 13.0 (Ventura) or later
- Screen Recording permission
- ~50MB disk space
| Metric | Value |
|---|---|
| Idle CPU | < 1% |
| OCR latency | ~1.5 seconds |
| Memory | ~70MB |
- Local only - All processing happens on your Mac
- No network - No data sent anywhere
- You control - Only monitors windows you explicitly select
MIT License - see LICENSE for details.
Built with Vision Framework and MCP