@linkedapi/mcp 1.0.0 → 2.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/README.md +9 -0
- package/dist/index.js +19 -9
- package/dist/index.js.map +1 -1
- package/dist/linked-api-server.d.ts +8 -5
- package/dist/linked-api-server.d.ts.map +1 -1
- package/dist/linked-api-server.js +63 -49
- package/dist/linked-api-server.js.map +1 -1
- package/dist/linked-api-tools.d.ts +17 -5
- package/dist/linked-api-tools.d.ts.map +1 -1
- package/dist/linked-api-tools.js +28 -28
- package/dist/linked-api-tools.js.map +1 -1
- package/dist/prompts/index.d.ts +2 -2
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +3 -1
- package/dist/prompts/index.js.map +1 -1
- package/dist/tools/comment-on-post.d.ts.map +1 -1
- package/dist/tools/comment-on-post.js +1 -1
- package/dist/tools/comment-on-post.js.map +1 -1
- package/dist/tools/create-post.js +1 -1
- package/dist/tools/create-post.js.map +1 -1
- package/dist/tools/execute-custom-workflow.d.ts.map +1 -1
- package/dist/tools/execute-custom-workflow.js +1 -1
- package/dist/tools/execute-custom-workflow.js.map +1 -1
- package/dist/tools/get-api-usage-stats.d.ts +0 -2
- package/dist/tools/get-api-usage-stats.d.ts.map +1 -1
- package/dist/tools/get-api-usage-stats.js.map +1 -1
- package/dist/tools/get-conversation.d.ts +3 -4
- package/dist/tools/get-conversation.d.ts.map +1 -1
- package/dist/tools/get-conversation.js +7 -6
- package/dist/tools/get-conversation.js.map +1 -1
- package/dist/tools/get-workflow-result.d.ts +6 -4
- package/dist/tools/get-workflow-result.d.ts.map +1 -1
- package/dist/tools/get-workflow-result.js +37 -10
- package/dist/tools/get-workflow-result.js.map +1 -1
- package/dist/tools/nv-get-conversation.d.ts +3 -4
- package/dist/tools/nv-get-conversation.d.ts.map +1 -1
- package/dist/tools/nv-get-conversation.js +7 -6
- package/dist/tools/nv-get-conversation.js.map +1 -1
- package/dist/tools/nv-send-message.js +1 -1
- package/dist/tools/nv-send-message.js.map +1 -1
- package/dist/tools/react-to-post.js +1 -1
- package/dist/tools/react-to-post.js.map +1 -1
- package/dist/tools/remove-connection.js +1 -1
- package/dist/tools/remove-connection.js.map +1 -1
- package/dist/tools/send-connection-request.js +1 -1
- package/dist/tools/send-connection-request.js.map +1 -1
- package/dist/tools/send-message.d.ts.map +1 -1
- package/dist/tools/send-message.js +1 -1
- package/dist/tools/send-message.js.map +1 -1
- package/dist/tools/withdraw-connection-request.js +1 -1
- package/dist/tools/withdraw-connection-request.js.map +1 -1
- package/dist/types/linked-api-tool-result.type.d.ts +6 -0
- package/dist/types/linked-api-tool-result.type.d.ts.map +1 -0
- package/dist/types/linked-api-tool-result.type.js +3 -0
- package/dist/types/linked-api-tool-result.type.js.map +1 -0
- package/dist/utils/define-request-timeout.d.ts.map +1 -1
- package/dist/utils/define-request-timeout.js +16 -4
- package/dist/utils/define-request-timeout.js.map +1 -1
- package/dist/utils/handle-linked-api-error.d.ts +1 -1
- package/dist/utils/handle-linked-api-error.d.ts.map +1 -1
- package/dist/utils/handle-linked-api-error.js +0 -9
- package/dist/utils/handle-linked-api-error.js.map +1 -1
- package/dist/utils/json-http-transport.d.ts.map +1 -1
- package/dist/utils/json-http-transport.js +4 -3
- package/dist/utils/json-http-transport.js.map +1 -1
- package/dist/utils/linked-api-tool.d.ts +10 -16
- package/dist/utils/linked-api-tool.d.ts.map +1 -1
- package/dist/utils/linked-api-tool.js +4 -10
- package/dist/utils/linked-api-tool.js.map +1 -1
- package/dist/utils/types.d.ts +0 -6
- package/dist/utils/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +19 -11
- package/src/linked-api-server.ts +83 -57
- package/src/linked-api-tools.ts +45 -32
- package/src/prompts/index.ts +3 -1
- package/src/tools/comment-on-post.ts +2 -1
- package/src/tools/create-post.ts +1 -1
- package/src/tools/execute-custom-workflow.ts +2 -1
- package/src/tools/get-api-usage-stats.ts +0 -2
- package/src/tools/get-conversation.ts +13 -10
- package/src/tools/get-workflow-result.ts +63 -17
- package/src/tools/nv-get-conversation.ts +13 -10
- package/src/tools/nv-send-message.ts +1 -1
- package/src/tools/react-to-post.ts +1 -1
- package/src/tools/remove-connection.ts +1 -1
- package/src/tools/send-connection-request.ts +1 -1
- package/src/tools/send-message.ts +2 -1
- package/src/tools/withdraw-connection-request.ts +1 -1
- package/src/types/linked-api-tool-result.type.ts +12 -0
- package/src/utils/define-request-timeout.ts +16 -4
- package/src/utils/handle-linked-api-error.ts +2 -10
- package/src/utils/json-http-transport.ts +4 -3
- package/src/utils/linked-api-tool.ts +16 -32
- package/src/utils/types.ts +0 -6
- package/dist/utils/execute-with-progress.d.ts +0 -8
- package/dist/utils/execute-with-progress.d.ts.map +0 -1
- package/dist/utils/execute-with-progress.js +0 -75
- package/dist/utils/execute-with-progress.js.map +0 -1
- package/src/utils/execute-with-progress.ts +0 -93
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-http-transport.js","sourceRoot":"","sources":["../../src/utils/json-http-transport.ts"],"names":[],"mappings":";;;AACA,iEAM4C;AAG5C,qCAAkC;AAgBlC,MAAa,uBAAuB;IAC3B,OAAO,CAAc;IACrB,OAAO,CAA0B;IACjC,SAAS,CAUN;IAEF,OAAO,GAAG,KAAK,CAAC;IAChB,eAAe,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC/C,WAAW,GAAG,IAAI,GAAG,EAA6B,CAAC;IACnD,GAAG,CAAc;IAEzB,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBAClC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;oBAChC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;gBACrB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,eAAM,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;YAChE,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC;QACvB,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAC/B,IAAI,CAAC;gBACH,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;oBAC3B,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;gBAChB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAuB,EAAE,OAA8B;QAChE,
|
|
1
|
+
{"version":3,"file":"json-http-transport.js","sourceRoot":"","sources":["../../src/utils/json-http-transport.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,28 +1,22 @@
|
|
|
1
|
-
import LinkedApi, {
|
|
1
|
+
import LinkedApi, { TOperationName } from '@linkedapi/node';
|
|
2
2
|
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
-
import { LinkedApiProgressNotification } from 'src/utils/types';
|
|
4
3
|
import z from 'zod';
|
|
4
|
+
import type { TLinkedApiToolResult, TWorkflowAck } from '../types/linked-api-tool-result.type.js';
|
|
5
|
+
interface TLinkedApiToolExecuteOptions<TParams> {
|
|
6
|
+
linkedapi: LinkedApi;
|
|
7
|
+
args: TParams;
|
|
8
|
+
mcpClient: string;
|
|
9
|
+
}
|
|
5
10
|
export declare abstract class LinkedApiTool<TParams, TResult> {
|
|
6
11
|
abstract readonly name: string;
|
|
7
12
|
protected abstract readonly schema: z.ZodSchema;
|
|
8
|
-
protected readonly progressCallback: (progress: LinkedApiProgressNotification) => void;
|
|
9
|
-
constructor(progressCallback: (progress: LinkedApiProgressNotification) => void);
|
|
10
13
|
abstract getTool(): Tool;
|
|
11
14
|
validate(args: unknown): TParams;
|
|
12
|
-
abstract execute(
|
|
13
|
-
linkedapi: LinkedApi;
|
|
14
|
-
args: TParams;
|
|
15
|
-
workflowTimeout: number;
|
|
16
|
-
progressToken?: string | number;
|
|
17
|
-
}): Promise<TMappedResponse<TResult>>;
|
|
15
|
+
abstract execute(options: TLinkedApiToolExecuteOptions<TParams>): Promise<TLinkedApiToolResult<TResult>>;
|
|
18
16
|
}
|
|
19
17
|
export declare abstract class OperationTool<TParams, TResult> extends LinkedApiTool<TParams, TResult> {
|
|
20
18
|
abstract readonly operationName: TOperationName;
|
|
21
|
-
execute({ linkedapi, args,
|
|
22
|
-
linkedapi: LinkedApi;
|
|
23
|
-
args: TParams;
|
|
24
|
-
workflowTimeout: number;
|
|
25
|
-
progressToken?: string | number;
|
|
26
|
-
}): Promise<TMappedResponse<TResult>>;
|
|
19
|
+
execute({ linkedapi, args, }: TLinkedApiToolExecuteOptions<TParams>): Promise<TWorkflowAck>;
|
|
27
20
|
}
|
|
21
|
+
export {};
|
|
28
22
|
//# sourceMappingURL=linked-api-tool.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linked-api-tool.d.ts","sourceRoot":"","sources":["../../src/utils/linked-api-tool.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,EAAE,EAAa,
|
|
1
|
+
{"version":3,"file":"linked-api-tool.d.ts","sourceRoot":"","sources":["../../src/utils/linked-api-tool.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,EAAE,EAAa,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC1D,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAElG,UAAU,4BAA4B,CAAC,OAAO;IAC5C,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,8BAAsB,aAAa,CAAC,OAAO,EAAE,OAAO;IAClD,kBAAyB,IAAI,EAAE,MAAM,CAAC;IACtC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC;aAEhC,OAAO,IAAI,IAAI;IAExB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;aAIvB,OAAO,CACrB,OAAO,EAAE,4BAA4B,CAAC,OAAO,CAAC,GAC7C,OAAO,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;CAC1C;AAED,8BAAsB,aAAa,CAAC,OAAO,EAAE,OAAO,CAAE,SAAQ,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC;IAC3F,kBAAyB,aAAa,EAAE,cAAc,CAAC;IAEjC,OAAO,CAAC,EAC5B,SAAS,EACT,IAAI,GACL,EAAE,4BAA4B,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;CAQjE"}
|
|
@@ -1,24 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.OperationTool = exports.LinkedApiTool = void 0;
|
|
4
|
-
const execute_with_progress_1 = require("./execute-with-progress");
|
|
5
4
|
class LinkedApiTool {
|
|
6
|
-
progressCallback;
|
|
7
|
-
constructor(progressCallback) {
|
|
8
|
-
this.progressCallback = progressCallback;
|
|
9
|
-
}
|
|
10
5
|
validate(args) {
|
|
11
6
|
return this.schema.parse(args);
|
|
12
7
|
}
|
|
13
8
|
}
|
|
14
9
|
exports.LinkedApiTool = LinkedApiTool;
|
|
15
10
|
class OperationTool extends LinkedApiTool {
|
|
16
|
-
execute({ linkedapi, args,
|
|
11
|
+
async execute({ linkedapi, args, }) {
|
|
17
12
|
const operation = linkedapi.operations.find((operation) => operation.operationName === this.operationName);
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
});
|
|
13
|
+
const response = await operation.execute(args);
|
|
14
|
+
return { ...response,
|
|
15
|
+
operationName: this.operationName };
|
|
22
16
|
}
|
|
23
17
|
}
|
|
24
18
|
exports.OperationTool = OperationTool;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linked-api-tool.js","sourceRoot":"","sources":["../../src/utils/linked-api-tool.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"linked-api-tool.js","sourceRoot":"","sources":["../../src/utils/linked-api-tool.ts"],"names":[],"mappings":";;;AAYA,MAAsB,aAAa;IAM1B,QAAQ,CAAC,IAAa;QAC3B,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;IAC5C,CAAC;CAKF;AAbD,sCAaC;AAED,MAAsB,aAAgC,SAAQ,aAA+B;IAG3E,KAAK,CAAC,OAAO,CAAC,EAC5B,SAAS,EACT,IAAI,GACkC;QACtC,MAAM,SAAS,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CACzC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,aAAa,KAAK,IAAI,CAAC,aAAa,CAC9B,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/C,OAAO,EAAE,GAAG,QAAQ;YACxB,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;IAClC,CAAC;CACF;AAdD,sCAcC"}
|
package/dist/utils/types.d.ts
CHANGED
|
@@ -7,10 +7,4 @@ export interface ExtendedCallToolRequest extends CallToolRequest {
|
|
|
7
7
|
};
|
|
8
8
|
};
|
|
9
9
|
}
|
|
10
|
-
export interface LinkedApiProgressNotification {
|
|
11
|
-
progressToken?: string | number;
|
|
12
|
-
progress: number;
|
|
13
|
-
total?: number;
|
|
14
|
-
message?: string;
|
|
15
|
-
}
|
|
16
10
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/utils/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAErF,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B,MAAM,WAAW,uBAAwB,SAAQ,eAAe;IAC9D,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,GAAG;QAClC,KAAK,CAAC,EAAE;YACN,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;SACjC,CAAC;KACH,CAAC;CACH
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/utils/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAErF,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B,MAAM,WAAW,uBAAwB,SAAQ,eAAe;IAC9D,MAAM,EAAE,eAAe,CAAC,QAAQ,CAAC,GAAG;QAClC,KAAK,CAAC,EAAE;YACN,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;SACjC,CAAC;KACH,CAAC;CACH"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@linkedapi/mcp",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "MCP server that lets AI assistants control LinkedIn accounts and retrieve real-time data.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"author": "Linked API",
|
|
31
31
|
"license": "MIT",
|
|
32
32
|
"dependencies": {
|
|
33
|
-
"@linkedapi/node": "^
|
|
33
|
+
"@linkedapi/node": "^2.0.0",
|
|
34
34
|
"@modelcontextprotocol/sdk": "^1.17.4",
|
|
35
35
|
"zod": "^4.1.1"
|
|
36
36
|
},
|
package/src/index.ts
CHANGED
|
@@ -13,10 +13,12 @@ import { LinkedApiMCPServer } from './linked-api-server';
|
|
|
13
13
|
import { availablePrompts, getPromptContent, systemPrompt } from './prompts';
|
|
14
14
|
import { JsonHTTPServerTransport } from './utils/json-http-transport';
|
|
15
15
|
import { logger } from './utils/logger';
|
|
16
|
-
import { LinkedApiProgressNotification } from './utils/types';
|
|
17
16
|
|
|
18
17
|
function deriveClientFromUserAgent(userAgent: string): string {
|
|
19
18
|
const ua = userAgent.toLowerCase();
|
|
19
|
+
if (ua.includes('codex')) return 'codex';
|
|
20
|
+
if (ua.includes('claude-code') || ua.includes('claude code')) return 'claude-code';
|
|
21
|
+
if (ua.includes('claude') || ua.includes('anthropic')) return 'claude';
|
|
20
22
|
if (ua.includes('cursor')) return 'cursor';
|
|
21
23
|
if (ua.includes('windsurf')) return 'windsurf';
|
|
22
24
|
if (ua.includes('vscode') || ua.includes('visual studio code')) return 'vscode';
|
|
@@ -33,6 +35,14 @@ function deriveClientFromUserAgent(userAgent: string): string {
|
|
|
33
35
|
return userAgent;
|
|
34
36
|
}
|
|
35
37
|
|
|
38
|
+
function normalizeHeaderValue(value: string | Array<string> | undefined): string | undefined {
|
|
39
|
+
if (Array.isArray(value)) {
|
|
40
|
+
return value.find((item) => item.trim().length > 0)?.trim();
|
|
41
|
+
}
|
|
42
|
+
const normalizedValue = value?.trim();
|
|
43
|
+
return normalizedValue && normalizedValue.length > 0 ? normalizedValue : undefined;
|
|
44
|
+
}
|
|
45
|
+
|
|
36
46
|
function getArgValue(flag: string): string | undefined {
|
|
37
47
|
const index = process.argv.indexOf(flag);
|
|
38
48
|
if (index === -1) return undefined;
|
|
@@ -61,8 +71,7 @@ async function main() {
|
|
|
61
71
|
},
|
|
62
72
|
);
|
|
63
73
|
|
|
64
|
-
const
|
|
65
|
-
const linkedApiServer = new LinkedApiMCPServer(progressCallback);
|
|
74
|
+
const linkedApiServer = new LinkedApiMCPServer();
|
|
66
75
|
|
|
67
76
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
68
77
|
const tools = linkedApiServer.getTools();
|
|
@@ -118,18 +127,17 @@ async function main() {
|
|
|
118
127
|
const localLinkedApiToken = process.env.LINKED_API_TOKEN;
|
|
119
128
|
const localIdentificationToken = process.env.IDENTIFICATION_TOKEN;
|
|
120
129
|
const headers = extra?.requestInfo?.headers ?? {};
|
|
121
|
-
const linkedApiToken =
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
'')
|
|
125
|
-
let mcpClient = (headers['client'] ?? ''
|
|
130
|
+
const linkedApiToken =
|
|
131
|
+
normalizeHeaderValue(headers['linked-api-token']) ?? localLinkedApiToken ?? '';
|
|
132
|
+
const identificationToken =
|
|
133
|
+
normalizeHeaderValue(headers['identification-token']) ?? localIdentificationToken ?? '';
|
|
134
|
+
let mcpClient = normalizeHeaderValue(headers['client']) ?? '';
|
|
126
135
|
if (!mcpClient) {
|
|
127
|
-
const userAgentHeader = headers['user-agent'];
|
|
128
|
-
if (
|
|
136
|
+
const userAgentHeader = normalizeHeaderValue(headers['user-agent']);
|
|
137
|
+
if (userAgentHeader) {
|
|
129
138
|
mcpClient = deriveClientFromUserAgent(userAgentHeader);
|
|
130
139
|
}
|
|
131
140
|
}
|
|
132
|
-
|
|
133
141
|
const result = await linkedApiServer.executeWithTokens(request.params, {
|
|
134
142
|
linkedApiToken,
|
|
135
143
|
identificationToken,
|
package/src/linked-api-server.ts
CHANGED
|
@@ -3,66 +3,81 @@ import { buildLinkedApiHttpClient } from '@linkedapi/node/dist/core';
|
|
|
3
3
|
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
4
4
|
|
|
5
5
|
import { LinkedApiTools } from './linked-api-tools';
|
|
6
|
-
import { defineRequestTimeoutInSeconds } from './utils/define-request-timeout';
|
|
7
6
|
import { handleLinkedApiError } from './utils/handle-linked-api-error';
|
|
8
7
|
import { logger } from './utils/logger';
|
|
9
|
-
import {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
8
|
+
import { CallToolResult, ExtendedCallToolRequest } from './utils/types';
|
|
9
|
+
|
|
10
|
+
const BACKGROUND_WORKFLOW_DESCRIPTION =
|
|
11
|
+
`Linked API actions are queued into a cloud-browser workflow and may take several minutes. The server returns immediately after starting the workflow with {status: 'pending'|'running', workflowId, operationName, message}. To retrieve the final result, call get_workflow_result with the returned workflowId and operationName — it will long-poll until completion or the request budget elapses, then return either the final result or another in-progress snapshot. Do not retry the original tool while a workflow is still running; that creates duplicate queued work.` as const;
|
|
12
|
+
const NON_WORKFLOW_TOOL_NAMES = new Set<string>(['get_workflow_result', 'get_api_usage'] as const);
|
|
13
|
+
|
|
14
|
+
interface TExecuteWithTokensOptions extends TLinkedApiConfig {
|
|
15
|
+
mcpClient: string;
|
|
16
|
+
}
|
|
14
17
|
|
|
15
18
|
export class LinkedApiMCPServer {
|
|
16
19
|
private tools: LinkedApiTools;
|
|
17
20
|
|
|
18
|
-
constructor(
|
|
19
|
-
this.tools = new LinkedApiTools(
|
|
21
|
+
constructor() {
|
|
22
|
+
this.tools = new LinkedApiTools();
|
|
20
23
|
}
|
|
21
24
|
|
|
22
25
|
public getTools(): Tool[] {
|
|
23
|
-
const linkedApiTools = this.tools.tools.map((tool) =>
|
|
26
|
+
const linkedApiTools = this.tools.tools.map((tool) => {
|
|
27
|
+
const definition = tool.getTool();
|
|
28
|
+
if (NON_WORKFLOW_TOOL_NAMES.has(definition.name)) {
|
|
29
|
+
return definition;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return {
|
|
33
|
+
...definition,
|
|
34
|
+
description: `${definition.description}\n\n${BACKGROUND_WORKFLOW_DESCRIPTION}`,
|
|
35
|
+
};
|
|
36
|
+
});
|
|
24
37
|
const adminTools = this.tools.adminTools.map((tool) => tool.getTool());
|
|
25
38
|
return [...linkedApiTools, ...adminTools];
|
|
26
39
|
}
|
|
27
40
|
|
|
28
41
|
public async executeWithTokens(
|
|
29
42
|
request: ExtendedCallToolRequest['params'],
|
|
30
|
-
{ linkedApiToken, identificationToken, mcpClient }:
|
|
43
|
+
{ linkedApiToken, identificationToken, mcpClient }: TExecuteWithTokensOptions,
|
|
31
44
|
): Promise<CallToolResult> {
|
|
32
|
-
const workflowTimeout = defineRequestTimeoutInSeconds(mcpClient) * 1000;
|
|
33
45
|
logger.info(
|
|
34
46
|
{
|
|
35
47
|
toolName: request.name,
|
|
36
48
|
arguments: request.arguments,
|
|
37
49
|
mcpClient,
|
|
38
|
-
workflowTimeout,
|
|
39
50
|
},
|
|
40
51
|
'Tool execution started',
|
|
41
52
|
);
|
|
42
|
-
const { name: toolName, arguments: args
|
|
43
|
-
const progressToken = _meta?.progressToken;
|
|
53
|
+
const { name: toolName, arguments: args } = request;
|
|
44
54
|
|
|
45
55
|
const startTime = Date.now();
|
|
46
56
|
try {
|
|
47
57
|
const adminTool = this.tools.adminToolByName(toolName);
|
|
48
58
|
if (adminTool) {
|
|
49
|
-
const admin = new LinkedApiAdmin({
|
|
50
|
-
|
|
59
|
+
const admin = new LinkedApiAdmin({
|
|
60
|
+
linkedApiToken,
|
|
61
|
+
client: 'mcp',
|
|
62
|
+
});
|
|
51
63
|
const params = adminTool.validate(args);
|
|
52
|
-
const result = await adminTool.execute({
|
|
53
|
-
|
|
64
|
+
const result = await adminTool.execute({
|
|
65
|
+
admin,
|
|
66
|
+
args: params,
|
|
67
|
+
});
|
|
54
68
|
const duration = this.calculateDuration(startTime);
|
|
55
|
-
logger.info(
|
|
56
|
-
|
|
57
|
-
|
|
69
|
+
logger.info(
|
|
70
|
+
{
|
|
71
|
+
toolName,
|
|
72
|
+
duration,
|
|
73
|
+
data: result,
|
|
74
|
+
},
|
|
75
|
+
'Tool execution successful',
|
|
76
|
+
);
|
|
58
77
|
if (result === undefined) {
|
|
59
|
-
return
|
|
60
|
-
text: 'Completed' }] };
|
|
78
|
+
return this.text('Completed');
|
|
61
79
|
}
|
|
62
|
-
return
|
|
63
|
-
content: [{ type: 'text' as const,
|
|
64
|
-
text: JSON.stringify(result, null, 2) }],
|
|
65
|
-
};
|
|
80
|
+
return this.text(JSON.stringify(result, null, 2));
|
|
66
81
|
}
|
|
67
82
|
|
|
68
83
|
const linkedapi = new LinkedApi(
|
|
@@ -80,14 +95,32 @@ text: JSON.stringify(result, null, 2) }],
|
|
|
80
95
|
throw new Error(`Unknown tool: ${toolName}`);
|
|
81
96
|
}
|
|
82
97
|
const params = tool.validate(args);
|
|
83
|
-
const
|
|
98
|
+
const result = await tool.execute({
|
|
84
99
|
linkedapi,
|
|
85
|
-
args: params,
|
|
86
|
-
|
|
87
|
-
progressToken,
|
|
100
|
+
args: params as never,
|
|
101
|
+
mcpClient,
|
|
88
102
|
});
|
|
89
|
-
const
|
|
90
|
-
|
|
103
|
+
const duration = this.calculateDuration(startTime);
|
|
104
|
+
|
|
105
|
+
if ('workflowStatus' in result) {
|
|
106
|
+
const inProgressBody = {
|
|
107
|
+
status: result.workflowStatus,
|
|
108
|
+
workflowId: result.workflowId,
|
|
109
|
+
operationName: result.operationName,
|
|
110
|
+
message: result.message,
|
|
111
|
+
};
|
|
112
|
+
logger.info(
|
|
113
|
+
{
|
|
114
|
+
toolName,
|
|
115
|
+
duration,
|
|
116
|
+
body: inProgressBody,
|
|
117
|
+
},
|
|
118
|
+
'Tool execution returned in-progress snapshot',
|
|
119
|
+
);
|
|
120
|
+
return this.text(JSON.stringify(inProgressBody, null, 2));
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const { data, errors } = result;
|
|
91
124
|
if (errors.length > 0 && !data) {
|
|
92
125
|
logger.error(
|
|
93
126
|
{
|
|
@@ -98,6 +131,7 @@ text: JSON.stringify(result, null, 2) }],
|
|
|
98
131
|
'Tool execution failed',
|
|
99
132
|
);
|
|
100
133
|
return {
|
|
134
|
+
isError: true,
|
|
101
135
|
content: [
|
|
102
136
|
{
|
|
103
137
|
type: 'text' as const,
|
|
@@ -115,23 +149,9 @@ text: JSON.stringify(result, null, 2) }],
|
|
|
115
149
|
'Tool execution successful',
|
|
116
150
|
);
|
|
117
151
|
if (data) {
|
|
118
|
-
return
|
|
119
|
-
content: [
|
|
120
|
-
{
|
|
121
|
-
type: 'text' as const,
|
|
122
|
-
text: JSON.stringify(data, null, 2),
|
|
123
|
-
},
|
|
124
|
-
],
|
|
125
|
-
};
|
|
152
|
+
return this.text(JSON.stringify(data, null, 2));
|
|
126
153
|
}
|
|
127
|
-
return
|
|
128
|
-
content: [
|
|
129
|
-
{
|
|
130
|
-
type: 'text' as const,
|
|
131
|
-
text: 'Completed',
|
|
132
|
-
},
|
|
133
|
-
],
|
|
134
|
-
};
|
|
154
|
+
return this.text('Completed');
|
|
135
155
|
} catch (error) {
|
|
136
156
|
const duration = this.calculateDuration(startTime);
|
|
137
157
|
if (error instanceof LinkedApiError) {
|
|
@@ -151,6 +171,8 @@ text: JSON.stringify(result, null, 2) }],
|
|
|
151
171
|
text: JSON.stringify(body, null, 2),
|
|
152
172
|
},
|
|
153
173
|
],
|
|
174
|
+
structuredContent: body,
|
|
175
|
+
isError: true,
|
|
154
176
|
};
|
|
155
177
|
}
|
|
156
178
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
@@ -164,17 +186,21 @@ text: JSON.stringify(result, null, 2) }],
|
|
|
164
186
|
'Tool execution failed with unknown error',
|
|
165
187
|
);
|
|
166
188
|
|
|
167
|
-
return {
|
|
168
|
-
content: [
|
|
169
|
-
{
|
|
170
|
-
type: 'text' as const,
|
|
171
|
-
text: `Error executing ${toolName}: ${errorMessage}`,
|
|
172
|
-
},
|
|
173
|
-
],
|
|
174
|
-
};
|
|
189
|
+
return this.text(`Error executing ${toolName}: ${errorMessage}`);
|
|
175
190
|
}
|
|
176
191
|
}
|
|
177
192
|
|
|
193
|
+
private text(text: string): CallToolResult {
|
|
194
|
+
return {
|
|
195
|
+
content: [
|
|
196
|
+
{
|
|
197
|
+
type: 'text' as const,
|
|
198
|
+
text,
|
|
199
|
+
},
|
|
200
|
+
],
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
|
|
178
204
|
private calculateDuration(startTime: number): string {
|
|
179
205
|
const endTime = Date.now();
|
|
180
206
|
return `${((endTime - startTime) / 1000).toFixed(2)} seconds`;
|
package/src/linked-api-tools.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import LinkedApi from '@linkedapi/node';
|
|
2
|
+
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
3
|
+
|
|
1
4
|
import { AdminConnectAccountTool } from './tools/admin-connect-account.js';
|
|
2
5
|
import { AdminDisconnectAccountTool } from './tools/admin-disconnect-account.js';
|
|
3
6
|
import { AdminGetAccountsTool } from './tools/admin-get-accounts.js';
|
|
@@ -35,46 +38,56 @@ import { SearchPeopleTool } from './tools/search-people.js';
|
|
|
35
38
|
import { SendConnectionRequestTool } from './tools/send-connection-request.js';
|
|
36
39
|
import { SendMessageTool } from './tools/send-message.js';
|
|
37
40
|
import { WithdrawConnectionRequestTool } from './tools/withdraw-connection-request.js';
|
|
41
|
+
import type { TLinkedApiToolResult } from './types/linked-api-tool-result.type.js';
|
|
38
42
|
import { AdminTool } from './utils/admin-tool.js';
|
|
39
|
-
|
|
40
|
-
|
|
43
|
+
|
|
44
|
+
interface TRegisteredLinkedApiTool {
|
|
45
|
+
readonly name: string;
|
|
46
|
+
getTool(): Tool;
|
|
47
|
+
validate(args: unknown): unknown;
|
|
48
|
+
execute(options: {
|
|
49
|
+
linkedapi: LinkedApi;
|
|
50
|
+
args: never;
|
|
51
|
+
mcpClient: string;
|
|
52
|
+
}): Promise<TLinkedApiToolResult<unknown>>;
|
|
53
|
+
}
|
|
41
54
|
|
|
42
55
|
export class LinkedApiTools {
|
|
43
|
-
public readonly tools: ReadonlyArray<
|
|
56
|
+
public readonly tools: ReadonlyArray<TRegisteredLinkedApiTool>;
|
|
44
57
|
public readonly adminTools: ReadonlyArray<AdminTool<unknown, unknown>>;
|
|
45
58
|
|
|
46
|
-
constructor(
|
|
59
|
+
constructor() {
|
|
47
60
|
this.tools = [
|
|
48
61
|
// Standard tools
|
|
49
|
-
new SendMessageTool(
|
|
50
|
-
new GetConversationTool(
|
|
51
|
-
new CheckConnectionStatusTool(
|
|
52
|
-
new RetrieveConnectionsTool(
|
|
53
|
-
new SendConnectionRequestTool(
|
|
54
|
-
new WithdrawConnectionRequestTool(
|
|
55
|
-
new RetrievePendingRequestsTool(
|
|
56
|
-
new RemoveConnectionTool(
|
|
57
|
-
new SearchCompaniesTool(
|
|
58
|
-
new SearchPeopleTool(
|
|
59
|
-
new FetchCompanyTool(
|
|
60
|
-
new FetchPersonTool(
|
|
61
|
-
new FetchPostTool(
|
|
62
|
-
new ReactToPostTool(
|
|
63
|
-
new CommentOnPostTool(
|
|
64
|
-
new CreatePostTool(
|
|
65
|
-
new RetrieveSSITool(
|
|
66
|
-
new RetrievePerformanceTool(
|
|
62
|
+
new SendMessageTool(),
|
|
63
|
+
new GetConversationTool(),
|
|
64
|
+
new CheckConnectionStatusTool(),
|
|
65
|
+
new RetrieveConnectionsTool(),
|
|
66
|
+
new SendConnectionRequestTool(),
|
|
67
|
+
new WithdrawConnectionRequestTool(),
|
|
68
|
+
new RetrievePendingRequestsTool(),
|
|
69
|
+
new RemoveConnectionTool(),
|
|
70
|
+
new SearchCompaniesTool(),
|
|
71
|
+
new SearchPeopleTool(),
|
|
72
|
+
new FetchCompanyTool(),
|
|
73
|
+
new FetchPersonTool(),
|
|
74
|
+
new FetchPostTool(),
|
|
75
|
+
new ReactToPostTool(),
|
|
76
|
+
new CommentOnPostTool(),
|
|
77
|
+
new CreatePostTool(),
|
|
78
|
+
new RetrieveSSITool(),
|
|
79
|
+
new RetrievePerformanceTool(),
|
|
67
80
|
// Sales Navigator tools
|
|
68
|
-
new NvSendMessageTool(
|
|
69
|
-
new NvGetConversationTool(
|
|
70
|
-
new NvSearchCompaniesTool(
|
|
71
|
-
new NvSearchPeopleTool(
|
|
72
|
-
new NvFetchCompanyTool(
|
|
73
|
-
new NvFetchPersonTool(
|
|
81
|
+
new NvSendMessageTool(),
|
|
82
|
+
new NvGetConversationTool(),
|
|
83
|
+
new NvSearchCompaniesTool(),
|
|
84
|
+
new NvSearchPeopleTool(),
|
|
85
|
+
new NvFetchCompanyTool(),
|
|
86
|
+
new NvFetchPersonTool(),
|
|
74
87
|
// Other tools
|
|
75
|
-
new ExecuteCustomWorkflowTool(
|
|
76
|
-
new GetWorkflowResultTool(
|
|
77
|
-
new GetApiUsageTool(
|
|
88
|
+
new ExecuteCustomWorkflowTool(),
|
|
89
|
+
new GetWorkflowResultTool(),
|
|
90
|
+
new GetApiUsageTool(),
|
|
78
91
|
];
|
|
79
92
|
|
|
80
93
|
this.adminTools = [
|
|
@@ -91,7 +104,7 @@ export class LinkedApiTools {
|
|
|
91
104
|
];
|
|
92
105
|
}
|
|
93
106
|
|
|
94
|
-
public toolByName(name: string):
|
|
107
|
+
public toolByName(name: string): TRegisteredLinkedApiTool | undefined {
|
|
95
108
|
return this.tools.find((tool) => tool.name === name);
|
|
96
109
|
}
|
|
97
110
|
|
package/src/prompts/index.ts
CHANGED
|
@@ -33,7 +33,7 @@ LINKEDIN WORKFLOWS RUN IN THE BACKGROUND:
|
|
|
33
33
|
- Simply continue listening for updates using get_workflow_result
|
|
34
34
|
|
|
35
35
|
WHEN A WORKFLOW IS RUNNING IN BACKGROUND:
|
|
36
|
-
1. You'll receive a status message with: workflowId and operationName
|
|
36
|
+
1. You'll receive a status message with: workflowId, status, message, and operationName
|
|
37
37
|
2. Use get_workflow_result(workflowId, operationName) to continue listening for updates
|
|
38
38
|
3. Keep listening until you get the final results
|
|
39
39
|
4. This is normal workflow operation - the task is actively running
|
|
@@ -41,6 +41,7 @@ WHEN A WORKFLOW IS RUNNING IN BACKGROUND:
|
|
|
41
41
|
EXAMPLE BACKGROUND WORKFLOW MESSAGE:
|
|
42
42
|
{
|
|
43
43
|
"message": "Workflow is running in the background. Continue listening for updates.",
|
|
44
|
+
"status": "running",
|
|
44
45
|
"workflowId": "account-12345-abcde",
|
|
45
46
|
"operationName": "searchCompanies"
|
|
46
47
|
}
|
|
@@ -113,6 +114,7 @@ WHAT TO DO WHEN WORKFLOW RUNS IN BACKGROUND:
|
|
|
113
114
|
EXAMPLE BACKGROUND WORKFLOW MESSAGE:
|
|
114
115
|
{
|
|
115
116
|
"message": "Workflow is running in the background. Continue listening for updates.",
|
|
117
|
+
"status": "running",
|
|
116
118
|
"workflowId": "account-12345-abcde",
|
|
117
119
|
"operationName": "searchCompanies"
|
|
118
120
|
}
|
|
@@ -16,7 +16,8 @@ export class CommentOnPostTool extends OperationTool<TCommentOnPostParams, unkno
|
|
|
16
16
|
public override getTool(): Tool {
|
|
17
17
|
return {
|
|
18
18
|
name: this.name,
|
|
19
|
-
description:
|
|
19
|
+
description:
|
|
20
|
+
'Allows you to leave a comment on a post (st.commentOnPost action). If this workflow is still running, do not retry this tool; retrying can post duplicate comments.',
|
|
20
21
|
inputSchema: {
|
|
21
22
|
type: 'object',
|
|
22
23
|
properties: {
|
package/src/tools/create-post.ts
CHANGED
|
@@ -26,7 +26,7 @@ export class CreatePostTool extends OperationTool<TCreatePostParams, unknown> {
|
|
|
26
26
|
return {
|
|
27
27
|
name: this.name,
|
|
28
28
|
description:
|
|
29
|
-
'Creates a new LinkedIn post with optional media attachments (st.createPost action).',
|
|
29
|
+
'Creates a new LinkedIn post with optional media attachments (st.createPost action). If this workflow is still running, do not retry this tool; retrying can create duplicate posts.',
|
|
30
30
|
inputSchema: {
|
|
31
31
|
type: 'object',
|
|
32
32
|
properties: {
|
|
@@ -17,7 +17,8 @@ export class ExecuteCustomWorkflowTool extends OperationTool<
|
|
|
17
17
|
public override getTool(): Tool {
|
|
18
18
|
return {
|
|
19
19
|
name: this.name,
|
|
20
|
-
description:
|
|
20
|
+
description:
|
|
21
|
+
'Execute a custom workflow definition. If this workflow is still running, do not retry this tool; retrying can duplicate any write actions inside the custom workflow.',
|
|
21
22
|
inputSchema: {
|
|
22
23
|
type: 'object',
|
|
23
24
|
properties: { definition: { type: 'object' } },
|
|
@@ -17,8 +17,6 @@ export class GetApiUsageTool extends LinkedApiTool<TApiUsageParams, TApiUsageAct
|
|
|
17
17
|
}: {
|
|
18
18
|
linkedapi: LinkedApi;
|
|
19
19
|
args: TApiUsageParams;
|
|
20
|
-
workflowTimeout: number;
|
|
21
|
-
progressToken?: string | number;
|
|
22
20
|
}): Promise<TMappedResponse<TApiUsageAction[]>> {
|
|
23
21
|
return await linkedapi.getApiUsage(args);
|
|
24
22
|
}
|