feat: added more config options for mcp servers

This commit is contained in:
Leyla Becker 2025-09-12 10:47:31 -05:00
parent cf330b1cbb
commit 0f8faadd80
2 changed files with 119 additions and 15 deletions

View file

@ -72,9 +72,27 @@ in {
enable = true; enable = true;
mcp = { mcp = {
nixos.enable = true; nixos.enable = true;
eslint.enable = true; eslint = {
vitest.enable = true; enable = true;
sleep.enable = true; autoApprove = {
lint-files = true;
};
};
vitest = {
enable = true;
autoApprove = {
list_tests = true;
run_tests = true;
analyze_coverage = true;
};
};
sleep = {
enable = true;
timeout = 18000; # 5 hours to match claude codes timeout
autoApprove = {
sleep = true;
};
};
}; };
}; };

View file

@ -35,6 +35,30 @@
) (lib.attrValues config.programs.vscode.profiles); ) (lib.attrValues config.programs.vscode.profiles);
anyProfileHasMcp = anyProfileHasMcpNixos || anyProfileHasMcpEslint || anyProfileHasMcpVitest || anyProfileHasMcpSleep; anyProfileHasMcp = anyProfileHasMcpNixos || anyProfileHasMcpEslint || anyProfileHasMcpVitest || anyProfileHasMcpSleep;
getMcpTimeout = serverName:
lib.findFirst (timeout: timeout != null) null (map (
profile:
if profile.extraExtensions.claudeDev.enable && profile.extraExtensions.claudeDev.mcp.${serverName}.enable
then profile.extraExtensions.claudeDev.mcp.${serverName}.timeout
else null
) (lib.attrValues config.programs.vscode.profiles));
getMcpAutoApprove = serverName:
lib.foldl' (
acc: profile:
if profile.extraExtensions.claudeDev.enable && profile.extraExtensions.claudeDev.mcp.${serverName}.enable
then acc // profile.extraExtensions.claudeDev.mcp.${serverName}.autoApprove
else acc
) {} (lib.attrValues config.programs.vscode.profiles);
getMcpPackage = serverName:
lib.findFirst (package: package != null) null (map (
profile:
if profile.extraExtensions.claudeDev.enable && profile.extraExtensions.claudeDev.mcp.${serverName}.enable
then profile.extraExtensions.claudeDev.mcp.${serverName}.package
else null
) (lib.attrValues config.programs.vscode.profiles));
in { in {
options.programs.vscode.profiles = lib.mkOption { options.programs.vscode.profiles = lib.mkOption {
type = lib.types.attrsOf (lib.types.submodule ({config, ...}: { type = lib.types.attrsOf (lib.types.submodule ({config, ...}: {
@ -51,12 +75,53 @@ in {
}; };
eslint = { eslint = {
enable = lib.mkEnableOption "enable ESLint MCP server for Claude Dev"; enable = lib.mkEnableOption "enable ESLint MCP server for Claude Dev";
package = lib.mkOption {
type = lib.types.str;
default = "@eslint/mcp@latest";
description = "NPM package to use for ESLint MCP server";
};
timeout = lib.mkOption {
type = lib.types.nullOr lib.types.int;
default = null;
description = "Timeout in seconds for ESLint MCP server operations";
};
autoApprove = {
lint-files = lib.mkEnableOption "Should the lint-files tool be auto approved for ESLint MCP server";
};
}; };
vitest = { vitest = {
enable = lib.mkEnableOption "enable Vitest MCP server for Claude Dev"; enable = lib.mkEnableOption "enable Vitest MCP server for Claude Dev";
package = lib.mkOption {
type = lib.types.str;
default = "@djankies/vitest-mcp";
description = "NPM package to use for Vitest MCP server";
};
timeout = lib.mkOption {
type = lib.types.nullOr lib.types.int;
default = null;
description = "Timeout in seconds for Vitest MCP server operations";
};
autoApprove = {
list_tests = lib.mkEnableOption "Should the list_tests tool be auto approved for Vitest MCP server";
run_tests = lib.mkEnableOption "Should the run_tests tool be auto approved for Vitest MCP server";
analyze_coverage = lib.mkEnableOption "Should the analyze_coverage tool be auto approved for Vitest MCP server";
};
}; };
sleep = { sleep = {
enable = lib.mkEnableOption "enable Sleep MCP server for Claude Dev"; enable = lib.mkEnableOption "enable Sleep MCP server for Claude Dev";
package = lib.mkOption {
type = lib.types.str;
default = "sleep-mcp";
description = "NPM package to use for Sleep MCP server";
};
timeout = lib.mkOption {
type = lib.types.nullOr lib.types.int;
default = null;
description = "Timeout in seconds for Sleep MCP server operations";
};
autoApprove = {
sleep = lib.mkEnableOption "Should the sleep tool be auto approved for Sleep MCP server";
};
}; };
}; };
}; };
@ -86,22 +151,43 @@ in {
}; };
}) })
// (lib.optionalAttrs anyProfileHasMcpEslint { // (lib.optionalAttrs anyProfileHasMcpEslint {
eslint = { eslint =
{
command = "${pkgs.nodejs}/bin/npx"; command = "${pkgs.nodejs}/bin/npx";
args = ["-y" "@eslint/mcp@latest"]; args = ["-y" (getMcpPackage "eslint")];
}; }
// (lib.optionalAttrs ((getMcpTimeout "eslint") != null) {
timeout = getMcpTimeout "eslint";
})
// (lib.optionalAttrs ((getMcpAutoApprove "eslint") != {}) {
autoApprove = builtins.attrNames (lib.filterAttrs (_: v: v) (getMcpAutoApprove "eslint"));
});
}) })
// (lib.optionalAttrs anyProfileHasMcpVitest { // (lib.optionalAttrs anyProfileHasMcpVitest {
vitest = { vitest =
{
command = "${pkgs.nodejs}/bin/npx"; command = "${pkgs.nodejs}/bin/npx";
args = ["-y" "@djankies/vitest-mcp"]; args = ["-y" (getMcpPackage "vitest")];
}; }
// (lib.optionalAttrs ((getMcpTimeout "vitest") != null) {
timeout = getMcpTimeout "vitest";
})
// (lib.optionalAttrs ((getMcpAutoApprove "vitest") != {}) {
autoApprove = builtins.attrNames (lib.filterAttrs (_: v: v) (getMcpAutoApprove "vitest"));
});
}) })
// (lib.optionalAttrs anyProfileHasMcpSleep { // (lib.optionalAttrs anyProfileHasMcpSleep {
sleep-mcp = { sleep-mcp =
{
command = "${pkgs.nodejs}/bin/npx"; command = "${pkgs.nodejs}/bin/npx";
args = ["-y" "sleep-mcp"]; args = ["-y" (getMcpPackage "sleep")];
}; }
// (lib.optionalAttrs ((getMcpTimeout "sleep") != null) {
timeout = getMcpTimeout "sleep";
})
// (lib.optionalAttrs ((getMcpAutoApprove "sleep") != {}) {
autoApprove = builtins.attrNames (lib.filterAttrs (_: v: v) (getMcpAutoApprove "sleep"));
});
}); });
}; };
force = true; force = true;