@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,198 @@
|
|
|
1
|
+
import { formatToolError, formatToolResult } from '../utils/errors.js';
|
|
2
|
+
import { createChildLogger } from '../utils/logger.js';
|
|
3
|
+
import { UploadImageInputSchema, CreateImagePostInputSchema, CreateDocumentPostInputSchema, } from '../schemas/media.js';
|
|
4
|
+
const log = createChildLogger('media-tools');
|
|
5
|
+
/**
|
|
6
|
+
* Helper to get the authenticated user's person URN.
|
|
7
|
+
*/
|
|
8
|
+
async function getPersonUrn(client) {
|
|
9
|
+
const userInfo = await client.get('/userinfo', undefined, false);
|
|
10
|
+
return `urn:li:person:${userInfo.sub}`;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Fetch binary data from a URL.
|
|
14
|
+
*/
|
|
15
|
+
async function fetchBinaryFromUrl(url) {
|
|
16
|
+
log.info('CAVEMAN: Fetching binary from URL: %s', url);
|
|
17
|
+
const response = await fetch(url);
|
|
18
|
+
if (!response.ok) {
|
|
19
|
+
throw new Error(`Failed to fetch from ${url}: HTTP ${response.status} ${response.statusText}`);
|
|
20
|
+
}
|
|
21
|
+
const contentType = response.headers.get('content-type') ?? 'application/octet-stream';
|
|
22
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
23
|
+
return { data: new Uint8Array(arrayBuffer), contentType };
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Upload an image to LinkedIn and return the image URN.
|
|
27
|
+
*/
|
|
28
|
+
export async function uploadImage(client, input) {
|
|
29
|
+
try {
|
|
30
|
+
log.info('CAVEMAN: Starting image upload from URL: %s', input.imageUrl);
|
|
31
|
+
const personUrn = await getPersonUrn(client);
|
|
32
|
+
log.info('CAVEMAN: Resolved person URN: %s', personUrn);
|
|
33
|
+
// Step 1: Initialize upload
|
|
34
|
+
const initResponse = await client.post('/images?action=initializeUpload', {
|
|
35
|
+
initializeUploadRequest: {
|
|
36
|
+
owner: personUrn,
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
const uploadUrl = initResponse.value.uploadUrl;
|
|
40
|
+
const imageUrn = initResponse.value.image;
|
|
41
|
+
log.info('CAVEMAN: Got upload URL and image URN: %s', imageUrn);
|
|
42
|
+
// Step 2: Fetch image from source URL
|
|
43
|
+
const { data, contentType } = await fetchBinaryFromUrl(input.imageUrl);
|
|
44
|
+
log.info('CAVEMAN: Fetched image (size=%d, type=%s)', data.length, contentType);
|
|
45
|
+
// Step 3: Upload the binary to LinkedIn
|
|
46
|
+
await client.uploadBinary(uploadUrl, data, contentType);
|
|
47
|
+
log.info('CAVEMAN: Image uploaded successfully');
|
|
48
|
+
return formatToolResult({
|
|
49
|
+
success: true,
|
|
50
|
+
imageUrn,
|
|
51
|
+
message: 'Image uploaded successfully',
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
log.error('CAVEMAN: Failed to upload image: %s', error);
|
|
56
|
+
return formatToolError(error);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Internal helper to upload an image and return the URN (throws on failure).
|
|
61
|
+
*/
|
|
62
|
+
async function uploadImageInternal(client, imageUrl, personUrn) {
|
|
63
|
+
const initResponse = await client.post('/images?action=initializeUpload', {
|
|
64
|
+
initializeUploadRequest: {
|
|
65
|
+
owner: personUrn,
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
const uploadUrl = initResponse.value.uploadUrl;
|
|
69
|
+
const imageUrn = initResponse.value.image;
|
|
70
|
+
const { data, contentType } = await fetchBinaryFromUrl(imageUrl);
|
|
71
|
+
await client.uploadBinary(uploadUrl, data, contentType);
|
|
72
|
+
return imageUrn;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Create a post with an image on LinkedIn.
|
|
76
|
+
*/
|
|
77
|
+
export async function createImagePost(client, input) {
|
|
78
|
+
try {
|
|
79
|
+
log.info('CAVEMAN: Creating image post (imageUrl=%s)', input.imageUrl);
|
|
80
|
+
const personUrn = await getPersonUrn(client);
|
|
81
|
+
log.info('CAVEMAN: Resolved person URN: %s', personUrn);
|
|
82
|
+
// Step 1: Upload the image
|
|
83
|
+
const imageUrn = await uploadImageInternal(client, input.imageUrl, personUrn);
|
|
84
|
+
log.info('CAVEMAN: Image uploaded with URN: %s', imageUrn);
|
|
85
|
+
// Step 2: Create the post with the image
|
|
86
|
+
const visibility = input.visibility ?? 'PUBLIC';
|
|
87
|
+
const body = {
|
|
88
|
+
author: personUrn,
|
|
89
|
+
commentary: input.text,
|
|
90
|
+
visibility,
|
|
91
|
+
distribution: {
|
|
92
|
+
feedDistribution: 'MAIN_FEED',
|
|
93
|
+
targetEntities: [],
|
|
94
|
+
thirdPartyDistributionChannels: [],
|
|
95
|
+
},
|
|
96
|
+
lifecycleState: 'PUBLISHED',
|
|
97
|
+
content: {
|
|
98
|
+
media: {
|
|
99
|
+
id: imageUrn,
|
|
100
|
+
...(input.altText ? { altText: input.altText } : {}),
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
};
|
|
104
|
+
const response = await client.post('/posts', body);
|
|
105
|
+
log.info('CAVEMAN: Image post created successfully');
|
|
106
|
+
return formatToolResult({
|
|
107
|
+
success: true,
|
|
108
|
+
message: 'Image post created successfully',
|
|
109
|
+
imageUrn,
|
|
110
|
+
postId: response?.id ?? 'unknown',
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
log.error('CAVEMAN: Failed to create image post: %s', error);
|
|
115
|
+
return formatToolError(error);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Create a post with a document (PDF, etc.) on LinkedIn.
|
|
120
|
+
*/
|
|
121
|
+
export async function createDocumentPost(client, input) {
|
|
122
|
+
try {
|
|
123
|
+
log.info('CAVEMAN: Creating document post (documentUrl=%s)', input.documentUrl);
|
|
124
|
+
const personUrn = await getPersonUrn(client);
|
|
125
|
+
log.info('CAVEMAN: Resolved person URN: %s', personUrn);
|
|
126
|
+
// Step 1: Initialize document upload
|
|
127
|
+
const initResponse = await client.post('/documents?action=initializeUpload', {
|
|
128
|
+
initializeUploadRequest: {
|
|
129
|
+
owner: personUrn,
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
const uploadUrl = initResponse.value.uploadUrl;
|
|
133
|
+
const documentUrn = initResponse.value.document;
|
|
134
|
+
log.info('CAVEMAN: Got upload URL and document URN: %s', documentUrn);
|
|
135
|
+
// Step 2: Fetch document from source URL
|
|
136
|
+
const { data, contentType } = await fetchBinaryFromUrl(input.documentUrl);
|
|
137
|
+
log.info('CAVEMAN: Fetched document (size=%d, type=%s)', data.length, contentType);
|
|
138
|
+
// Step 3: Upload the binary to LinkedIn
|
|
139
|
+
await client.uploadBinary(uploadUrl, data, contentType);
|
|
140
|
+
log.info('CAVEMAN: Document uploaded successfully');
|
|
141
|
+
// Step 4: Create the post with the document
|
|
142
|
+
const visibility = input.visibility ?? 'PUBLIC';
|
|
143
|
+
const body = {
|
|
144
|
+
author: personUrn,
|
|
145
|
+
commentary: input.text,
|
|
146
|
+
visibility,
|
|
147
|
+
distribution: {
|
|
148
|
+
feedDistribution: 'MAIN_FEED',
|
|
149
|
+
targetEntities: [],
|
|
150
|
+
thirdPartyDistributionChannels: [],
|
|
151
|
+
},
|
|
152
|
+
lifecycleState: 'PUBLISHED',
|
|
153
|
+
content: {
|
|
154
|
+
media: {
|
|
155
|
+
id: documentUrn,
|
|
156
|
+
...(input.title ? { title: input.title } : {}),
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
const response = await client.post('/posts', body);
|
|
161
|
+
log.info('CAVEMAN: Document post created successfully');
|
|
162
|
+
return formatToolResult({
|
|
163
|
+
success: true,
|
|
164
|
+
message: 'Document post created successfully',
|
|
165
|
+
documentUrn,
|
|
166
|
+
postId: response?.id ?? 'unknown',
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
log.error('CAVEMAN: Failed to create document post: %s', error);
|
|
171
|
+
return formatToolError(error);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Register all media-related tools with the MCP server.
|
|
176
|
+
*/
|
|
177
|
+
export function registerMediaTools(server, client) {
|
|
178
|
+
server.registerTool('upload_image', {
|
|
179
|
+
description: 'Upload an image to LinkedIn from a URL and get an image URN for use in posts',
|
|
180
|
+
inputSchema: UploadImageInputSchema.shape,
|
|
181
|
+
}, async (input) => {
|
|
182
|
+
return uploadImage(client, input);
|
|
183
|
+
});
|
|
184
|
+
server.registerTool('create_image_post', {
|
|
185
|
+
description: 'Create a post with an image on LinkedIn',
|
|
186
|
+
inputSchema: CreateImagePostInputSchema.shape,
|
|
187
|
+
}, async (input) => {
|
|
188
|
+
return createImagePost(client, input);
|
|
189
|
+
});
|
|
190
|
+
server.registerTool('create_document_post', {
|
|
191
|
+
description: 'Create a post with a document (PDF, etc.) on LinkedIn',
|
|
192
|
+
inputSchema: CreateDocumentPostInputSchema.shape,
|
|
193
|
+
}, async (input) => {
|
|
194
|
+
return createDocumentPost(client, input);
|
|
195
|
+
});
|
|
196
|
+
log.info('CAVEMAN: Registered media tools (upload_image, create_image_post, create_document_post)');
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/tools/media.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { LinkedInClient } from '../services/linkedin-client.js';
|
|
3
|
+
/**
|
|
4
|
+
* Register all organization analytics tools with the MCP server.
|
|
5
|
+
*/
|
|
6
|
+
export declare function registerOrgAnalyticsTools(server: McpServer, client: LinkedInClient): void;
|
|
7
|
+
//# sourceMappingURL=org-analytics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"org-analytics.d.ts","sourceRoot":"","sources":["../../src/tools/org-analytics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAYhE;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAgHzF"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { createChildLogger } from '../utils/logger.js';
|
|
2
|
+
import { formatToolError, formatToolResult } from '../utils/errors.js';
|
|
3
|
+
import { buildUrn } from '../utils/urns.js';
|
|
4
|
+
import { GetOrgPageStatisticsSchema, GetOrgFollowerStatisticsSchema, GetOrgShareStatisticsSchema, } from '../schemas/analytics.js';
|
|
5
|
+
const log = createChildLogger('org-analytics-tools');
|
|
6
|
+
/**
|
|
7
|
+
* Register all organization analytics tools with the MCP server.
|
|
8
|
+
*/
|
|
9
|
+
export function registerOrgAnalyticsTools(server, client) {
|
|
10
|
+
// ─── get_org_page_statistics ────────────────────────────────────────────
|
|
11
|
+
server.registerTool('get_org_page_statistics', {
|
|
12
|
+
description: 'Get page view statistics for a LinkedIn organization',
|
|
13
|
+
inputSchema: {
|
|
14
|
+
organizationId: GetOrgPageStatisticsSchema.shape.organizationId,
|
|
15
|
+
timeRange: GetOrgPageStatisticsSchema.shape.timeRange,
|
|
16
|
+
},
|
|
17
|
+
}, async (params) => {
|
|
18
|
+
try {
|
|
19
|
+
log.info('CAVEMAN: get_org_page_statistics called for org=%s', params.organizationId);
|
|
20
|
+
const orgUrn = buildUrn('organization', params.organizationId);
|
|
21
|
+
const queryParams = {
|
|
22
|
+
q: 'organization',
|
|
23
|
+
organization: orgUrn,
|
|
24
|
+
};
|
|
25
|
+
if (params.timeRange) {
|
|
26
|
+
queryParams['timeIntervals.timeGranularityType'] = 'DAY';
|
|
27
|
+
queryParams['timeIntervals.timeRange.start'] = String(params.timeRange.start);
|
|
28
|
+
queryParams['timeIntervals.timeRange.end'] = String(params.timeRange.end);
|
|
29
|
+
}
|
|
30
|
+
const result = await client.get('/organizationPageStatistics', queryParams, false);
|
|
31
|
+
log.info('CAVEMAN: get_org_page_statistics succeeded');
|
|
32
|
+
return formatToolResult(result);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
log.error('CAVEMAN: get_org_page_statistics failed: %s', error);
|
|
36
|
+
return formatToolError(error);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
// ─── get_org_follower_statistics ────────────────────────────────────────
|
|
40
|
+
server.registerTool('get_org_follower_statistics', {
|
|
41
|
+
description: 'Get follower statistics for a LinkedIn organization',
|
|
42
|
+
inputSchema: {
|
|
43
|
+
organizationId: GetOrgFollowerStatisticsSchema.shape.organizationId,
|
|
44
|
+
},
|
|
45
|
+
}, async (params) => {
|
|
46
|
+
try {
|
|
47
|
+
log.info('CAVEMAN: get_org_follower_statistics called for org=%s', params.organizationId);
|
|
48
|
+
const orgUrn = buildUrn('organization', params.organizationId);
|
|
49
|
+
const result = await client.get('/organizationalEntityFollowerStatistics', {
|
|
50
|
+
q: 'organizationalEntity',
|
|
51
|
+
organizationalEntity: orgUrn,
|
|
52
|
+
}, false);
|
|
53
|
+
log.info('CAVEMAN: get_org_follower_statistics succeeded');
|
|
54
|
+
return formatToolResult(result);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
log.error('CAVEMAN: get_org_follower_statistics failed: %s', error);
|
|
58
|
+
return formatToolError(error);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
// ─── get_org_share_statistics ───────────────────────────────────────────
|
|
62
|
+
server.registerTool('get_org_share_statistics', {
|
|
63
|
+
description: 'Get share/post engagement statistics for a LinkedIn organization',
|
|
64
|
+
inputSchema: {
|
|
65
|
+
organizationId: GetOrgShareStatisticsSchema.shape.organizationId,
|
|
66
|
+
shareUrns: GetOrgShareStatisticsSchema.shape.shareUrns,
|
|
67
|
+
},
|
|
68
|
+
}, async (params) => {
|
|
69
|
+
try {
|
|
70
|
+
log.info('CAVEMAN: get_org_share_statistics called for org=%s', params.organizationId);
|
|
71
|
+
const orgUrn = buildUrn('organization', params.organizationId);
|
|
72
|
+
const queryParams = {
|
|
73
|
+
q: 'organizationalEntity',
|
|
74
|
+
organizationalEntity: orgUrn,
|
|
75
|
+
};
|
|
76
|
+
// Add share URN filters if provided
|
|
77
|
+
if (params.shareUrns && params.shareUrns.length > 0) {
|
|
78
|
+
params.shareUrns.forEach((urn, index) => {
|
|
79
|
+
queryParams[`shares[${index}]`] = urn;
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
const result = await client.get('/organizationalEntityShareStatistics', queryParams, false);
|
|
83
|
+
log.info('CAVEMAN: get_org_share_statistics succeeded');
|
|
84
|
+
return formatToolResult(result);
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
log.error('CAVEMAN: get_org_share_statistics failed: %s', error);
|
|
88
|
+
return formatToolError(error);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=org-analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"org-analytics.js","sourceRoot":"","sources":["../../src/tools/org-analytics.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EACL,0BAA0B,EAC1B,8BAA8B,EAC9B,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AAEjC,MAAM,GAAG,GAAG,iBAAiB,CAAC,qBAAqB,CAAC,CAAC;AAErD;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAiB,EAAE,MAAsB;IACjF,2EAA2E;IAC3E,MAAM,CAAC,YAAY,CACjB,yBAAyB,EACzB;QACE,WAAW,EAAE,sDAAsD;QACnE,WAAW,EAAE;YACX,cAAc,EAAE,0BAA0B,CAAC,KAAK,CAAC,cAAc;YAC/D,SAAS,EAAE,0BAA0B,CAAC,KAAK,CAAC,SAAS;SACtD;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,oDAAoD,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;YAEtF,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;YAC/D,MAAM,WAAW,GAA2B;gBAC1C,CAAC,EAAE,cAAc;gBACjB,YAAY,EAAE,MAAM;aACrB,CAAC;YAEF,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACrB,WAAW,CAAC,mCAAmC,CAAC,GAAG,KAAK,CAAC;gBACzD,WAAW,CAAC,+BAA+B,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBAC9E,WAAW,CAAC,6BAA6B,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YAC5E,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,6BAA6B,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;YAEnF,GAAG,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;YACvD,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,6CAA6C,EAAE,KAAK,CAAC,CAAC;YAChE,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,2EAA2E;IAC3E,MAAM,CAAC,YAAY,CACjB,6BAA6B,EAC7B;QACE,WAAW,EAAE,qDAAqD;QAClE,WAAW,EAAE;YACX,cAAc,EAAE,8BAA8B,CAAC,KAAK,CAAC,cAAc;SACpE;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,wDAAwD,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;YAE1F,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;YAE/D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAC7B,yCAAyC,EACzC;gBACE,CAAC,EAAE,sBAAsB;gBACzB,oBAAoB,EAAE,MAAM;aAC7B,EACD,KAAK,CACN,CAAC;YAEF,GAAG,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;YAC3D,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,iDAAiD,EAAE,KAAK,CAAC,CAAC;YACpE,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,2EAA2E;IAC3E,MAAM,CAAC,YAAY,CACjB,0BAA0B,EAC1B;QACE,WAAW,EAAE,kEAAkE;QAC/E,WAAW,EAAE;YACX,cAAc,EAAE,2BAA2B,CAAC,KAAK,CAAC,cAAc;YAChE,SAAS,EAAE,2BAA2B,CAAC,KAAK,CAAC,SAAS;SACvD;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,qDAAqD,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;YAEvF,MAAM,MAAM,GAAG,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;YAC/D,MAAM,WAAW,GAA2B;gBAC1C,CAAC,EAAE,sBAAsB;gBACzB,oBAAoB,EAAE,MAAM;aAC7B,CAAC;YAEF,oCAAoC;YACpC,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpD,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;oBACtC,WAAW,CAAC,UAAU,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC;gBACxC,CAAC,CAAC,CAAC;YACL,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAC7B,sCAAsC,EACtC,WAAW,EACX,KAAK,CACN,CAAC;YAEF,GAAG,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YACxD,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC,CAAC;YACjE,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { LinkedInClient } from '../services/linkedin-client.js';
|
|
3
|
+
/**
|
|
4
|
+
* Register all organization management tools with the MCP server.
|
|
5
|
+
*/
|
|
6
|
+
export declare function registerOrganizationTools(server: McpServer, client: LinkedInClient): void;
|
|
7
|
+
//# sourceMappingURL=organization.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organization.d.ts","sourceRoot":"","sources":["../../src/tools/organization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAahE;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CA6JzF"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { createChildLogger } from '../utils/logger.js';
|
|
2
|
+
import { formatToolError, formatToolResult } from '../utils/errors.js';
|
|
3
|
+
import { buildUrn } from '../utils/urns.js';
|
|
4
|
+
import { GetOrganizationSchema, CreateOrgPostSchema, GetOrgPostsSchema, DeleteOrgPostSchema, } from '../schemas/organization.js';
|
|
5
|
+
const log = createChildLogger('organization-tools');
|
|
6
|
+
/**
|
|
7
|
+
* Register all organization management tools with the MCP server.
|
|
8
|
+
*/
|
|
9
|
+
export function registerOrganizationTools(server, client) {
|
|
10
|
+
// ─── get_organization ─────────────────────────────────────────────────────
|
|
11
|
+
server.registerTool('get_organization', {
|
|
12
|
+
description: 'Get LinkedIn organization details by ID or vanity name',
|
|
13
|
+
inputSchema: {
|
|
14
|
+
organizationId: GetOrganizationSchema.innerType().shape.organizationId,
|
|
15
|
+
vanityName: GetOrganizationSchema.innerType().shape.vanityName,
|
|
16
|
+
},
|
|
17
|
+
}, async (params) => {
|
|
18
|
+
try {
|
|
19
|
+
log.info('CAVEMAN: get_organization called with params=%o', params);
|
|
20
|
+
const { organizationId, vanityName } = params;
|
|
21
|
+
if (!organizationId && !vanityName) {
|
|
22
|
+
return formatToolError(new Error('Either organizationId or vanityName must be provided'));
|
|
23
|
+
}
|
|
24
|
+
let result;
|
|
25
|
+
if (organizationId) {
|
|
26
|
+
log.debug('CAVEMAN: Fetching organization by ID: %s', organizationId);
|
|
27
|
+
result = await client.get(`/organizations/${organizationId}`, undefined, false);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
log.debug('CAVEMAN: Fetching organization by vanityName: %s', vanityName);
|
|
31
|
+
result = await client.get('/organizations', { q: 'vanityName', vanityName: vanityName }, false);
|
|
32
|
+
}
|
|
33
|
+
log.info('CAVEMAN: get_organization succeeded');
|
|
34
|
+
return formatToolResult(result);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
log.error('CAVEMAN: get_organization failed: %s', error);
|
|
38
|
+
return formatToolError(error);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
// ─── create_org_post ──────────────────────────────────────────────────────
|
|
42
|
+
server.registerTool('create_org_post', {
|
|
43
|
+
description: 'Create a post on behalf of a LinkedIn organization',
|
|
44
|
+
inputSchema: {
|
|
45
|
+
organizationId: CreateOrgPostSchema.shape.organizationId,
|
|
46
|
+
text: CreateOrgPostSchema.shape.text,
|
|
47
|
+
visibility: CreateOrgPostSchema.shape.visibility,
|
|
48
|
+
linkUrl: CreateOrgPostSchema.shape.linkUrl,
|
|
49
|
+
linkTitle: CreateOrgPostSchema.shape.linkTitle,
|
|
50
|
+
},
|
|
51
|
+
}, async (params) => {
|
|
52
|
+
try {
|
|
53
|
+
log.info('CAVEMAN: create_org_post called for org=%s', params.organizationId);
|
|
54
|
+
const authorUrn = buildUrn('organization', params.organizationId);
|
|
55
|
+
const visibility = params.visibility ?? 'PUBLIC';
|
|
56
|
+
const postBody = {
|
|
57
|
+
author: authorUrn,
|
|
58
|
+
commentary: params.text,
|
|
59
|
+
visibility: visibility,
|
|
60
|
+
distribution: {
|
|
61
|
+
feedDistribution: 'MAIN_FEED',
|
|
62
|
+
targetEntities: [],
|
|
63
|
+
thirdPartyDistributionChannels: [],
|
|
64
|
+
},
|
|
65
|
+
lifecycleState: 'PUBLISHED',
|
|
66
|
+
};
|
|
67
|
+
// Add article content if link URL is provided
|
|
68
|
+
if (params.linkUrl) {
|
|
69
|
+
postBody.content = {
|
|
70
|
+
article: {
|
|
71
|
+
source: params.linkUrl,
|
|
72
|
+
title: params.linkTitle ?? params.linkUrl,
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
log.debug('CAVEMAN: Creating org post with body=%o', postBody);
|
|
77
|
+
const result = await client.post('/posts', postBody);
|
|
78
|
+
log.info('CAVEMAN: create_org_post succeeded');
|
|
79
|
+
return formatToolResult(result ?? { success: true, message: 'Organization post created successfully' });
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
log.error('CAVEMAN: create_org_post failed: %s', error);
|
|
83
|
+
return formatToolError(error);
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
// ─── get_org_posts ────────────────────────────────────────────────────────
|
|
87
|
+
server.registerTool('get_org_posts', {
|
|
88
|
+
description: 'Get recent posts from a LinkedIn organization',
|
|
89
|
+
inputSchema: {
|
|
90
|
+
organizationId: GetOrgPostsSchema.shape.organizationId,
|
|
91
|
+
count: GetOrgPostsSchema.shape.count,
|
|
92
|
+
start: GetOrgPostsSchema.shape.start,
|
|
93
|
+
},
|
|
94
|
+
}, async (params) => {
|
|
95
|
+
try {
|
|
96
|
+
log.info('CAVEMAN: get_org_posts called for org=%s', params.organizationId);
|
|
97
|
+
const authorUrn = buildUrn('organization', params.organizationId);
|
|
98
|
+
const count = params.count ?? 10;
|
|
99
|
+
const start = params.start ?? 0;
|
|
100
|
+
const result = await client.get('/posts', {
|
|
101
|
+
q: 'author',
|
|
102
|
+
author: authorUrn,
|
|
103
|
+
count: String(count),
|
|
104
|
+
start: String(start),
|
|
105
|
+
});
|
|
106
|
+
log.info('CAVEMAN: get_org_posts succeeded');
|
|
107
|
+
return formatToolResult(result);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
log.error('CAVEMAN: get_org_posts failed: %s', error);
|
|
111
|
+
return formatToolError(error);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
// ─── delete_org_post ──────────────────────────────────────────────────────
|
|
115
|
+
server.registerTool('delete_org_post', {
|
|
116
|
+
description: 'Delete a LinkedIn organization post by its URN',
|
|
117
|
+
inputSchema: {
|
|
118
|
+
postUrn: DeleteOrgPostSchema.shape.postUrn,
|
|
119
|
+
},
|
|
120
|
+
}, async (params) => {
|
|
121
|
+
try {
|
|
122
|
+
log.info('CAVEMAN: delete_org_post called for postUrn=%s', params.postUrn);
|
|
123
|
+
const encodedUrn = encodeURIComponent(params.postUrn);
|
|
124
|
+
await client.delete(`/posts/${encodedUrn}`);
|
|
125
|
+
log.info('CAVEMAN: delete_org_post succeeded');
|
|
126
|
+
return formatToolResult({ success: true, message: `Post ${params.postUrn} deleted successfully` });
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
log.error('CAVEMAN: delete_org_post failed: %s', error);
|
|
130
|
+
return formatToolError(error);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=organization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"organization.js","sourceRoot":"","sources":["../../src/tools/organization.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,GAAG,GAAG,iBAAiB,CAAC,oBAAoB,CAAC,CAAC;AAEpD;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAiB,EAAE,MAAsB;IACjF,6EAA6E;IAC7E,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,WAAW,EAAE,wDAAwD;QACrE,WAAW,EAAE;YACX,cAAc,EAAE,qBAAqB,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,cAAc;YACtE,UAAU,EAAE,qBAAqB,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,UAAU;SAC/D;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,iDAAiD,EAAE,MAAM,CAAC,CAAC;YAEpE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;YAE9C,IAAI,CAAC,cAAc,IAAI,CAAC,UAAU,EAAE,CAAC;gBACnC,OAAO,eAAe,CAAC,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC,CAAC;YAC5F,CAAC;YAED,IAAI,MAAe,CAAC;YAEpB,IAAI,cAAc,EAAE,CAAC;gBACnB,GAAG,CAAC,KAAK,CAAC,0CAA0C,EAAE,cAAc,CAAC,CAAC;gBACtE,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,kBAAkB,cAAc,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YAClF,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,KAAK,CAAC,kDAAkD,EAAE,UAAU,CAAC,CAAC;gBAC1E,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CACvB,gBAAgB,EAChB,EAAE,CAAC,EAAE,YAAY,EAAE,UAAU,EAAE,UAAW,EAAE,EAC5C,KAAK,CACN,CAAC;YACJ,CAAC;YAED,GAAG,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;YAChD,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;YACzD,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,6EAA6E;IAC7E,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,WAAW,EAAE,oDAAoD;QACjE,WAAW,EAAE;YACX,cAAc,EAAE,mBAAmB,CAAC,KAAK,CAAC,cAAc;YACxD,IAAI,EAAE,mBAAmB,CAAC,KAAK,CAAC,IAAI;YACpC,UAAU,EAAE,mBAAmB,CAAC,KAAK,CAAC,UAAU;YAChD,OAAO,EAAE,mBAAmB,CAAC,KAAK,CAAC,OAAO;YAC1C,SAAS,EAAE,mBAAmB,CAAC,KAAK,CAAC,SAAS;SAC/C;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,4CAA4C,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;YAE9E,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;YAClE,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,QAAQ,CAAC;YAEjD,MAAM,QAAQ,GAA4B;gBACxC,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,MAAM,CAAC,IAAI;gBACvB,UAAU,EAAE,UAAU;gBACtB,YAAY,EAAE;oBACZ,gBAAgB,EAAE,WAAW;oBAC7B,cAAc,EAAE,EAAE;oBAClB,8BAA8B,EAAE,EAAE;iBACnC;gBACD,cAAc,EAAE,WAAW;aAC5B,CAAC;YAEF,8CAA8C;YAC9C,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,QAAQ,CAAC,OAAO,GAAG;oBACjB,OAAO,EAAE;wBACP,MAAM,EAAE,MAAM,CAAC,OAAO;wBACtB,KAAK,EAAE,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,OAAO;qBAC1C;iBACF,CAAC;YACJ,CAAC;YAED,GAAG,CAAC,KAAK,CAAC,yCAAyC,EAAE,QAAQ,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAErD,GAAG,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YAC/C,OAAO,gBAAgB,CAAC,MAAM,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,wCAAwC,EAAE,CAAC,CAAC;QAC1G,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;YACxD,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,6EAA6E;IAC7E,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,WAAW,EAAE,+CAA+C;QAC5D,WAAW,EAAE;YACX,cAAc,EAAE,iBAAiB,CAAC,KAAK,CAAC,cAAc;YACtD,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,KAAK;YACpC,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,KAAK;SACrC;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,0CAA0C,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;YAE5E,MAAM,SAAS,GAAG,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;YAClE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;YAEhC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE;gBACxC,CAAC,EAAE,QAAQ;gBACX,MAAM,EAAE,SAAS;gBACjB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;gBACpB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;aACrB,CAAC,CAAC;YAEH,GAAG,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YAC7C,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;YACtD,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,6EAA6E;IAC7E,MAAM,CAAC,YAAY,CACjB,iBAAiB,EACjB;QACE,WAAW,EAAE,gDAAgD;QAC7D,WAAW,EAAE;YACX,OAAO,EAAE,mBAAmB,CAAC,KAAK,CAAC,OAAO;SAC3C;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,gDAAgD,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YAE3E,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACtD,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,UAAU,EAAE,CAAC,CAAC;YAE5C,GAAG,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YAC/C,OAAO,gBAAgB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,MAAM,CAAC,OAAO,uBAAuB,EAAE,CAAC,CAAC;QACrG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;YACxD,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,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 CreateTextPostInput, type CreateLinkPostInput, type DeletePostInput } from '../schemas/posts.js';
|
|
5
|
+
/**
|
|
6
|
+
* Create a text-only post on LinkedIn.
|
|
7
|
+
*/
|
|
8
|
+
export declare function createTextPost(client: LinkedInClient, input: CreateTextPostInput): Promise<{
|
|
9
|
+
content: TextContent[];
|
|
10
|
+
isError?: true;
|
|
11
|
+
}>;
|
|
12
|
+
/**
|
|
13
|
+
* Create a post with a link/article on LinkedIn.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createLinkPost(client: LinkedInClient, input: CreateLinkPostInput): Promise<{
|
|
16
|
+
content: TextContent[];
|
|
17
|
+
isError?: true;
|
|
18
|
+
}>;
|
|
19
|
+
/**
|
|
20
|
+
* Delete a post from LinkedIn.
|
|
21
|
+
*/
|
|
22
|
+
export declare function deletePost(client: LinkedInClient, input: DeletePostInput): Promise<{
|
|
23
|
+
content: TextContent[];
|
|
24
|
+
isError?: true;
|
|
25
|
+
}>;
|
|
26
|
+
/**
|
|
27
|
+
* Register all post-related tools with the MCP server.
|
|
28
|
+
*/
|
|
29
|
+
export declare function registerPostTools(server: McpServer, client: LinkedInClient): void;
|
|
30
|
+
//# sourceMappingURL=posts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"posts.d.ts","sourceRoot":"","sources":["../../src/tools/posts.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,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACrB,MAAM,qBAAqB,CAAC;AAa7B;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC;IAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC,CAgCrD;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC;IAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC,CAsCrD;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC;IAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC,CAgBrD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,IAAI,CAmCjF"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { formatToolError, formatToolResult } from '../utils/errors.js';
|
|
2
|
+
import { createChildLogger } from '../utils/logger.js';
|
|
3
|
+
import { CreateTextPostInputSchema, CreateLinkPostInputSchema, DeletePostInputSchema, } from '../schemas/posts.js';
|
|
4
|
+
const log = createChildLogger('posts-tools');
|
|
5
|
+
/**
|
|
6
|
+
* Helper to get the authenticated user's person URN.
|
|
7
|
+
*/
|
|
8
|
+
async function getPersonUrn(client) {
|
|
9
|
+
const userInfo = await client.get('/userinfo', undefined, false);
|
|
10
|
+
return `urn:li:person:${userInfo.sub}`;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Create a text-only post on LinkedIn.
|
|
14
|
+
*/
|
|
15
|
+
export async function createTextPost(client, input) {
|
|
16
|
+
try {
|
|
17
|
+
log.info('CAVEMAN: Creating text post (length=%d)', input.text.length);
|
|
18
|
+
const personUrn = await getPersonUrn(client);
|
|
19
|
+
log.info('CAVEMAN: Resolved person URN: %s', personUrn);
|
|
20
|
+
const visibility = input.visibility ?? 'PUBLIC';
|
|
21
|
+
const body = {
|
|
22
|
+
author: personUrn,
|
|
23
|
+
commentary: input.text,
|
|
24
|
+
visibility,
|
|
25
|
+
distribution: {
|
|
26
|
+
feedDistribution: 'MAIN_FEED',
|
|
27
|
+
targetEntities: [],
|
|
28
|
+
thirdPartyDistributionChannels: [],
|
|
29
|
+
},
|
|
30
|
+
lifecycleState: 'PUBLISHED',
|
|
31
|
+
};
|
|
32
|
+
const response = await client.post('/posts', body);
|
|
33
|
+
log.info('CAVEMAN: Text post created successfully');
|
|
34
|
+
return formatToolResult({
|
|
35
|
+
success: true,
|
|
36
|
+
message: 'Post created successfully',
|
|
37
|
+
postId: response?.id ?? response?.['x-restli-id'] ?? 'unknown',
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
log.error('CAVEMAN: Failed to create text post: %s', error);
|
|
42
|
+
return formatToolError(error);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Create a post with a link/article on LinkedIn.
|
|
47
|
+
*/
|
|
48
|
+
export async function createLinkPost(client, input) {
|
|
49
|
+
try {
|
|
50
|
+
log.info('CAVEMAN: Creating link post (url=%s)', input.linkUrl);
|
|
51
|
+
const personUrn = await getPersonUrn(client);
|
|
52
|
+
log.info('CAVEMAN: Resolved person URN: %s', personUrn);
|
|
53
|
+
const visibility = input.visibility ?? 'PUBLIC';
|
|
54
|
+
const body = {
|
|
55
|
+
author: personUrn,
|
|
56
|
+
commentary: input.text,
|
|
57
|
+
visibility,
|
|
58
|
+
distribution: {
|
|
59
|
+
feedDistribution: 'MAIN_FEED',
|
|
60
|
+
targetEntities: [],
|
|
61
|
+
thirdPartyDistributionChannels: [],
|
|
62
|
+
},
|
|
63
|
+
lifecycleState: 'PUBLISHED',
|
|
64
|
+
content: {
|
|
65
|
+
article: {
|
|
66
|
+
source: input.linkUrl,
|
|
67
|
+
...(input.linkTitle ? { title: input.linkTitle } : {}),
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
const response = await client.post('/posts', body);
|
|
72
|
+
log.info('CAVEMAN: Link post created successfully');
|
|
73
|
+
return formatToolResult({
|
|
74
|
+
success: true,
|
|
75
|
+
message: 'Link post created successfully',
|
|
76
|
+
postId: response?.id ?? response?.['x-restli-id'] ?? 'unknown',
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
log.error('CAVEMAN: Failed to create link post: %s', error);
|
|
81
|
+
return formatToolError(error);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Delete a post from LinkedIn.
|
|
86
|
+
*/
|
|
87
|
+
export async function deletePost(client, input) {
|
|
88
|
+
try {
|
|
89
|
+
log.info('CAVEMAN: Deleting post with URN: %s', input.postUrn);
|
|
90
|
+
const encodedUrn = encodeURIComponent(input.postUrn);
|
|
91
|
+
await client.delete(`/posts/${encodedUrn}`);
|
|
92
|
+
log.info('CAVEMAN: Post deleted successfully');
|
|
93
|
+
return formatToolResult({
|
|
94
|
+
success: true,
|
|
95
|
+
message: `Post ${input.postUrn} deleted successfully`,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
log.error('CAVEMAN: Failed to delete post: %s', error);
|
|
100
|
+
return formatToolError(error);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Register all post-related tools with the MCP server.
|
|
105
|
+
*/
|
|
106
|
+
export function registerPostTools(server, client) {
|
|
107
|
+
server.registerTool('create_text_post', {
|
|
108
|
+
description: 'Create a text-only post on LinkedIn',
|
|
109
|
+
inputSchema: CreateTextPostInputSchema.shape,
|
|
110
|
+
}, async (input) => {
|
|
111
|
+
return createTextPost(client, input);
|
|
112
|
+
});
|
|
113
|
+
server.registerTool('create_link_post', {
|
|
114
|
+
description: 'Create a post with a link/article on LinkedIn',
|
|
115
|
+
inputSchema: CreateLinkPostInputSchema.shape,
|
|
116
|
+
}, async (input) => {
|
|
117
|
+
return createLinkPost(client, input);
|
|
118
|
+
});
|
|
119
|
+
server.registerTool('delete_post', {
|
|
120
|
+
description: 'Delete a post from LinkedIn by its URN',
|
|
121
|
+
inputSchema: DeletePostInputSchema.shape,
|
|
122
|
+
}, async (input) => {
|
|
123
|
+
return deletePost(client, input);
|
|
124
|
+
});
|
|
125
|
+
log.info('CAVEMAN: Registered post tools (create_text_post, create_link_post, delete_post)');
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=posts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"posts.js","sourceRoot":"","sources":["../../src/tools/posts.ts"],"names":[],"mappings":"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"}
|