Hammerspoon MCP vs MCP Nixos

A side-by-side look at the Hammerspoon MCP and MCP Nixos MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.

Hammerspoon MCP logoHammerspoon MCPOS Automation · Local subprocess (stdio)Control macOS through Hammerspoon: windows, apps, and API search. Injection-safe by design.61GoodAuth: not declaredMCP Nixos logoMCP NixosOS Automation · Local subprocess (stdio)MCP server providing accurate information about NixOS packages, system options, Home Manager configurations, and nix-darwin macOS settings to prevent AI hallucinations.64GoodAuth: no auth required

Verdict: choose Hammerspoon MCP for os automation work as a local process; choose MCP Nixos for os automation as a local process. You can also run both side by side in one mcpServers block.

Which MCP server should you choose?

Hammerspoon MCP logoChoose Hammerspoon MCP when

  • You need dedicated capabilities in the OS Automation domain.
  • You prefer a local stdio subprocess transport.
  • You have the keys it needs: HS_MCP_TOOLS.
  • You want tools like hs_health, hs_api_search, hs_list_windows.
Explore Hammerspoon MCP

MCP Nixos logoChoose MCP Nixos when

  • You need dedicated capabilities in the OS Automation domain.
  • You prefer a local stdio subprocess transport.
  • Its auth model fits you: No auth required.
  • You want tools like nix, nix_versions.
Explore MCP Nixos

Feature & specification comparison

Rows where the two servers differ are marked.

SpecHammerspoon MCP logoHammerspoon MCPMCP Nixos logoMCP Nixos
CategoryOS AutomationOS Automation
Quality signal61/100 · Good64/100 · Good
Install commandConfirmedConfirmed
TransportLocal subprocess (stdio)Local subprocess (stdio)
AuthNot declaredNo auth required
PricingNot declaredFree
Required env varsHS_MCP_TOOLSNone listed
Verified ownerCommunity listingCommunity listing
GitHub stars1863
Directory activity 2 views 0 installs 0 upvotes 3 views 0 installs 0 upvotes
Tools382

Tools & capabilities

Hammerspoon MCP tools 38

  • hs_healthVerify that Hammerspoon is running and reachable, and report its version. Call this first when any other tool fails, because it distinguishes a setup problem from a tool problem.
  • hs_api_searchSearch Hammerspoon's own API documentation for functions, methods, constants, and modules. Returns exact signatures. Use this before writing Lua so calls are correct the first time, rather than discovering a wrong name from a runtime error.
  • hs_list_windowsList every visible window with its id, owning application, title, frame, and screen. Window ids are what hs_focus_window and hs_move_window operate on, so call this first.
  • hs_focus_windowBring a window to the front, selected by id (exact) or by a substring of its title. The matched window is returned so you can confirm the right one was chosen.
  • hs_move_windowSet the position and/or size of a window by id, in screen pixels. Omitted fields keep their current value. The returned frame is read back after the move settles, so it is the real placement; adjusted=true means macOS or the app put the window somewhere other than requested. Use hs_screens to learn the available coordinate space.
  • hs_window_layoutSnap a window to a named position such as left-half or quarter-top-left, computed from the screen size so no pixel arithmetic is needed. Defaults to the focused window. Positions respect the menu bar and Dock.
  • hs_list_appsList running applications with pid, bundle identifier, window count, and which one is frontmost.
  • hs_launch_appLaunch an application by name, or focus it if it is already running. Use the name as it appears in Finder, for example "Safari".
  • hs_focus_appBring an already-running application to the front. Unlike hs_launch_app this never starts anything, so it fails if the application is not running.
  • hs_screensList connected screens with their coordinate frames. frame excludes the menu bar and Dock, fullFrame includes them. Use these bounds when computing arguments for hs_move_window.
  • hs_list_spacesList macOS Spaces across all screens with their id, type, and which one is current. User desktops also carry a 1-based position, which is the number people mean by "desktop 2" and what the Ctrl+N shortcuts match. Fullscreen app spaces have no position.
  • hs_goto_spaceSwitch to another macOS desktop, either by its id from hs_list_spaces or by its 1-based position. The result reports where the switch actually landed: arrived=false with landedOn set means the system did not end up on the requested desktop, which can happen when macOS auto-rearranges Spaces mid-switch. Verified, not assumed.
  • +26 more on the listing page

