@fastaai/lenx-mcp 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +99 -0
  2. package/dist/client.d.ts +13 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +68 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/config.d.ts +11 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +24 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/index.d.ts +3 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +14 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/server.d.ts +3 -0
  15. package/dist/server.d.ts.map +1 -0
  16. package/dist/server.js +37 -0
  17. package/dist/server.js.map +1 -0
  18. package/dist/tools/createTask.d.ts +4 -0
  19. package/dist/tools/createTask.d.ts.map +1 -0
  20. package/dist/tools/createTask.js +40 -0
  21. package/dist/tools/createTask.js.map +1 -0
  22. package/dist/tools/deleteTask.d.ts +4 -0
  23. package/dist/tools/deleteTask.d.ts.map +1 -0
  24. package/dist/tools/deleteTask.js +18 -0
  25. package/dist/tools/deleteTask.js.map +1 -0
  26. package/dist/tools/exportTaskData.d.ts +4 -0
  27. package/dist/tools/exportTaskData.d.ts.map +1 -0
  28. package/dist/tools/exportTaskData.js +38 -0
  29. package/dist/tools/exportTaskData.js.map +1 -0
  30. package/dist/tools/getTask.d.ts +4 -0
  31. package/dist/tools/getTask.d.ts.map +1 -0
  32. package/dist/tools/getTask.js +18 -0
  33. package/dist/tools/getTask.js.map +1 -0
  34. package/dist/tools/getTaskData.d.ts +4 -0
  35. package/dist/tools/getTaskData.d.ts.map +1 -0
  36. package/dist/tools/getTaskData.js +29 -0
  37. package/dist/tools/getTaskData.js.map +1 -0
  38. package/dist/tools/listTasks.d.ts +4 -0
  39. package/dist/tools/listTasks.d.ts.map +1 -0
  40. package/dist/tools/listTasks.js +26 -0
  41. package/dist/tools/listTasks.js.map +1 -0
  42. package/dist/tools/updateTask.d.ts +4 -0
  43. package/dist/tools/updateTask.d.ts.map +1 -0
  44. package/dist/tools/updateTask.js +38 -0
  45. package/dist/tools/updateTask.js.map +1 -0
  46. package/dist/types.d.ts +134 -0
  47. package/dist/types.d.ts.map +1 -0
  48. package/dist/types.js +2 -0
  49. package/dist/types.js.map +1 -0
  50. package/package.json +46 -0
