Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 21 additions & 21 deletions flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

16 changes: 16 additions & 0 deletions home-manager/mcp/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
}:
let
mcp-server-github-wrapper = pkgs.callPackage ./mcp-server-github-wrapper.nix { inherit config; };
linkedin-mcp-server-wrapper = pkgs.callPackage ./linkedin-mcp-server-wrapper.nix {
inherit config;
};

cfg = config.programs.mcp;

Expand All @@ -18,6 +21,7 @@ let
++ (lib.optionals cfg.enableGit [ mcp-server-git ])
++ (lib.optionals cfg.enableGithub [ mcp-server-github-wrapper ])
++ (lib.optionals cfg.enableKubectl [ kubectl-mcp-server ])
++ (lib.optionals cfg.enableLinkedIn [ linkedin-mcp-server-wrapper ])
++ (lib.optionals cfg.enableMemory [ mcp-server-memory ])
++ (lib.optionals cfg.enablePlaywright [ mcp-server-playwright ])
++ (lib.optionals cfg.enableSequentialThinking [ mcp-server-sequential-thinking ]);
Expand Down Expand Up @@ -65,6 +69,12 @@ let
description = "kubectl for managing and debugging Kubernetes clusters";
};
})
// (lib.optionalAttrs cfg.enableLinkedIn {
linkedin = {
command = "${linkedin-mcp-server-wrapper}/bin/linkedin-mcp-server-wrapper";
description = "LinkedIn API integration for managing posts, profiles, and company pages";
};
})
// (lib.optionalAttrs cfg.enableMemory {
memory = {
command = "${pkgs.mcp-server-memory}/bin/mcp-server-memory";
Expand Down Expand Up @@ -141,6 +151,12 @@ in
description = "Enable MCP kubectl server for Kubernetes cluster management";
};

enableLinkedIn = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Enable MCP LinkedIn server for managing posts, profiles, and company pages";
};

enableMemory = lib.mkOption {
type = lib.types.bool;
default = true;
Expand Down
11 changes: 11 additions & 0 deletions home-manager/mcp/linkedin-mcp-server-wrapper.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{ pkgs, config, ... }:

pkgs.writeShellScriptBin "linkedin-mcp-server-wrapper" ''
# Read the LinkedIn credentials from sops secrets
export LINKEDIN_CLIENT_ID="$(cat ${config.sops.secrets.linkedin_client_id.path})"
export LINKEDIN_CLIENT_SECRET="$(cat ${config.sops.secrets.linkedin_client_secret.path})"
export LINKEDIN_ACCESS_TOKEN="$(cat ${config.sops.secrets.linkedin_access_token.path})"

# Execute the actual linkedin-mcp-server with all passed arguments
exec ${pkgs.linkedin-mcp-server}/bin/linkedin-mcp-server "$@"
''
18 changes: 18 additions & 0 deletions home-manager/sops/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,24 @@
format = "json";
key = "password";
};

secrets."linkedin_client_id" = {
sopsFile = ../../secrets/linkedin-app.enc.json;
format = "json";
key = "CLIENT_ID";
};

secrets."linkedin_client_secret" = {
sopsFile = ../../secrets/linkedin-app.enc.json;
format = "json";
key = "CLIENT_SECRET";
};

