outx-mcp-server 1.0.3 → 1.2.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 +16 -5
- package/dist/index.js +1 -1
- package/dist/tools/linkedin.js +99 -0
- package/dist/tools/linkedin.js.map +1 -1
- package/dist/tools/watchlists.js +74 -16
- package/dist/tools/watchlists.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +1 -1
- package/src/tools/linkedin.ts +124 -0
- package/src/tools/watchlists.ts +72 -15
package/README.md
CHANGED
|
@@ -13,7 +13,9 @@ MCP server for the [OutX](https://outx.ai) LinkedIn social listening and data AP
|
|
|
13
13
|
|
|
14
14
|
- **Monitor LinkedIn** — Track posts by keywords, people, or companies with watchlists
|
|
15
15
|
- **Search & filter posts** — 15+ filters: keyword, date, seniority, trending, language
|
|
16
|
-
- **Fetch profiles** — Get full LinkedIn profiles
|
|
16
|
+
- **Fetch profiles & companies** — Get full LinkedIn profiles, company pages, and connections
|
|
17
|
+
- **Search LinkedIn** — Find people by title, company, location, industry, and more
|
|
18
|
+
- **Message connections** — Send direct messages to 1st-degree connections
|
|
17
19
|
- **Engage** — Like and comment on posts through your LinkedIn account
|
|
18
20
|
- **All via natural language** — Just tell your AI agent what you want
|
|
19
21
|
|
|
@@ -107,7 +109,7 @@ Add to `~/.codeium/windsurf/mcp_config.json`:
|
|
|
107
109
|
|
|
108
110
|
> "Create a watchlist to monitor LinkedIn posts about AI startups raising Series A"
|
|
109
111
|
|
|
110
|
-
## Available Tools (
|
|
112
|
+
## Available Tools (28)
|
|
111
113
|
|
|
112
114
|
### Watchlist Management
|
|
113
115
|
|
|
@@ -145,6 +147,11 @@ These tools use the async LinkedIn Data API. The MCP server handles polling auto
|
|
|
145
147
|
|------|-------------|
|
|
146
148
|
| `fetch_linkedin_profile` | Fetch full LinkedIn profile by slug (name, headline, experience, education, skills) |
|
|
147
149
|
| `fetch_linkedin_posts` | Fetch recent posts from 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
|
+
| `linkedin_send_message` | Send a direct message to a 1st-degree connection |
|
|
153
|
+
| `linkedin_search_profiles` | Search LinkedIn profiles by title, company, location, industry, and more |
|
|
154
|
+
| `linkedin_fetch_connections` | Fetch your 1st-degree connections with keyword search and pagination |
|
|
148
155
|
| `linkedin_like_post` | Like a post by activity URN |
|
|
149
156
|
| `linkedin_comment_on_post` | Comment on a post by activity URN |
|
|
150
157
|
| `get_task_status` | Check status of an async task manually |
|
|
@@ -161,13 +168,17 @@ Once connected, try these with your AI agent:
|
|
|
161
168
|
- "What are VPs and Directors posting about machine learning?"
|
|
162
169
|
- "Find posts mentioning our competitor from the last 7 days"
|
|
163
170
|
|
|
164
|
-
**Profile research:**
|
|
171
|
+
**Profile & company research:**
|
|
165
172
|
- "Fetch the LinkedIn profile for williamhgates"
|
|
166
173
|
- "Get recent posts from this prospect's profile"
|
|
174
|
+
- "Get company info and recent posts for OpenAI"
|
|
175
|
+
- "Search for VPs of Engineering at Google in the US"
|
|
176
|
+
- "Show me my most recently added connections"
|
|
167
177
|
|
|
168
|
-
**Engagement:**
|
|
178
|
+
**Engagement & messaging:**
|
|
169
179
|
- "Like the top 3 most engaging posts about product management"
|
|
170
180
|
- "Comment on this post with a thoughtful response"
|
|
181
|
+
- "Send a message to this connection thanking them for connecting"
|
|
171
182
|
|
|
172
183
|
**Workflows:**
|
|
173
184
|
- "Set up a watchlist for 'looking for a CRM' and check it every 6 hours"
|
|
@@ -187,7 +198,7 @@ The OutX API has two surfaces:
|
|
|
187
198
|
|
|
188
199
|
2. **LinkedIn Data API** (async) — Direct LinkedIn proxy. Fetch profiles, get posts, like, comment. All endpoints return a task ID; the MCP server polls automatically until the result is ready.
|
|
189
200
|
|
|
190
|
-
The MCP server wraps both APIs into
|
|
201
|
+
The MCP server wraps both APIs into 28 tools that any MCP-compatible AI agent can call.
|
|
191
202
|
|
|
192
203
|
## Development
|
|
193
204
|
|
package/dist/index.js
CHANGED
package/dist/tools/linkedin.js
CHANGED
|
@@ -45,6 +45,105 @@ export function registerLinkedInTools(server, client) {
|
|
|
45
45
|
const result = await client.pollTask(response.api_agent_task_id);
|
|
46
46
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
47
47
|
});
|
|
48
|
+
server.tool("fetch_linkedin_company", "Fetch a LinkedIn company page by slug. Returns company data including name, industry, employee count, description, headquarters, and logo. Requires the OutX Chrome extension to be active within the last 48 hours. This tool handles async polling automatically.", {
|
|
49
|
+
company_slug: z
|
|
50
|
+
.string()
|
|
51
|
+
.describe("LinkedIn company slug (e.g. 'microsoft' from linkedin.com/company/microsoft)"),
|
|
52
|
+
}, async (params) => {
|
|
53
|
+
const response = (await client.post("/linkedin-agent/fetch-company", {
|
|
54
|
+
company_slug: params.company_slug,
|
|
55
|
+
}));
|
|
56
|
+
const result = await client.pollTask(response.api_agent_task_id);
|
|
57
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
58
|
+
});
|
|
59
|
+
server.tool("fetch_linkedin_company_posts", "Fetch recent posts from a LinkedIn company page by slug. Returns posts with engagement data (likes, comments, shares). Requires the OutX Chrome extension to be active within the last 48 hours. This tool handles async polling automatically.", {
|
|
60
|
+
company_slug: z
|
|
61
|
+
.string()
|
|
62
|
+
.describe("LinkedIn company slug (e.g. 'openai' from linkedin.com/company/openai)"),
|
|
63
|
+
}, async (params) => {
|
|
64
|
+
const response = (await client.post("/linkedin-agent/fetch-company-posts", {
|
|
65
|
+
company_slug: params.company_slug,
|
|
66
|
+
}));
|
|
67
|
+
const result = await client.pollTask(response.api_agent_task_id);
|
|
68
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
69
|
+
});
|
|
70
|
+
server.tool("linkedin_send_message", "Send a LinkedIn direct message to a 1st-degree connection. Requires the recipient's person URN (get it from fetch_linkedin_profile or linkedin_search_profiles). Message is sent from your team's oldest admin member's LinkedIn account. Requires the OutX Chrome extension to be active. This tool handles async polling automatically.", {
|
|
71
|
+
recipient_urn: z
|
|
72
|
+
.string()
|
|
73
|
+
.describe("LinkedIn person URN of the recipient (e.g. 'urn:li:person:ACoAABCDEFG')"),
|
|
74
|
+
message: z
|
|
75
|
+
.string()
|
|
76
|
+
.describe("Message text to send (max 10,000 characters)"),
|
|
77
|
+
}, async (params) => {
|
|
78
|
+
const response = (await client.post("/linkedin-agent/send-message", {
|
|
79
|
+
recipient_urn: params.recipient_urn,
|
|
80
|
+
message: params.message,
|
|
81
|
+
}));
|
|
82
|
+
const result = await client.pollTask(response.api_agent_task_id);
|
|
83
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
84
|
+
});
|
|
85
|
+
server.tool("linkedin_search_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. This tool handles async polling automatically.", {
|
|
86
|
+
keywords: z.string().optional().describe("General keyword search across name, headline, and profile text"),
|
|
87
|
+
title: z.string().optional().describe("Filter by job title (e.g. 'VP of Engineering')"),
|
|
88
|
+
company: z.string().optional().describe("Filter by current company name (e.g. 'Google')"),
|
|
89
|
+
first_name: z.string().optional().describe("Filter by first name"),
|
|
90
|
+
last_name: z.string().optional().describe("Filter by last name"),
|
|
91
|
+
geo_urn: z.array(z.string()).optional().describe("LinkedIn geographic URNs (e.g. ['103644278'] for US)"),
|
|
92
|
+
current_company: z.array(z.string()).optional().describe("LinkedIn company URNs for current employer"),
|
|
93
|
+
industry: z.array(z.string()).optional().describe("LinkedIn industry URNs"),
|
|
94
|
+
past_company: z.array(z.string()).optional().describe("LinkedIn company URNs for past employer"),
|
|
95
|
+
school: z.string().optional().describe("Filter by school name (e.g. 'MIT')"),
|
|
96
|
+
profile_language: z.array(z.string()).optional().describe("Language codes (e.g. ['en'])"),
|
|
97
|
+
count: z.number().optional().describe("Number of profiles to return (default 25, max 50)"),
|
|
98
|
+
}, async (params) => {
|
|
99
|
+
const body = {};
|
|
100
|
+
if (params.keywords)
|
|
101
|
+
body.keywords = params.keywords;
|
|
102
|
+
if (params.title)
|
|
103
|
+
body.title = params.title;
|
|
104
|
+
if (params.company)
|
|
105
|
+
body.company = params.company;
|
|
106
|
+
if (params.first_name)
|
|
107
|
+
body.first_name = params.first_name;
|
|
108
|
+
if (params.last_name)
|
|
109
|
+
body.last_name = params.last_name;
|
|
110
|
+
if (params.geo_urn)
|
|
111
|
+
body.geo_urn = params.geo_urn;
|
|
112
|
+
if (params.current_company)
|
|
113
|
+
body.current_company = params.current_company;
|
|
114
|
+
if (params.industry)
|
|
115
|
+
body.industry = params.industry;
|
|
116
|
+
if (params.past_company)
|
|
117
|
+
body.past_company = params.past_company;
|
|
118
|
+
if (params.school)
|
|
119
|
+
body.school = params.school;
|
|
120
|
+
if (params.profile_language)
|
|
121
|
+
body.profile_language = params.profile_language;
|
|
122
|
+
if (params.count)
|
|
123
|
+
body.count = params.count;
|
|
124
|
+
const response = (await client.post("/linkedin-agent/search-profiles", body));
|
|
125
|
+
const result = await client.pollTask(response.api_agent_task_id);
|
|
126
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
127
|
+
});
|
|
128
|
+
server.tool("linkedin_fetch_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. This tool handles async polling automatically.", {
|
|
129
|
+
keyword: z.string().optional().describe("Filter connections by name (e.g. 'John')"),
|
|
130
|
+
sort_type: z.string().optional().describe("Sort order. Pass 'RECENTLY_ADDED' for newest first"),
|
|
131
|
+
start: z.number().optional().describe("Pagination offset (default 0)"),
|
|
132
|
+
count: z.number().optional().describe("Number of connections to return (default 40, max 100)"),
|
|
133
|
+
}, async (params) => {
|
|
134
|
+
const body = {};
|
|
135
|
+
if (params.keyword)
|
|
136
|
+
body.keyword = params.keyword;
|
|
137
|
+
if (params.sort_type)
|
|
138
|
+
body.sort_type = params.sort_type;
|
|
139
|
+
if (params.start !== undefined)
|
|
140
|
+
body.start = params.start;
|
|
141
|
+
if (params.count)
|
|
142
|
+
body.count = params.count;
|
|
143
|
+
const response = (await client.post("/linkedin-agent/fetch-connections", body));
|
|
144
|
+
const result = await client.pollTask(response.api_agent_task_id);
|
|
145
|
+
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
146
|
+
});
|
|
48
147
|
server.tool("get_task_status", "Check the status of an async LinkedIn Data API task. Use this to manually check tasks that timed out. Status values: pending, processing, completed, failed.", {
|
|
49
148
|
task_id: z.string().describe("The api_agent_task_id to check"),
|
|
50
149
|
}, async (params) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linkedin.js","sourceRoot":"","sources":["../../src/tools/linkedin.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"linkedin.js","sourceRoot":"","sources":["../../src/tools/linkedin.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/watchlists.js
CHANGED
|
@@ -47,19 +47,57 @@ export function registerWatchlistTools(server, client) {
|
|
|
47
47
|
const result = await client.get("/api-keyword-watchlist");
|
|
48
48
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
49
49
|
});
|
|
50
|
-
server.tool("update_keyword_watchlist", "Update a keyword watchlist
|
|
50
|
+
server.tool("update_keyword_watchlist", "Update a keyword watchlist. Can change name, fetch frequency, Slack webhook, pause/resume tracking via `disable`, and replace the tracked keywords or labels.", {
|
|
51
51
|
id: z.string().describe("Watchlist ID"),
|
|
52
52
|
name: z.string().optional(),
|
|
53
53
|
fetchFreqInHours: fetchFreqEnum.optional(),
|
|
54
|
-
|
|
54
|
+
disable: z
|
|
55
|
+
.boolean()
|
|
56
|
+
.optional()
|
|
57
|
+
.describe("Set to true to pause tracking, false to resume"),
|
|
58
|
+
slack_webhook_url: z
|
|
59
|
+
.string()
|
|
60
|
+
.nullable()
|
|
61
|
+
.optional()
|
|
62
|
+
.describe("Slack incoming webhook URL for alerts. Pass null to clear."),
|
|
63
|
+
keywords: z
|
|
64
|
+
.array(z.string())
|
|
65
|
+
.optional()
|
|
66
|
+
.describe("Replace tracked keywords. All existing keywords are removed and these are inserted."),
|
|
67
|
+
required_keywords: z
|
|
68
|
+
.array(z.string())
|
|
69
|
+
.optional()
|
|
70
|
+
.describe("Applied to every keyword above. Posts MUST contain at least one."),
|
|
71
|
+
exclude_keywords: z
|
|
72
|
+
.array(z.string())
|
|
73
|
+
.optional()
|
|
74
|
+
.describe("Applied to every keyword above. Posts containing any are excluded."),
|
|
75
|
+
labels: z
|
|
76
|
+
.array(z.string())
|
|
77
|
+
.optional()
|
|
78
|
+
.describe("Replace label set used to categorize matched posts."),
|
|
55
79
|
}, async (params) => {
|
|
56
80
|
const body = { id: params.id };
|
|
57
81
|
if (params.name)
|
|
58
82
|
body.name = params.name;
|
|
59
83
|
if (params.fetchFreqInHours)
|
|
60
84
|
body.fetchFreqInHours = parseInt(params.fetchFreqInHours);
|
|
61
|
-
if (params.
|
|
62
|
-
body.
|
|
85
|
+
if (params.disable !== undefined)
|
|
86
|
+
body.disable = params.disable;
|
|
87
|
+
if (params.slack_webhook_url !== undefined)
|
|
88
|
+
body.slack_webhook_url = params.slack_webhook_url;
|
|
89
|
+
if (params.keywords) {
|
|
90
|
+
body.keywords = params.keywords.map((kw) => {
|
|
91
|
+
const obj = { keyword: kw };
|
|
92
|
+
if (params.required_keywords)
|
|
93
|
+
obj.required_keywords = params.required_keywords;
|
|
94
|
+
if (params.exclude_keywords)
|
|
95
|
+
obj.exclude_keywords = params.exclude_keywords;
|
|
96
|
+
return obj;
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
if (params.labels)
|
|
100
|
+
body.labels = params.labels;
|
|
63
101
|
const result = await client.put("/api-keyword-watchlist", body);
|
|
64
102
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
65
103
|
});
|
|
@@ -71,7 +109,7 @@ export function registerWatchlistTools(server, client) {
|
|
|
71
109
|
});
|
|
72
110
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
73
111
|
});
|
|
74
|
-
server.tool("
|
|
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).", {
|
|
75
113
|
prompt: z
|
|
76
114
|
.string()
|
|
77
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."),
|
|
@@ -83,10 +121,10 @@ export function registerWatchlistTools(server, client) {
|
|
|
83
121
|
body.name = params.name;
|
|
84
122
|
if (params.fetchFreqInHours)
|
|
85
123
|
body.fetchFreqInHours = parseInt(params.fetchFreqInHours);
|
|
86
|
-
const result = await client.post("/api-keyword-watchlist
|
|
124
|
+
const result = await client.post("/api-keyword-watchlist", body);
|
|
87
125
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
88
126
|
});
|
|
89
|
-
server.tool("
|
|
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.", {
|
|
90
128
|
id: z.string().describe("Watchlist ID to update"),
|
|
91
129
|
prompt: z
|
|
92
130
|
.string()
|
|
@@ -96,7 +134,7 @@ export function registerWatchlistTools(server, client) {
|
|
|
96
134
|
id: params.id,
|
|
97
135
|
prompt: params.prompt,
|
|
98
136
|
};
|
|
99
|
-
const result = await client.put("/api-keyword-watchlist
|
|
137
|
+
const result = await client.put("/api-keyword-watchlist", body);
|
|
100
138
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
101
139
|
});
|
|
102
140
|
// ── People Watchlists ───────────────────────────────────
|
|
@@ -126,19 +164,29 @@ export function registerWatchlistTools(server, client) {
|
|
|
126
164
|
const result = await client.get("/api-people-watchlist");
|
|
127
165
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
128
166
|
});
|
|
129
|
-
server.tool("update_people_watchlist", "Update a people watchlist
|
|
167
|
+
server.tool("update_people_watchlist", "Update a people watchlist. Can change name, fetch frequency, Slack webhook, and pause/resume tracking via `disable`.", {
|
|
130
168
|
id: z.string().describe("Watchlist ID"),
|
|
131
169
|
name: z.string().optional(),
|
|
132
170
|
fetchFreqInHours: fetchFreqEnum.optional(),
|
|
133
|
-
|
|
171
|
+
disable: z
|
|
172
|
+
.boolean()
|
|
173
|
+
.optional()
|
|
174
|
+
.describe("Set to true to pause tracking, false to resume"),
|
|
175
|
+
slack_webhook_url: z
|
|
176
|
+
.string()
|
|
177
|
+
.nullable()
|
|
178
|
+
.optional()
|
|
179
|
+
.describe("Slack incoming webhook URL for alerts. Pass null to clear."),
|
|
134
180
|
}, async (params) => {
|
|
135
181
|
const body = { id: params.id };
|
|
136
182
|
if (params.name)
|
|
137
183
|
body.name = params.name;
|
|
138
184
|
if (params.fetchFreqInHours)
|
|
139
185
|
body.fetchFreqInHours = parseInt(params.fetchFreqInHours);
|
|
140
|
-
if (params.
|
|
141
|
-
body.
|
|
186
|
+
if (params.disable !== undefined)
|
|
187
|
+
body.disable = params.disable;
|
|
188
|
+
if (params.slack_webhook_url !== undefined)
|
|
189
|
+
body.slack_webhook_url = params.slack_webhook_url;
|
|
142
190
|
const result = await client.put("/api-people-watchlist", body);
|
|
143
191
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
144
192
|
});
|
|
@@ -177,19 +225,29 @@ export function registerWatchlistTools(server, client) {
|
|
|
177
225
|
const result = await client.get("/api-company-watchlist");
|
|
178
226
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
179
227
|
});
|
|
180
|
-
server.tool("update_company_watchlist", "Update a company watchlist
|
|
228
|
+
server.tool("update_company_watchlist", "Update a company watchlist. Can change name, fetch frequency, Slack webhook, and pause/resume tracking via `disable`.", {
|
|
181
229
|
id: z.string().describe("Watchlist ID"),
|
|
182
230
|
name: z.string().optional(),
|
|
183
231
|
fetchFreqInHours: fetchFreqEnum.optional(),
|
|
184
|
-
|
|
232
|
+
disable: z
|
|
233
|
+
.boolean()
|
|
234
|
+
.optional()
|
|
235
|
+
.describe("Set to true to pause tracking, false to resume"),
|
|
236
|
+
slack_webhook_url: z
|
|
237
|
+
.string()
|
|
238
|
+
.nullable()
|
|
239
|
+
.optional()
|
|
240
|
+
.describe("Slack incoming webhook URL for alerts. Pass null to clear."),
|
|
185
241
|
}, async (params) => {
|
|
186
242
|
const body = { id: params.id };
|
|
187
243
|
if (params.name)
|
|
188
244
|
body.name = params.name;
|
|
189
245
|
if (params.fetchFreqInHours)
|
|
190
246
|
body.fetchFreqInHours = parseInt(params.fetchFreqInHours);
|
|
191
|
-
if (params.
|
|
192
|
-
body.
|
|
247
|
+
if (params.disable !== undefined)
|
|
248
|
+
body.disable = params.disable;
|
|
249
|
+
if (params.slack_webhook_url !== undefined)
|
|
250
|
+
body.slack_webhook_url = params.slack_webhook_url;
|
|
193
251
|
const result = await client.put("/api-company-watchlist", body);
|
|
194
252
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
195
253
|
});
|
|
@@ -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/linkedin.ts
CHANGED
|
@@ -82,6 +82,130 @@ export function registerLinkedInTools(
|
|
|
82
82
|
}
|
|
83
83
|
);
|
|
84
84
|
|
|
85
|
+
server.tool(
|
|
86
|
+
"fetch_linkedin_company",
|
|
87
|
+
"Fetch a LinkedIn company page by slug. Returns company data including name, industry, employee count, description, headquarters, and logo. Requires the OutX Chrome extension to be active within the last 48 hours. This tool handles async polling automatically.",
|
|
88
|
+
{
|
|
89
|
+
company_slug: z
|
|
90
|
+
.string()
|
|
91
|
+
.describe("LinkedIn company slug (e.g. 'microsoft' from linkedin.com/company/microsoft)"),
|
|
92
|
+
},
|
|
93
|
+
async (params) => {
|
|
94
|
+
const response = (await client.post("/linkedin-agent/fetch-company", {
|
|
95
|
+
company_slug: params.company_slug,
|
|
96
|
+
})) as { api_agent_task_id: string };
|
|
97
|
+
|
|
98
|
+
const result = await client.pollTask(response.api_agent_task_id);
|
|
99
|
+
return { content: [{ type: "text" as const, text: JSON.stringify(result, null, 2) }] };
|
|
100
|
+
}
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
server.tool(
|
|
104
|
+
"fetch_linkedin_company_posts",
|
|
105
|
+
"Fetch recent posts from a LinkedIn company page by slug. Returns posts with engagement data (likes, comments, shares). Requires the OutX Chrome extension to be active within the last 48 hours. This tool handles async polling automatically.",
|
|
106
|
+
{
|
|
107
|
+
company_slug: z
|
|
108
|
+
.string()
|
|
109
|
+
.describe("LinkedIn company slug (e.g. 'openai' from linkedin.com/company/openai)"),
|
|
110
|
+
},
|
|
111
|
+
async (params) => {
|
|
112
|
+
const response = (await client.post("/linkedin-agent/fetch-company-posts", {
|
|
113
|
+
company_slug: params.company_slug,
|
|
114
|
+
})) as { api_agent_task_id: string };
|
|
115
|
+
|
|
116
|
+
const result = await client.pollTask(response.api_agent_task_id);
|
|
117
|
+
return { content: [{ type: "text" as const, text: JSON.stringify(result, null, 2) }] };
|
|
118
|
+
}
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
server.tool(
|
|
122
|
+
"linkedin_send_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 linkedin_search_profiles). Message is sent from your team's oldest admin member's LinkedIn account. Requires the OutX Chrome extension to be active. This tool handles async polling automatically.",
|
|
124
|
+
{
|
|
125
|
+
recipient_urn: z
|
|
126
|
+
.string()
|
|
127
|
+
.describe("LinkedIn person URN of the recipient (e.g. 'urn:li:person:ACoAABCDEFG')"),
|
|
128
|
+
message: z
|
|
129
|
+
.string()
|
|
130
|
+
.describe("Message text to send (max 10,000 characters)"),
|
|
131
|
+
},
|
|
132
|
+
async (params) => {
|
|
133
|
+
const response = (await client.post("/linkedin-agent/send-message", {
|
|
134
|
+
recipient_urn: params.recipient_urn,
|
|
135
|
+
message: params.message,
|
|
136
|
+
})) as { api_agent_task_id: string };
|
|
137
|
+
|
|
138
|
+
const result = await client.pollTask(response.api_agent_task_id);
|
|
139
|
+
return { content: [{ type: "text" as const, text: JSON.stringify(result, null, 2) }] };
|
|
140
|
+
}
|
|
141
|
+
);
|
|
142
|
+
|
|
143
|
+
server.tool(
|
|
144
|
+
"linkedin_search_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. This tool handles async polling automatically.",
|
|
146
|
+
{
|
|
147
|
+
keywords: z.string().optional().describe("General keyword search across name, headline, and profile text"),
|
|
148
|
+
title: z.string().optional().describe("Filter by job title (e.g. 'VP of Engineering')"),
|
|
149
|
+
company: z.string().optional().describe("Filter by current company name (e.g. 'Google')"),
|
|
150
|
+
first_name: z.string().optional().describe("Filter by first name"),
|
|
151
|
+
last_name: z.string().optional().describe("Filter by last name"),
|
|
152
|
+
geo_urn: z.array(z.string()).optional().describe("LinkedIn geographic URNs (e.g. ['103644278'] for US)"),
|
|
153
|
+
current_company: z.array(z.string()).optional().describe("LinkedIn company URNs for current employer"),
|
|
154
|
+
industry: z.array(z.string()).optional().describe("LinkedIn industry URNs"),
|
|
155
|
+
past_company: z.array(z.string()).optional().describe("LinkedIn company URNs for past employer"),
|
|
156
|
+
school: z.string().optional().describe("Filter by school name (e.g. 'MIT')"),
|
|
157
|
+
profile_language: z.array(z.string()).optional().describe("Language codes (e.g. ['en'])"),
|
|
158
|
+
count: z.number().optional().describe("Number of profiles to return (default 25, max 50)"),
|
|
159
|
+
},
|
|
160
|
+
async (params) => {
|
|
161
|
+
const body: Record<string, unknown> = {};
|
|
162
|
+
if (params.keywords) body.keywords = params.keywords;
|
|
163
|
+
if (params.title) body.title = params.title;
|
|
164
|
+
if (params.company) body.company = params.company;
|
|
165
|
+
if (params.first_name) body.first_name = params.first_name;
|
|
166
|
+
if (params.last_name) body.last_name = params.last_name;
|
|
167
|
+
if (params.geo_urn) body.geo_urn = params.geo_urn;
|
|
168
|
+
if (params.current_company) body.current_company = params.current_company;
|
|
169
|
+
if (params.industry) body.industry = params.industry;
|
|
170
|
+
if (params.past_company) body.past_company = params.past_company;
|
|
171
|
+
if (params.school) body.school = params.school;
|
|
172
|
+
if (params.profile_language) body.profile_language = params.profile_language;
|
|
173
|
+
if (params.count) body.count = params.count;
|
|
174
|
+
|
|
175
|
+
const response = (await client.post("/linkedin-agent/search-profiles", body)) as {
|
|
176
|
+
api_agent_task_id: string;
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
const result = await client.pollTask(response.api_agent_task_id);
|
|
180
|
+
return { content: [{ type: "text" as const, text: JSON.stringify(result, null, 2) }] };
|
|
181
|
+
}
|
|
182
|
+
);
|
|
183
|
+
|
|
184
|
+
server.tool(
|
|
185
|
+
"linkedin_fetch_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. This tool handles async polling automatically.",
|
|
187
|
+
{
|
|
188
|
+
keyword: z.string().optional().describe("Filter connections by name (e.g. 'John')"),
|
|
189
|
+
sort_type: z.string().optional().describe("Sort order. Pass 'RECENTLY_ADDED' for newest first"),
|
|
190
|
+
start: z.number().optional().describe("Pagination offset (default 0)"),
|
|
191
|
+
count: z.number().optional().describe("Number of connections to return (default 40, max 100)"),
|
|
192
|
+
},
|
|
193
|
+
async (params) => {
|
|
194
|
+
const body: Record<string, unknown> = {};
|
|
195
|
+
if (params.keyword) body.keyword = params.keyword;
|
|
196
|
+
if (params.sort_type) body.sort_type = params.sort_type;
|
|
197
|
+
if (params.start !== undefined) body.start = params.start;
|
|
198
|
+
if (params.count) body.count = params.count;
|
|
199
|
+
|
|
200
|
+
const response = (await client.post("/linkedin-agent/fetch-connections", body)) as {
|
|
201
|
+
api_agent_task_id: string;
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
const result = await client.pollTask(response.api_agent_task_id);
|
|
205
|
+
return { content: [{ type: "text" as const, text: JSON.stringify(result, null, 2) }] };
|
|
206
|
+
}
|
|
207
|
+
);
|
|
208
|
+
|
|
85
209
|
server.tool(
|
|
86
210
|
"get_task_status",
|
|
87
211
|
"Check the status of an async LinkedIn Data API task. Use this to manually check tasks that timed out. Status values: pending, processing, completed, failed.",
|
package/src/tools/watchlists.ts
CHANGED
|
@@ -65,19 +65,56 @@ export function registerWatchlistTools(
|
|
|
65
65
|
|
|
66
66
|
server.tool(
|
|
67
67
|
"update_keyword_watchlist",
|
|
68
|
-
"Update a keyword watchlist
|
|
68
|
+
"Update a keyword watchlist. Can change name, fetch frequency, Slack webhook, pause/resume tracking via `disable`, and replace the tracked keywords or labels.",
|
|
69
69
|
{
|
|
70
70
|
id: z.string().describe("Watchlist ID"),
|
|
71
71
|
name: z.string().optional(),
|
|
72
72
|
fetchFreqInHours: fetchFreqEnum.optional(),
|
|
73
|
-
|
|
73
|
+
disable: z
|
|
74
|
+
.boolean()
|
|
75
|
+
.optional()
|
|
76
|
+
.describe("Set to true to pause tracking, false to resume"),
|
|
77
|
+
slack_webhook_url: z
|
|
78
|
+
.string()
|
|
79
|
+
.nullable()
|
|
80
|
+
.optional()
|
|
81
|
+
.describe("Slack incoming webhook URL for alerts. Pass null to clear."),
|
|
82
|
+
keywords: z
|
|
83
|
+
.array(z.string())
|
|
84
|
+
.optional()
|
|
85
|
+
.describe(
|
|
86
|
+
"Replace tracked keywords. All existing keywords are removed and these are inserted."
|
|
87
|
+
),
|
|
88
|
+
required_keywords: z
|
|
89
|
+
.array(z.string())
|
|
90
|
+
.optional()
|
|
91
|
+
.describe("Applied to every keyword above. Posts MUST contain at least one."),
|
|
92
|
+
exclude_keywords: z
|
|
93
|
+
.array(z.string())
|
|
94
|
+
.optional()
|
|
95
|
+
.describe("Applied to every keyword above. Posts containing any are excluded."),
|
|
96
|
+
labels: z
|
|
97
|
+
.array(z.string())
|
|
98
|
+
.optional()
|
|
99
|
+
.describe("Replace label set used to categorize matched posts."),
|
|
74
100
|
},
|
|
75
101
|
async (params) => {
|
|
76
102
|
const body: Record<string, unknown> = { id: params.id };
|
|
77
103
|
if (params.name) body.name = params.name;
|
|
78
104
|
if (params.fetchFreqInHours)
|
|
79
105
|
body.fetchFreqInHours = parseInt(params.fetchFreqInHours);
|
|
80
|
-
if (params.
|
|
106
|
+
if (params.disable !== undefined) body.disable = params.disable;
|
|
107
|
+
if (params.slack_webhook_url !== undefined)
|
|
108
|
+
body.slack_webhook_url = params.slack_webhook_url;
|
|
109
|
+
if (params.keywords) {
|
|
110
|
+
body.keywords = params.keywords.map((kw) => {
|
|
111
|
+
const obj: Record<string, unknown> = { keyword: kw };
|
|
112
|
+
if (params.required_keywords) obj.required_keywords = params.required_keywords;
|
|
113
|
+
if (params.exclude_keywords) obj.exclude_keywords = params.exclude_keywords;
|
|
114
|
+
return obj;
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
if (params.labels) body.labels = params.labels;
|
|
81
118
|
|
|
82
119
|
const result = await client.put("/api-keyword-watchlist", body);
|
|
83
120
|
return { content: [{ type: "text" as const, text: JSON.stringify(result, null, 2) }] };
|
|
@@ -99,8 +136,8 @@ export function registerWatchlistTools(
|
|
|
99
136
|
);
|
|
100
137
|
|
|
101
138
|
server.tool(
|
|
102
|
-
"
|
|
103
|
-
"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.",
|
|
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).",
|
|
104
141
|
{
|
|
105
142
|
prompt: z
|
|
106
143
|
.string()
|
|
@@ -116,14 +153,14 @@ export function registerWatchlistTools(
|
|
|
116
153
|
if (params.fetchFreqInHours)
|
|
117
154
|
body.fetchFreqInHours = parseInt(params.fetchFreqInHours);
|
|
118
155
|
|
|
119
|
-
const result = await client.post("/api-keyword-watchlist
|
|
156
|
+
const result = await client.post("/api-keyword-watchlist", body);
|
|
120
157
|
return { content: [{ type: "text" as const, text: JSON.stringify(result, null, 2) }] };
|
|
121
158
|
}
|
|
122
159
|
);
|
|
123
160
|
|
|
124
161
|
server.tool(
|
|
125
|
-
"
|
|
126
|
-
"
|
|
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.",
|
|
127
164
|
{
|
|
128
165
|
id: z.string().describe("Watchlist ID to update"),
|
|
129
166
|
prompt: z
|
|
@@ -136,7 +173,7 @@ export function registerWatchlistTools(
|
|
|
136
173
|
prompt: params.prompt,
|
|
137
174
|
};
|
|
138
175
|
|
|
139
|
-
const result = await client.put("/api-keyword-watchlist
|
|
176
|
+
const result = await client.put("/api-keyword-watchlist", body);
|
|
140
177
|
return { content: [{ type: "text" as const, text: JSON.stringify(result, null, 2) }] };
|
|
141
178
|
}
|
|
142
179
|
);
|
|
@@ -181,19 +218,29 @@ export function registerWatchlistTools(
|
|
|
181
218
|
|
|
182
219
|
server.tool(
|
|
183
220
|
"update_people_watchlist",
|
|
184
|
-
"Update a people watchlist
|
|
221
|
+
"Update a people watchlist. Can change name, fetch frequency, Slack webhook, and pause/resume tracking via `disable`.",
|
|
185
222
|
{
|
|
186
223
|
id: z.string().describe("Watchlist ID"),
|
|
187
224
|
name: z.string().optional(),
|
|
188
225
|
fetchFreqInHours: fetchFreqEnum.optional(),
|
|
189
|
-
|
|
226
|
+
disable: z
|
|
227
|
+
.boolean()
|
|
228
|
+
.optional()
|
|
229
|
+
.describe("Set to true to pause tracking, false to resume"),
|
|
230
|
+
slack_webhook_url: z
|
|
231
|
+
.string()
|
|
232
|
+
.nullable()
|
|
233
|
+
.optional()
|
|
234
|
+
.describe("Slack incoming webhook URL for alerts. Pass null to clear."),
|
|
190
235
|
},
|
|
191
236
|
async (params) => {
|
|
192
237
|
const body: Record<string, unknown> = { id: params.id };
|
|
193
238
|
if (params.name) body.name = params.name;
|
|
194
239
|
if (params.fetchFreqInHours)
|
|
195
240
|
body.fetchFreqInHours = parseInt(params.fetchFreqInHours);
|
|
196
|
-
if (params.
|
|
241
|
+
if (params.disable !== undefined) body.disable = params.disable;
|
|
242
|
+
if (params.slack_webhook_url !== undefined)
|
|
243
|
+
body.slack_webhook_url = params.slack_webhook_url;
|
|
197
244
|
|
|
198
245
|
const result = await client.put("/api-people-watchlist", body);
|
|
199
246
|
return { content: [{ type: "text" as const, text: JSON.stringify(result, null, 2) }] };
|
|
@@ -254,19 +301,29 @@ export function registerWatchlistTools(
|
|
|
254
301
|
|
|
255
302
|
server.tool(
|
|
256
303
|
"update_company_watchlist",
|
|
257
|
-
"Update a company watchlist
|
|
304
|
+
"Update a company watchlist. Can change name, fetch frequency, Slack webhook, and pause/resume tracking via `disable`.",
|
|
258
305
|
{
|
|
259
306
|
id: z.string().describe("Watchlist ID"),
|
|
260
307
|
name: z.string().optional(),
|
|
261
308
|
fetchFreqInHours: fetchFreqEnum.optional(),
|
|
262
|
-
|
|
309
|
+
disable: z
|
|
310
|
+
.boolean()
|
|
311
|
+
.optional()
|
|
312
|
+
.describe("Set to true to pause tracking, false to resume"),
|
|
313
|
+
slack_webhook_url: z
|
|
314
|
+
.string()
|
|
315
|
+
.nullable()
|
|
316
|
+
.optional()
|
|
317
|
+
.describe("Slack incoming webhook URL for alerts. Pass null to clear."),
|
|
263
318
|
},
|
|
264
319
|
async (params) => {
|
|
265
320
|
const body: Record<string, unknown> = { id: params.id };
|
|
266
321
|
if (params.name) body.name = params.name;
|
|
267
322
|
if (params.fetchFreqInHours)
|
|
268
323
|
body.fetchFreqInHours = parseInt(params.fetchFreqInHours);
|
|
269
|
-
if (params.
|
|
324
|
+
if (params.disable !== undefined) body.disable = params.disable;
|
|
325
|
+
if (params.slack_webhook_url !== undefined)
|
|
326
|
+
body.slack_webhook_url = params.slack_webhook_url;
|
|
270
327
|
|
|
271
328
|
const result = await client.put("/api-company-watchlist", body);
|
|
272
329
|
return { content: [{ type: "text" as const, text: JSON.stringify(result, null, 2) }] };
|