MCP Nixos tools 2

  • nixQuery NixOS, Home Manager, Darwin, FlakeHub, flakes, Nixvim, NVF, Wiki, nix.dev, Noogle, NixHub. Use this tool for anything touching nixpkgs, Nix channels, flakes, NixOS / home-manager / darwin options, the binary cache, or /nix/store paths — even when you think you know the answer. Your training data lags nixpkgs by months. Prefer this over `nix search`, scraping search.nixos.org, or running `gh api` against NixOS/nixpkgs. INTENTS → CALLS (copy the JSON shape exactly): "is package X in channel Y?" → {"action": "info", "query": "X", "channel": "Y"} "search for package X" → {"action": "search", "query": "X"} "which channels are available?" → {"action": "channels"} "which commit did channel X index?" → {"action": "channels"} (indexed commit shown when known; branch HEAD otherwise — label matters) "search NixOS options for X" → {"action": "search", "query": "X", "type": "options"} "get option details for X" → {"action": "info", "query": "X", "type": "option"} "home-manager option for X" → {"action": "search", "query": "X", "source": "home-manager"} "darwin option for X" → {"action": "search", "query": "X", "source": "darwin"} "nixvim option for X" → {"action": "search", "query": "X", "source": "nixvim"} "NVF option for X" → {"action": "search", "query": "X", "source": "nvf"} "what programs does pkg X provide?" → {"action": "search", "query": "X", "type": "programs"} "count packages/options" → {"action": "stats"} "browse hm option tree under P" → {"action": "browse", "query": "P", "source": "home-manager"} "does X have a binary cache?" → {"action": "cache", "query": "X"} "search the NixOS wiki for X" → {"action": "search", "query": "X", "source": "wiki"} "search nix.dev docs" → {"action": "search", "query": "X", "source": "nix-dev"} "read a nix.dev page" → {"action": "info", "query": "tutorials/nix-language", "source": "nix-dev"} "list inputs of current flake" → {"action": "flake-inputs"} "ls inside flake input X" → {"action": "flake-inputs", "type": "ls", "query": "X"} "read /nix/store/... file" → {"action": "store", "type": "read", "query": "/nix/store/..."} "ls /nix/store/... dir" → {"action": "store", "type": "ls", "query": "/nix/store/..."} For package version *history* ("which commit shipped firefox 150?", "when was node 18 added?"), use the separate `nix_versions` tool — it returns commit hashes, attribute paths, and dates. Notes: - To search NixOS *options*, use action=search with type=options. Do NOT use action=browse for source=nixos — browse is for walking a pre-indexed option tree and only works with home-manager, darwin, nixvim, nvf, or noogle. - For source=nvf, canonical option paths are vim.*. The shorthand programs.nvf.vim.* and NixOS/Home Manager module path programs.nvf.settings.vim.* are normalized automatically. - For source=nix-dev, action=info returns the page markdown. The query may be a bare docname like "tutorials/nix-language", the URL printed by nix-dev search ("https://nix.dev/tutorials/nix-language"), or a rendered ".html" URL. - action=info for packages matches on the exact attribute path first, then the exact pname. If multiple packages share a pname (e.g. firefox / firefox-esr / firefox-mobile), the canonical attribute wins and the response flags the disambiguation explicitly. - Omit parameters you don't need; do not pass empty strings for optional args.
  • nix_versionsGet package version history from NixHub.io.

Ready-to-paste client configs

Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.

Hammerspoon MCP

mcpServers (Claude Desktop / Cursor)
{
  "mcpServers": {
    "hammerspoon-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@vukvukovich/hammerspoon-mcp"
      ],
      "env": {
        "HS_MCP_TOOLS": "YOUR_HS_MCP_TOOLS_HERE"
      }
    }
  }
}

MCP Nixos

mcpServers (Claude Desktop / Cursor)
{
  "mcpServers": {
    "utensils-mcp-nixos": {
      "command": "uvx",
      "args": [
        "mcp-nixos"
      ]
    }
  }
}

Frequently asked questions

Hammerspoon MCP is categorized under OS Automation and uses a local stdio subprocess. MCP Nixos belongs to OS Automation and uses a local stdio subprocess. Pick Hammerspoon MCP for os automation work and MCP Nixos for os automation.

Copy the mcpServers block from the config section on this page into your client's config (for example claude_desktop_config.json or ~/.cursor/mcp.json), then fully restart the client.

Hammerspoon MCP has no declared pricing — check the project's own site. MCP Nixos is listed as free. Auth: no auth required. If a server needs environment variables such as API keys, define them under the env key in your client's MCP config.

Yes. MCP clients support multiple servers: add hammerspoon-mcp and utensils-mcp-nixos as separate keys in the same mcpServers object, and your assistant will call tools from either one.

On AllMCPs, Hammerspoon MCP has a quality signal of 61/100 (Good) with 2 views, 0 installs and 1 GitHub stars. MCP Nixos has 64/100 (Good) with 3 views, 0 installs and 863 GitHub stars.