From 9e1fe1370c1e74abbf411c034103c8660f0115cc Mon Sep 17 00:00:00 2001 From: gotha Date: Thu, 5 Mar 2026 15:25:35 +0200 Subject: [PATCH] WIP - integrate linkedin mcp server --- flake.lock | 42 +++++++++---------- home-manager/mcp/default.nix | 16 +++++++ .../mcp/linkedin-mcp-server-wrapper.nix | 11 +++++ home-manager/sops/default.nix | 18 ++++++++ secrets/linkedin-app.enc.json | 18 ++++++++ 5 files changed, 84 insertions(+), 21 deletions(-) create mode 100644 home-manager/mcp/linkedin-mcp-server-wrapper.nix create mode 100644 secrets/linkedin-app.enc.json diff --git a/flake.lock b/flake.lock index 7704132..553e53c 100644 --- a/flake.lock +++ b/flake.lock @@ -7,11 +7,11 @@ ] }, "locked": { - "lastModified": 1771992996, - "narHash": "sha256-Y/ijH/unOPxzUicbla6yT/14RJgubUWnY2I2A6Ast2Q=", + "lastModified": 1772379624, + "narHash": "sha256-NG9LLTWlz4YiaTAiRGChbrzbVxBfX+Auq4Ab/SWmk4A=", "owner": "lnl7", "repo": "nix-darwin", - "rev": "3bfa436c1975674ca465ce34586467be301ff509", + "rev": "52d061516108769656a8bd9c6e811c677ec5b462", "type": "github" }, "original": { @@ -61,11 +61,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1771394122, - "narHash": "sha256-Z8gca9rOPaYchx7uR7g4iWKh8FOQ7+ZRSsR9O/Ilri8=", + "lastModified": 1772716938, + "narHash": "sha256-4g47DLpWHDsoqgFQHKVYQLb+ZnXRnK8FuVBYPUTqYAw=", "owner": "gotha", "repo": "nixpkgs", - "rev": "2292ed482b47e3b600d69da97123b697c49bd5fb", + "rev": "0d9a6c48450808ab75131311ff38a3aefc99a1e5", "type": "github" }, "original": { @@ -82,11 +82,11 @@ ] }, "locked": { - "lastModified": 1772330611, - "narHash": "sha256-UZjPc/d5XRxvjDbk4veAO4XFdvx6BUum2l40V688Xq8=", + "lastModified": 1772633327, + "narHash": "sha256-jl+DJB2DUx7EbWLRng+6HNWW/1/VQOnf0NsQB4PlA7I=", "owner": "nix-community", "repo": "home-manager", - "rev": "58fd7ff0eec2cda43e705c4c0585729ec471d400", + "rev": "5a75730e6f21ee624cbf86f4915c6e7489c74acc", "type": "github" }, "original": { @@ -121,11 +121,11 @@ "nixpkgs": "nixpkgs_3" }, "locked": { - "lastModified": 1772333747, - "narHash": "sha256-3Zf3U1MS865xg2SdhKeJ8LldAgPtNndahZzPr7k1BSU=", + "lastModified": 1772678592, + "narHash": "sha256-1VZ1hg1YHW+WyBXIOfrQ9Oq+qLL0w93lkdKAiRRHEuI=", "owner": "nix-community", "repo": "nix-vscode-extensions", - "rev": "56e29b45cf55aa208eb7e67d7bff6f7ec301485c", + "rev": "5521856f37c3d2654fe9b20b03331a6594f855c6", "type": "github" }, "original": { @@ -188,11 +188,11 @@ }, "nixpkgs-stable": { "locked": { - "lastModified": 1772047000, - "narHash": "sha256-7DaQVv4R97cii/Qdfy4tmDZMB2xxtyIvNGSwXBBhSmo=", + "lastModified": 1772598333, + "narHash": "sha256-YaHht/C35INEX3DeJQNWjNaTcPjYmBwwjFJ2jdtr+5U=", "owner": "nixos", "repo": "nixpkgs", - "rev": "1267bb4920d0fc06ea916734c11b0bf004bbe17e", + "rev": "fabb8c9deee281e50b1065002c9828f2cf7b2239", "type": "github" }, "original": { @@ -235,11 +235,11 @@ }, "nixpkgs_4": { "locked": { - "lastModified": 1772173633, - "narHash": "sha256-MOH58F4AIbCkh6qlQcwMycyk5SWvsqnS/TCfnqDlpj4=", + "lastModified": 1772643971, + "narHash": "sha256-+bllfMsclzbAAPMZTm3K9G/a5lG+s6l18/AyyYLPSIE=", "owner": "nixos", "repo": "nixpkgs", - "rev": "c0f3d81a7ddbc2b1332be0d8481a672b4f6004d6", + "rev": "400de68cd101e8cfebffea121397683caf7f5a34", "type": "github" }, "original": { @@ -270,11 +270,11 @@ ] }, "locked": { - "lastModified": 1772340640, - "narHash": "sha256-1nq7+Kt5IUBD8Hu3nptVPbMf+22rNJoHT0t9L1X+GKA=", + "lastModified": 1772495394, + "narHash": "sha256-hmIvE/slLKEFKNEJz27IZ8BKlAaZDcjIHmkZ7GCEjfw=", "owner": "Mic92", "repo": "sops-nix", - "rev": "dec4d8eac700dcd2fe3c020857d3ee220ec147f1", + "rev": "1d9b98a29a45abe9c4d3174bd36de9f28755e3ff", "type": "github" }, "original": { diff --git a/home-manager/mcp/default.nix b/home-manager/mcp/default.nix index 84cb809..fb3b7f8 100644 --- a/home-manager/mcp/default.nix +++ b/home-manager/mcp/default.nix @@ -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; @@ -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 ]); @@ -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"; @@ -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; diff --git a/home-manager/mcp/linkedin-mcp-server-wrapper.nix b/home-manager/mcp/linkedin-mcp-server-wrapper.nix new file mode 100644 index 0000000..2b0ad07 --- /dev/null +++ b/home-manager/mcp/linkedin-mcp-server-wrapper.nix @@ -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 "$@" +'' diff --git a/home-manager/sops/default.nix b/home-manager/sops/default.nix index 42c6691..ee2aa87 100644 --- a/home-manager/sops/default.nix +++ b/home-manager/sops/default.nix @@ -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"; + }; }; } diff --git a/secrets/linkedin-app.enc.json b/secrets/linkedin-app.enc.json new file mode 100644 index 0000000..4feb632 --- /dev/null +++ b/secrets/linkedin-app.enc.json @@ -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" + } +}