Skip to content

Commit 6079941

Browse files
Admin API added
1 parent d6aa0d7 commit 6079941

15 files changed

Lines changed: 563 additions & 67 deletions

package-lock.json

Lines changed: 53 additions & 53 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@linkedapi/mcp",
3-
"version": "0.3.11",
3+
"version": "1.0.0",
44
"description": "MCP server that lets AI assistants control LinkedIn accounts and retrieve real-time data.",
55
"main": "dist/index.js",
66
"bin": {
@@ -30,8 +30,8 @@
3030
"author": "Linked API",
3131
"license": "MIT",
3232
"dependencies": {
33+
"@linkedapi/node": "^1.2.18",
3334
"@modelcontextprotocol/sdk": "^1.17.4",
34-
"@linkedapi/node": "^1.2.17",
3535
"zod": "^4.1.1"
3636
},
3737
"devDependencies": {

src/linked-api-server.ts

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { LinkedApi, LinkedApiError, TLinkedApiConfig } from '@linkedapi/node';
1+
import { LinkedApi, LinkedApiAdmin, LinkedApiError, TLinkedApiConfig } from '@linkedapi/node';
22
import { buildLinkedApiHttpClient } from '@linkedapi/node/dist/core';
33
import { Tool } from '@modelcontextprotocol/sdk/types.js';
44

@@ -20,7 +20,9 @@ export class LinkedApiMCPServer {
2020
}
2121

2222
public getTools(): Tool[] {
23-
return this.tools.tools.map((tool) => tool.getTool());
23+
const linkedApiTools = this.tools.tools.map((tool) => tool.getTool());
24+
const adminTools = this.tools.adminTools.map((tool) => tool.getTool());
25+
return [...linkedApiTools, ...adminTools];
2426
}
2527

2628
public async executeWithTokens(
@@ -37,21 +39,42 @@ export class LinkedApiMCPServer {
3739
},
3840
'Tool execution started',
3941
);
40-
const linkedapi = new LinkedApi(
41-
buildLinkedApiHttpClient(
42-
{
43-
linkedApiToken: linkedApiToken,
44-
identificationToken: identificationToken,
45-
},
46-
'mcp',
47-
),
48-
);
49-
5042
const { name: toolName, arguments: args, _meta } = request;
5143
const progressToken = _meta?.progressToken;
5244

5345
const startTime = Date.now();
5446
try {
47+
const adminTool = this.tools.adminToolByName(toolName);
48+
if (adminTool) {
49+
const admin = new LinkedApiAdmin({ linkedApiToken,
50+
client: 'mcp' });
51+
const params = adminTool.validate(args);
52+
const result = await adminTool.execute({ admin,
53+
args: params });
54+
const duration = this.calculateDuration(startTime);
55+
logger.info({ toolName,
56+
duration,
57+
data: result }, 'Tool execution successful');
58+
if (result === undefined) {
59+
return { content: [{ type: 'text' as const,
60+
text: 'Completed' }] };
61+
}
62+
return {
63+
content: [{ type: 'text' as const,
64+
text: JSON.stringify(result, null, 2) }],
65+
};
66+
}
67+
68+
const linkedapi = new LinkedApi(
69+
buildLinkedApiHttpClient(
70+
{
71+
linkedApiToken: linkedApiToken,
72+
identificationToken: identificationToken,
73+
},
74+
'mcp',
75+
),
76+
);
77+
5578
const tool = this.tools.toolByName(toolName);
5679
if (!tool) {
5780
throw new Error(`Unknown tool: ${toolName}`);

src/linked-api-tools.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
import { AdminConnectAccountTool } from './tools/admin-connect-account.js';
2+
import { AdminDisconnectAccountTool } from './tools/admin-disconnect-account.js';
3+
import { AdminGetAccountsTool } from './tools/admin-get-accounts.js';
4+
import { AdminGetLimitsUsageTool } from './tools/admin-get-limits-usage.js';
5+
import { AdminGetSeatsTool } from './tools/admin-get-seats.js';
6+
import { AdminGetSubscriptionStatusTool } from './tools/admin-get-subscription-status.js';
7+
import { AdminRegenerateTokenTool } from './tools/admin-regenerate-token.js';
8+
import { AdminResetLimitsTool } from './tools/admin-reset-limits.js';
9+
import { AdminSetLimitsTool } from './tools/admin-set-limits.js';
10+
import { AdminSetSeatsTool } from './tools/admin-set-seats.js';
111
import { CheckConnectionStatusTool } from './tools/check-connection-status.js';
212
import { CommentOnPostTool } from './tools/comment-on-post.js';
313
import { CreatePostTool } from './tools/create-post.js';
@@ -25,11 +35,13 @@ import { SearchPeopleTool } from './tools/search-people.js';
2535
import { SendConnectionRequestTool } from './tools/send-connection-request.js';
2636
import { SendMessageTool } from './tools/send-message.js';
2737
import { WithdrawConnectionRequestTool } from './tools/withdraw-connection-request.js';
38+
import { AdminTool } from './utils/admin-tool.js';
2839
import { LinkedApiTool } from './utils/linked-api-tool.js';
2940
import { LinkedApiProgressNotification } from './utils/types.js';
3041

3142
export class LinkedApiTools {
3243
public readonly tools: ReadonlyArray<LinkedApiTool<unknown, unknown>>;
44+
public readonly adminTools: ReadonlyArray<AdminTool<unknown, unknown>>;
3345

3446
constructor(progressCallback: (progress: LinkedApiProgressNotification) => void) {
3547
this.tools = [
@@ -64,9 +76,26 @@ export class LinkedApiTools {
6476
new GetWorkflowResultTool(progressCallback),
6577
new GetApiUsageTool(progressCallback),
6678
];
79+
80+
this.adminTools = [
81+
new AdminGetSubscriptionStatusTool(),
82+
new AdminGetSeatsTool(),
83+
new AdminSetSeatsTool(),
84+
new AdminGetAccountsTool(),
85+
new AdminConnectAccountTool(),
86+
new AdminDisconnectAccountTool(),
87+
new AdminRegenerateTokenTool(),
88+
new AdminGetLimitsUsageTool(),
89+
new AdminSetLimitsTool(),
90+
new AdminResetLimitsTool(),
91+
];
6792
}
6893

6994
public toolByName(name: string): LinkedApiTool<unknown, unknown> | undefined {
7095
return this.tools.find((tool) => tool.name === name);
7196
}
97+
98+
public adminToolByName(name: string): AdminTool<unknown, unknown> | undefined {
99+
return this.adminTools.find((tool) => tool.name === name);
100+
}
72101
}

0 commit comments

Comments
 (0)