windy-word-mcp
MCP server providing 115 tools to control the Windy Word voice-to-text desktop app, enabling paste, hotkeys, transcription, recording, and many other operations.
README
windy-word-mcp
An MCP (Model Context Protocol) server that turns Windy Word — the voice-to-text desktop app — into an agent-controllable platform. 115 tools spanning paste / hotkeys / transcription / recording verbs / audio devices / install / diagnostics / archive / voice clones / translation / documents / system / window / account + billing / TTS / settings-undo / music-ducking / bulk-clone-ingest / soul-file export.
Windy Word ships a local HTTP control server on 127.0.0.1:18765. This package is a schema-validated MCP wrapper around it. Agents call MCP tools; the server forwards to Windy Word over localhost; everything happens on the user's machine (no network round-trips for state queries).
Install
For most users:
claude mcp add windy-word --command "npx" --args "-y" "windy-word-mcp"
Or in ~/.claude.json / ~/.config/claude/claude_desktop_config.json:
{
"mcpServers": {
"windy-word": {
"command": "npx",
"args": ["-y", "windy-word-mcp"]
}
}
}
Local-dev (cloned repo):
git clone https://github.com/sneakyfree/windy-word-mcp && cd windy-word-mcp
npm install
claude mcp add windy-word --command "node" --args "$(pwd)/bin/windy-word-mcp.js"
Requirements
- Node.js ≥ 18
- Windy Word running locally (Electron app — the HTTP control server binds automatically at startup)
Environment overrides
| Variable | Default | Purpose |
|---|---|---|
WINDY_WORD_MCP_HOST |
127.0.0.1 |
Override the control-server host |
WINDY_WORD_MCP_PORT |
18765 |
Override the control-server port |
WINDY_WORD_MCP_TIMEOUT_MS |
5000 |
Default per-request timeout (the install + transcribe tools override this internally for long ops) |
Tool catalog (115 tools, 22 categories)
Regenerate this section's tool count any time with
npm run test:list-tools(node scripts/list-tools.js), which enumerates the live server's registered tools.
Platform (1)
| Tool | What it does |
|---|---|
get_platform |
OS, arch, distro, display server, desktop env, xdotool/ydotool presence |
Paste strategies (9)
12 platform-specific paste backends (macOS / Windows / Linux X11 / Linux Wayland) with capability metadata, hotkey-collision auto-detection, and a verified fallback chain.
| Tool | What it does |
|---|---|
list_paste_strategies |
All 12 strategies + per-strategy availability + resolved chain + collision flag |
get_active_paste_strategy |
Current selection + resolved chain |
set_paste_strategy |
Switch active (or "auto") |
test_paste_strategy |
Fire a specific strategy at the focused window (injects text!) |
auto_paste |
Run the auto-execute chain with explicit candidates |
run_paste_injection_test |
Real end-to-end test — spawns Tk target, fires paste, diffs result |
get_paste_history / clear_paste_history |
In-memory audit log |
get_paste_target |
XWayland vs Wayland-native detection |
Hotkeys (3)
| Tool | What it does |
|---|---|
list_hotkeys |
Current bindings + available actions + reserved combos |
set_hotkey |
Rebind a global shortcut (Electron accelerator format) |
reset_hotkeys |
Restore all global shortcuts to catalog defaults + re-register |
Transcription engine (3)
| Tool | What it does |
|---|---|
list_models |
Whisper model catalog + current + WindyTune ladder |
set_model |
Switch (hot-reloads Python engine over WebSocket) |
get_windytune_state |
Auto-tune state, ladder, recent-timing history |
Recording verbs (8)
| Tool | What it does |
|---|---|
start_recording |
Begin a mode-aware recording (batch / streaming / API engine) |
stop_recording |
End the recording → trigger transcription + paste pipeline |
cancel_recording |
Abort an in-flight recording without saving |
get_recording_state |
isRecording + pythonEngineRunning + mode snapshot |
toggle_recording |
Start/stop (same effect as the global hotkey) |
paste_transcript |
Re-paste the most recent transcript |
set_language |
Set the Whisper transcription language (ISO 639-1) |
set_panel_visibility |
Configure a bottom panel row (always / hover / off) |
Audio devices (1)
| Tool | What it does |
|---|---|
list_audio_devices |
Enumerate microphones available to Windy Word |
install_dependency family (8)
Agent installs missing system tools (Linux/macOS/Windows package managers). Linux uses pkexec; macOS uses user-scope brew; Windows uses winget. Whitelist-only: wtype, ydotool, wl-clipboard, xdotool, cliclick, ffmpeg.
| Tool | What it does |
|---|---|
list_installable_dependencies |
What's installable on this machine right now |
install_dependency |
Synchronous install (whitelist + dryRun) |
install_dependency_async |
Fire-and-poll variant — returns jobId |
get_install_status |
Poll a job |
list_install_jobs |
All in-memory jobs |
get_install_history / clear_install_history |
Audit log |
setup_install_polkit_rule |
Install/remove the Linux polkit auto-approve rule |
Polkit setup (Linux): setup_install_polkit_rule installs /etc/polkit-1/rules.d/49-windy-install-deps.rules once per machine to make installs prompt-free. See the rule snippet.
Windy Doctor — local + cloud (3)
13 local rule-based checks covering paste-stack tooling, /dev/uinput permissions, polkit rule presence (with EACCES-tolerant detection), Python engine liveness, Mutter hotkey collision, macOS Accessibility + Microphone permissions, Homebrew presence, cliclick presence.
| Tool | What it does |
|---|---|
run_diagnostics |
Run the local battery; return structured findings + actionable remediations |
list_diagnostic_checks |
What checks exist + which apply to this platform |
cloud_diagnose |
LLM-augment via the windy-fix-me Cloudflare Worker (Claude Haiku 4.5 via OpenRouter) |
Settings catalog (5) — typed/validated agent surface
49 typed catalog entries with tags (archive, voice-clone, transcription, paste, hotkey, ui, geometry, lifecycle, license). Validation runs server-side before any write.
| Tool | What it does |
|---|---|
list_settings |
Catalog + current live values + available tags. Supports ?tag=X filter |
describe_setting |
Single entry + current value |
set_setting |
Validate + apply + return side effects |
get_config |
Full electron-store dump (low-level escape hatch) |
set_config |
Patch by dotted path, no validation (low-level escape hatch) |
Settings undo (2)
| Tool | What it does |
|---|---|
undo_last_setting_change |
Revert the most recent catalog-validated setting change this session |
list_recent_setting_changes |
List session setting changes, oldest first |
Archive surface (8) — opaque-id session catalog
Agents work with opaque arc:YYYY-MM-DD:HHMMSS.md ids, never filesystem paths. Path-confined deletes.
| Tool | What it does |
|---|---|
list_archive_entries |
List recordings with transcripts + metadata |
get_archive_stats |
totalFiles/sizeMB/days/words/sessions (30s server-side cache) |
read_archive_entry |
Base64 audio or video for an entry |
delete_archive_entry |
Tear down md + audio + video |
open_archive_folder |
Pop OS file manager at the archive root |
search_archives |
Full-text substring search across every transcript |
archives_by_date_range |
Sessions whose start timestamp falls within [from, to] |
bulk_delete_archives |
Tear down multiple entries in one call |
Voice clones (10 — Phase 1 + Phase 2)
| Tool | What it does |
|---|---|
list_voice_clones |
All clones + activeId (no audio bytes) |
get_active_voice_clone |
Currently-active clone (or null) |
set_active_voice_clone |
Switch active (or deactivate with null) |
create_voice_clone_from_path |
Create from an audio file on disk (path-confined copy) |
delete_voice_clone |
Irreversible teardown |
preview_voice_clone |
Metadata + optional base64 audio |
list_clone_bundles |
Training-bundle catalog |
submit_voice_clone_to_cloud |
Submit a local clone to Windy Clone for ElevenLabs training |
get_cloud_clone_order_status |
Poll Windy Clone for ElevenLabs training progress |
bulk_ingest_to_clone |
Copy a batch of audio files into the voice-samples store as clones |
Bulk clone ingest + watchers (3)
| Tool | What it does |
|---|---|
scan_folder_for_media |
Scan a folder (recursive) for audio + video files |
watch_folder_for_recordings |
Start/stop a folder watcher that auto-ingests new audio |
list_clone_watchers |
List active folder watchers |
Translation (5)
| Tool | What it does |
|---|---|
translate_text |
TM-cache-first → Groq/OpenAI fallback (auto-populates cache) |
lookup_translation_memory |
Local cache query, no API |
save_translation_memory |
Manual upsert |
get_translation_memory_stats |
Total / topPairs / recentEntries |
clear_translation_memory |
Wipe (destructive) |
Documents (3)
| Tool | What it does |
|---|---|
extract_document_text |
Path-based, supports txt/md/csv/html/pdf/docx (5MB default, 20MB cap) |
save_text_file |
Path-based write; refuses overwrite unless flagged |
transcribe_audio_file |
Any audio file → Whisper transcript via warm WebSocket engine (~5× real-time on CPU) |
Sound effects (7)
| Tool | What it does |
|---|---|
get_sound_effect_state |
Per-hook-stage enabled/volume settings (6 lifecycle stages) |
set_sound_hook |
Configure a single sound-effect hook stage |
set_active_sound_pack |
Switch the active sound pack |
set_master_sfx_volume |
Set master SFX volume (0-100) |
set_sound_effect_mode |
Switch EffectsEngine mode (silent / classic / surprise / custom / pack) |
list_sound_effect_packs |
List known sound-effect packs |
get_widget_state |
Mini-widget (tornado) runtime state via the renderer bridge |
System utilities (3) + Forma Animae (1)
| Tool | What it does |
|---|---|
detect_hardware |
RAM, CPU, GPU (nvidia-smi + Apple Silicon detect), disk free |
get_autostart_status |
Is Windy Word configured to launch on login |
set_autostart |
Toggle login-item / .desktop entry |
export_soul_file_to_path |
Forma Animae: zip the whole archive (audio + video + transcripts + manifest) for the digital-twin pipeline |
Window + app lifecycle (16)
| Tool | What it does |
|---|---|
get_window_state |
Snapshot of maximized/minimized/focused/visible/fullScreen |
minimize_window / maximize_window / unmaximize_window |
Title-bar window controls |
bring_window_to_front |
Restore + show + raise (does not steal keyboard focus) |
set_window_geometry |
Set position + size in screen pixels (live + persisted) |
set_video_fullscreen |
Toggle native OS-level fullscreen |
set_always_on_top |
Keep the window above others |
set_opacity |
Set window opacity (0.1-1.0) |
set_theme |
dark / light / auto |
set_font_size |
UI zoom factor (70-150%) |
show_hide_window |
Cycle main → tornado → hidden → main |
quick_translate |
Open the Quick Translate mini-window |
restart_app / quit_app |
Relaunch / quit Windy Word (destructive) |
App info + notifications (5)
| Tool | What it does |
|---|---|
get_version |
Windy Word + Electron + Node versions |
check_for_updates |
Trigger electron-updater's update check |
set_analytics_enabled |
Opt in/out of anonymous usage analytics |
open_url |
Open an http/https URL or a Windy ecosystem scheme |
send_notification |
Show an OS-native notification |
Account + billing (6)
| Tool | What it does |
|---|---|
get_my_plan |
Signed-in identity + license tier |
get_billing_history |
Purchase / transaction history |
get_billing_summary |
Tier + lifetime spend + next renewal |
open_upgrade_checkout |
Open Stripe Checkout for an upgrade |
open_billing_portal |
Open the Stripe Customer Portal |
logout_account |
Sign the user out |
TTS (3)
| Tool | What it does |
|---|---|
speak_text |
Speak text aloud through the OS system TTS |
stop_speaking |
Silence in-flight TTS playback |
list_tts_voices |
List installed system TTS voices |
Music ducking (2)
| Tool | What it does |
|---|---|
pause_other_audio |
Pause music/media in other apps (Spotify, Apple Music, browsers, VLC) |
resume_other_audio |
Resume what pause_other_audio paused |
Architecture
┌──────────────────────────┐
│ Agent (Claude Code etc) │
└──────────┬───────────────┘
│ MCP over stdio
▼
┌─────────────────────────────────────────┐
│ windy-word-mcp (this package) │
│ - 115 zod-validated tool schemas │
│ - Per-tool timeout overrides │
│ - Structured 4xx body pass-through │
│ - "Windy Word not running" detection │
└──────────┬──────────────────────────────┘
│ HTTP localhost:18765
▼
┌─────────────────────────────────────────┐
│ Windy Word (Electron) — windy-pro repo │
│ - 49-entry settings catalog │
│ - 13 Doctor checks │
│ - Paste-strategy registry (12 backends)│
│ - Whisper Python engine (WebSocket) │
│ - Voice clone + archive on-disk state │
└──────────┬──────────────────────────────┘
│ HTTPS (only for cloud-diagnose)
▼
┌─────────────────────────────────────────┐
│ windy-fix-me CF Worker │
│ - SHARED_SECRET auth │
│ - 20 req/IP/min rate limit │
│ - Claude Haiku 4.5 via OpenRouter │
└─────────────────────────────────────────┘
Coverage
115 MCP tools now surface the Windy Word desktop app's agent-control surface — paste, hotkeys, transcription, recording verbs, audio devices, install/Doctor, archive, voice clones (Phase 1 + Phase 2 cloud training), translation, documents, sound effects, window + app lifecycle, account + billing, TTS, settings-undo, music-ducking, bulk-clone-ingest, and soul-file export. Internal renderer events that are not agent-callable RPCs by design are intentionally excluded.
Quality bar
scripts/stress-test.js exercises every safe tool, including:
- Whitelist rejection at the MCP zod layer
- Structured 4xx error pass-through for validation failures
- Cross-OS rejection (cliclick on Linux, wtype on macOS)
- Real paste injection round-trip (Tk capture + diff)
- Concurrency burst (20 parallel
get_platformcalls) - Idempotent installs (alreadyInstalled detection)
67/67 passing at v1.0.0 release.
Known intermittent: run_paste_injection_test ~1-in-5 hits a Mutter focus-handoff race on Wayland+GNOME. Re-run is clean. Not a regression.
Sibling repos
sneakyfree/windy-pro— the Electron app (Windy Word). Contains the control server, settings catalog, install registry, Doctor checks, paste strategies, archive scanner, voice-clone CRUD.npm install + npm startto run.sneakyfree/windy-fix-me— the cloud-relay Cloudflare Worker. Receives Doctor findings + platform context, returns LLM-augmented remediation via OpenRouter.
Version history
See CHANGELOG.md for the per-version details. Tool count progression:
v0.1.0 20 foundation
v0.2.0 24 install_dependency + polkit auto-approve
v0.3.0 27 settings catalog
v0.4.0 33 async install + Windy Doctor + cross-platform
v0.5.0 34 cloud_diagnose
v0.6.0 35 paste injection + tag filter
v0.7.0 41 voice clones Phase 1
v0.8.0 46 archive surface
v0.9.0 53 translation + documents
v0.10.0 56 utilities + OC5 macOS Doctor merge
v0.11.0 57 transcribe_audio_file
v0.12.0 60 soul-file export + voice-clone Phase 2 starters
v1.0.0 60 stable API surface declared
v1.5.0 95 Waves W1–W6: window/state, archive search, lifecycle, recording verbs, cloud submit
v1.6.0 104 account / billing / plan surface
v1.7.0 107 TTS round-trip
v1.8.0 109 settings undo + audit log
v1.9.0 111 music ducking
v1.10.0 115 bulk clone-ingest
License
MIT. See LICENSE.
Contributing
Bug reports + tool additions welcome. See PUBLISHING.md for the release recipe.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。