@himanshu31shr/linkedin-mcp-server 1.0.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.
- package/LICENSE +21 -0
- package/README.md +71 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/analytics.d.ts +56 -0
- package/dist/schemas/analytics.d.ts.map +1 -0
- package/dist/schemas/analytics.js +41 -0
- package/dist/schemas/analytics.js.map +1 -0
- package/dist/schemas/media.d.ts +60 -0
- package/dist/schemas/media.d.ts.map +1 -0
- package/dist/schemas/media.js +31 -0
- package/dist/schemas/media.js.map +1 -0
- package/dist/schemas/organization.d.ts +74 -0
- package/dist/schemas/organization.d.ts.map +1 -0
- package/dist/schemas/organization.js +77 -0
- package/dist/schemas/organization.js.map +1 -0
- package/dist/schemas/posts.d.ts +51 -0
- package/dist/schemas/posts.d.ts.map +1 -0
- package/dist/schemas/posts.js +28 -0
- package/dist/schemas/posts.js.map +1 -0
- package/dist/schemas/profile.d.ts +30 -0
- package/dist/schemas/profile.d.ts.map +1 -0
- package/dist/schemas/profile.js +12 -0
- package/dist/schemas/profile.js.map +1 -0
- package/dist/schemas/social-actions.d.ts +78 -0
- package/dist/schemas/social-actions.d.ts.map +1 -0
- package/dist/schemas/social-actions.js +80 -0
- package/dist/schemas/social-actions.js.map +1 -0
- package/dist/server.d.ts +10 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +29 -0
- package/dist/server.js.map +1 -0
- package/dist/services/linkedin-client.d.ts +55 -0
- package/dist/services/linkedin-client.d.ts.map +1 -0
- package/dist/services/linkedin-client.js +148 -0
- package/dist/services/linkedin-client.js.map +1 -0
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +7 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/media.d.ts +30 -0
- package/dist/tools/media.d.ts.map +1 -0
- package/dist/tools/media.js +198 -0
- package/dist/tools/media.js.map +1 -0
- package/dist/tools/org-analytics.d.ts +7 -0
- package/dist/tools/org-analytics.d.ts.map +1 -0
- package/dist/tools/org-analytics.js +92 -0
- package/dist/tools/org-analytics.js.map +1 -0
- package/dist/tools/organization.d.ts +7 -0
- package/dist/tools/organization.d.ts.map +1 -0
- package/dist/tools/organization.js +134 -0
- package/dist/tools/organization.js.map +1 -0
- package/dist/tools/posts.d.ts +30 -0
- package/dist/tools/posts.d.ts.map +1 -0
- package/dist/tools/posts.js +127 -0
- package/dist/tools/posts.js.map +1 -0
- package/dist/tools/profile.d.ts +22 -0
- package/dist/tools/profile.d.ts.map +1 -0
- package/dist/tools/profile.js +63 -0
- package/dist/tools/profile.js.map +1 -0
- package/dist/tools/social-actions.d.ts +7 -0
- package/dist/tools/social-actions.d.ts.map +1 -0
- package/dist/tools/social-actions.js +158 -0
- package/dist/tools/social-actions.js.map +1 -0
- package/dist/utils/errors.d.ts +35 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +59 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +19 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/urns.d.ts +43 -0
- package/dist/utils/urns.d.ts.map +1 -0
- package/dist/utils/urns.js +59 -0
- package/dist/utils/urns.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** Valid LinkedIn reaction types */
|
|
3
|
+
export declare const REACTION_TYPES: readonly ["LIKE", "CELEBRATE", "SUPPORT", "LOVE", "INSIGHTFUL", "CURIOUS"];
|
|
4
|
+
export type ReactionType = (typeof REACTION_TYPES)[number];
|
|
5
|
+
/**
|
|
6
|
+
* Schema for get_post_comments tool.
|
|
7
|
+
*/
|
|
8
|
+
export declare const GetPostCommentsSchema: z.ZodObject<{
|
|
9
|
+
postUrn: z.ZodString;
|
|
10
|
+
count: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
11
|
+
start: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
12
|
+
}, "strip", z.ZodTypeAny, {
|
|
13
|
+
postUrn: string;
|
|
14
|
+
count: number;
|
|
15
|
+
start: number;
|
|
16
|
+
}, {
|
|
17
|
+
postUrn: string;
|
|
18
|
+
count?: number | undefined;
|
|
19
|
+
start?: number | undefined;
|
|
20
|
+
}>;
|
|
21
|
+
export type GetPostCommentsInput = z.infer<typeof GetPostCommentsSchema>;
|
|
22
|
+
/**
|
|
23
|
+
* Schema for create_comment tool.
|
|
24
|
+
*/
|
|
25
|
+
export declare const CreateCommentSchema: z.ZodObject<{
|
|
26
|
+
postUrn: z.ZodString;
|
|
27
|
+
text: z.ZodString;
|
|
28
|
+
authorUrn: z.ZodOptional<z.ZodString>;
|
|
29
|
+
}, "strip", z.ZodTypeAny, {
|
|
30
|
+
text: string;
|
|
31
|
+
postUrn: string;
|
|
32
|
+
authorUrn?: string | undefined;
|
|
33
|
+
}, {
|
|
34
|
+
text: string;
|
|
35
|
+
postUrn: string;
|
|
36
|
+
authorUrn?: string | undefined;
|
|
37
|
+
}>;
|
|
38
|
+
export type CreateCommentInput = z.infer<typeof CreateCommentSchema>;
|
|
39
|
+
/**
|
|
40
|
+
* Schema for delete_comment tool.
|
|
41
|
+
*/
|
|
42
|
+
export declare const DeleteCommentSchema: z.ZodObject<{
|
|
43
|
+
commentUrn: z.ZodString;
|
|
44
|
+
}, "strip", z.ZodTypeAny, {
|
|
45
|
+
commentUrn: string;
|
|
46
|
+
}, {
|
|
47
|
+
commentUrn: string;
|
|
48
|
+
}>;
|
|
49
|
+
export type DeleteCommentInput = z.infer<typeof DeleteCommentSchema>;
|
|
50
|
+
/**
|
|
51
|
+
* Schema for add_reaction tool.
|
|
52
|
+
*/
|
|
53
|
+
export declare const AddReactionSchema: z.ZodObject<{
|
|
54
|
+
postUrn: z.ZodString;
|
|
55
|
+
reactionType: z.ZodEnum<["LIKE", "CELEBRATE", "SUPPORT", "LOVE", "INSIGHTFUL", "CURIOUS"]>;
|
|
56
|
+
}, "strip", z.ZodTypeAny, {
|
|
57
|
+
postUrn: string;
|
|
58
|
+
reactionType: "LIKE" | "CELEBRATE" | "SUPPORT" | "LOVE" | "INSIGHTFUL" | "CURIOUS";
|
|
59
|
+
}, {
|
|
60
|
+
postUrn: string;
|
|
61
|
+
reactionType: "LIKE" | "CELEBRATE" | "SUPPORT" | "LOVE" | "INSIGHTFUL" | "CURIOUS";
|
|
62
|
+
}>;
|
|
63
|
+
export type AddReactionInput = z.infer<typeof AddReactionSchema>;
|
|
64
|
+
/**
|
|
65
|
+
* Schema for remove_reaction tool.
|
|
66
|
+
*/
|
|
67
|
+
export declare const RemoveReactionSchema: z.ZodObject<{
|
|
68
|
+
postUrn: z.ZodString;
|
|
69
|
+
reactionType: z.ZodEnum<["LIKE", "CELEBRATE", "SUPPORT", "LOVE", "INSIGHTFUL", "CURIOUS"]>;
|
|
70
|
+
}, "strip", z.ZodTypeAny, {
|
|
71
|
+
postUrn: string;
|
|
72
|
+
reactionType: "LIKE" | "CELEBRATE" | "SUPPORT" | "LOVE" | "INSIGHTFUL" | "CURIOUS";
|
|
73
|
+
}, {
|
|
74
|
+
postUrn: string;
|
|
75
|
+
reactionType: "LIKE" | "CELEBRATE" | "SUPPORT" | "LOVE" | "INSIGHTFUL" | "CURIOUS";
|
|
76
|
+
}>;
|
|
77
|
+
export type RemoveReactionInput = z.infer<typeof RemoveReactionSchema>;
|
|
78
|
+
//# sourceMappingURL=social-actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"social-actions.d.ts","sourceRoot":"","sources":["../../src/schemas/social-actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,oCAAoC;AACpC,eAAO,MAAM,cAAc,4EAOjB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3D;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;;;;;EAmBhC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEzE;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;EAY9B,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAErE;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;EAI9B,CAAC;AAEH,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAErE;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;EAO5B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEjE;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;;EAO/B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** Valid LinkedIn reaction types */
|
|
3
|
+
export const REACTION_TYPES = [
|
|
4
|
+
'LIKE',
|
|
5
|
+
'CELEBRATE',
|
|
6
|
+
'SUPPORT',
|
|
7
|
+
'LOVE',
|
|
8
|
+
'INSIGHTFUL',
|
|
9
|
+
'CURIOUS',
|
|
10
|
+
];
|
|
11
|
+
/**
|
|
12
|
+
* Schema for get_post_comments tool.
|
|
13
|
+
*/
|
|
14
|
+
export const GetPostCommentsSchema = z.object({
|
|
15
|
+
postUrn: z
|
|
16
|
+
.string()
|
|
17
|
+
.describe('The URN of the post to get comments for'),
|
|
18
|
+
count: z
|
|
19
|
+
.number()
|
|
20
|
+
.int()
|
|
21
|
+
.min(1)
|
|
22
|
+
.max(100)
|
|
23
|
+
.optional()
|
|
24
|
+
.default(10)
|
|
25
|
+
.describe('Number of comments to retrieve (1-100, default 10)'),
|
|
26
|
+
start: z
|
|
27
|
+
.number()
|
|
28
|
+
.int()
|
|
29
|
+
.min(0)
|
|
30
|
+
.optional()
|
|
31
|
+
.default(0)
|
|
32
|
+
.describe('Pagination offset (default 0)'),
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* Schema for create_comment tool.
|
|
36
|
+
*/
|
|
37
|
+
export const CreateCommentSchema = z.object({
|
|
38
|
+
postUrn: z
|
|
39
|
+
.string()
|
|
40
|
+
.describe('The URN of the post to comment on'),
|
|
41
|
+
text: z
|
|
42
|
+
.string()
|
|
43
|
+
.min(1)
|
|
44
|
+
.describe('The text content of the comment'),
|
|
45
|
+
authorUrn: z
|
|
46
|
+
.string()
|
|
47
|
+
.optional()
|
|
48
|
+
.describe('The URN of the author (defaults to authenticated user)'),
|
|
49
|
+
});
|
|
50
|
+
/**
|
|
51
|
+
* Schema for delete_comment tool.
|
|
52
|
+
*/
|
|
53
|
+
export const DeleteCommentSchema = z.object({
|
|
54
|
+
commentUrn: z
|
|
55
|
+
.string()
|
|
56
|
+
.describe('The full URN of the comment to delete (e.g., urn:li:comment:(urn:li:activity:123456,789))'),
|
|
57
|
+
});
|
|
58
|
+
/**
|
|
59
|
+
* Schema for add_reaction tool.
|
|
60
|
+
*/
|
|
61
|
+
export const AddReactionSchema = z.object({
|
|
62
|
+
postUrn: z
|
|
63
|
+
.string()
|
|
64
|
+
.describe('The URN of the post to react to'),
|
|
65
|
+
reactionType: z
|
|
66
|
+
.enum(REACTION_TYPES)
|
|
67
|
+
.describe('The type of reaction to add'),
|
|
68
|
+
});
|
|
69
|
+
/**
|
|
70
|
+
* Schema for remove_reaction tool.
|
|
71
|
+
*/
|
|
72
|
+
export const RemoveReactionSchema = z.object({
|
|
73
|
+
postUrn: z
|
|
74
|
+
.string()
|
|
75
|
+
.describe('The URN of the post to remove the reaction from'),
|
|
76
|
+
reactionType: z
|
|
77
|
+
.enum(REACTION_TYPES)
|
|
78
|
+
.describe('The type of reaction to remove'),
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=social-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"social-actions.js","sourceRoot":"","sources":["../../src/schemas/social-actions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,oCAAoC;AACpC,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,MAAM;IACN,WAAW;IACX,SAAS;IACT,MAAM;IACN,YAAY;IACZ,SAAS;CACD,CAAC;AAIX;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,CAAC,yCAAyC,CAAC;IACtD,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,GAAG,CAAC,GAAG,CAAC;SACR,QAAQ,EAAE;SACV,OAAO,CAAC,EAAE,CAAC;SACX,QAAQ,CAAC,oDAAoD,CAAC;IACjE,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,EAAE;SACL,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,EAAE;SACV,OAAO,CAAC,CAAC,CAAC;SACV,QAAQ,CAAC,+BAA+B,CAAC;CAC7C,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,CAAC,mCAAmC,CAAC;IAChD,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,CAAC;SACN,QAAQ,CAAC,iCAAiC,CAAC;IAC9C,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,wDAAwD,CAAC;CACtE,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,UAAU,EAAE,CAAC;SACV,MAAM,EAAE;SACR,QAAQ,CAAC,2FAA2F,CAAC;CACzG,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,CAAC,iCAAiC,CAAC;IAC9C,YAAY,EAAE,CAAC;SACZ,IAAI,CAAC,cAAc,CAAC;SACpB,QAAQ,CAAC,6BAA6B,CAAC;CAC3C,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,CAAC,iDAAiD,CAAC;IAC9D,YAAY,EAAE,CAAC;SACZ,IAAI,CAAC,cAAc,CAAC;SACpB,QAAQ,CAAC,gCAAgC,CAAC;CAC9C,CAAC,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
/**
|
|
3
|
+
* Create and configure the LinkedIn MCP Server.
|
|
4
|
+
* Registers all tool groups against a single LinkedInClient instance.
|
|
5
|
+
*
|
|
6
|
+
* @param accessToken — Optional OAuth 2.0 access token. Falls back to LINKEDIN_ACCESS_TOKEN env var.
|
|
7
|
+
* @returns Configured McpServer ready for transport connection.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createServer(accessToken?: string): McpServer;
|
|
10
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAcpE;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAmB5D"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { LinkedInClient } from './services/linkedin-client.js';
|
|
3
|
+
import { registerProfileTools, registerPostTools, registerMediaTools, registerOrganizationTools, registerSocialActionTools, registerOrgAnalyticsTools, } from './tools/index.js';
|
|
4
|
+
import { createChildLogger } from './utils/logger.js';
|
|
5
|
+
const log = createChildLogger('server');
|
|
6
|
+
/**
|
|
7
|
+
* Create and configure the LinkedIn MCP Server.
|
|
8
|
+
* Registers all tool groups against a single LinkedInClient instance.
|
|
9
|
+
*
|
|
10
|
+
* @param accessToken — Optional OAuth 2.0 access token. Falls back to LINKEDIN_ACCESS_TOKEN env var.
|
|
11
|
+
* @returns Configured McpServer ready for transport connection.
|
|
12
|
+
*/
|
|
13
|
+
export function createServer(accessToken) {
|
|
14
|
+
const server = new McpServer({
|
|
15
|
+
name: 'linkedin-mcp-server',
|
|
16
|
+
version: '1.0.0',
|
|
17
|
+
});
|
|
18
|
+
const client = new LinkedInClient(accessToken);
|
|
19
|
+
// Register all tool groups
|
|
20
|
+
registerProfileTools(server, client);
|
|
21
|
+
registerPostTools(server, client);
|
|
22
|
+
registerMediaTools(server, client);
|
|
23
|
+
registerOrganizationTools(server, client);
|
|
24
|
+
registerSocialActionTools(server, client);
|
|
25
|
+
registerOrgAnalyticsTools(server, client);
|
|
26
|
+
log.info('CAVEMAN: All tool groups registered successfully');
|
|
27
|
+
return server;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,GAAG,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AAExC;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,WAAoB;IAC/C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,qBAAqB;QAC3B,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,WAAW,CAAC,CAAC;IAE/C,2BAA2B;IAC3B,oBAAoB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,yBAAyB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE1C,GAAG,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IAE7D,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/** HTTP methods supported by the client */
|
|
2
|
+
export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
3
|
+
/** Options for making a LinkedIn API request */
|
|
4
|
+
export interface LinkedInRequestOptions {
|
|
5
|
+
/** HTTP method */
|
|
6
|
+
method: HttpMethod;
|
|
7
|
+
/** API path (appended to base URL) */
|
|
8
|
+
path: string;
|
|
9
|
+
/** Use /rest base URL (true, default) or /v2 base URL (false) */
|
|
10
|
+
useRestApi?: boolean;
|
|
11
|
+
/** Request body (will be JSON-serialized) */
|
|
12
|
+
body?: Record<string, unknown>;
|
|
13
|
+
/** Additional query parameters */
|
|
14
|
+
params?: Record<string, string>;
|
|
15
|
+
/** Additional headers */
|
|
16
|
+
headers?: Record<string, string>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* LinkedIn REST API client.
|
|
20
|
+
* Handles authentication, required headers, error parsing, and rate limit awareness.
|
|
21
|
+
*/
|
|
22
|
+
export declare class LinkedInClient {
|
|
23
|
+
private accessToken;
|
|
24
|
+
constructor(accessToken?: string);
|
|
25
|
+
/**
|
|
26
|
+
* Make an authenticated request to the LinkedIn API.
|
|
27
|
+
*/
|
|
28
|
+
request<T = unknown>(options: LinkedInRequestOptions): Promise<T>;
|
|
29
|
+
/**
|
|
30
|
+
* Convenience method for GET requests.
|
|
31
|
+
*/
|
|
32
|
+
get<T = unknown>(path: string, params?: Record<string, string>, useRestApi?: boolean): Promise<T>;
|
|
33
|
+
/**
|
|
34
|
+
* Convenience method for POST requests.
|
|
35
|
+
*/
|
|
36
|
+
post<T = unknown>(path: string, body?: Record<string, unknown>, useRestApi?: boolean): Promise<T>;
|
|
37
|
+
/**
|
|
38
|
+
* Convenience method for DELETE requests.
|
|
39
|
+
*/
|
|
40
|
+
delete<T = unknown>(path: string, useRestApi?: boolean): Promise<T>;
|
|
41
|
+
/**
|
|
42
|
+
* Convenience method for PATCH requests.
|
|
43
|
+
*/
|
|
44
|
+
patch<T = unknown>(path: string, body?: Record<string, unknown>, useRestApi?: boolean): Promise<T>;
|
|
45
|
+
/**
|
|
46
|
+
* Upload binary data to a LinkedIn upload URL.
|
|
47
|
+
* Used for image/video/document uploads where LinkedIn provides a pre-signed URL.
|
|
48
|
+
*/
|
|
49
|
+
uploadBinary(uploadUrl: string, data: Uint8Array, contentType: string): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Extract a useful error message from a LinkedIn API error response.
|
|
52
|
+
*/
|
|
53
|
+
private extractApiErrorMessage;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=linkedin-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linkedin-client.d.ts","sourceRoot":"","sources":["../../src/services/linkedin-client.ts"],"names":[],"mappings":"AAYA,2CAA2C;AAC3C,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErE,gDAAgD;AAChD,MAAM,WAAW,sBAAsB;IACrC,kBAAkB;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,sCAAsC;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,CAAC,EAAE,MAAM;IAShC;;OAEG;IACG,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,CAAC,CAAC;IA2EvE;;OAEG;IACG,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,UAAU,UAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAIpG;;OAEG;IACG,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,UAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAIpG;;OAEG;IACG,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,UAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAItE;;OAEG;IACG,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,UAAU,UAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAIrG;;;OAGG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB3F;;OAEG;IACH,OAAO,CAAC,sBAAsB;CAiB/B"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { AuthenticationError, LinkedInApiError } from '../utils/errors.js';
|
|
2
|
+
import { createChildLogger } from '../utils/logger.js';
|
|
3
|
+
const log = createChildLogger('linkedin-client');
|
|
4
|
+
/** LinkedIn API version header value (YYYYMM format) */
|
|
5
|
+
const LINKEDIN_API_VERSION = '202406';
|
|
6
|
+
/** Base URLs for LinkedIn API */
|
|
7
|
+
const REST_BASE_URL = 'https://api.linkedin.com/rest';
|
|
8
|
+
const V2_BASE_URL = 'https://api.linkedin.com/v2';
|
|
9
|
+
/**
|
|
10
|
+
* LinkedIn REST API client.
|
|
11
|
+
* Handles authentication, required headers, error parsing, and rate limit awareness.
|
|
12
|
+
*/
|
|
13
|
+
export class LinkedInClient {
|
|
14
|
+
accessToken;
|
|
15
|
+
constructor(accessToken) {
|
|
16
|
+
const token = accessToken ?? process.env.LINKEDIN_ACCESS_TOKEN;
|
|
17
|
+
if (!token) {
|
|
18
|
+
throw new AuthenticationError();
|
|
19
|
+
}
|
|
20
|
+
this.accessToken = token;
|
|
21
|
+
log.info('CAVEMAN: LinkedInClient initialized with token (length=%d)', token.length);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Make an authenticated request to the LinkedIn API.
|
|
25
|
+
*/
|
|
26
|
+
async request(options) {
|
|
27
|
+
const baseUrl = options.useRestApi === false ? V2_BASE_URL : REST_BASE_URL;
|
|
28
|
+
const url = new URL(`${baseUrl}${options.path}`);
|
|
29
|
+
// Append query params
|
|
30
|
+
if (options.params) {
|
|
31
|
+
for (const [key, value] of Object.entries(options.params)) {
|
|
32
|
+
url.searchParams.set(key, value);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
const headers = {
|
|
36
|
+
Authorization: `Bearer ${this.accessToken}`,
|
|
37
|
+
'LinkedIn-Version': LINKEDIN_API_VERSION,
|
|
38
|
+
'X-Restli-Protocol-Version': '2.0.0',
|
|
39
|
+
...options.headers,
|
|
40
|
+
};
|
|
41
|
+
// Add Content-Type for requests with bodies
|
|
42
|
+
if (options.body) {
|
|
43
|
+
headers['Content-Type'] = 'application/json';
|
|
44
|
+
}
|
|
45
|
+
log.debug('CAVEMAN: %s %s', options.method, url.toString());
|
|
46
|
+
const response = await fetch(url.toString(), {
|
|
47
|
+
method: options.method,
|
|
48
|
+
headers,
|
|
49
|
+
body: options.body ? JSON.stringify(options.body) : undefined,
|
|
50
|
+
});
|
|
51
|
+
log.debug('CAVEMAN: Response status=%d', response.status);
|
|
52
|
+
// Handle rate limiting
|
|
53
|
+
if (response.status === 429) {
|
|
54
|
+
const retryAfter = response.headers.get('Retry-After');
|
|
55
|
+
throw new LinkedInApiError(429, `Rate limited by LinkedIn API. ${retryAfter ? `Retry after ${retryAfter} seconds.` : 'Please try again later.'}`);
|
|
56
|
+
}
|
|
57
|
+
// Handle no-content responses (e.g., DELETE)
|
|
58
|
+
if (response.status === 204) {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
// Parse response body
|
|
62
|
+
const responseText = await response.text();
|
|
63
|
+
let responseBody;
|
|
64
|
+
if (responseText) {
|
|
65
|
+
try {
|
|
66
|
+
responseBody = JSON.parse(responseText);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// If response is not JSON, wrap it
|
|
70
|
+
responseBody = { rawResponse: responseText };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Handle error responses
|
|
74
|
+
if (!response.ok) {
|
|
75
|
+
const errorMessage = this.extractApiErrorMessage(responseBody, response.status);
|
|
76
|
+
log.error('CAVEMAN: API error: %s', errorMessage);
|
|
77
|
+
throw new LinkedInApiError(response.status, errorMessage, typeof responseBody === 'object' ? responseBody : undefined);
|
|
78
|
+
}
|
|
79
|
+
log.debug('CAVEMAN: Request successful');
|
|
80
|
+
return responseBody;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Convenience method for GET requests.
|
|
84
|
+
*/
|
|
85
|
+
async get(path, params, useRestApi = true) {
|
|
86
|
+
return this.request({ method: 'GET', path, params, useRestApi });
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Convenience method for POST requests.
|
|
90
|
+
*/
|
|
91
|
+
async post(path, body, useRestApi = true) {
|
|
92
|
+
return this.request({ method: 'POST', path, body, useRestApi });
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Convenience method for DELETE requests.
|
|
96
|
+
*/
|
|
97
|
+
async delete(path, useRestApi = true) {
|
|
98
|
+
return this.request({ method: 'DELETE', path, useRestApi });
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Convenience method for PATCH requests.
|
|
102
|
+
*/
|
|
103
|
+
async patch(path, body, useRestApi = true) {
|
|
104
|
+
return this.request({ method: 'PATCH', path, body, useRestApi });
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Upload binary data to a LinkedIn upload URL.
|
|
108
|
+
* Used for image/video/document uploads where LinkedIn provides a pre-signed URL.
|
|
109
|
+
*/
|
|
110
|
+
async uploadBinary(uploadUrl, data, contentType) {
|
|
111
|
+
log.debug('CAVEMAN: Uploading binary to %s (size=%d, type=%s)', uploadUrl, data.length, contentType);
|
|
112
|
+
const response = await fetch(uploadUrl, {
|
|
113
|
+
method: 'PUT',
|
|
114
|
+
headers: {
|
|
115
|
+
Authorization: `Bearer ${this.accessToken}`,
|
|
116
|
+
'Content-Type': contentType,
|
|
117
|
+
},
|
|
118
|
+
body: data,
|
|
119
|
+
});
|
|
120
|
+
if (!response.ok) {
|
|
121
|
+
const text = await response.text();
|
|
122
|
+
log.error('CAVEMAN: Upload failed: status=%d, body=%s', response.status, text);
|
|
123
|
+
throw new LinkedInApiError(response.status, `Upload failed: ${text}`);
|
|
124
|
+
}
|
|
125
|
+
log.debug('CAVEMAN: Upload successful');
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Extract a useful error message from a LinkedIn API error response.
|
|
129
|
+
*/
|
|
130
|
+
extractApiErrorMessage(responseBody, status) {
|
|
131
|
+
if (responseBody && typeof responseBody === 'object') {
|
|
132
|
+
const body = responseBody;
|
|
133
|
+
// LinkedIn error format: { message: "...", status: 401 }
|
|
134
|
+
if (typeof body.message === 'string') {
|
|
135
|
+
return body.message;
|
|
136
|
+
}
|
|
137
|
+
// Alternative format: { error: "...", error_description: "..." }
|
|
138
|
+
if (typeof body.error_description === 'string') {
|
|
139
|
+
return body.error_description;
|
|
140
|
+
}
|
|
141
|
+
if (typeof body.error === 'string') {
|
|
142
|
+
return body.error;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return `LinkedIn API request failed with status ${status}`;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=linkedin-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linkedin-client.js","sourceRoot":"","sources":["../../src/services/linkedin-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { registerProfileTools } from './profile.js';
|
|
2
|
+
export { registerPostTools } from './posts.js';
|
|
3
|
+
export { registerMediaTools } from './media.js';
|
|
4
|
+
export { registerOrganizationTools } from './organization.js';
|
|
5
|
+
export { registerSocialActionTools } from './social-actions.js';
|
|
6
|
+
export { registerOrgAnalyticsTools } from './org-analytics.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { registerProfileTools } from './profile.js';
|
|
2
|
+
export { registerPostTools } from './posts.js';
|
|
3
|
+
export { registerMediaTools } from './media.js';
|
|
4
|
+
export { registerOrganizationTools } from './organization.js';
|
|
5
|
+
export { registerSocialActionTools } from './social-actions.js';
|
|
6
|
+
export { registerOrgAnalyticsTools } from './org-analytics.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import type { TextContent } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
import { LinkedInClient } from '../services/linkedin-client.js';
|
|
4
|
+
import { type UploadImageInput, type CreateImagePostInput, type CreateDocumentPostInput } from '../schemas/media.js';
|
|
5
|
+
/**
|
|
6
|
+
* Upload an image to LinkedIn and return the image URN.
|
|
7
|
+
*/
|
|
8
|
+
export declare function uploadImage(client: LinkedInClient, input: UploadImageInput): Promise<{
|
|
9
|
+
content: TextContent[];
|
|
10
|
+
isError?: true;
|
|
11
|
+
}>;
|
|
12
|
+
/**
|
|
13
|
+
* Create a post with an image on LinkedIn.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createImagePost(client: LinkedInClient, input: CreateImagePostInput): Promise<{
|
|
16
|
+
content: TextContent[];
|
|
17
|
+
isError?: true;
|
|
18
|
+
}>;
|
|
19
|
+
/**
|
|
20
|
+
* Create a post with a document (PDF, etc.) on LinkedIn.
|
|
21
|
+
*/
|
|
22
|
+
export declare function createDocumentPost(client: LinkedInClient, input: CreateDocumentPostInput): Promise<{
|
|
23
|
+
content: TextContent[];
|
|
24
|
+
isError?: true;
|
|
25
|
+
}>;
|
|
26
|
+
/**
|
|
27
|
+
* Register all media-related tools with the MCP server.
|
|
28
|
+
*/
|
|
29
|
+
export declare function registerMediaTools(server: McpServer, client: LinkedInClient): void;
|
|
30
|
+
//# sourceMappingURL=media.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/tools/media.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAGhE,OAAO,EAIL,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC7B,MAAM,qBAAqB,CAAC;AA2C7B;;GAEG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC;IAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC,CAsCrD;AA4BD;;GAEG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC;IAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC,CA4CrD;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC;IAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC,CA8DrD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAmClF"}
|