secrets."linkedin_access_token" = {
sopsFile = ../../secrets/linkedin-app.enc.json;
format = "json";
key = "ACCESS_TOKEN";
};
};

}
18 changes: 18 additions & 0 deletions secrets/linkedin-app.enc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"CLIENT_ID": "ENC[AES256_GCM,data:b8lx2ahQVMfU0mxNQ1c=,iv:h+P4Tm9Cdg3DPnhhO0W1ZyY7rHnvyGitxo20pnSdEyA=,tag:3p24hzFSt2mKok6IPiwkSA==,type:str]",
"CLIENT_SECRET": "ENC[AES256_GCM,data:JuvK9ol5os3zYXmjyRjniYPurgwWrGH2+tQhzZjrmCg9,iv:mfn4fIJJNopH3o7P5+zQHHeLh3l7LVPCYVG+vSvy/Eo=,tag:9j0iOFxKlLDeqdFwLAqD+w==,type:str]",
"ACCESS_TOKEN": "ENC[AES256_GCM,data:baLvMvruYwTmTnatw7FzFaR1IH7o+zHlHPNjaDSe64ICZMQh6jw41KlXfzI7BI6VyxYrAOD3S6Ezie3AicX3Bh3q59E5hLuqKZZYHX4LGa5e6oEZvDSKHQUYRkJyahgXgWvPkJdVfjB2OYPnatVrXOPI9eIoTWtdIisef6M685hW1xYQXf28o5grwXQpqjjJDVnZAPHUspwsQlT6fHEPVqoSOcyileF+wx/2GDYWV1A9MhDPJNirm7+omMqmgCN+qdn10UqWp1+wzI/wxvJCZEgUAXE29jjWtuZZu1w2lFY3aq5QumA1CR15eP9kft60ryHGZ0Xg2AZ4/jSsxbaoyRkPRX97K9hsy6V2GH/DLfMGF/e1ujiq69duzVPwPFxm6VJ971cVbRNhloi5OXSrInzlSgZKQoaUfkkweqkQFpIn5gfgENHPMps/jatMehsw8Hp1JIAbKluiiPb64qE=,iv:ciKVtnXBm74uqRtuWmwY4l2ozx7C7FwRMzGYTAiIKrU=,tag:uuMHWIl7Q76GYbIeC0Cl2g==,type:str]",
"sops": {
"lastmodified": "2026-03-05T13:07:46Z",
"mac": "ENC[AES256_GCM,data:dbietUPzvQJWA8RMQChBt9JxezUJXTEf7PIotTP/dSxfdRtT0fVr74NxXHQgVpFQA7q7+DvQsNzw5kTHSYLufAmj4fQZBFIJSY7rgTDmhGG5SBl0VCE01WXitaWULobhd6hrIqz7aOZ7fH/1tbfvuudzxQj/6Co6pi8seKlI8+4=,iv:Hs9T0qrg6KsM7lpS3D4aAgF71eTjhE11CZIerBsTg9I=,tag:pAwklF4MPHTufGGBmNAPXQ==,type:str]",
"pgp": [
{
"created_at": "2026-03-05T13:07:46Z",
"enc": "-----BEGIN PGP MESSAGE-----\n\nhQIMA8jd+Ki99wZwARAAr4tvdSUScsDZDwg7YfX0wp6Ga+o0F+N57YJVVjXrpyOm\n03VaTbBfulaZXNh5qnVSJ4+CCNfUlhPNEz8fI3v1VJxBmuXUJJ+pVXTq4bAZdEXv\nfXKe/u5EUV+GiiK+GkNb7IbSofJlCeZx6G3UC59IVor4L80Na7EhuSDv/WxJnY1h\n9gzzXC0LT6fF5r4bj0bG8Y5N4x8WMJ/W3mF4r6fsJVGmzebPAgj6q3Hw5k3D3Uc3\nj6PQd/krkG2Ud6m5XG6Y50OnGcPBHtK1hn1IijGDR6BEoCOtG9+ElVOUhw1plRtR\nA59EB9d6+JIA43sp7Z8G8lE+Fp+sBVvboaSb7XGUhvwiqhUSDg2G25GhBHAtGjes\n26QDnT0UN62iWOACNNBqfh95+vkoLEwglzoAIRpIOgJkpFZTDl4D1HnCui9Or9a0\nfBbB33I8Suu28NreVckNUeIBwepvKdorXjvmKE9CT0fcy6Gk6oBZNI1+FZGqdC+S\nfj5u71VHGQku3gR79Puj/XLaufzjw2kMnEBFlkC2guKkXKJE1zDhIr3ExXAXIVIW\n6KOpXjRYGx0zvCte6I2NSc5YKj//NlvLqHFNvmjaLKCw0ZVBS6vHXJC6f+0h+KnO\nJTDtrTbngwGQWh2DKJvQtElfeQ+3HcYvrQOD7jq/6up3k3eSqX6vfbCXwiXA/WXS\nXgH+fUFV6G5DmXqSW9gT2RINZsnKAIcDXhnffbJsJG4HJK4fbsdGkI5dPF4WtWc1\ny7YiAEjgD3E15lOsQQqbpJBQZi5Qv9FkJyIN1RIaK+kI4sCR+UDidixX+H7xxog=\n=Kvim\n-----END PGP MESSAGE-----",
"fp": "7EFF0CECB200083C60EA2AA2C8DDF8A8BDF70670"
}
],
"unencrypted_regex": "^(apiVersion|metadata|kind|type)$",
"version": "3.12.1"
}
}