Skip to content

Commit 3673a41

Browse files
committed
feat(glyph): setup kagi mcp
1 parent ab9d6bb commit 3673a41

6 files changed

Lines changed: 107 additions & 1 deletion

File tree

423 Bytes
Binary file not shown.

‎hosts/glyph/services/default.nix‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,19 @@
6060
extraUpFlags = ["--ssh"];
6161
};
6262

63+
age.secrets.kagi-api-key = {
64+
file = ./../secrets/kagi-api-key.age;
65+
mode = "440";
66+
owner = "kagi-mcp";
67+
group = "kagi-mcp";
68+
};
69+
6370
services.basic-memory.enable = true;
6471
services.mcp-nixos.enable = true;
72+
services.kagi-mcp = {
73+
enable = true;
74+
environmentFile = config.age.secrets.kagi-api-key.path;
75+
};
6576
services.mcpjungle = {
6677
enable = true;
6778
servers.basic-memory = {
@@ -72,5 +83,9 @@
7283
url = "http://127.0.0.1:8092/mcp";
7384
description = "NixOS options, packages, and Home Manager search";
7485
};
86+
servers.kagi = {
87+
url = "http://127.0.0.1:8093/mcp";
88+
description = "Kagi web search and page summarization";
89+
};
7590
};
7691
}

‎lib/secrets/glyph.nix‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ in {
44
"hosts/glyph/secrets/filebrowser-env.age".publicKeys = keys;
55
"hosts/glyph/secrets/pushover-app-token.age".publicKeys = keys;
66
"hosts/glyph/secrets/pushover-user-token.age".publicKeys = keys;
7+
"hosts/glyph/secrets/kagi-api-key.age".publicKeys = keys;
78
}

‎modules/nixos/llm/default.nix‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
22
imports = [
33
./basic-memory.nix
4+
./kagi.nix
45
./mcp-nixos.nix
56
./mcpjungle.nix
67
];

‎modules/nixos/llm/kagi.nix‎

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
{
2+
config,
3+
pkgs,
4+
lib,
5+
...
6+
}: let
7+
cfg = config.services.kagi-mcp;
8+
9+
startScript = pkgs.writeShellScript "kagi-mcp-start" ''
10+
exec ${lib.getExe pkgs.uv} run --with kagimcp python -c "
11+
from kagimcp.server import mcp
12+
mcp.settings.host = '${cfg.host}'
13+
mcp.settings.port = ${toString cfg.port}
14+
mcp.run(transport='streamable-http')
15+
"
16+
'';
17+
in {
18+
options.services.kagi-mcp = {
19+
enable = lib.mkEnableOption "Kagi MCP server";
20+
21+
port = lib.mkOption {
22+
type = lib.types.port;
23+
default = 8093;
24+
description = "Port for the streamable HTTP transport.";
25+
};
26+
27+
host = lib.mkOption {
28+
type = lib.types.str;
29+
default = "127.0.0.1";
30+
description = "Address to bind the HTTP server to.";
31+
};
32+
33+
environmentFile = lib.mkOption {
34+
type = lib.types.path;
35+
description = "Path to environment file containing KAGI_API_KEY.";
36+
};
37+
38+
openFirewall = lib.mkEnableOption "opening firewall ports for Kagi MCP";
39+
};
40+
41+
config = lib.mkIf cfg.enable {
42+
users.users.kagi-mcp = {
43+
isSystemUser = true;
44+
group = "kagi-mcp";
45+
home = "/var/lib/kagi-mcp";
46+
};
47+
users.groups.kagi-mcp = {};
48+
49+
systemd.services.kagi-mcp = {
50+
description = "Kagi MCP Server";
51+
after = ["network-online.target"];
52+
wants = ["network-online.target"];
53+
wantedBy = ["multi-user.target"];
54+
55+
environment = {
56+
HOME = "/var/lib/kagi-mcp";
57+
UV_CACHE_DIR = "/var/lib/kagi-mcp/.cache/uv";
58+
};
59+
60+
serviceConfig = {
61+
ExecStart = "${startScript}";
62+
EnvironmentFile = cfg.environmentFile;
63+
User = "kagi-mcp";
64+
Group = "kagi-mcp";
65+
WorkingDirectory = "/var/lib/kagi-mcp";
66+
StateDirectory = "kagi-mcp";
67+
Restart = "on-failure";
68+
RestartSec = 5;
69+
70+
# Hardening
71+
NoNewPrivileges = true;
72+
PrivateDevices = true;
73+
PrivateTmp = true;
74+
ProtectHome = "tmpfs";
75+
BindPaths = ["/var/lib/kagi-mcp"];
76+
ProtectSystem = "strict";
77+
ReadWritePaths = ["/var/lib/kagi-mcp"];
78+
ProtectKernelTunables = true;
79+
ProtectKernelModules = true;
80+
ProtectControlGroups = true;
81+
RestrictSUIDSGID = true;
82+
};
83+
};
84+
85+
programs.nix-ld.enable = true;
86+
87+
networking.firewall.allowedTCPPorts = lib.mkIf cfg.openFirewall [cfg.port];
88+
};
89+
}

‎modules/nixos/llm/mcpjungle.nix‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ in {
104104
done
105105
106106
if [ "$ready" = true ]; then
107-
${bin} register --name '${name}' --description '${server.description}' --url '${server.url}' --registry ${registry}
107+
${bin} register --name '${name}' --description '${server.description}' --url '${server.url}' --registry ${registry} || echo "ERROR: failed to register ${name}"
108108
else
109109
echo "WARNING: ${name} at ${server.url} not reachable after 60s, skipping registration."
110110
fi

0 commit comments

Comments
 (0)