outx-mcp-server 1.2.1 → 1.3.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 +20 -22
- package/dist/index.js +1 -1
- package/dist/tools/engagement.js +4 -4
- package/dist/tools/engagement.js.map +1 -1
- package/dist/tools/linkedin.js +8 -8
- package/dist/tools/linkedin.js.map +1 -1
- package/dist/tools/watchlists.js +75 -68
- package/dist/tools/watchlists.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +1 -1
- package/src/tools/engagement.ts +6 -6
- package/src/tools/linkedin.ts +14 -14
- package/src/tools/watchlists.ts +82 -76
package/README.md
CHANGED
|
@@ -109,7 +109,7 @@ Add to `~/.codeium/windsurf/mcp_config.json`:
|
|
|
109
109
|
|
|
110
110
|
> "Create a watchlist to monitor LinkedIn posts about AI startups raising Series A"
|
|
111
111
|
|
|
112
|
-
## Available Tools (
|
|
112
|
+
## Available Tools (26)
|
|
113
113
|
|
|
114
114
|
### Watchlist Management
|
|
115
115
|
|
|
@@ -117,11 +117,9 @@ Pause and resume any watchlist with `disable: true` or `disable: false` on its u
|
|
|
117
117
|
|
|
118
118
|
| Tool | Description |
|
|
119
119
|
|------|-------------|
|
|
120
|
-
| `create_keyword_watchlist` | Create a watchlist that monitors LinkedIn posts matching
|
|
121
|
-
| `create_keyword_watchlist_from_prompt` | Create a keyword watchlist from a plain-English prompt. OutX generates keywords and intent labels via AI in the background. Useful when you do not want to hand-pick keywords. |
|
|
120
|
+
| `create_keyword_watchlist` | Create a watchlist that monitors LinkedIn posts matching keywords. Two modes: pass `keywords` to track exact terms, OR pass a plain-English `prompt` and OutX will generate keywords and intent labels for you. Mutually exclusive. |
|
|
122
121
|
| `list_keyword_watchlists` | List all keyword watchlists on your account. |
|
|
123
|
-
| `update_keyword_watchlist` | Patch any
|
|
124
|
-
| `regenerate_keyword_watchlist_from_prompt` | Replace the prompt on an existing watchlist. OutX wipes the current keywords and labels and regenerates them from the new prompt in the background. |
|
|
122
|
+
| `update_keyword_watchlist` | Patch any combination of `name`, `fetchFreqInHours`, `disable` (pause/resume), `slack_webhook_url`, `keywords`, or `labels`, OR pass `prompt` to have OutX wipe and regenerate keywords + labels from a new description. Patch and prompt modes are mutually exclusive. |
|
|
125
123
|
| `delete_keyword_watchlist` | Delete a keyword watchlist and all tracked data. |
|
|
126
124
|
| `create_people_watchlist` | Create a watchlist that tracks posts from specific LinkedIn profiles by URL or slug. |
|
|
127
125
|
| `list_people_watchlists` | List all people watchlists on your account. |
|
|
@@ -132,31 +130,31 @@ Pause and resume any watchlist with `disable: true` or `disable: false` on its u
|
|
|
132
130
|
| `update_company_watchlist` | Patch a company watchlist: `name`, `fetchFreqInHours`, `disable` (pause/resume), or `slack_webhook_url`. |
|
|
133
131
|
| `delete_company_watchlist` | Delete a company watchlist. |
|
|
134
132
|
|
|
135
|
-
### Posts & Engagement
|
|
133
|
+
### Posts & Engagement (operates on posts your watchlists captured)
|
|
136
134
|
|
|
137
135
|
| Tool | Description |
|
|
138
136
|
|------|-------------|
|
|
139
|
-
| `get_posts` | Search and filter posts from watchlists (keyword, date, seniority, trending, language, etc.) |
|
|
140
|
-
| `get_interactions` | Retrieve likes and comments for posts in a watchlist with filtering, pagination, and daily graph data |
|
|
141
|
-
| `
|
|
142
|
-
| `
|
|
137
|
+
| `get_posts` | Search and filter posts from your watchlists (keyword, date, seniority, trending, language, etc.) |
|
|
138
|
+
| `get_interactions` | Retrieve likes and comments for posts in a watchlist with filtering, pagination, and daily graph data. |
|
|
139
|
+
| `like_watchlist_post` | Like a post by its OutX `post_id` (from `get_posts` results). For liking by LinkedIn activity URN, use `like_linkedin_post`. |
|
|
140
|
+
| `comment_on_watchlist_post` | Comment on a post by its OutX `post_id` (from `get_posts` results). For commenting by LinkedIn activity URN, use `comment_on_linkedin_post`. |
|
|
143
141
|
|
|
144
|
-
### LinkedIn Data API
|
|
142
|
+
### LinkedIn Data API (direct LinkedIn actions, no watchlist required)
|
|
145
143
|
|
|
146
|
-
|
|
144
|
+
Async tools, the MCP server polls LinkedIn for ~150s and returns the result directly. You almost never need `get_task_status` because of this.
|
|
147
145
|
|
|
148
146
|
| Tool | Description |
|
|
149
147
|
|------|-------------|
|
|
150
|
-
| `fetch_linkedin_profile` | Fetch full LinkedIn profile by slug (name, headline, experience, education, skills) |
|
|
151
|
-
| `
|
|
152
|
-
| `fetch_linkedin_company` | Fetch company page data by slug (industry, employee count, description, headquarters) |
|
|
153
|
-
| `fetch_linkedin_company_posts` | Fetch recent posts from a company page with engagement data |
|
|
154
|
-
| `
|
|
155
|
-
| `
|
|
156
|
-
| `
|
|
157
|
-
| `
|
|
158
|
-
| `
|
|
159
|
-
| `get_task_status` |
|
|
148
|
+
| `fetch_linkedin_profile` | Fetch full LinkedIn profile by slug (name, headline, experience, education, skills). |
|
|
149
|
+
| `fetch_linkedin_profile_posts` | Fetch recent posts from one or more profiles by URN. |
|
|
150
|
+
| `fetch_linkedin_company` | Fetch company page data by slug (industry, employee count, description, headquarters). |
|
|
151
|
+
| `fetch_linkedin_company_posts` | Fetch recent posts from a company page with engagement data. |
|
|
152
|
+
| `fetch_linkedin_connections` | Fetch your 1st-degree connections with keyword search and pagination. |
|
|
153
|
+
| `search_linkedin_profiles` | Search LinkedIn profiles by title, company, location, industry, and more. |
|
|
154
|
+
| `send_linkedin_message` | Send a direct message to a 1st-degree connection by recipient URN. |
|
|
155
|
+
| `like_linkedin_post` | Like a post by its LinkedIn activity URN. For liking a post that came from a watchlist, use `like_watchlist_post`. |
|
|
156
|
+
| `comment_on_linkedin_post` | Comment on a post by its LinkedIn activity URN. For commenting on a post that came from a watchlist, use `comment_on_watchlist_post`. |
|
|
157
|
+
| `get_task_status` | Recovery only. Use this when another tool returns a "did not complete within 150s" error, pass the `api_agent_task_id` from that error to check whether the task has since finished. Don't retry the original tool, that creates a duplicate and wastes a daily quota slot. |
|
|
160
158
|
|
|
161
159
|
> **Note:** LinkedIn Data tools require the [OutX Chrome extension](https://outx.ai/docs/resources/chrome-extension) to be active within the last 48 hours.
|
|
162
160
|
|
package/dist/index.js
CHANGED
package/dist/tools/engagement.js
CHANGED
|
@@ -27,8 +27,8 @@ export function registerEngagementTools(server, client) {
|
|
|
27
27
|
const result = await client.get("/api-interactions", queryParams);
|
|
28
28
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
29
29
|
});
|
|
30
|
-
server.tool("
|
|
31
|
-
post_id: z.string().describe("
|
|
30
|
+
server.tool("like_watchlist_post", "Like a LinkedIn post that came from one of your OutX watchlists. Takes an OutX `post_id` (from `get_posts` results). To like a post by its LinkedIn activity URN directly without a watchlist, use `like_linkedin_post` instead.", {
|
|
31
|
+
post_id: z.string().describe("OutX post ID, from get_posts results"),
|
|
32
32
|
user_email: z.string().describe("Email of the LinkedIn account to like from"),
|
|
33
33
|
actor_type: z
|
|
34
34
|
.enum(["user", "company"])
|
|
@@ -44,8 +44,8 @@ export function registerEngagementTools(server, client) {
|
|
|
44
44
|
const result = await client.post("/api-like", body);
|
|
45
45
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
46
46
|
});
|
|
47
|
-
server.tool("
|
|
48
|
-
post_id: z.string().describe("
|
|
47
|
+
server.tool("comment_on_watchlist_post", "Comment on a LinkedIn post that came from one of your OutX watchlists. Takes an OutX `post_id` (from `get_posts` results). To comment on a post by its LinkedIn activity URN directly without a watchlist, use `comment_on_linkedin_post` instead.", {
|
|
48
|
+
post_id: z.string().describe("OutX post ID, from get_posts results"),
|
|
49
49
|
user_email: z.string().describe("Email of the LinkedIn account to comment from"),
|
|
50
50
|
comment_text: z.string().describe("The comment text to post"),
|
|
51
51
|
actor_type: z
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engagement.js","sourceRoot":"","sources":["../../src/tools/engagement.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,uBAAuB,CACrC,MAAiB,EACjB,MAAkB;IAElB,MAAM,CAAC,IAAI,CACT,kBAAkB,EAClB,6OAA6O,EAC7O;QACE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4CAA4C,CAAC;QAC/E,gBAAgB,EAAE,CAAC;aAChB,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;aACzB,QAAQ,EAAE;aACV,QAAQ,CAAC,4BAA4B,CAAC;QACzC,SAAS,EAAE,CAAC;aACT,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,kEAAkE,CAAC;QAC/E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QAChE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;KACrF,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,WAAW,GAA2B;YAC1C,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC,CAAC;QACF,IAAI,MAAM,CAAC,gBAAgB;YAAE,WAAW,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACpF,IAAI,MAAM,CAAC,SAAS;YAAE,WAAW,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAC/D,IAAI,MAAM,CAAC,IAAI;YAAE,WAAW,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QAChD,IAAI,MAAM,CAAC,SAAS;YAAE,WAAW,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAE/D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,mBAAmB,EAAE,WAAW,CAAC,CAAC;QAClE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,
|
|
1
|
+
{"version":3,"file":"engagement.js","sourceRoot":"","sources":["../../src/tools/engagement.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/linkedin.js
CHANGED
|
@@ -11,7 +11,7 @@ export function registerLinkedInTools(server, client) {
|
|
|
11
11
|
const result = await client.pollTask(response.api_agent_task_id);
|
|
12
12
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
13
13
|
});
|
|
14
|
-
server.tool("
|
|
14
|
+
server.tool("fetch_linkedin_profile_posts", "Fetch recent posts from one or more LinkedIn profiles by URN. Use fetch_linkedin_profile first to get the profile URN. Requires the OutX Chrome extension to be active. This tool handles async polling automatically.", {
|
|
15
15
|
profile_urns: z
|
|
16
16
|
.array(z.string())
|
|
17
17
|
.min(1)
|
|
@@ -21,7 +21,7 @@ export function registerLinkedInTools(server, client) {
|
|
|
21
21
|
const result = await client.pollTask(response.api_agent_task_id);
|
|
22
22
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
23
23
|
});
|
|
24
|
-
server.tool("
|
|
24
|
+
server.tool("like_linkedin_post", "Like a LinkedIn post by its activity URN (direct LinkedIn action). Use this when you have a `social_urn` and don't need a watchlist. For liking a post that came from one of your watchlists (using its OutX `post_id`), use `like_watchlist_post` instead. Requires the OutX Chrome extension to be active. Polls automatically.", {
|
|
25
25
|
social_urn: z
|
|
26
26
|
.string()
|
|
27
27
|
.describe("LinkedIn activity URN of the post to like"),
|
|
@@ -32,7 +32,7 @@ export function registerLinkedInTools(server, client) {
|
|
|
32
32
|
const result = await client.pollTask(response.api_agent_task_id);
|
|
33
33
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
34
34
|
});
|
|
35
|
-
server.tool("
|
|
35
|
+
server.tool("comment_on_linkedin_post", "Comment on a LinkedIn post by its activity URN (direct LinkedIn action). Use this when you have a `social_urn` and don't need a watchlist. For commenting on a post that came from one of your watchlists (using its OutX `post_id`), use `comment_on_watchlist_post` instead. Requires the OutX Chrome extension to be active. Polls automatically.", {
|
|
36
36
|
social_urn: z
|
|
37
37
|
.string()
|
|
38
38
|
.describe("LinkedIn activity URN of the post to comment on"),
|
|
@@ -67,7 +67,7 @@ export function registerLinkedInTools(server, client) {
|
|
|
67
67
|
const result = await client.pollTask(response.api_agent_task_id);
|
|
68
68
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
69
69
|
});
|
|
70
|
-
server.tool("
|
|
70
|
+
server.tool("send_linkedin_message", "Send a LinkedIn direct message to a 1st-degree connection. Requires the recipient's person URN (get it from fetch_linkedin_profile or search_linkedin_profiles). Message is sent from your team's oldest admin member's LinkedIn account. Requires the OutX Chrome extension to be active. Polls automatically.", {
|
|
71
71
|
recipient_urn: z
|
|
72
72
|
.string()
|
|
73
73
|
.describe("LinkedIn person URN of the recipient (e.g. 'urn:li:person:ACoAABCDEFG')"),
|
|
@@ -82,7 +82,7 @@ export function registerLinkedInTools(server, client) {
|
|
|
82
82
|
const result = await client.pollTask(response.api_agent_task_id);
|
|
83
83
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
84
84
|
});
|
|
85
|
-
server.tool("
|
|
85
|
+
server.tool("search_linkedin_profiles", "Search LinkedIn profiles by keywords, title, company, location, industry, and more. Returns matching profiles with name, headline, location, profile slug, and connection degree. At least one filter is required. Requires the OutX Chrome extension to be active. Polls automatically.", {
|
|
86
86
|
keywords: z.string().optional().describe("General keyword search across name, headline, and profile text"),
|
|
87
87
|
title: z.string().optional().describe("Filter by job title (e.g. 'VP of Engineering')"),
|
|
88
88
|
company: z.string().optional().describe("Filter by current company name (e.g. 'Google')"),
|
|
@@ -125,7 +125,7 @@ export function registerLinkedInTools(server, client) {
|
|
|
125
125
|
const result = await client.pollTask(response.api_agent_task_id);
|
|
126
126
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
127
127
|
});
|
|
128
|
-
server.tool("
|
|
128
|
+
server.tool("fetch_linkedin_connections", "Fetch your 1st-degree LinkedIn connections. Optionally filter by keyword, sort by recently added, and paginate. Connections are from your team's oldest admin member's LinkedIn account. Requires the OutX Chrome extension to be active. Polls automatically.", {
|
|
129
129
|
keyword: z.string().optional().describe("Filter connections by name (e.g. 'John')"),
|
|
130
130
|
sort_type: z.string().optional().describe("Sort order. Pass 'RECENTLY_ADDED' for newest first"),
|
|
131
131
|
start: z.number().optional().describe("Pagination offset (default 0)"),
|
|
@@ -144,8 +144,8 @@ export function registerLinkedInTools(server, client) {
|
|
|
144
144
|
const result = await client.pollTask(response.api_agent_task_id);
|
|
145
145
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
146
146
|
});
|
|
147
|
-
server.tool("get_task_status", "
|
|
148
|
-
task_id: z.string().describe("The api_agent_task_id
|
|
147
|
+
server.tool("get_task_status", "Recovery tool. Every other LinkedIn Data API tool polls automatically for ~150 seconds and returns the result directly, so you almost never need this. Use it ONLY when another tool returns a 'did not complete within 150s' error: pass the `api_agent_task_id` from that error message to check whether the task has since finished. Calling the original tool again would create a duplicate task and consume another LinkedIn-side daily quota slot. Status values: pending, processing, completed, failed.", {
|
|
148
|
+
task_id: z.string().describe("The `api_agent_task_id` from the timeout error message of another LinkedIn Data tool."),
|
|
149
149
|
}, async (params) => {
|
|
150
150
|
const result = await client.get("/linkedin-agent/get-task-status", {
|
|
151
151
|
api_agent_task_id: params.task_id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linkedin.js","sourceRoot":"","sources":["../../src/tools/linkedin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,qBAAqB,CACnC,MAAiB,EACjB,MAAkB;IAElB,MAAM,CAAC,IAAI,CACT,wBAAwB,EACxB,mPAAmP,EACnP;QACE,YAAY,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,QAAQ,CAAC,iFAAiF,CAAC;KAC/F,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,+BAA+B,EAAE;YACnE,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC,CAAC,CAAkC,CAAC;QAErC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;QACjE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACzF,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,IAAI,CACT,
|
|
1
|
+
{"version":3,"file":"linkedin.js","sourceRoot":"","sources":["../../src/tools/linkedin.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/watchlists.js
CHANGED
|
@@ -4,40 +4,56 @@ const fetchFreqEnum = z
|
|
|
4
4
|
.describe("How often to scan for new posts (hours)");
|
|
5
5
|
export function registerWatchlistTools(server, client) {
|
|
6
6
|
// ── Keyword Watchlists ──────────────────────────────────
|
|
7
|
-
server.tool("create_keyword_watchlist", "Create a watchlist that monitors LinkedIn posts matching keywords.
|
|
7
|
+
server.tool("create_keyword_watchlist", "Create a watchlist that monitors LinkedIn posts matching keywords. Two modes: provide `keywords` to track exact terms, OR provide `prompt` to have OutX generate keywords and intent labels from a plain-English description. Pass one or the other, not both.", {
|
|
8
8
|
keywords: z
|
|
9
9
|
.array(z.string())
|
|
10
|
-
.
|
|
11
|
-
.describe("Keywords to track (e.g. ['AI startup funding', 'series A'])"),
|
|
10
|
+
.optional()
|
|
11
|
+
.describe("Direct mode. Keywords to track (e.g. ['AI startup funding', 'series A']). Mutually exclusive with `prompt`."),
|
|
12
12
|
required_keywords: z
|
|
13
13
|
.array(z.string())
|
|
14
14
|
.optional()
|
|
15
|
-
.describe("Posts MUST contain at least one of these words"),
|
|
15
|
+
.describe("Direct mode only. Applied to every keyword. Posts MUST contain at least one of these words."),
|
|
16
16
|
exclude_keywords: z
|
|
17
17
|
.array(z.string())
|
|
18
18
|
.optional()
|
|
19
|
-
.describe("
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
.describe("Direct mode only. Applied to every keyword. Posts containing any of these are excluded."),
|
|
20
|
+
prompt: z
|
|
21
|
+
.string()
|
|
22
|
+
.optional()
|
|
23
|
+
.describe("AI mode. Plain-English description of what to track (e.g. 'People looking for remote software engineering jobs'). OutX generates keywords and intent labels in the background. Mutually exclusive with `keywords`."),
|
|
24
|
+
name: z.string().optional().describe("Watchlist name. Auto-generated if omitted."),
|
|
25
|
+
description: z.string().optional().describe("Direct mode only. Optional description for the watchlist."),
|
|
26
|
+
labels: z.array(z.string()).optional().describe("Direct mode only. Custom labels for categorization."),
|
|
23
27
|
fetchFreqInHours: fetchFreqEnum.optional(),
|
|
24
28
|
}, async (params) => {
|
|
25
|
-
const
|
|
26
|
-
|
|
29
|
+
const hasKeywords = Array.isArray(params.keywords) && params.keywords.length > 0;
|
|
30
|
+
const hasPrompt = typeof params.prompt === "string" && params.prompt.trim().length > 0;
|
|
31
|
+
if (hasKeywords && hasPrompt) {
|
|
32
|
+
throw new Error("Provide either `keywords` or `prompt`, not both.");
|
|
33
|
+
}
|
|
34
|
+
if (!hasKeywords && !hasPrompt) {
|
|
35
|
+
throw new Error("Provide either `keywords` (array) or `prompt` (string).");
|
|
36
|
+
}
|
|
37
|
+
const body = {};
|
|
38
|
+
if (hasPrompt) {
|
|
39
|
+
body.prompt = params.prompt.trim();
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
body.keywords = params.keywords.map((kw) => {
|
|
27
43
|
const obj = { keyword: kw };
|
|
28
44
|
if (params.required_keywords)
|
|
29
45
|
obj.required_keywords = params.required_keywords;
|
|
30
46
|
if (params.exclude_keywords)
|
|
31
47
|
obj.exclude_keywords = params.exclude_keywords;
|
|
32
48
|
return obj;
|
|
33
|
-
})
|
|
34
|
-
|
|
49
|
+
});
|
|
50
|
+
if (params.description)
|
|
51
|
+
body.description = params.description;
|
|
52
|
+
if (params.labels)
|
|
53
|
+
body.labels = params.labels;
|
|
54
|
+
}
|
|
35
55
|
if (params.name)
|
|
36
56
|
body.name = params.name;
|
|
37
|
-
if (params.description)
|
|
38
|
-
body.description = params.description;
|
|
39
|
-
if (params.labels)
|
|
40
|
-
body.labels = params.labels;
|
|
41
57
|
if (params.fetchFreqInHours)
|
|
42
58
|
body.fetchFreqInHours = parseInt(params.fetchFreqInHours);
|
|
43
59
|
const result = await client.post("/api-keyword-watchlist", body);
|
|
@@ -47,7 +63,7 @@ export function registerWatchlistTools(server, client) {
|
|
|
47
63
|
const result = await client.get("/api-keyword-watchlist");
|
|
48
64
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
49
65
|
});
|
|
50
|
-
server.tool("update_keyword_watchlist", "Update a keyword watchlist.
|
|
66
|
+
server.tool("update_keyword_watchlist", "Update a keyword watchlist. Patch any fields (name, fetchFreqInHours, disable, slack_webhook_url, keywords, labels), OR pass `prompt` to have OutX regenerate keywords and labels from a new description. Patch and prompt modes are mutually exclusive.", {
|
|
51
67
|
id: z.string().describe("Watchlist ID"),
|
|
52
68
|
name: z.string().optional(),
|
|
53
69
|
fetchFreqInHours: fetchFreqEnum.optional(),
|
|
@@ -63,41 +79,60 @@ export function registerWatchlistTools(server, client) {
|
|
|
63
79
|
keywords: z
|
|
64
80
|
.array(z.string())
|
|
65
81
|
.optional()
|
|
66
|
-
.describe("Replace tracked keywords
|
|
82
|
+
.describe("Patch mode. Replace tracked keywords; all existing keywords are removed and these are inserted. Mutually exclusive with `prompt`."),
|
|
67
83
|
required_keywords: z
|
|
68
84
|
.array(z.string())
|
|
69
85
|
.optional()
|
|
70
|
-
.describe("Applied to every keyword above. Posts MUST contain at least one."),
|
|
86
|
+
.describe("Patch mode only. Applied to every keyword above. Posts MUST contain at least one."),
|
|
71
87
|
exclude_keywords: z
|
|
72
88
|
.array(z.string())
|
|
73
89
|
.optional()
|
|
74
|
-
.describe("Applied to every keyword above. Posts containing any are excluded."),
|
|
90
|
+
.describe("Patch mode only. Applied to every keyword above. Posts containing any are excluded."),
|
|
75
91
|
labels: z
|
|
76
92
|
.array(z.string())
|
|
77
93
|
.optional()
|
|
78
|
-
.describe("Replace label set used to categorize matched posts."),
|
|
94
|
+
.describe("Patch mode only. Replace label set used to categorize matched posts."),
|
|
95
|
+
prompt: z
|
|
96
|
+
.string()
|
|
97
|
+
.optional()
|
|
98
|
+
.describe("Regenerate mode. New plain-English prompt. OutX wipes the existing keywords and labels and regenerates them in the background. Mutually exclusive with patch fields above (other than `id`)."),
|
|
79
99
|
}, async (params) => {
|
|
100
|
+
const hasPrompt = typeof params.prompt === "string" && params.prompt.trim().length > 0;
|
|
101
|
+
const hasPatch = params.name !== undefined ||
|
|
102
|
+
params.fetchFreqInHours !== undefined ||
|
|
103
|
+
params.disable !== undefined ||
|
|
104
|
+
params.slack_webhook_url !== undefined ||
|
|
105
|
+
params.keywords !== undefined ||
|
|
106
|
+
params.labels !== undefined;
|
|
107
|
+
if (hasPrompt && hasPatch) {
|
|
108
|
+
throw new Error("Provide either patch fields (name, fetchFreqInHours, disable, slack_webhook_url, keywords, labels) or `prompt` for regeneration, not both.");
|
|
109
|
+
}
|
|
80
110
|
const body = { id: params.id };
|
|
81
|
-
if (
|
|
82
|
-
body.
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
obj
|
|
96
|
-
|
|
97
|
-
|
|
111
|
+
if (hasPrompt) {
|
|
112
|
+
body.prompt = params.prompt.trim();
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
if (params.name)
|
|
116
|
+
body.name = params.name;
|
|
117
|
+
if (params.fetchFreqInHours)
|
|
118
|
+
body.fetchFreqInHours = parseInt(params.fetchFreqInHours);
|
|
119
|
+
if (params.disable !== undefined)
|
|
120
|
+
body.disable = params.disable;
|
|
121
|
+
if (params.slack_webhook_url !== undefined)
|
|
122
|
+
body.slack_webhook_url = params.slack_webhook_url;
|
|
123
|
+
if (params.keywords) {
|
|
124
|
+
body.keywords = params.keywords.map((kw) => {
|
|
125
|
+
const obj = { keyword: kw };
|
|
126
|
+
if (params.required_keywords)
|
|
127
|
+
obj.required_keywords = params.required_keywords;
|
|
128
|
+
if (params.exclude_keywords)
|
|
129
|
+
obj.exclude_keywords = params.exclude_keywords;
|
|
130
|
+
return obj;
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
if (params.labels)
|
|
134
|
+
body.labels = params.labels;
|
|
98
135
|
}
|
|
99
|
-
if (params.labels)
|
|
100
|
-
body.labels = params.labels;
|
|
101
136
|
const result = await client.put("/api-keyword-watchlist", body);
|
|
102
137
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
103
138
|
});
|
|
@@ -109,34 +144,6 @@ export function registerWatchlistTools(server, client) {
|
|
|
109
144
|
});
|
|
110
145
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
111
146
|
});
|
|
112
|
-
server.tool("create_keyword_watchlist_from_prompt", "Create a keyword watchlist from a natural-language prompt. OutX generates optimized keywords and intent labels automatically using AI. The watchlist is created immediately; keyword generation runs in the background. Hits the same endpoint as create_keyword_watchlist with a different body shape (prompt instead of keywords).", {
|
|
113
|
-
prompt: z
|
|
114
|
-
.string()
|
|
115
|
-
.describe("Plain English description of what to track (e.g. 'People looking for remote software engineering jobs'). Can include URLs for better keyword quality."),
|
|
116
|
-
name: z.string().optional().describe("Watchlist name (auto-generated if omitted)"),
|
|
117
|
-
fetchFreqInHours: fetchFreqEnum.optional(),
|
|
118
|
-
}, async (params) => {
|
|
119
|
-
const body = { prompt: params.prompt };
|
|
120
|
-
if (params.name)
|
|
121
|
-
body.name = params.name;
|
|
122
|
-
if (params.fetchFreqInHours)
|
|
123
|
-
body.fetchFreqInHours = parseInt(params.fetchFreqInHours);
|
|
124
|
-
const result = await client.post("/api-keyword-watchlist", body);
|
|
125
|
-
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
126
|
-
});
|
|
127
|
-
server.tool("regenerate_keyword_watchlist_from_prompt", "Replace the prompt on an existing keyword watchlist. OutX wipes the current keywords and labels and regenerates them from the new prompt. Regeneration runs in the background. Hits the same endpoint as update_keyword_watchlist with a prompt body.", {
|
|
128
|
-
id: z.string().describe("Watchlist ID to update"),
|
|
129
|
-
prompt: z
|
|
130
|
-
.string()
|
|
131
|
-
.describe("New natural-language prompt. OutX will regenerate keywords and labels from this."),
|
|
132
|
-
}, async (params) => {
|
|
133
|
-
const body = {
|
|
134
|
-
id: params.id,
|
|
135
|
-
prompt: params.prompt,
|
|
136
|
-
};
|
|
137
|
-
const result = await client.put("/api-keyword-watchlist", body);
|
|
138
|
-
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
139
|
-
});
|
|
140
147
|
// ── People Watchlists ───────────────────────────────────
|
|
141
148
|
server.tool("create_people_watchlist", "Create a watchlist that monitors posts from specific LinkedIn profiles.", {
|
|
142
149
|
profiles: z
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watchlists.js","sourceRoot":"","sources":["../../src/tools/watchlists.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"watchlists.js","sourceRoot":"","sources":["../../src/tools/watchlists.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
package/src/tools/engagement.ts
CHANGED
|
@@ -37,10 +37,10 @@ export function registerEngagementTools(
|
|
|
37
37
|
);
|
|
38
38
|
|
|
39
39
|
server.tool(
|
|
40
|
-
"
|
|
41
|
-
"Like a LinkedIn post from your
|
|
40
|
+
"like_watchlist_post",
|
|
41
|
+
"Like a LinkedIn post that came from one of your OutX watchlists. Takes an OutX `post_id` (from `get_posts` results). To like a post by its LinkedIn activity URN directly without a watchlist, use `like_linkedin_post` instead.",
|
|
42
42
|
{
|
|
43
|
-
post_id: z.string().describe("
|
|
43
|
+
post_id: z.string().describe("OutX post ID, from get_posts results"),
|
|
44
44
|
user_email: z.string().describe("Email of the LinkedIn account to like from"),
|
|
45
45
|
actor_type: z
|
|
46
46
|
.enum(["user", "company"])
|
|
@@ -60,10 +60,10 @@ export function registerEngagementTools(
|
|
|
60
60
|
);
|
|
61
61
|
|
|
62
62
|
server.tool(
|
|
63
|
-
"
|
|
64
|
-
"Comment on a LinkedIn post from your
|
|
63
|
+
"comment_on_watchlist_post",
|
|
64
|
+
"Comment on a LinkedIn post that came from one of your OutX watchlists. Takes an OutX `post_id` (from `get_posts` results). To comment on a post by its LinkedIn activity URN directly without a watchlist, use `comment_on_linkedin_post` instead.",
|
|
65
65
|
{
|
|
66
|
-
post_id: z.string().describe("
|
|
66
|
+
post_id: z.string().describe("OutX post ID, from get_posts results"),
|
|
67
67
|
user_email: z.string().describe("Email of the LinkedIn account to comment from"),
|
|
68
68
|
comment_text: z.string().describe("The comment text to post"),
|
|
69
69
|
actor_type: z
|
package/src/tools/linkedin.ts
CHANGED
|
@@ -25,8 +25,8 @@ export function registerLinkedInTools(
|
|
|
25
25
|
);
|
|
26
26
|
|
|
27
27
|
server.tool(
|
|
28
|
-
"
|
|
29
|
-
"Fetch recent posts from LinkedIn profiles by URN. Use fetch_linkedin_profile first to get the profile URN. Requires the OutX Chrome extension to be active. This tool handles async polling automatically.",
|
|
28
|
+
"fetch_linkedin_profile_posts",
|
|
29
|
+
"Fetch recent posts from one or more LinkedIn profiles by URN. Use fetch_linkedin_profile first to get the profile URN. Requires the OutX Chrome extension to be active. This tool handles async polling automatically.",
|
|
30
30
|
{
|
|
31
31
|
profile_urns: z
|
|
32
32
|
.array(z.string())
|
|
@@ -45,8 +45,8 @@ export function registerLinkedInTools(
|
|
|
45
45
|
);
|
|
46
46
|
|
|
47
47
|
server.tool(
|
|
48
|
-
"
|
|
49
|
-
"Like a LinkedIn post by its activity URN.
|
|
48
|
+
"like_linkedin_post",
|
|
49
|
+
"Like a LinkedIn post by its activity URN (direct LinkedIn action). Use this when you have a `social_urn` and don't need a watchlist. For liking a post that came from one of your watchlists (using its OutX `post_id`), use `like_watchlist_post` instead. Requires the OutX Chrome extension to be active. Polls automatically.",
|
|
50
50
|
{
|
|
51
51
|
social_urn: z
|
|
52
52
|
.string()
|
|
@@ -63,8 +63,8 @@ export function registerLinkedInTools(
|
|
|
63
63
|
);
|
|
64
64
|
|
|
65
65
|
server.tool(
|
|
66
|
-
"
|
|
67
|
-
"Comment on a LinkedIn post by its activity URN.
|
|
66
|
+
"comment_on_linkedin_post",
|
|
67
|
+
"Comment on a LinkedIn post by its activity URN (direct LinkedIn action). Use this when you have a `social_urn` and don't need a watchlist. For commenting on a post that came from one of your watchlists (using its OutX `post_id`), use `comment_on_watchlist_post` instead. Requires the OutX Chrome extension to be active. Polls automatically.",
|
|
68
68
|
{
|
|
69
69
|
social_urn: z
|
|
70
70
|
.string()
|
|
@@ -119,8 +119,8 @@ export function registerLinkedInTools(
|
|
|
119
119
|
);
|
|
120
120
|
|
|
121
121
|
server.tool(
|
|
122
|
-
"
|
|
123
|
-
"Send a LinkedIn direct message to a 1st-degree connection. Requires the recipient's person URN (get it from fetch_linkedin_profile or
|
|
122
|
+
"send_linkedin_message",
|
|
123
|
+
"Send a LinkedIn direct message to a 1st-degree connection. Requires the recipient's person URN (get it from fetch_linkedin_profile or search_linkedin_profiles). Message is sent from your team's oldest admin member's LinkedIn account. Requires the OutX Chrome extension to be active. Polls automatically.",
|
|
124
124
|
{
|
|
125
125
|
recipient_urn: z
|
|
126
126
|
.string()
|
|
@@ -141,8 +141,8 @@ export function registerLinkedInTools(
|
|
|
141
141
|
);
|
|
142
142
|
|
|
143
143
|
server.tool(
|
|
144
|
-
"
|
|
145
|
-
"Search LinkedIn profiles by keywords, title, company, location, industry, and more. Returns matching profiles with name, headline, location, profile slug, and connection degree. At least one filter is required. Requires the OutX Chrome extension to be active.
|
|
144
|
+
"search_linkedin_profiles",
|
|
145
|
+
"Search LinkedIn profiles by keywords, title, company, location, industry, and more. Returns matching profiles with name, headline, location, profile slug, and connection degree. At least one filter is required. Requires the OutX Chrome extension to be active. Polls automatically.",
|
|
146
146
|
{
|
|
147
147
|
keywords: z.string().optional().describe("General keyword search across name, headline, and profile text"),
|
|
148
148
|
title: z.string().optional().describe("Filter by job title (e.g. 'VP of Engineering')"),
|
|
@@ -182,8 +182,8 @@ export function registerLinkedInTools(
|
|
|
182
182
|
);
|
|
183
183
|
|
|
184
184
|
server.tool(
|
|
185
|
-
"
|
|
186
|
-
"Fetch your 1st-degree LinkedIn connections. Optionally filter by keyword, sort by recently added, and paginate. Connections are from your team's oldest admin member's LinkedIn account. Requires the OutX Chrome extension to be active.
|
|
185
|
+
"fetch_linkedin_connections",
|
|
186
|
+
"Fetch your 1st-degree LinkedIn connections. Optionally filter by keyword, sort by recently added, and paginate. Connections are from your team's oldest admin member's LinkedIn account. Requires the OutX Chrome extension to be active. Polls automatically.",
|
|
187
187
|
{
|
|
188
188
|
keyword: z.string().optional().describe("Filter connections by name (e.g. 'John')"),
|
|
189
189
|
sort_type: z.string().optional().describe("Sort order. Pass 'RECENTLY_ADDED' for newest first"),
|
|
@@ -208,9 +208,9 @@ export function registerLinkedInTools(
|
|
|
208
208
|
|
|
209
209
|
server.tool(
|
|
210
210
|
"get_task_status",
|
|
211
|
-
"
|
|
211
|
+
"Recovery tool. Every other LinkedIn Data API tool polls automatically for ~150 seconds and returns the result directly, so you almost never need this. Use it ONLY when another tool returns a 'did not complete within 150s' error: pass the `api_agent_task_id` from that error message to check whether the task has since finished. Calling the original tool again would create a duplicate task and consume another LinkedIn-side daily quota slot. Status values: pending, processing, completed, failed.",
|
|
212
212
|
{
|
|
213
|
-
task_id: z.string().describe("The api_agent_task_id
|
|
213
|
+
task_id: z.string().describe("The `api_agent_task_id` from the timeout error message of another LinkedIn Data tool."),
|
|
214
214
|
},
|
|
215
215
|
async (params) => {
|
|
216
216
|
const result = await client.get("/linkedin-agent/get-task-status", {
|
package/src/tools/watchlists.ts
CHANGED
|
@@ -14,37 +14,60 @@ export function registerWatchlistTools(
|
|
|
14
14
|
|
|
15
15
|
server.tool(
|
|
16
16
|
"create_keyword_watchlist",
|
|
17
|
-
"Create a watchlist that monitors LinkedIn posts matching keywords.
|
|
17
|
+
"Create a watchlist that monitors LinkedIn posts matching keywords. Two modes: provide `keywords` to track exact terms, OR provide `prompt` to have OutX generate keywords and intent labels from a plain-English description. Pass one or the other, not both.",
|
|
18
18
|
{
|
|
19
19
|
keywords: z
|
|
20
20
|
.array(z.string())
|
|
21
|
-
.
|
|
22
|
-
.describe(
|
|
21
|
+
.optional()
|
|
22
|
+
.describe(
|
|
23
|
+
"Direct mode. Keywords to track (e.g. ['AI startup funding', 'series A']). Mutually exclusive with `prompt`."
|
|
24
|
+
),
|
|
23
25
|
required_keywords: z
|
|
24
26
|
.array(z.string())
|
|
25
27
|
.optional()
|
|
26
|
-
.describe("Posts MUST contain at least one of these words"),
|
|
28
|
+
.describe("Direct mode only. Applied to every keyword. Posts MUST contain at least one of these words."),
|
|
27
29
|
exclude_keywords: z
|
|
28
30
|
.array(z.string())
|
|
29
31
|
.optional()
|
|
30
|
-
.describe("
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
.describe("Direct mode only. Applied to every keyword. Posts containing any of these are excluded."),
|
|
33
|
+
prompt: z
|
|
34
|
+
.string()
|
|
35
|
+
.optional()
|
|
36
|
+
.describe(
|
|
37
|
+
"AI mode. Plain-English description of what to track (e.g. 'People looking for remote software engineering jobs'). OutX generates keywords and intent labels in the background. Mutually exclusive with `keywords`."
|
|
38
|
+
),
|
|
39
|
+
name: z.string().optional().describe("Watchlist name. Auto-generated if omitted."),
|
|
40
|
+
description: z.string().optional().describe("Direct mode only. Optional description for the watchlist."),
|
|
41
|
+
labels: z.array(z.string()).optional().describe("Direct mode only. Custom labels for categorization."),
|
|
34
42
|
fetchFreqInHours: fetchFreqEnum.optional(),
|
|
35
43
|
},
|
|
36
44
|
async (params) => {
|
|
37
|
-
const
|
|
38
|
-
|
|
45
|
+
const hasKeywords = Array.isArray(params.keywords) && params.keywords.length > 0;
|
|
46
|
+
const hasPrompt = typeof params.prompt === "string" && params.prompt.trim().length > 0;
|
|
47
|
+
|
|
48
|
+
if (hasKeywords && hasPrompt) {
|
|
49
|
+
throw new Error("Provide either `keywords` or `prompt`, not both.");
|
|
50
|
+
}
|
|
51
|
+
if (!hasKeywords && !hasPrompt) {
|
|
52
|
+
throw new Error("Provide either `keywords` (array) or `prompt` (string).");
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const body: Record<string, unknown> = {};
|
|
56
|
+
|
|
57
|
+
if (hasPrompt) {
|
|
58
|
+
body.prompt = params.prompt!.trim();
|
|
59
|
+
} else {
|
|
60
|
+
body.keywords = params.keywords!.map((kw) => {
|
|
39
61
|
const obj: Record<string, unknown> = { keyword: kw };
|
|
40
62
|
if (params.required_keywords) obj.required_keywords = params.required_keywords;
|
|
41
63
|
if (params.exclude_keywords) obj.exclude_keywords = params.exclude_keywords;
|
|
42
64
|
return obj;
|
|
43
|
-
})
|
|
44
|
-
|
|
65
|
+
});
|
|
66
|
+
if (params.description) body.description = params.description;
|
|
67
|
+
if (params.labels) body.labels = params.labels;
|
|
68
|
+
}
|
|
69
|
+
|
|
45
70
|
if (params.name) body.name = params.name;
|
|
46
|
-
if (params.description) body.description = params.description;
|
|
47
|
-
if (params.labels) body.labels = params.labels;
|
|
48
71
|
if (params.fetchFreqInHours)
|
|
49
72
|
body.fetchFreqInHours = parseInt(params.fetchFreqInHours);
|
|
50
73
|
|
|
@@ -65,7 +88,7 @@ export function registerWatchlistTools(
|
|
|
65
88
|
|
|
66
89
|
server.tool(
|
|
67
90
|
"update_keyword_watchlist",
|
|
68
|
-
"Update a keyword watchlist.
|
|
91
|
+
"Update a keyword watchlist. Patch any fields (name, fetchFreqInHours, disable, slack_webhook_url, keywords, labels), OR pass `prompt` to have OutX regenerate keywords and labels from a new description. Patch and prompt modes are mutually exclusive.",
|
|
69
92
|
{
|
|
70
93
|
id: z.string().describe("Watchlist ID"),
|
|
71
94
|
name: z.string().optional(),
|
|
@@ -83,38 +106,64 @@ export function registerWatchlistTools(
|
|
|
83
106
|
.array(z.string())
|
|
84
107
|
.optional()
|
|
85
108
|
.describe(
|
|
86
|
-
"Replace tracked keywords
|
|
109
|
+
"Patch mode. Replace tracked keywords; all existing keywords are removed and these are inserted. Mutually exclusive with `prompt`."
|
|
87
110
|
),
|
|
88
111
|
required_keywords: z
|
|
89
112
|
.array(z.string())
|
|
90
113
|
.optional()
|
|
91
|
-
.describe("Applied to every keyword above. Posts MUST contain at least one."),
|
|
114
|
+
.describe("Patch mode only. Applied to every keyword above. Posts MUST contain at least one."),
|
|
92
115
|
exclude_keywords: z
|
|
93
116
|
.array(z.string())
|
|
94
117
|
.optional()
|
|
95
|
-
.describe("Applied to every keyword above. Posts containing any are excluded."),
|
|
118
|
+
.describe("Patch mode only. Applied to every keyword above. Posts containing any are excluded."),
|
|
96
119
|
labels: z
|
|
97
120
|
.array(z.string())
|
|
98
121
|
.optional()
|
|
99
|
-
.describe("Replace label set used to categorize matched posts."),
|
|
122
|
+
.describe("Patch mode only. Replace label set used to categorize matched posts."),
|
|
123
|
+
prompt: z
|
|
124
|
+
.string()
|
|
125
|
+
.optional()
|
|
126
|
+
.describe(
|
|
127
|
+
"Regenerate mode. New plain-English prompt. OutX wipes the existing keywords and labels and regenerates them in the background. Mutually exclusive with patch fields above (other than `id`)."
|
|
128
|
+
),
|
|
100
129
|
},
|
|
101
130
|
async (params) => {
|
|
131
|
+
const hasPrompt = typeof params.prompt === "string" && params.prompt.trim().length > 0;
|
|
132
|
+
const hasPatch =
|
|
133
|
+
params.name !== undefined ||
|
|
134
|
+
params.fetchFreqInHours !== undefined ||
|
|
135
|
+
params.disable !== undefined ||
|
|
136
|
+
params.slack_webhook_url !== undefined ||
|
|
137
|
+
params.keywords !== undefined ||
|
|
138
|
+
params.labels !== undefined;
|
|
139
|
+
|
|
140
|
+
if (hasPrompt && hasPatch) {
|
|
141
|
+
throw new Error(
|
|
142
|
+
"Provide either patch fields (name, fetchFreqInHours, disable, slack_webhook_url, keywords, labels) or `prompt` for regeneration, not both."
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
|
|
102
146
|
const body: Record<string, unknown> = { id: params.id };
|
|
103
|
-
|
|
104
|
-
if (
|
|
105
|
-
body.
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
body.
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
147
|
+
|
|
148
|
+
if (hasPrompt) {
|
|
149
|
+
body.prompt = params.prompt!.trim();
|
|
150
|
+
} else {
|
|
151
|
+
if (params.name) body.name = params.name;
|
|
152
|
+
if (params.fetchFreqInHours)
|
|
153
|
+
body.fetchFreqInHours = parseInt(params.fetchFreqInHours);
|
|
154
|
+
if (params.disable !== undefined) body.disable = params.disable;
|
|
155
|
+
if (params.slack_webhook_url !== undefined)
|
|
156
|
+
body.slack_webhook_url = params.slack_webhook_url;
|
|
157
|
+
if (params.keywords) {
|
|
158
|
+
body.keywords = params.keywords.map((kw) => {
|
|
159
|
+
const obj: Record<string, unknown> = { keyword: kw };
|
|
160
|
+
if (params.required_keywords) obj.required_keywords = params.required_keywords;
|
|
161
|
+
if (params.exclude_keywords) obj.exclude_keywords = params.exclude_keywords;
|
|
162
|
+
return obj;
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
if (params.labels) body.labels = params.labels;
|
|
116
166
|
}
|
|
117
|
-
if (params.labels) body.labels = params.labels;
|
|
118
167
|
|
|
119
168
|
const result = await client.put("/api-keyword-watchlist", body);
|
|
120
169
|
return { content: [{ type: "text" as const, text: JSON.stringify(result, null, 2) }] };
|
|
@@ -135,49 +184,6 @@ export function registerWatchlistTools(
|
|
|
135
184
|
}
|
|
136
185
|
);
|
|
137
186
|
|
|
138
|
-
server.tool(
|
|
139
|
-
"create_keyword_watchlist_from_prompt",
|
|
140
|
-
"Create a keyword watchlist from a natural-language prompt. OutX generates optimized keywords and intent labels automatically using AI. The watchlist is created immediately; keyword generation runs in the background. Hits the same endpoint as create_keyword_watchlist with a different body shape (prompt instead of keywords).",
|
|
141
|
-
{
|
|
142
|
-
prompt: z
|
|
143
|
-
.string()
|
|
144
|
-
.describe(
|
|
145
|
-
"Plain English description of what to track (e.g. 'People looking for remote software engineering jobs'). Can include URLs for better keyword quality."
|
|
146
|
-
),
|
|
147
|
-
name: z.string().optional().describe("Watchlist name (auto-generated if omitted)"),
|
|
148
|
-
fetchFreqInHours: fetchFreqEnum.optional(),
|
|
149
|
-
},
|
|
150
|
-
async (params) => {
|
|
151
|
-
const body: Record<string, unknown> = { prompt: params.prompt };
|
|
152
|
-
if (params.name) body.name = params.name;
|
|
153
|
-
if (params.fetchFreqInHours)
|
|
154
|
-
body.fetchFreqInHours = parseInt(params.fetchFreqInHours);
|
|
155
|
-
|
|
156
|
-
const result = await client.post("/api-keyword-watchlist", body);
|
|
157
|
-
return { content: [{ type: "text" as const, text: JSON.stringify(result, null, 2) }] };
|
|
158
|
-
}
|
|
159
|
-
);
|
|
160
|
-
|
|
161
|
-
server.tool(
|
|
162
|
-
"regenerate_keyword_watchlist_from_prompt",
|
|
163
|
-
"Replace the prompt on an existing keyword watchlist. OutX wipes the current keywords and labels and regenerates them from the new prompt. Regeneration runs in the background. Hits the same endpoint as update_keyword_watchlist with a prompt body.",
|
|
164
|
-
{
|
|
165
|
-
id: z.string().describe("Watchlist ID to update"),
|
|
166
|
-
prompt: z
|
|
167
|
-
.string()
|
|
168
|
-
.describe("New natural-language prompt. OutX will regenerate keywords and labels from this."),
|
|
169
|
-
},
|
|
170
|
-
async (params) => {
|
|
171
|
-
const body: Record<string, unknown> = {
|
|
172
|
-
id: params.id,
|
|
173
|
-
prompt: params.prompt,
|
|
174
|
-
};
|
|
175
|
-
|
|
176
|
-
const result = await client.put("/api-keyword-watchlist", body);
|
|
177
|
-
return { content: [{ type: "text" as const, text: JSON.stringify(result, null, 2) }] };
|
|
178
|
-
}
|
|
179
|
-
);
|
|
180
|
-
|
|
181
187
|
// ── People Watchlists ───────────────────────────────────
|
|
182
188
|
|
|
183
189
|
server.tool(
|