social-mcp 1.3.2 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/README.md +19 -1
  2. package/dist/index.js +17 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/config.d.ts +4 -0
  5. package/dist/lib/config.js +4 -0
  6. package/dist/lib/config.js.map +1 -1
  7. package/dist/services/linkedin-service.d.ts +48 -0
  8. package/dist/services/linkedin-service.js +142 -0
  9. package/dist/services/linkedin-service.js.map +1 -0
  10. package/dist/tools/linkedin-tools/add-comment.d.ts +18 -0
  11. package/dist/tools/linkedin-tools/add-comment.js +31 -0
  12. package/dist/tools/linkedin-tools/add-comment.js.map +1 -0
  13. package/dist/tools/linkedin-tools/create-post.d.ts +26 -0
  14. package/dist/tools/linkedin-tools/create-post.js +31 -0
  15. package/dist/tools/linkedin-tools/create-post.js.map +1 -0
  16. package/dist/tools/linkedin-tools/delete-post.d.ts +14 -0
  17. package/dist/tools/linkedin-tools/delete-post.js +26 -0
  18. package/dist/tools/linkedin-tools/delete-post.js.map +1 -0
  19. package/dist/tools/linkedin-tools/get-posts.d.ts +16 -0
  20. package/dist/tools/linkedin-tools/get-posts.js +44 -0
  21. package/dist/tools/linkedin-tools/get-posts.js.map +1 -0
  22. package/dist/tools/linkedin-tools/get-profile.d.ts +10 -0
  23. package/dist/tools/linkedin-tools/get-profile.js +24 -0
  24. package/dist/tools/linkedin-tools/get-profile.js.map +1 -0
  25. package/dist/tools/linkedin-tools/like-post.d.ts +16 -0
  26. package/dist/tools/linkedin-tools/like-post.js +30 -0
  27. package/dist/tools/linkedin-tools/like-post.js.map +1 -0
  28. package/dist/tools/linkedin-tools/search-people.d.ts +16 -0
  29. package/dist/tools/linkedin-tools/search-people.js +34 -0
  30. package/dist/tools/linkedin-tools/search-people.js.map +1 -0
  31. package/package.json +77 -78
package/README.md CHANGED
@@ -13,6 +13,7 @@ An MCP (Model Context Protocol) server that lets AI assistants post and interact
13
13
  | Facebook | Create post, get posts |
14
14
  | Instagram | Create post, get posts |
15
15
  | Slack | Send message, get messages, list channels |
16
+ | LinkedIn | Get profile, create post, get posts, like post, add comment, search people |
16
17
 
17
18
  ## Quick Start
18
19
 
@@ -52,7 +53,8 @@ Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS)
52
53
  "WHATSAPP_PHONE_NUMBER_ID": "your_id",
53
54
  "FACEBOOK_ACCESS_TOKEN": "your_token",
54
55
  "INSTAGRAM_ACCESS_TOKEN": "your_token",
55
- "SLACK_BOT_TOKEN": "your_token"
56
+ "SLACK_BOT_TOKEN": "your_token",
57
+ "LINKEDIN_ACCESS_TOKEN": "your_token"
56
58
  }
57
59
  }
58
60
  }
@@ -120,6 +122,11 @@ Copy `example.env` to `.env` and fill in the credentials for the platforms you w
120
122
  |----------|-------------|
