diff --git a/home/programs/goose.nix b/home/programs/goose.nix index aa45068..5e5f6f6 100644 --- a/home/programs/goose.nix +++ b/home/programs/goose.nix @@ -93,6 +93,19 @@ exec ${pkgs.nodejs}/bin/npx --yes --loglevel=silent slack-mcp-server@latest --transport stdio "$@" ''; + applescriptMcp = pkgs.writeShellScriptBin "goose-applescript-mcp" '' + set -euo pipefail + + # Keep npm quiet before JSON-RPC begins, but include macOS system paths so + # the MCP server can invoke osascript and other Apple-provided tools. + export PATH=${lib.escapeShellArg (lib.makeBinPath [pkgs.nodejs pkgs.bash pkgs.coreutils])}:/usr/bin:/bin:/usr/sbin:/sbin + export NPM_CONFIG_LOGLEVEL=silent + export NPM_CONFIG_UPDATE_NOTIFIER=false + export NPM_CONFIG_FUND=false + export NPM_CONFIG_AUDIT=false + + exec ${pkgs.nodejs}/bin/npx --yes --loglevel=silent @peakmojo/applescript-mcp "$@" + ''; gooseHomeAssistantExtension = { enabled = true; type = "stdio"; @@ -117,11 +130,27 @@ bundled = false; available_tools = []; }; + gooseApplescriptExtension = { + enabled = true; + type = "stdio"; + name = "applescript"; + display_name = "AppleScript"; + description = "Run AppleScript on macOS via @peakmojo/applescript-mcp for local Apple app automation."; + cmd = "${applescriptMcp}/bin/goose-applescript-mcp"; + args = []; + timeout = 300; + bundled = false; + available_tools = []; + }; gooseExtensionFile = (pkgs.formats.yaml {}).generate "goose-extensions.yaml" { - extensions = { - homeassistant = gooseHomeAssistantExtension; - slack = gooseSlackExtension; - }; + extensions = + { + homeassistant = gooseHomeAssistantExtension; + slack = gooseSlackExtension; + } + // lib.optionalAttrs device.isDarwin { + applescript = gooseApplescriptExtension; + }; }; gooseDesktopExternalBackendConfigFile = config.sops.templates."goose-desktop-external-goosed.json".path; goosedMacosScript = pkgs.writeShellScriptBin "goosed-shiro" '' @@ -158,6 +187,7 @@ in homeAssistantMcp slackMcp ] + ++ lib.optionals device.isDarwin [applescriptMcp] ++ lib.optionals (pkgs.stdenv.hostPlatform.system == "x86_64-linux") [pkgs.goose-desktop]; sops.secrets =