package/README.md ADDED
@@ -0,0 +1,99 @@
1
+ # Lenx MCP Server
2
+
3
+ MCP server bridging AI agents to the [Lenx.ai](https://lenx.ai) social media monitoring API.
4
+
5
+ ## Installation
6
+
7
+ Run directly via npx (no local installation required):
8
+
9
+ ```bash
10
+ npx @fastaai/lenx-mcp
11
+ ```
12
+
13
+ Or install globally:
14
+
15
+ ```bash
16
+ npm install -g @fastaai/lenx-mcp
17
+ lenx-mcp
18
+ ```
19
+
20
+ ## Configuration
21
+
22
+ The server requires two environment variables:
23
+
24
+ | Variable | Required | Description |
25
+ |----------|----------|-------------|
26
+ | `LENX_API_KEY` | Yes | Your Lenx API key |
27
+ | `LENX_USER_ID` | Yes | Your Lenx user ID |
28
+ | `LENX_BASE_URL` | No | API base URL (default: `https://open.lenx.ai`) |
29
+
30
+ ### Claude Code
31
+
32
+ Add to your Claude Code MCP configuration:
33
+
34
+ ```json
35
+ {
36
+ "mcpServers": {
37
+ "lenx": {
38
+ "command": "npx",
39
+ "args": ["-y", "@fastaai/lenx-mcp"],
40
+ "env": {
41
+ "LENX_API_KEY": "your-api-key",
42
+ "LENX_USER_ID": "your-user-id",
43
+ "LENX_BASE_URL": "https://open.lenx.ai"
44
+ }
45
+ }
46
+ }
47
+ }
48
+ ```
49
+
50
+ ### OpenCode
51
+
52
+ Add to your `~/.config/opencode/opencode.json`:
53
+
54
+ ```json
55
+ {
56
+ "mcpServers": {
57
+ "lenx": {
58
+ "command": "npx",
59
+ "args": ["-y", "@fastaai/lenx-mcp"],
60
+ "env": {
61
+ "LENX_API_KEY": "your-api-key",
62
+ "LENX_USER_ID": "your-user-id"
63
+ }
64
+ }
65
+ }
66
+ }
67
+ ```
68
+
69
+ ## Available Tools
70
+
71
+ | Tool | Description |
72
+ |------|-------------|
73
+ | `lenx_list_tasks` | List monitoring tasks with pagination |
74
+ | `lenx_get_task` | Get task details by ID |
75
+ | `lenx_create_task` | Create a new live or adhoc task |
76
+ | `lenx_update_task` | Update task name and/or search query |
77
+ | `lenx_delete_task` | Delete a monitoring task |
78
+ | `lenx_get_task_data` | Get paginated post data for a task |
79
+ | `lenx_export_task_data` | Request CSV/XLSX export via email |
80
+
81
+ ## Development
82
+
83
+ ```bash
84
+ # Install dependencies
85
+ npm install
86
+
87
+ # Run tests
88
+ npm test
89
+
90
+ # Build
91
+ npm run build
92
+
93
+ # Watch mode
94
+ npm run watch
95
+ ```
96
+
97
+ ## License
98
+
99
+ MIT
@@ -0,0 +1,13 @@
1
+ import { LenxConfig } from "./config.js";
2
+ export declare class LenxClient {
3
+ private baseUrl;
4
+ private apiKey;
5
+ private userId;
6
+ constructor(config: LenxConfig);
7
+ private request;
8
+ get<T>(path: string): Promise<T>;
9
+ post<T>(path: string, body: unknown): Promise<T>;
10
+ patch<T>(path: string, body: unknown): Promise<T>;
11
+ delete<T>(path: string): Promise<T>;
12
+ }
13
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,UAAU;YAMhB,OAAO;IAsDf,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhD,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAIjD,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CAG1C"}
package/dist/client.js ADDED
@@ -0,0 +1,68 @@
1
+ export class LenxClient {
2
+ baseUrl;
3
+ apiKey;
4
+ userId;
5
+ constructor(config) {
6
+ this.baseUrl = config.baseUrl.replace(/\/$/, "");
7
+ this.apiKey = config.apiKey;
8
+ this.userId = config.userId;
9
+ }
10
+ async request(method, path, body) {
11
+ const url = new URL(path, this.baseUrl);
12
+ const headers = {
13
+ "x-api-key": this.apiKey,
14
+ "x-user-id": this.userId,
15
+ "Content-Type": "application/json",
16
+ };
17
+ const init = {
18
+ method,
19
+ headers,
20
+ signal: AbortSignal.timeout(30000),
21
+ };
22
+ if (body !== undefined) {
23
+ init.body = JSON.stringify(body);
24
+ }
25
+ let response;
26
+ try {
27
+ response = await fetch(url.toString(), init);
28
+ }
29
+ catch (err) {
30
+ const message = err instanceof Error ? err.message : String(err);
31
+ throw new Error(`Network error: ${message}`);
32
+ }
33
+ if (!response.ok) {
34
+ const status = response.status;
35
+ let message;
36
+ try {
37
+ const errorBody = await response.json();
38
+ message = errorBody.message ?? errorBody.error ?? `HTTP ${status}`;
39
+ }
40
+ catch {
41
+ message = `HTTP ${status}`;
42
+ }
43
+ if (status >= 500) {
44
+ throw new Error(`Server error: ${status}`);
45
+ }
46
+ throw new Error(message);
47
+ }
48
+ // Handle empty body (e.g., 204 No Content)
49
+ const contentLength = response.headers.get("content-length");
50
+ if (contentLength === "0" || response.status === 204) {
51
+ return null;
52
+ }
53
+ return response.json();
54
+ }
55
+ async get(path) {
56
+ return this.request("GET", path);
57
+ }
58
+ async post(path, body) {
59
+ return this.request("POST", path, body);
60
+ }
61
+ async patch(path, body) {
62
+ return this.request("PATCH", path, body);
63
+ }
64
+ async delete(path) {
65
+ return this.request("DELETE", path);
66
+ }
67
+ }
68
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export declare class ConfigError extends Error {
2
+ readonly errors: string[];
3
+ constructor(errors: string[]);
4
+ }
5
+ export interface LenxConfig {
6
+ apiKey: string;
7
+ userId: string;
8
+ baseUrl: string;
9
+ }
10
+ export declare function loadConfig(): LenxConfig;
11
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAY,SAAQ,KAAK;aACR,MAAM,EAAE,MAAM,EAAE;gBAAhB,MAAM,EAAE,MAAM,EAAE;CAI7C;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,UAAU,IAAI,UAAU,CAevC"}
package/dist/config.js ADDED
@@ -0,0 +1,24 @@
1
+ export class ConfigError extends Error {
2
+ errors;
3
+ constructor(errors) {
4
+ super("Lenx MCP configuration errors:\n" + errors.map((e) => ` - ${e}`).join("\n"));
5
+ this.errors = errors;
6
+ this.name = "ConfigError";
7
+ }
8
+ }
9
+ export function loadConfig() {
10
+ const env = process.env;
11
+ const apiKey = (env.LENX_API_KEY ?? "").trim();
12
+ const userId = (env.LENX_USER_ID ?? "").trim();
13
+ const baseUrl = (env.LENX_BASE_URL ?? "https://open.lenx.ai").trim();
14
+ const errors = [];
15
+ if (!apiKey)
16
+ errors.push("LENX_API_KEY is required but was not provided");
17
+ if (!userId)
18
+ errors.push("LENX_USER_ID is required but was not provided");
19
+ if (errors.length > 0) {
20
+ throw new ConfigError(errors);
21
+ }
22
+ return { apiKey, userId, baseUrl };
23
+ }
24
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,WAAY,SAAQ,KAAK;IACR;IAA5B,YAA4B,MAAgB;QAC1C,KAAK,CAAC,kCAAkC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAD3D,WAAM,GAAN,MAAM,CAAU;QAE1C,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAQD,MAAM,UAAU,UAAU;IACxB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,aAAa,IAAI,sBAAsB,CAAC,CAAC,IAAI,EAAE,CAAC;IAErE,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM;QAAE,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IAC1E,IAAI,CAAC,MAAM;QAAE,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IAE1E,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AACrC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ import { loadConfig } from "./config.js";
3
+ import { createAndRunServer } from "./server.js";
4
+ async function main() {
5
+ const config = loadConfig();
6
+ console.error(`Lenx MCP: starting server (base URL: ${config.baseUrl})`);
7
+ await createAndRunServer(config);
8
+ console.error("Lenx MCP: server stopped");
9
+ }
10
+ main().catch((err) => {
11
+ console.error("Lenx MCP: fatal error:", err.message);
12
+ process.exit(1);
13
+ });
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,CAAC,KAAK,CAAC,wCAAwC,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC;IACzE,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;AAC5C,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;IAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { LenxConfig } from "./config.js";
2
+ export declare function createAndRunServer(config: LenxConfig): Promise<void>;
3
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AASzC,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAiC1E"}
package/dist/server.js ADDED
@@ -0,0 +1,37 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { LenxClient } from "./client.js";
4
+ import { registerListTasks } from "./tools/listTasks.js";
5
+ import { registerGetTask } from "./tools/getTask.js";
6
+ import { registerCreateTask } from "./tools/createTask.js";
7
+ import { registerUpdateTask } from "./tools/updateTask.js";
8
+ import { registerDeleteTask } from "./tools/deleteTask.js";
9
+ import { registerGetTaskData } from "./tools/getTaskData.js";
10
+ import { registerExportTaskData } from "./tools/exportTaskData.js";
11
+ export async function createAndRunServer(config) {
12
+ const client = new LenxClient(config);
13
+ const server = new McpServer({ name: "lenx-mcp", version: "0.1.0" }, {
14
+ instructions: "Always list tasks first to find task IDs before using other tools.\n" +
15
+ "Task IDs are integers.\n" +
16
+ "Export is async — the result indicates job submission, not completion.",
17
+ });
18
+ registerListTasks(server, client);
19
+ registerGetTask(server, client);
20
+ registerCreateTask(server, client);
21
+ registerUpdateTask(server, client);
22
+ registerDeleteTask(server, client);
23
+ registerGetTaskData(server, client);
24
+ registerExportTaskData(server, client);
25
+ const transport = new StdioServerTransport();
26
+ await server.connect(transport);
27
+ return new Promise((resolve) => {
28
+ const cleanup = async () => {
29
+ console.error("Lenx MCP: shutting down...");
30
+ await server.close();
31
+ resolve();
32
+ };
33
+ process.on("SIGINT", cleanup);
34
+ process.on("SIGTERM", cleanup);
35
+ });
36
+ }
37
+ //# 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,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAkB;IACzD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IAEtC,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,EACtC;QACE,YAAY,EACV,sEAAsE;YACtE,0BAA0B;YAC1B,wEAAwE;KAC3E,CACF,CAAC;IAEF,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEvC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;YACzB,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAC5C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { LenxClient } from "../client.js";
3
+ export declare function registerCreateTask(server: McpServer, client: LenxClient): void;
4
+ //# sourceMappingURL=createTask.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createTask.d.ts","sourceRoot":"","sources":["../../src/tools/createTask.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAiB1C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CA+B9E"}
@@ -0,0 +1,40 @@
1
+ import { z } from "zod";
2
+ const queryLayerItemSchema = z.object({
3
+ in: z.array(z.union([z.string(), z.array(z.string())])),
4
+ ex: z.array(z.union([z.string(), z.array(z.string())])),
5
+ });
6
+ const searchQuerySchema = z.object({
7
+ query_layer: z.array(queryLayerItemSchema).nullable().optional(),
8
+ region: z.string().nullable().optional(),
9
+ list_medium: z.array(z.string()).optional(),
10
+ list_author_id: z.array(z.string()).optional(),
11
+ lang_abbr: z.string().nullable().optional(),
12
+ exclude_channel_links: z.array(z.string()).optional(),
13
+ });
14
+ export function registerCreateTask(server, client) {
15
+ server.tool("lenx_create_task", "Create a new monitoring task (live or adhoc). Live tasks run continuously; adhoc tasks require a date_range.", {
16
+ task_type: z.enum(["live", "adhoc"]).describe("Task type: 'live' runs continuously, 'adhoc' requires date_range"),
17
+ task_name: z.string().min(1).max(50).describe("Task name (1-50 characters)"),
18
+ language: z.enum(["zh-t", "zh-s", "en"]).describe("Language: zh-t (Traditional Chinese), zh-s (Simplified Chinese), en (English)"),
19
+ date_range: z.object({
20
+ from: z.number().positive().describe("Start unix timestamp"),
21
+ to: z.number().positive().describe("End unix timestamp"),
22
+ }).optional().describe("Required for adhoc tasks: time range for data collection"),
23
+ search_query: searchQuerySchema.describe("Search query configuration. Example query_layer with nested grouped keywords:\n" +
24
+ '[{"in": ["brand_name", "product_name"], "ex": ["competitor_name"]}]\n' +
25
+ "Nested OR-group form:\n" +
26
+ '[{"in": [["brand_name", "brand_alias"], ["product_series_a", "product_series_b"]], "ex": [["competitor_a", "competitor_b"]]}]'),
27
+ }, async (params) => {
28
+ try {
29
+ const result = await client.post("/api/v1/tasks", params);
30
+ return { content: [{ type: "text", text: JSON.stringify(result) }] };
31
+ }
32
+ catch (err) {
33
+ return {
34
+ isError: true,
35
+ content: [{ type: "text", text: err.message }],
36
+ };
37
+ }
38
+ });
39
+ }
40
+ //# sourceMappingURL=createTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createTask.js","sourceRoot":"","sources":["../../src/tools/createTask.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { LenxClient } from "../client.js";
3
+ export declare function registerDeleteTask(server: McpServer, client: LenxClient): void;
4
+ //# sourceMappingURL=deleteTask.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deleteTask.d.ts","sourceRoot":"","sources":["../../src/tools/deleteTask.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAmB9E"}
@@ -0,0 +1,18 @@
1
+ import { z } from "zod";
2
+ export function registerDeleteTask(server, client) {
3
+ server.tool("lenx_delete_task", "Delete a monitoring task. Only the task owner can perform this operation.", {
4
+ task_id: z.coerce.number().int().positive().describe("Task ID to delete"),
5
+ }, async ({ task_id }) => {
6
+ try {
7
+ const result = await client.delete(`/api/v1/tasks/${task_id}`);
8
+ return { content: [{ type: "text", text: JSON.stringify(result) }] };
9
+ }
10
+ catch (err) {
11
+ return {
12
+ isError: true,
13
+ content: [{ type: "text", text: err.message }],
14
+ };
15
+ }
16
+ });
17
+ }
18
+ //# sourceMappingURL=deleteTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deleteTask.js","sourceRoot":"","sources":["../../src/tools/deleteTask.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,MAAkB;IACtE,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,2EAA2E,EAC3E;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;KAC1E,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACpB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAqB,iBAAiB,OAAO,EAAE,CAAC,CAAC;YACnF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QAChF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;aACnE,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { LenxClient } from "../client.js";
3
+ export declare function registerExportTaskData(server: McpServer, client: LenxClient): void;
4
+ //# sourceMappingURL=exportTaskData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exportTaskData.d.ts","sourceRoot":"","sources":["../../src/tools/exportTaskData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAa1C,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CA8BlF"}
@@ -0,0 +1,38 @@
1
+ import { z } from "zod";
2
+ const exportColumns = [
3
+ "medium", "site", "country", "lang_abbr", "thread_title",
4
+ "post_message", "author_name", "channel", "post_timestamp",
5
+ "post_date", "post_time", "thread_link", "post_link",
6
+ "comment_count", "share_count", "view_count", "reaction_count",
7
+ "reaction_like", "reaction_dislike", "reaction_angry",
8
+ "reaction_haha", "reaction_love", "reaction_sad", "reaction_wow",
9
+ "ai_sentiment", "ai_impact", "hash",
10
+ ];
11
+ export function registerExportTaskData(server, client) {
12
+ server.tool("lenx_export_task_data", "Request a CSV or XLSX export of task post data. Results are sent to the specified email address.", {
13
+ task_ids: z.array(z.coerce.number().int().positive()).min(1).describe("Array of task IDs to export (strings are auto-converted to numbers)"),
14
+ unix_start: z.number().int().min(0).describe("Start of export time range (unix timestamp)"),
15
+ unix_end: z.number().int().min(0).describe("End of export time range (unix timestamp)"),
16
+ columns: z.array(z.enum(exportColumns)).min(1).describe("Columns to include in the export file"),
17
+ file_format: z.enum(["csv", "xlsx"]).describe("Export file format: csv or xlsx"),
18
+ email: z.string().email().max(255).describe("Email address to send the export to"),
19
+ is_comment: z.boolean().optional().describe("Include comments in export"),
20
+ dedupe: z.boolean().optional().describe("Deduplicate posts in export"),
21
+ limit: z.number().int().positive().optional().describe("Maximum number of posts to export"),
22
+ recipients: z.array(z.string().email()).optional().describe("Additional email recipients"),
23
+ email_subject: z.string().max(200).optional().describe("Custom email subject line"),
24
+ timezone: z.string().optional().describe("Timezone for date formatting in export"),
25
+ }, async (params) => {
26
+ try {
27
+ const result = await client.post("/api/v1/tasks/export", params);
28
+ return { content: [{ type: "text", text: JSON.stringify(result) }] };
29
+ }
30
+ catch (err) {
31
+ return {
32
+ isError: true,
33
+ content: [{ type: "text", text: err.message }],
34
+ };
35
+ }
36
+ });
37
+ }
38
+ //# sourceMappingURL=exportTaskData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exportTaskData.js","sourceRoot":"","sources":["../../src/tools/exportTaskData.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { LenxClient } from "../client.js";
3
+ export declare function registerGetTask(server: McpServer, client: LenxClient): void;
4
+ //# sourceMappingURL=getTask.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTask.d.ts","sourceRoot":"","sources":["../../src/tools/getTask.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAmB3E"}
@@ -0,0 +1,18 @@
1
+ import { z } from "zod";
2
+ export function registerGetTask(server, client) {
3
+ server.tool("lenx_get_task", "Retrieve configuration and metadata for a single monitoring task by ID.", {
4
+ task_id: z.coerce.number().int().positive().describe("Task ID"),
5
+ }, async ({ task_id }) => {
6
+ try {
7
+ const result = await client.get(`/api/v1/tasks/${task_id}`);
8
+ return { content: [{ type: "text", text: JSON.stringify(result) }] };
9
+ }
10
+ catch (err) {
11
+ return {
12
+ isError: true,
13
+ content: [{ type: "text", text: err.message }],
14
+ };
15
+ }
16
+ });
17
+ }
18
+ //# sourceMappingURL=getTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTask.js","sourceRoot":"","sources":["../../src/tools/getTask.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,eAAe,CAAC,MAAiB,EAAE,MAAkB;IACnE,MAAM,CAAC,IAAI,CACT,eAAe,EACf,yEAAyE,EACzE;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;KAChE,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACpB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAkB,iBAAiB,OAAO,EAAE,CAAC,CAAC;YAC7E,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QAChF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;aACnE,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { LenxClient } from "../client.js";
3
+ export declare function registerGetTaskData(server: McpServer, client: LenxClient): void;
4
+ //# sourceMappingURL=getTaskData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTaskData.d.ts","sourceRoot":"","sources":["../../src/tools/getTaskData.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CA+B/E"}
@@ -0,0 +1,29 @@
1
+ import { z } from "zod";
2
+ export function registerGetTaskData(server, client) {
3
+ server.tool("lenx_get_task_data", "Retrieve paginated social media post data for a specific task within a time range.", {
4
+ task_id: z.coerce.number().int().positive().describe("Task ID"),
5
+ from: z.number().positive().describe("Start unix timestamp (inclusive)"),
6
+ to: z.number().positive().describe("End unix timestamp (inclusive)"),
7
+ size: z.number().positive().max(1000).describe("Number of posts per page (max: 1000)"),
8
+ search_after: z.number().optional().describe("Cursor for pagination: pass the last post's unix_timestamp to get the next page"),
9
+ }, async ({ task_id, from, to, size, search_after }) => {
10
+ try {
11
+ const params = new URLSearchParams({
12
+ from: String(from),
13
+ to: String(to),
14
+ size: String(size),
15
+ });
16
+ if (search_after !== undefined)
17
+ params.set("search_after", String(search_after));
18
+ const result = await client.get(`/api/v1/tasks/${task_id}/data?${params.toString()}`);
19
+ return { content: [{ type: "text", text: JSON.stringify(result) }] };
20
+ }
21
+ catch (err) {
22
+ return {
23
+ isError: true,
24
+ content: [{ type: "text", text: err.message }],
25
+ };
26
+ }
27
+ });
28
+ }
29
+ //# sourceMappingURL=getTaskData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTaskData.js","sourceRoot":"","sources":["../../src/tools/getTaskData.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAkB;IACvE,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,oFAAoF,EACpF;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC/D,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QACxE,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;QACpE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,sCAAsC,CAAC;QACtF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iFAAiF,CAAC;KAChI,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE;QAClD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;gBACjC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;gBAClB,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;gBACd,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;aACnB,CAAC,CAAC;YACH,IAAI,YAAY,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;YACjF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAC7B,iBAAiB,OAAO,SAAS,MAAM,CAAC,QAAQ,EAAE,EAAE,CACrD,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QAChF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;aACnE,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { LenxClient } from "../client.js";
3
+ export declare function registerListTasks(server: McpServer, client: LenxClient): void;
4
+ //# sourceMappingURL=listTasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listTasks.d.ts","sourceRoot":"","sources":["../../src/tools/listTasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAyB7E"}
@@ -0,0 +1,26 @@
1
+ import { z } from "zod";
2
+ export function registerListTasks(server, client) {
3
+ server.tool("lenx_list_tasks", "List monitoring tasks accessible to the authenticated user, with pagination support.", {
4
+ page: z.number().int().positive().optional().describe("Page number (default: 1)"),
5
+ size: z.number().int().positive().max(20).optional().describe("Items per page (default: 10, max: 20)"),
6
+ }, async ({ page, size }) => {
7
+ try {
8
+ const params = new URLSearchParams();
9
+ if (page !== undefined)
10
+ params.set("page", String(page));
11
+ if (size !== undefined)
12
+ params.set("size", String(size));
13
+ const qs = params.toString();
14
+ const path = qs ? `/api/v1/tasks?${qs}` : "/api/v1/tasks";
15
+ const result = await client.get(path);
16
+ return { content: [{ type: "text", text: JSON.stringify(result) }] };
17
+ }
18
+ catch (err) {
19
+ return {
20
+ isError: true,
21
+ content: [{ type: "text", text: err.message }],
22
+ };
23
+ }
24
+ });
25
+ }
26
+ //# sourceMappingURL=listTasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listTasks.js","sourceRoot":"","sources":["../../src/tools/listTasks.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,UAAU,iBAAiB,CAAC,MAAiB,EAAE,MAAkB;IACrE,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,sFAAsF,EACtF;QACE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QACjF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;KACvG,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;QACvB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,IAAI,IAAI,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YACzD,IAAI,IAAI,KAAK,SAAS;gBAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YACzD,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC;YAC1D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAoB,IAAI,CAAC,CAAC;YACzD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QAChF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;aACnE,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { LenxClient } from "../client.js";
3
+ export declare function registerUpdateTask(server: McpServer, client: LenxClient): void;
4
+ //# sourceMappingURL=updateTask.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateTask.d.ts","sourceRoot":"","sources":["../../src/tools/updateTask.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAiB1C,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CA2B9E"}
@@ -0,0 +1,38 @@
1
+ import { z } from "zod";
2
+ const queryLayerItemSchema = z.object({
3
+ in: z.array(z.union([z.string(), z.array(z.string())])),
4
+ ex: z.array(z.union([z.string(), z.array(z.string())])),
5
+ });
6
+ const updateSearchQuerySchema = z.object({
7
+ query_layer: z.array(queryLayerItemSchema).nullable().optional(),
8
+ region: z.string().nullable().optional(),
9
+ list_medium: z.array(z.string()).optional(),
10
+ list_author_id: z.array(z.string()).optional(),
11
+ lang_abbr: z.string().nullable().optional(),
12
+ exclude_channel_links: z.array(z.string()).optional(),
13
+ });
14
+ export function registerUpdateTask(server, client) {
15
+ server.tool("lenx_update_task", "Update an existing task's name and/or search query configuration. At least one field is required.", {
16
+ task_id: z.coerce.number().int().positive().describe("Task ID to update"),
17
+ task_name: z.string().min(1).max(50).optional().describe("New task name (1-50 characters)"),
18
+ search_query: updateSearchQuerySchema.optional().describe("Partial search query update. Provide only the fields to change. Example:\n" +
19
+ '{"query_layer": [{"in": ["new_keyword"], "ex": []}]}'),
20
+ }, async (params) => {
21
+ try {
22
+ const body = {};
23
+ if (params.task_name !== undefined)
24
+ body.task_name = params.task_name;
25
+ if (params.search_query !== undefined)
26
+ body.search_query = params.search_query;
27
+ const result = await client.patch(`/api/v1/tasks/${params.task_id}`, body);
28
+ return { content: [{ type: "text", text: JSON.stringify(result) }] };
29
+ }
30
+ catch (err) {
31
+ return {
32
+ isError: true,
33
+ content: [{ type: "text", text: err.message }],
34
+ };
35
+ }
36
+ });
37
+ }
38
+ //# sourceMappingURL=updateTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateTask.js","sourceRoot":"","sources":["../../src/tools/updateTask.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;CACxD,CAAC,CAAC;AAEH,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAChE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACxC,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC3C,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC9C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC3C,qBAAqB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;CACtD,CAAC,CAAC;AAEH,MAAM,UAAU,kBAAkB,CAAC,MAAiB,EAAE,MAAkB;IACtE,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,mGAAmG,EACnG;QACE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACzE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;QAC3F,YAAY,EAAE,uBAAuB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACvD,4EAA4E;YAC5E,sDAAsD,CACvD;KACF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,IAAI,CAAC;YACH,MAAM,IAAI,GAA4B,EAAE,CAAC;YACzC,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS;gBAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;YACtE,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS;gBAAE,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;YAC/E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,KAAK,CAAqB,iBAAiB,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC;YAC/F,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QAChF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;aACnE,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,134 @@
1
+ export interface QueryLayerItem {
2
+ in: string[] | string[][];
3
+ ex: string[] | string[][];
4
+ }
5
+ export interface SearchQuery {
6
+ query_layer?: QueryLayerItem[] | null;
7
+ region?: string | null;
8
+ list_medium?: string[];
9
+ list_author_id?: string[];
10
+ lang_abbr?: string | null;
11
+ exclude_channel_links?: string[];
12
+ }
13
+ export interface DateRange {
14
+ from: number;
15
+ to: number;
16
+ }
17
+ export interface Post {
18
+ id: string;
19
+ hash: string;
20
+ country: string;
21
+ lang_abbr: string;
22
+ medium: string;
23
+ channel: string;
24
+ channel_link: string;
25
+ site: string;
26
+ thread_link: string;
27
+ post_link: string;
28
+ thread_title: string;
29
+ post_message: string;
30
+ post_timestamp: string;
31
+ unix_timestamp: number;
32
+ author_name: string;
33
+ author_id?: string;
34
+ author_image?: string;
35
+ author_link?: string;
36
+ is_comment: boolean;
37
+ comment_order?: number;
38
+ comment_count?: number;
39
+ share_count?: number;
40
+ view_count?: number;
41
+ reaction_count?: number;
42
+ reaction_like?: number;
43
+ reaction_dislike?: number;
44
+ reaction_love?: number;
45
+ reaction_wow?: number;
46
+ reaction_haha?: number;
47
+ reaction_sad?: number;
48
+ reaction_angry?: number;
49
+ sentiment_score?: number;
50
+ }
51
+ export interface Task {
52
+ task_id: number;
53
+ task_name: string;
54
+ task_type: string;
55
+ language: string;
56
+ date_range?: DateRange;
57
+ search_query?: SearchQuery;
58
+ created_at?: string;
59
+ updated_at?: string;
60
+ }
61
+ export interface Pagination {
62
+ page: number;
63
+ size: number;
64
+ total: number;
65
+ totalPages: number;
66
+ }
67
+ export interface ErrorResponse {
68
+ message: string;
69
+ error?: string;
70
+ }
71
+ export interface CreateTaskRequest {
72
+ task_type: "live" | "adhoc";
73
+ task_name: string;
74
+ language: "zh-t" | "zh-s" | "en";
75
+ date_range?: DateRange;
76
+ search_query: SearchQuery;
77
+ }
78
+ export interface UpdateTaskRequest {
79
+ task_name?: string;
80
+ search_query?: SearchQuery;
81
+ }
82
+ export interface ExportTaskRequest {
83
+ task_ids?: number[];
84
+ unix_start: number;
85
+ unix_end: number;
86
+ columns: string[];
87
+ file_format: "csv" | "xlsx";
88
+ email: string;
89
+ is_comment?: boolean;
90
+ dedupe?: boolean;
91
+ limit?: number;
92
+ recipients?: string[];
93
+ email_subject?: string;
94
+ timezone?: string;
95
+ }
96
+ export interface ListTasksResponse {
97
+ data: Task[];
98
+ pagination: Pagination;
99
+ }
100
+ export interface GetTaskResponse {
101
+ data: Task;
102
+ }
103
+ export interface CreateTaskResponse {
104
+ data: Record<string, unknown>;
105
+ }
106
+ export interface UpdateTaskResponse {
107
+ data: {
108
+ task_id: number;
109
+ updated: boolean;
110
+ };
111
+ }
112
+ export interface DeleteTaskResponse {
113
+ data: {
114
+ task_id: number;
115
+ deleted: boolean;
116
+ };
117
+ }
118
+ export interface GetTaskDataParams {
119
+ from: number;
120
+ to: number;
121
+ size: number;
122
+ search_after?: number;
123
+ }
124
+ export interface GetTaskDataResponse {
125
+ data: Post[];
126
+ total: number;
127
+ }
128
+ export interface ExportTaskResponse {
129
+ result: "success" | "error";
130
+ job_id?: string;
131
+ message?: string;
132
+ error?: string;
133
+ }
134
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC;IAC1B,EAAE,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;CAClC;AAGD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAGD,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,IAAI;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,YAAY,CAAC,EAAE,WAAW,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAGD,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACjC,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,YAAY,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,WAAW,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,KAAK,GAAG,MAAM,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,IAAI,EAAE,CAAC;IACb,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,IAAI,EAAE,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@fastaai/lenx-mcp",
3
+ "version": "0.0.1",
4
+ "description": "MCP server bridging AI agents to the Lenx.ai social media monitoring API",
5
+ "type": "module",
6
+ "bin": {
7
+ "lenx-mcp": "dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist/",
11
+ "README.md"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc && node scripts/postbuild.js",
15
+ "watch": "tsc --watch",
16
+ "prepublishOnly": "npm run build",
17
+ "test": "vitest run",
18
+ "test:watch": "vitest"
19
+ },
20
+ "engines": {
21
+ "node": ">=20"
22
+ },
23
+ "dependencies": {
24
+ "@modelcontextprotocol/sdk": "^1.0.0",
25
+ "zod": "^3.23.0"
26
+ },
27
+ "devDependencies": {
28
+ "typescript": "^5.5.0",
29
+ "vitest": "^2.1.0",
30
+ "@types/node": "^20.0.0"
31
+ },
32
+ "publishConfig": {
33
+ "access": "public"
34
+ },
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "git+https://github.com/thinkcol/lenx-mcp.git"
38
+ },
39
+ "keywords": [
40
+ "mcp",
41
+ "lenx",
42
+ "social-media",
43
+ "monitoring"
44
+ ],
45
+ "license": "MIT"
46
+ }