121
123
  | `SLACK_BOT_TOKEN` | Bot token from [api.slack.com](https://api.slack.com/apps) — requires `chat:write`, `channels:history`, `channels:read` scopes |
122
124
 
125
+ ### LinkedIn
126
+ | Variable | Description |
127
+ |----------|-------------|
128
+ | `LINKEDIN_ACCESS_TOKEN` | OAuth 2.0 access token from the [LinkedIn Developer Portal](https://www.linkedin.com/developers/apps) — requires `r_liteprofile`, `w_member_social` scopes |
129
+
123
130
  ## Available Tools
124
131
 
125
132
  ### Telegram
@@ -161,6 +168,17 @@ Copy `example.env` to `.env` and fill in the credentials for the platforms you w
161
168
  - **GET_SLACK_MESSAGES** — Retrieve recent messages from a channel (`channelId`, `limit`)
162
169
  - **LIST_SLACK_CHANNELS** — List public channels in the workspace (`limit`)
163
170
 
171
+ ### LinkedIn
172
+ - **GET_LINKEDIN_PROFILE** — Get the authenticated user's profile information
173
+ - **CREATE_LINKEDIN_POST** — Create a UGC post (`authorUrn`, `text`, `visibility`)
174
+ - **GET_LINKEDIN_POSTS** — Retrieve recent posts by a member or organization (`authorUrn`, `count`)
175
+ - **DELETE_LINKEDIN_POST** — Delete a UGC post (`ugcPostUrn`)
176
+ - **LIKE_LINKEDIN_POST** — Like a post (`actorUrn`, `ugcPostUrn`)
177
+ - **ADD_LINKEDIN_COMMENT** — Comment on a post (`actorUrn`, `ugcPostUrn`, `text`)
178
+ - **SEARCH_LINKEDIN_PEOPLE** — Search for people by keywords (`keywords`, `count`)
179
+
180
+ > **Note:** `SEARCH_LINKEDIN_PEOPLE` uses the LinkedIn People Search API which requires [Partner Program](https://learn.microsoft.com/en-us/linkedin/talent/recruiter-system-connect/getting-access) access. Most developer apps will receive a 403. All other tools work with a standard OAuth 2.0 token.
181
+
164
182
  ## Development
165
183
 
166
184
  ```bash
package/dist/index.js CHANGED
@@ -5,6 +5,7 @@ import { CredentialsError } from "./lib/errors.js";
5
5
  import { getDiscordService } from "./services/discord-service.js";
6
6
  import { getFacebookService } from "./services/facebook-service.js";
7
7
  import { getInstagramService } from "./services/instagram-service.js";
8
+ import { getLinkedInService } from "./services/linkedin-service.js";
8
9
  import { getSlackService } from "./services/slack-service.js";
9
10
  import { getTelegramService } from "./services/telegram-service.js";
10
11
  import { getTwitterService } from "./services/twitter-service.js";
@@ -15,6 +16,13 @@ import { createPostTool as facebookCreatePostTool } from "./tools/facebook-tools
15
16
  import { getPostsTool as facebookGetPostsTool } from "./tools/facebook-tools/get-posts.js";
16
17
  import { createPostTool as instagramCreatePostTool } from "./tools/instagram-tools/create-post.js";
17
18
  import { getPostsTool as instagramGetPostsTool } from "./tools/instagram-tools/get-posts.js";
19
+ import { addCommentTool as linkedInAddCommentTool } from "./tools/linkedin-tools/add-comment.js";
20
+ import { createPostTool as linkedInCreatePostTool } from "./tools/linkedin-tools/create-post.js";
21
+ import { deletePostTool as linkedInDeletePostTool } from "./tools/linkedin-tools/delete-post.js";
22
+ import { getPostsTool as linkedInGetPostsTool } from "./tools/linkedin-tools/get-posts.js";
23
+ import { getProfileTool as linkedInGetProfileTool } from "./tools/linkedin-tools/get-profile.js";
24
+ import { likePostTool as linkedInLikePostTool } from "./tools/linkedin-tools/like-post.js";
25
+ import { searchPeopleTool as linkedInSearchPeopleTool } from "./tools/linkedin-tools/search-people.js";
18
26
  import { getMessagesTool as slackGetMessagesTool } from "./tools/slack-tools/get-messages.js";
19
27
  import { listChannelsTool as slackListChannelsTool } from "./tools/slack-tools/list-channels.js";
20
28
  import { sendMessageTool as slackSendMessageTool } from "./tools/slack-tools/send-message.js";
@@ -57,6 +65,7 @@ async function main() {
57
65
  checkPlatform("Facebook", getFacebookService);
58
66
  checkPlatform("Instagram", getInstagramService);
59
67
  checkPlatform("Slack", getSlackService);
68
+ checkPlatform("LinkedIn", getLinkedInService);
60
69
  console.error("");
61
70
  const server = new FastMCP({ name: "Social MCP Server", version });
62
71
  // Telegram
@@ -89,6 +98,14 @@ async function main() {
89
98
  server.addTool(slackSendMessageTool);
90
99
  server.addTool(slackGetMessagesTool);
91
100
  server.addTool(slackListChannelsTool);
101
+ // LinkedIn
102
+ server.addTool(linkedInGetProfileTool);
103
+ server.addTool(linkedInCreatePostTool);
104
+ server.addTool(linkedInGetPostsTool);
105
+ server.addTool(linkedInDeletePostTool);
106
+ server.addTool(linkedInLikePostTool);
107
+ server.addTool(linkedInAddCommentTool);
108
+ server.addTool(linkedInSearchPeopleTool);
92
109
  try {
93
110
  await server.start({ transportType: "stdio" });
94
111
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,eAAe,IAAI,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EAAE,eAAe,IAAI,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EAAE,cAAc,IAAI,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACjG,OAAO,EAAE,YAAY,IAAI,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,cAAc,IAAI,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACnG,OAAO,EAAE,YAAY,IAAI,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7F,OAAO,EAAE,cAAc,IAAI,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACjG,OAAO,EAAE,cAAc,IAAI,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACjG,OAAO,EAAE,cAAc,IAAI,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACjG,OAAO,EAAE,YAAY,IAAI,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,cAAc,IAAI,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACjG,OAAO,EAAE,YAAY,IAAI,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,gBAAgB,IAAI,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACvG,OAAO,EAAE,eAAe,IAAI,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC9F,OAAO,EAAE,gBAAgB,IAAI,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AACjG,OAAO,EAAE,eAAe,IAAI,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,+CAA+C,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,eAAe,IAAI,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAEpG,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAE5C,CAAC;AAEF,SAAS,aAAa,CAAC,IAAY,EAAE,IAAmB;IACvD,IAAI,CAAC;QACJ,IAAI,EAAE,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACd,IAAI,GAAG,YAAY,gBAAgB,EAAE,CAAC;YACrC,OAAO,CAAC,KAAK,CAAC,UAAU,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,KAAK,CACZ,UAAU,IAAI,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACrE,CAAC;QACH,CAAC;IACF,CAAC;AACF,CAAC;AAED,KAAK,UAAU,IAAI;IAClB,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC5D,aAAa,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;IAC9C,aAAa,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;IAC9C,aAAa,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAC5C,aAAa,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;IAC9C,aAAa,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;IAC9C,aAAa,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;IAChD,aAAa,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACxC,aAAa,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;IAC9C,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAElB,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,CAAC,CAAC;IAEnE,WAAW;IACX,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAChC,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACnC,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACnC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/B,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACtC,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAEhC,UAAU;IACV,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9B,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAChC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACjC,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/B,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC9B,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAEhC,UAAU;IACV,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACvC,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAEvC,WAAW;IACX,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAExC,WAAW;IACX,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACvC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAErC,YAAY;IACZ,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACxC,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAEtC,QAAQ;IACR,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACrC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACrC,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IAEtC,WAAW;IACX,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACvC,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACvC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACrC,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACvC,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACrC,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACvC,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAEzC,IAAI,CAAC;QACJ,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACtB,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;IAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC"}
@@ -17,4 +17,8 @@ export declare const config: {
17
17
  baseUrl: string;
18
18
  accessToken: string;
19
19
  };
20
+ linkedin: {
21
+ baseUrl: string;
22
+ accessToken: string;
23
+ };
20
24
  };
@@ -18,5 +18,9 @@ export const config = {
18
18
  baseUrl: META_BASE,
19
19
  accessToken: process.env.INSTAGRAM_ACCESS_TOKEN || "",
20
20
  },
21
+ linkedin: {
22
+ baseUrl: "https://api.linkedin.com/v2",
23
+ accessToken: process.env.LINKEDIN_ACCESS_TOKEN || "",
24
+ },
21
25
  };
22
26
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AACxC,MAAM,SAAS,GAAG,8BAA8B,gBAAgB,EAAE,CAAC;AAEnE,MAAM,CAAC,MAAM,MAAM,GAAG;IACrB,OAAO,EAAE;QACR,OAAO,EAAE,6BAA6B;QACtC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE;KAC7C;IACD,QAAQ,EAAE;QACT,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;QACpD,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE;KACzD;IACD,QAAQ,EAAE;QACT,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;KACpD;IACD,SAAS,EAAE;QACV,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE;KACrD;CACD,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AACxC,MAAM,SAAS,GAAG,8BAA8B,gBAAgB,EAAE,CAAC;AAEnE,MAAM,CAAC,MAAM,MAAM,GAAG;IACrB,OAAO,EAAE;QACR,OAAO,EAAE,6BAA6B;QACtC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE;KAC7C;IACD,QAAQ,EAAE;QACT,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;QACpD,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,wBAAwB,IAAI,EAAE;KACzD;IACD,QAAQ,EAAE;QACT,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;KACpD;IACD,SAAS,EAAE;QACV,OAAO,EAAE,SAAS;QAClB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE;KACrD;IACD,QAAQ,EAAE;QACT,OAAO,EAAE,6BAA6B;QACtC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE;KACpD;CACD,CAAC"}
@@ -0,0 +1,48 @@
1
+ export declare class LinkedInService {
2
+ private baseUrl;
3
+ private headers;
4
+ constructor();
5
+ getProfile(): Promise<{
6
+ id: string;
7
+ localizedFirstName?: string | undefined;
8
+ localizedLastName?: string | undefined;
9
+ localizedHeadline?: string | undefined;
10
+ }>;
11
+ createPost(authorUrn: string, text: string, visibility?: string): Promise<{
12
+ id: string;
13
+ }>;
14
+ getPosts(authorUrn: string, count?: number): Promise<{
15
+ elements: {
16
+ id: string;
17
+ created?: {
18
+ time: number;
19
+ } | undefined;
20
+ specificContent?: {
21
+ "com.linkedin.ugc.ShareContent"?: {
22
+ shareCommentary?: {
23
+ text: string;
24
+ } | undefined;
25
+ } | undefined;
26
+ } | undefined;
27
+ }[];
28
+ }>;
29
+ likePost(actorUrn: string, ugcPostUrn: string): Promise<{
30
+ id: string;
31
+ activity?: string | undefined;
32
+ }>;
33
+ addComment(actorUrn: string, ugcPostUrn: string, text: string): Promise<{
34
+ id: string;
35
+ activity?: string | undefined;
36
+ }>;
37
+ deletePost(ugcPostUrn: string): Promise<void>;
38
+ searchPeople(keywords: string, count?: number): Promise<{
39
+ elements: {
40
+ targetUrn?: string | undefined;
41
+ "*profileActions"?: string | undefined;
42
+ }[];
43
+ metadata?: {
44
+ nextDecoratedCursor?: string | undefined;
45
+ } | undefined;
46
+ }>;
47
+ }
48
+ export declare function getLinkedInService(): LinkedInService;
@@ -0,0 +1,142 @@
1
+ import { z } from "zod";
2
+ import { config } from "../lib/config.js";
3
+ import { CredentialsError } from "../lib/errors.js";
4
+ import { fetchJson } from "../lib/http.js";
5
+ const linkedInProfileSchema = z.object({
6
+ id: z.string(),
7
+ localizedFirstName: z.string().optional(),
8
+ localizedLastName: z.string().optional(),
9
+ localizedHeadline: z.string().optional(),
10
+ });
11
+ const linkedInUGCPostSchema = z.object({
12
+ id: z.string(),
13
+ });
14
+ const linkedInShareSchema = z.object({
15
+ id: z.string(),
16
+ activity: z.string().optional(),
17
+ });
18
+ const linkedInPostsResponseSchema = z.object({
19
+ elements: z.array(z.object({
20
+ id: z.string(),
21
+ created: z
22
+ .object({
23
+ time: z.number(),
24
+ })
25
+ .optional(),
26
+ specificContent: z
27
+ .object({
28
+ "com.linkedin.ugc.ShareContent": z
29
+ .object({
30
+ shareCommentary: z
31
+ .object({
32
+ text: z.string(),
33
+ })
34
+ .optional(),
35
+ })
36
+ .optional(),
37
+ })
38
+ .optional(),
39
+ })),
40
+ });
41
+ const linkedInSearchResponseSchema = z.object({
42
+ elements: z.array(z.object({
43
+ targetUrn: z.string().optional(),
44
+ "*profileActions": z.string().optional(),
45
+ })),
46
+ metadata: z
47
+ .object({
48
+ nextDecoratedCursor: z.string().optional(),
49
+ })
50
+ .optional(),
51
+ });
52
+ export class LinkedInService {
53
+ baseUrl = config.linkedin.baseUrl;
54
+ headers;
55
+ constructor() {
56
+ if (!config.linkedin.accessToken) {
57
+ throw new CredentialsError("LinkedIn", ["LINKEDIN_ACCESS_TOKEN"]);
58
+ }
59
+ this.headers = {
60
+ "Content-Type": "application/json",
61
+ Authorization: `Bearer ${config.linkedin.accessToken}`,
62
+ "X-Restli-Protocol-Version": "2.0.0",
63
+ };
64
+ }
65
+ async getProfile() {
66
+ return fetchJson(`${this.baseUrl}/me`, { method: "GET", headers: this.headers }, linkedInProfileSchema);
67
+ }
68
+ async createPost(authorUrn, text, visibility = "PUBLIC") {
69
+ const body = {
70
+ author: authorUrn,
71
+ lifecycleState: "PUBLISHED",
72
+ specificContent: {
73
+ "com.linkedin.ugc.ShareContent": {
74
+ shareCommentary: { text },
75
+ shareMediaCategory: "NONE",
76
+ },
77
+ },
78
+ visibility: {
79
+ "com.linkedin.ugc.MemberNetworkVisibility": visibility,
80
+ },
81
+ };
82
+ return fetchJson(`${this.baseUrl}/ugcPosts`, {
83
+ method: "POST",
84
+ headers: this.headers,
85
+ body: JSON.stringify(body),
86
+ }, linkedInUGCPostSchema);
87
+ }
88
+ async getPosts(authorUrn, count = 10) {
89
+ const encoded = encodeURIComponent(authorUrn);
90
+ return fetchJson(`${this.baseUrl}/ugcPosts?q=authors&authors=List(${encoded})&count=${count}`, { method: "GET", headers: this.headers }, linkedInPostsResponseSchema);
91
+ }
92
+ async likePost(actorUrn, ugcPostUrn) {
93
+ const encoded = encodeURIComponent(ugcPostUrn);
94
+ const body = {
95
+ actor: actorUrn,
96
+ object: ugcPostUrn,
97
+ };
98
+ return fetchJson(`${this.baseUrl}/socialActions/${encoded}/likes`, {
99
+ method: "POST",
100
+ headers: this.headers,
101
+ body: JSON.stringify(body),
102
+ }, linkedInShareSchema);
103
+ }
104
+ async addComment(actorUrn, ugcPostUrn, text) {
105
+ const encoded = encodeURIComponent(ugcPostUrn);
106
+ const body = {
107
+ actor: actorUrn,
108
+ object: ugcPostUrn,
109
+ message: { text },
110
+ };
111
+ return fetchJson(`${this.baseUrl}/socialActions/${encoded}/comments`, {
112
+ method: "POST",
113
+ headers: this.headers,
114
+ body: JSON.stringify(body),
115
+ }, linkedInShareSchema);
116
+ }
117
+ async deletePost(ugcPostUrn) {
118
+ const encoded = encodeURIComponent(ugcPostUrn);
119
+ const response = await fetch(`${this.baseUrl}/ugcPosts/${encoded}`, {
120
+ method: "DELETE",
121
+ headers: this.headers,
122
+ });
123
+ if (!response.ok) {
124
+ throw new Error(`LinkedIn API error ${response.status}: ${await response.text()}`);
125
+ }
126
+ }
127
+ async searchPeople(keywords, count = 10) {
128
+ const params = new URLSearchParams({
129
+ q: "people",
130
+ keywords,
131
+ count: String(count),
132
+ });
133
+ return fetchJson(`${this.baseUrl}/search?${params}`, { method: "GET", headers: this.headers }, linkedInSearchResponseSchema);
134
+ }
135
+ }
136
+ let _instance;
137
+ export function getLinkedInService() {
138
+ if (!_instance)
139
+ _instance = new LinkedInService();
140
+ return _instance;
141
+ }
142
+ //# sourceMappingURL=linkedin-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linkedin-service.js","sourceRoot":"","sources":["../../src/services/linkedin-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { z } from "zod";
2
+ declare const addCommentParams: z.ZodObject<{
3
+ actorUrn: z.ZodString;
4
+ ugcPostUrn: z.ZodString;
5
+ text: z.ZodString;
6
+ }, z.core.$strip>;
7
+ type AddCommentParams = z.infer<typeof addCommentParams>;
8
+ export declare const addCommentTool: {
9
+ readonly name: "ADD_LINKEDIN_COMMENT";
10
+ readonly description: "Add a comment to a LinkedIn post";
11
+ readonly parameters: z.ZodObject<{
12
+ actorUrn: z.ZodString;
13
+ ugcPostUrn: z.ZodString;
14
+ text: z.ZodString;
15
+ }, z.core.$strip>;
16
+ readonly execute: (params: AddCommentParams) => Promise<string>;
17
+ };
18
+ export {};
@@ -0,0 +1,31 @@
1
+ import { z } from "zod";
2
+ import { CredentialsError } from "../../lib/errors.js";
3
+ import { getLinkedInService } from "../../services/linkedin-service.js";
4
+ const addCommentParams = z.object({
5
+ actorUrn: z
6
+ .string()
7
+ .min(1)
8
+ .describe("The URN of the person posting the comment, e.g. urn:li:person:ABC123"),
9
+ ugcPostUrn: z
10
+ .string()
11
+ .min(1)
12
+ .describe("The URN of the post to comment on, e.g. urn:li:ugcPost:123456"),
13
+ text: z.string().min(1).max(1250).describe("The comment text"),
14
+ });
15
+ export const addCommentTool = {
16
+ name: "ADD_LINKEDIN_COMMENT",
17
+ description: "Add a comment to a LinkedIn post",
18
+ parameters: addCommentParams,
19
+ execute: async (params) => {
20
+ try {
21
+ const result = await getLinkedInService().addComment(params.actorUrn, params.ugcPostUrn, params.text);
22
+ return `Comment added successfully to LinkedIn post: ${params.ugcPostUrn}\n\nComment ID: ${result.id}`;
23
+ }
24
+ catch (error) {
25
+ if (error instanceof CredentialsError)
26
+ return `Error: ${error.message}`;
27
+ return `Error adding LinkedIn comment: ${error instanceof Error ? error.message : "Unknown error"}`;
28
+ }
29
+ },
30
+ };
31
+ //# sourceMappingURL=add-comment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-comment.js","sourceRoot":"","sources":["../../../src/tools/linkedin-tools/add-comment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAExE,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,QAAQ,EAAE,CAAC;SACT,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CACR,sEAAsE,CACtE;IACF,UAAU,EAAE,CAAC;SACX,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,+DAA+D,CAAC;IAC3E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;CAC9D,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,kCAAkC;IAC/C,UAAU,EAAE,gBAAgB;IAC5B,OAAO,EAAE,KAAK,EAAE,MAAwB,EAAE,EAAE;QAC3C,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC,UAAU,CACnD,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,IAAI,CACX,CAAC;YACF,OAAO,gDAAgD,MAAM,CAAC,UAAU,mBAAmB,MAAM,CAAC,EAAE,EAAE,CAAC;QACxG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,KAAK,YAAY,gBAAgB;gBAAE,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;YACxE,OAAO,kCAAkC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;QACrG,CAAC;IACF,CAAC;CACQ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { z } from "zod";
2
+ declare const createPostParams: z.ZodObject<{
3
+ authorUrn: z.ZodString;
4
+ text: z.ZodString;
5
+ visibility: z.ZodDefault<z.ZodEnum<{
6
+ PUBLIC: "PUBLIC";
7
+ CONNECTIONS: "CONNECTIONS";
8
+ LOGGED_IN: "LOGGED_IN";
9
+ }>>;
10
+ }, z.core.$strip>;
11
+ type CreatePostParams = z.infer<typeof createPostParams>;
12
+ export declare const createPostTool: {
13
+ readonly name: "CREATE_LINKEDIN_POST";
14
+ readonly description: "Create a LinkedIn UGC post on behalf of a member or organization";
15
+ readonly parameters: z.ZodObject<{
16
+ authorUrn: z.ZodString;
17
+ text: z.ZodString;
18
+ visibility: z.ZodDefault<z.ZodEnum<{
19
+ PUBLIC: "PUBLIC";
20
+ CONNECTIONS: "CONNECTIONS";
21
+ LOGGED_IN: "LOGGED_IN";
22
+ }>>;
23
+ }, z.core.$strip>;
24
+ readonly execute: (params: CreatePostParams) => Promise<string>;
25
+ };
26
+ export {};
@@ -0,0 +1,31 @@
1
+ import { z } from "zod";
2
+ import { CredentialsError } from "../../lib/errors.js";
3
+ import { getLinkedInService } from "../../services/linkedin-service.js";
4
+ const createPostParams = z.object({
5
+ authorUrn: z
6
+ .string()
7
+ .min(1)
8
+ .describe("The URN of the post author, e.g. urn:li:person:ABC123 or urn:li:organization:123456"),
9
+ text: z.string().min(1).max(3000).describe("The text content of the post"),
10
+ visibility: z
11
+ .enum(["PUBLIC", "CONNECTIONS", "LOGGED_IN"])
12
+ .default("PUBLIC")
13
+ .describe("Who can see the post"),
14
+ });
15
+ export const createPostTool = {
16
+ name: "CREATE_LINKEDIN_POST",
17
+ description: "Create a LinkedIn UGC post on behalf of a member or organization",
18
+ parameters: createPostParams,
19
+ execute: async (params) => {
20
+ try {
21
+ const post = await getLinkedInService().createPost(params.authorUrn, params.text, params.visibility);
22
+ return `Post created successfully on LinkedIn!\n\nPost ID: ${post.id}`;
23
+ }
24
+ catch (error) {
25
+ if (error instanceof CredentialsError)
26
+ return `Error: ${error.message}`;
27
+ return `Error creating LinkedIn post: ${error instanceof Error ? error.message : "Unknown error"}`;
28
+ }
29
+ },
30
+ };
31
+ //# sourceMappingURL=create-post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-post.js","sourceRoot":"","sources":["../../../src/tools/linkedin-tools/create-post.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAExE,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,SAAS,EAAE,CAAC;SACV,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CACR,qFAAqF,CACrF;IACF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,8BAA8B,CAAC;IAC1E,UAAU,EAAE,CAAC;SACX,IAAI,CAAC,CAAC,QAAQ,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC;SAC5C,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,sBAAsB,CAAC;CAClC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,kEAAkE;IAC/E,UAAU,EAAE,gBAAgB;IAC5B,OAAO,EAAE,KAAK,EAAE,MAAwB,EAAE,EAAE;QAC3C,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG,MAAM,kBAAkB,EAAE,CAAC,UAAU,CACjD,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,IAAI,EACX,MAAM,CAAC,UAAU,CACjB,CAAC;YACF,OAAO,sDAAsD,IAAI,CAAC,EAAE,EAAE,CAAC;QACxE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,KAAK,YAAY,gBAAgB;gBAAE,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;YACxE,OAAO,iCAAiC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;QACpG,CAAC;IACF,CAAC;CACQ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { z } from "zod";
2
+ declare const deletePostParams: z.ZodObject<{
3
+ ugcPostUrn: z.ZodString;
4
+ }, z.core.$strip>;
5
+ type DeletePostParams = z.infer<typeof deletePostParams>;
6
+ export declare const deletePostTool: {
7
+ readonly name: "DELETE_LINKEDIN_POST";
8
+ readonly description: "Delete a LinkedIn UGC post";
9
+ readonly parameters: z.ZodObject<{
10
+ ugcPostUrn: z.ZodString;
11
+ }, z.core.$strip>;
12
+ readonly execute: (params: DeletePostParams) => Promise<string>;
13
+ };
14
+ export {};
@@ -0,0 +1,26 @@
1
+ import { z } from "zod";
2
+ import { CredentialsError } from "../../lib/errors.js";
3
+ import { getLinkedInService } from "../../services/linkedin-service.js";
4
+ const deletePostParams = z.object({
5
+ ugcPostUrn: z
6
+ .string()
7
+ .min(1)
8
+ .describe("The URN of the post to delete, e.g. urn:li:ugcPost:123456"),
9
+ });
10
+ export const deletePostTool = {
11
+ name: "DELETE_LINKEDIN_POST",
12
+ description: "Delete a LinkedIn UGC post",
13
+ parameters: deletePostParams,
14
+ execute: async (params) => {
15
+ try {
16
+ await getLinkedInService().deletePost(params.ugcPostUrn);
17
+ return `Post deleted successfully: ${params.ugcPostUrn}`;
18
+ }
19
+ catch (error) {
20
+ if (error instanceof CredentialsError)
21
+ return `Error: ${error.message}`;
22
+ return `Error deleting LinkedIn post: ${error instanceof Error ? error.message : "Unknown error"}`;
23
+ }
24
+ },
25
+ };
26
+ //# sourceMappingURL=delete-post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete-post.js","sourceRoot":"","sources":["../../../src/tools/linkedin-tools/delete-post.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAExE,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,UAAU,EAAE,CAAC;SACX,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,2DAA2D,CAAC;CACvE,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,4BAA4B;IACzC,UAAU,EAAE,gBAAgB;IAC5B,OAAO,EAAE,KAAK,EAAE,MAAwB,EAAE,EAAE;QAC3C,IAAI,CAAC;YACJ,MAAM,kBAAkB,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACzD,OAAO,8BAA8B,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,KAAK,YAAY,gBAAgB;gBAAE,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;YACxE,OAAO,iCAAiC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;QACpG,CAAC;IACF,CAAC;CACQ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { z } from "zod";
2
+ declare const getPostsParams: z.ZodObject<{
3
+ authorUrn: z.ZodString;
4
+ count: z.ZodDefault<z.ZodNumber>;
5
+ }, z.core.$strip>;
6
+ type GetPostsParams = z.infer<typeof getPostsParams>;
7
+ export declare const getPostsTool: {
8
+ readonly name: "GET_LINKEDIN_POSTS";
9
+ readonly description: "Get recent LinkedIn UGC posts by a member or organization";
10
+ readonly parameters: z.ZodObject<{
11
+ authorUrn: z.ZodString;
12
+ count: z.ZodDefault<z.ZodNumber>;
13
+ }, z.core.$strip>;
14
+ readonly execute: (params: GetPostsParams) => Promise<string>;
15
+ };
16
+ export {};
@@ -0,0 +1,44 @@
1
+ import { z } from "zod";
2
+ import { CredentialsError } from "../../lib/errors.js";
3
+ import { getLinkedInService } from "../../services/linkedin-service.js";
4
+ const getPostsParams = z.object({
5
+ authorUrn: z
6
+ .string()
7
+ .min(1)
8
+ .describe("The URN of the post author, e.g. urn:li:person:ABC123 or urn:li:organization:123456"),
9
+ count: z
10
+ .number()
11
+ .int()
12
+ .min(1)
13
+ .max(100)
14
+ .default(10)
15
+ .describe("Number of posts to retrieve"),
16
+ });
17
+ export const getPostsTool = {
18
+ name: "GET_LINKEDIN_POSTS",
19
+ description: "Get recent LinkedIn UGC posts by a member or organization",
20
+ parameters: getPostsParams,
21
+ execute: async (params) => {
22
+ try {
23
+ const result = await getLinkedInService().getPosts(params.authorUrn, params.count);
24
+ if (result.elements.length === 0) {
25
+ return "No posts found for the specified author.";
26
+ }
27
+ const lines = result.elements.map((el, i) => {
28
+ const text = el.specificContent?.["com.linkedin.ugc.ShareContent"]
29
+ ?.shareCommentary?.text ?? "(no text)";
30
+ const ts = el.created?.time
31
+ ? new Date(el.created.time).toISOString()
32
+ : "unknown time";
33
+ return `${i + 1}. [${ts}] ${el.id}\n ${text}`;
34
+ });
35
+ return `LinkedIn posts for ${params.authorUrn}:\n\n${lines.join("\n\n")}`;
36
+ }
37
+ catch (error) {
38
+ if (error instanceof CredentialsError)
39
+ return `Error: ${error.message}`;
40
+ return `Error fetching LinkedIn posts: ${error instanceof Error ? error.message : "Unknown error"}`;
41
+ }
42
+ },
43
+ };
44
+ //# sourceMappingURL=get-posts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-posts.js","sourceRoot":"","sources":["../../../src/tools/linkedin-tools/get-posts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAExE,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,SAAS,EAAE,CAAC;SACV,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CACR,qFAAqF,CACrF;IACF,KAAK,EAAE,CAAC;SACN,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,6BAA6B,CAAC;CACzC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC3B,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,2DAA2D;IACxE,UAAU,EAAE,cAAc;IAC1B,OAAO,EAAE,KAAK,EAAE,MAAsB,EAAE,EAAE;QACzC,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC,QAAQ,CACjD,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,KAAK,CACZ,CAAC;YACF,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClC,OAAO,0CAA0C,CAAC;YACnD,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE;gBAC3C,MAAM,IAAI,GACT,EAAE,CAAC,eAAe,EAAE,CAAC,+BAA+B,CAAC;oBACpD,EAAE,eAAe,EAAE,IAAI,IAAI,WAAW,CAAC;gBACzC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,IAAI;oBAC1B,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE;oBACzC,CAAC,CAAC,cAAc,CAAC;gBAClB,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,IAAI,EAAE,CAAC;YACjD,CAAC,CAAC,CAAC;YACH,OAAO,sBAAsB,MAAM,CAAC,SAAS,QAAQ,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,KAAK,YAAY,gBAAgB;gBAAE,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;YACxE,OAAO,kCAAkC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;QACrG,CAAC;IACF,CAAC;CACQ,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { z } from "zod";
2
+ declare const getProfileParams: z.ZodObject<{}, z.core.$strip>;
3
+ type GetProfileParams = z.infer<typeof getProfileParams>;
4
+ export declare const getProfileTool: {
5
+ readonly name: "GET_LINKEDIN_PROFILE";
6
+ readonly description: "Get the authenticated user's LinkedIn profile information";
7
+ readonly parameters: z.ZodObject<{}, z.core.$strip>;
8
+ readonly execute: (_params: GetProfileParams) => Promise<string>;
9
+ };
10
+ export {};
@@ -0,0 +1,24 @@
1
+ import { z } from "zod";
2
+ import { CredentialsError } from "../../lib/errors.js";
3
+ import { getLinkedInService } from "../../services/linkedin-service.js";
4
+ const getProfileParams = z.object({});
5
+ export const getProfileTool = {
6
+ name: "GET_LINKEDIN_PROFILE",
7
+ description: "Get the authenticated user's LinkedIn profile information",
8
+ parameters: getProfileParams,
9
+ execute: async (_params) => {
10
+ try {
11
+ const profile = await getLinkedInService().getProfile();
12
+ const name = [profile.localizedFirstName, profile.localizedLastName]
13
+ .filter(Boolean)
14
+ .join(" ");
15
+ return `LinkedIn Profile:\n\nID: ${profile.id}\nName: ${name || "N/A"}\nHeadline: ${profile.localizedHeadline ?? "N/A"}`;
16
+ }
17
+ catch (error) {
18
+ if (error instanceof CredentialsError)
19
+ return `Error: ${error.message}`;
20
+ return `Error fetching LinkedIn profile: ${error instanceof Error ? error.message : "Unknown error"}`;
21
+ }
22
+ },
23
+ };
24
+ //# sourceMappingURL=get-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-profile.js","sourceRoot":"","sources":["../../../src/tools/linkedin-tools/get-profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAExE,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAItC,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,IAAI,EAAE,sBAAsB;IAC5B,WAAW,EAAE,2DAA2D;IACxE,UAAU,EAAE,gBAAgB;IAC5B,OAAO,EAAE,KAAK,EAAE,OAAyB,EAAE,EAAE;QAC5C,IAAI,CAAC;YACJ,MAAM,OAAO,GAAG,MAAM,kBAAkB,EAAE,CAAC,UAAU,EAAE,CAAC;YACxD,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,iBAAiB,CAAC;iBAClE,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,CAAC,GAAG,CAAC,CAAC;YACZ,OAAO,4BAA4B,OAAO,CAAC,EAAE,WAAW,IAAI,IAAI,KAAK,eAAe,OAAO,CAAC,iBAAiB,IAAI,KAAK,EAAE,CAAC;QAC1H,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,KAAK,YAAY,gBAAgB;gBAAE,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;YACxE,OAAO,oCAAoC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;QACvG,CAAC;IACF,CAAC;CACQ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { z } from "zod";
2
+ declare const likePostParams: z.ZodObject<{
3
+ actorUrn: z.ZodString;
4
+ ugcPostUrn: z.ZodString;
5
+ }, z.core.$strip>;
6
+ type LikePostParams = z.infer<typeof likePostParams>;
7
+ export declare const likePostTool: {
8
+ readonly name: "LIKE_LINKEDIN_POST";
9
+ readonly description: "Like a LinkedIn post on behalf of a member";
10
+ readonly parameters: z.ZodObject<{
11
+ actorUrn: z.ZodString;
12
+ ugcPostUrn: z.ZodString;
13
+ }, z.core.$strip>;
14
+ readonly execute: (params: LikePostParams) => Promise<string>;
15
+ };
16
+ export {};
@@ -0,0 +1,30 @@
1
+ import { z } from "zod";
2
+ import { CredentialsError } from "../../lib/errors.js";
3
+ import { getLinkedInService } from "../../services/linkedin-service.js";
4
+ const likePostParams = z.object({
5
+ actorUrn: z
6
+ .string()
7
+ .min(1)
8
+ .describe("The URN of the person liking the post, e.g. urn:li:person:ABC123"),
9
+ ugcPostUrn: z
10
+ .string()
11
+ .min(1)
12
+ .describe("The URN of the post to like, e.g. urn:li:ugcPost:123456"),
13
+ });
14
+ export const likePostTool = {
15
+ name: "LIKE_LINKEDIN_POST",
16
+ description: "Like a LinkedIn post on behalf of a member",
17
+ parameters: likePostParams,
18
+ execute: async (params) => {
19
+ try {
20
+ await getLinkedInService().likePost(params.actorUrn, params.ugcPostUrn);
21
+ return `Successfully liked LinkedIn post: ${params.ugcPostUrn}`;
22
+ }
23
+ catch (error) {
24
+ if (error instanceof CredentialsError)
25
+ return `Error: ${error.message}`;
26
+ return `Error liking LinkedIn post: ${error instanceof Error ? error.message : "Unknown error"}`;
27
+ }
28
+ },
29
+ };
30
+ //# sourceMappingURL=like-post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"like-post.js","sourceRoot":"","sources":["../../../src/tools/linkedin-tools/like-post.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAExE,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,QAAQ,EAAE,CAAC;SACT,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,kEAAkE,CAAC;IAC9E,UAAU,EAAE,CAAC;SACX,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,yDAAyD,CAAC;CACrE,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC3B,IAAI,EAAE,oBAAoB;IAC1B,WAAW,EAAE,4CAA4C;IACzD,UAAU,EAAE,cAAc;IAC1B,OAAO,EAAE,KAAK,EAAE,MAAsB,EAAE,EAAE;QACzC,IAAI,CAAC;YACJ,MAAM,kBAAkB,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;YACxE,OAAO,qCAAqC,MAAM,CAAC,UAAU,EAAE,CAAC;QACjE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,KAAK,YAAY,gBAAgB;gBAAE,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;YACxE,OAAO,+BAA+B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;QAClG,CAAC;IACF,CAAC;CACQ,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { z } from "zod";
2
+ declare const searchPeopleParams: z.ZodObject<{
3
+ keywords: z.ZodString;
4
+ count: z.ZodDefault<z.ZodNumber>;
5
+ }, z.core.$strip>;
6
+ type SearchPeopleParams = z.infer<typeof searchPeopleParams>;
7
+ export declare const searchPeopleTool: {
8
+ readonly name: "SEARCH_LINKEDIN_PEOPLE";
9
+ readonly description: "Search for people on LinkedIn by keywords";
10
+ readonly parameters: z.ZodObject<{
11
+ keywords: z.ZodString;
12
+ count: z.ZodDefault<z.ZodNumber>;
13
+ }, z.core.$strip>;
14
+ readonly execute: (params: SearchPeopleParams) => Promise<string>;
15
+ };
16
+ export {};
@@ -0,0 +1,34 @@
1
+ import { z } from "zod";
2
+ import { CredentialsError } from "../../lib/errors.js";
3
+ import { getLinkedInService } from "../../services/linkedin-service.js";
4
+ const searchPeopleParams = z.object({
5
+ keywords: z.string().min(1).describe("Keywords to search for people on LinkedIn"),
6
+ count: z
7
+ .number()
8
+ .int()
9
+ .min(1)
10
+ .max(50)
11
+ .default(10)
12
+ .describe("Number of results to return"),
13
+ });
14
+ export const searchPeopleTool = {
15
+ name: "SEARCH_LINKEDIN_PEOPLE",
16
+ description: "Search for people on LinkedIn by keywords",
17
+ parameters: searchPeopleParams,
18
+ execute: async (params) => {
19
+ try {
20
+ const result = await getLinkedInService().searchPeople(params.keywords, params.count);
21
+ if (result.elements.length === 0) {
22
+ return `No people found for keywords: "${params.keywords}"`;
23
+ }
24
+ const lines = result.elements.map((el, i) => `${i + 1}. ${el.targetUrn ?? "(unknown URN)"}`);
25
+ return `LinkedIn people search results for "${params.keywords}":\n\n${lines.join("\n")}`;
26
+ }
27
+ catch (error) {
28
+ if (error instanceof CredentialsError)
29
+ return `Error: ${error.message}`;
30
+ return `Error searching LinkedIn people: ${error instanceof Error ? error.message : "Unknown error"}`;
31
+ }
32
+ },
33
+ };
34
+ //# sourceMappingURL=search-people.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-people.js","sourceRoot":"","sources":["../../../src/tools/linkedin-tools/search-people.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAExE,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,2CAA2C,CAAC;IACjF,KAAK,EAAE,CAAC;SACN,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,EAAE,CAAC;SACP,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,6BAA6B,CAAC;CACzC,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC/B,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EAAE,2CAA2C;IACxD,UAAU,EAAE,kBAAkB;IAC9B,OAAO,EAAE,KAAK,EAAE,MAA0B,EAAE,EAAE;QAC7C,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC,YAAY,CACrD,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,KAAK,CACZ,CAAC;YACF,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClC,OAAO,kCAAkC,MAAM,CAAC,QAAQ,GAAG,CAAC;YAC7D,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAChC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,SAAS,IAAI,eAAe,EAAE,CACzD,CAAC;YACF,OAAO,uCAAuC,MAAM,CAAC,QAAQ,SAAS,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,KAAK,YAAY,gBAAgB;gBAAE,OAAO,UAAU,KAAK,CAAC,OAAO,EAAE,CAAC;YACxE,OAAO,oCAAoC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;QACvG,CAAC;IACF,CAAC;CACQ,CAAC"}
package/package.json CHANGED
@@ -1,79 +1,78 @@
1
1
  {
2
- "name": "social-mcp",
3
- "version": "1.3.2",
4
- "description": "MCP server for posting and interacting across social media platforms: Twitter, Instagram, Facebook, WhatsApp, Discord, Telegram, and Slack",
5
- "main": "dist/index.js",
6
- "type": "module",
7
- "bin": {
8
- "social-mcp": "dist/index.js"
9
- },
10
- "files": [
11
- "dist",
12
- "README.md"
13
- ],
14
- "scripts": {
15
- "build": "tsc && shx chmod +x dist/index.js",
16
- "clean": "shx rm -rf dist",
17
- "prepare": "husky",
18
- "watch": "tsc --watch",
19
- "start": "node dist/index.js",
20
- "release": "pnpm run build && changeset publish",
21
- "format": "biome format . --write",
22
- "lint": "biome check .",
23
- "test": "vitest run",
24
- "test:watch": "vitest"
25
- },
26
- "publishConfig": {
27
- "access": "public"
28
- },
29
- "exports": {
30
- ".": {
31
- "import": "./dist/index.js"
32
- }
33
- },
34
- "repository": {
35
- "type": "git",
36
- "url": "git+https://github.com/oluwaeinstein007/social-mcp.git"
37
- },
38
- "bugs": {
39
- "url": "https://github.com/oluwaeinstein007/social-mcp/issues"
40
- },
41
- "homepage": "https://github.com/oluwaeinstein007/social-mcp#readme",
42
- "keywords": [
43
- "mcp",
44
- "model-context-protocol",
45
- "social-media",
46
- "twitter",
47
- "instagram",
48
- "facebook",
49
- "whatsapp",
50
- "discord",
51
- "telegram",
52
- "slack",
53
- "ai",
54
- "llm",
55
- "automation"
56
- ],
57
- "author": "Lanre Sanni",
58
- "license": "ISC",
59
- "packageManager": "pnpm@10.7.1",
60
- "dependencies": {
61
- "@slack/web-api": "^7.14.1",
62
- "dotenv": "^17.3.1",
63
- "fastmcp": "^3.33.0",
64
- "telegraf": "^4.16.3",
65
- "twitter-api-v2": "^1.29.0",
66
- "zod": "^4.3.6"
67
- },
68
- "devDependencies": {
69
- "@biomejs/biome": "*",
70
- "@changesets/cli": "^2.29.8",
71
- "@types/node": "^22.15.19",
72
- "husky": "^9.1.7",
73
- "lint-staged": "^15.5.2",
74
- "shx": "^0.3.4",
75
- "typescript": "^5.8.3",
76
- "ts-node": "^10.9.2",
77
- "vitest": "^3.2.4"
78
- }
79
- }
2
+ "name": "social-mcp",
3
+ "version": "1.4.0",
4
+ "description": "MCP server for posting and interacting across social media platforms: Twitter, Instagram, Facebook, WhatsApp, Discord, Telegram, Slack, and LinkedIn",
5
+ "main": "dist/index.js",
6
+ "type": "module",
7
+ "bin": {
8
+ "social-mcp": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "README.md"
13
+ ],
14
+ "publishConfig": {
15
+ "access": "public"
16
+ },
17
+ "exports": {
18
+ ".": {
19
+ "import": "./dist/index.js"
20
+ }
21
+ },
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "git+https://github.com/oluwaeinstein007/social-mcp.git"
25
+ },
26
+ "bugs": {
27
+ "url": "https://github.com/oluwaeinstein007/social-mcp/issues"
28
+ },
29
+ "homepage": "https://github.com/oluwaeinstein007/social-mcp#readme",
30
+ "keywords": [
31
+ "mcp",
32
+ "model-context-protocol",
33
+ "social-media",
34
+ "twitter",
35
+ "instagram",
36
+ "facebook",
37
+ "whatsapp",
38
+ "discord",
39
+ "telegram",
40
+ "slack",
41
+ "linkedin",
42
+ "ai",
43
+ "llm",
44
+ "automation"
45
+ ],
46
+ "author": "Lanre Sanni",
47
+ "license": "ISC",
48
+ "dependencies": {
49
+ "@slack/web-api": "^7.14.1",
50
+ "dotenv": "^17.3.1",
51
+ "fastmcp": "^3.33.0",
52
+ "telegraf": "^4.16.3",
53
+ "twitter-api-v2": "^1.29.0",
54
+ "zod": "^4.3.6"
55
+ },
56
+ "devDependencies": {
57
+ "@biomejs/biome": "*",
58
+ "@changesets/cli": "^2.29.8",
59
+ "@types/node": "^22.15.19",
60
+ "husky": "^9.1.7",
61
+ "lint-staged": "^15.5.2",
62
+ "shx": "^0.3.4",
63
+ "typescript": "^5.8.3",
64
+ "ts-node": "^10.9.2",
65
+ "vitest": "^3.2.4"
66
+ },
67
+ "scripts": {
68
+ "build": "tsc && shx chmod +x dist/index.js",
69
+ "clean": "shx rm -rf dist",
70
+ "watch": "tsc --watch",
71
+ "start": "node dist/index.js",
72
+ "release": "pnpm run build && changeset publish",
73
+ "format": "biome format . --write",
74
+ "lint": "biome check .",
75
+ "test": "vitest run",
76
+ "test:watch": "vitest"
77
+ }
78
+ }