outx-mcp-server 1.7.0 → 1.8.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 +89 -67
- package/WORKLOG.md +7 -0
- package/dist/client.d.ts +4 -1
- package/dist/client.js +39 -13
- package/dist/client.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/tools/linkedin.js +29 -4
- package/dist/tools/linkedin.js.map +1 -1
- package/dist/tools/posts.js +42 -4
- package/dist/tools/posts.js.map +1 -1
- package/dist/tools/watchlists.js +156 -28
- package/dist/tools/watchlists.js.map +1 -1
- package/package.json +1 -1
- package/scripts/gen-tool-table.ts +119 -0
- package/src/client.ts +55 -13
- package/src/index.ts +1 -1
- package/src/tools/linkedin.ts +33 -4
- package/src/tools/posts.ts +54 -4
- package/src/tools/watchlists.ts +188 -28
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
[](https://www.npmjs.com/package/outx-mcp-server)
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
5
|
|
|
6
|
-
MCP server for the [OutX](https://outx.ai) LinkedIn social listening and data API. Connect AI agents like Claude, Cursor, and Claude Code to LinkedIn
|
|
6
|
+
MCP server for the [OutX](https://outx.ai) LinkedIn social listening and data API. Connect AI agents like Claude, Cursor, and Claude Code to LinkedIn: create watchlists, search posts, fetch profiles, and engage, all through natural language.
|
|
7
7
|
|
|
8
8
|
<p align="center">
|
|
9
9
|
<code>AI Agent ←→ MCP Protocol ←→ OutX MCP Server ←→ OutX API ←→ LinkedIn</code>
|
|
@@ -11,13 +11,13 @@ MCP server for the [OutX](https://outx.ai) LinkedIn social listening and data AP
|
|
|
11
11
|
|
|
12
12
|
## What You Can Do
|
|
13
13
|
|
|
14
|
-
- **Monitor LinkedIn
|
|
15
|
-
- **Search & filter posts
|
|
16
|
-
- **Fetch profiles & companies
|
|
17
|
-
- **Search LinkedIn
|
|
18
|
-
- **Message connections
|
|
19
|
-
- **Engage
|
|
20
|
-
- **All via natural language
|
|
14
|
+
- **Monitor LinkedIn**: Track posts by keywords, people, or companies with watchlists
|
|
15
|
+
- **Search & filter posts**: 15+ filters: keyword, date, seniority, trending, language
|
|
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
|
|
19
|
+
- **Engage**: Like and comment on posts through your LinkedIn account
|
|
20
|
+
- **All via natural language**: Just tell your AI agent what you want
|
|
21
21
|
|
|
22
22
|
## Quick Start
|
|
23
23
|
|
|
@@ -109,35 +109,42 @@ 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
|
-
|
|
112
|
+
<!-- BEGIN GENERATED TOOL TABLE -->
|
|
113
|
+
|
|
114
|
+
## Available Tools (33)
|
|
113
115
|
|
|
114
116
|
### Watchlist Management
|
|
115
117
|
|
|
116
|
-
Pause and resume any watchlist with `disable: true` or `disable: false` on its update tool. Configure Slack alerts with `slack_webhook_url`.
|
|
118
|
+
One watchlist carries one signal for one audience. Pause and resume any watchlist with `disable: true` or `disable: false` on its update tool. Configure Slack alerts with `slack_webhook_url`. Grow a people or company watchlist with `add_profiles` / `add_companies` on its update tool, never by creating a second list: 200 members per watchlist, and a per-plan cap on the total your team tracks.
|
|
117
119
|
|
|
118
120
|
| Tool | Description |
|
|
119
121
|
|------|-------------|
|
|
120
|
-
| `
|
|
121
|
-
| `
|
|
122
|
-
| `
|
|
123
|
-
| `
|
|
124
|
-
| `
|
|
125
|
-
| `
|
|
126
|
-
| `
|
|
127
|
-
| `
|
|
128
|
-
| `
|
|
129
|
-
| `
|
|
130
|
-
| `
|
|
131
|
-
| `
|
|
122
|
+
| `list_watchlists` | List every watchlist on the team, all four types (keyword, reddit, people, company) in one call. Call this before creating anything, so you extend or reuse what is already there instead of making a near-duplicate. |
|
|
123
|
+
| `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. |
|
|
124
|
+
| `list_keyword_watchlists` | List all keyword watchlists for your account. Each item includes `disabled` (true when the watchlist is paused and collecting nothing) and `disabledAt`. |
|
|
125
|
+
| `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. |
|
|
126
|
+
| `delete_keyword_watchlist` | Delete a keyword watchlist and all its tracked data. |
|
|
127
|
+
| `create_people_watchlist` | Create a watchlist that monitors posts from specific LinkedIn profiles. A watchlist holds at most 200 profiles, and your plan caps the total profiles and companies your team tracks across every watchlist it owns. |
|
|
128
|
+
| `list_people_watchlists` | List all people watchlists for your account. Each item includes `disabled` (true when the watchlist is paused and collecting nothing) and `disabledAt`. |
|
|
129
|
+
| `update_people_watchlist` | Update a people watchlist: change the name or Slack webhook, pause or resume it with `disable`, and add or remove tracked profiles with `add_profiles` and `remove_profiles`. This is how you grow a people watchlist, so never create a second list for the same audience. |
|
|
130
|
+
| `delete_people_watchlist` | Delete a people watchlist and all its tracked data. |
|
|
131
|
+
| `create_company_watchlist` | Create a watchlist that monitors posts from LinkedIn company pages. A watchlist holds at most 200 companies, and your plan caps the total profiles and companies your team tracks across every watchlist it owns. |
|
|
132
|
+
| `list_company_watchlists` | List all company watchlists for your account. Each item includes `disabled` (true when the watchlist is paused and collecting nothing) and `disabledAt`. |
|
|
133
|
+
| `update_company_watchlist` | Update a company watchlist: change the name or Slack webhook, pause or resume it with `disable`, and add or remove tracked companies with `add_companies` and `remove_companies`. This is how you grow a company watchlist, so never create a second list for the same audience. |
|
|
134
|
+
| `delete_company_watchlist` | Delete a company watchlist and all its tracked data. |
|
|
135
|
+
| `create_reddit_watchlist` | Create a watchlist that monitors Reddit 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. |
|
|
136
|
+
| `list_reddit_watchlists` | List all reddit watchlists for your account. Each item includes `disabled` (true when the watchlist is paused and collecting nothing) and `disabledAt`. |
|
|
137
|
+
| `update_reddit_watchlist` | Update a reddit watchlist. Patch any fields (name, fetchFreqInHours, disable, slack_webhook_url, keywords, labels), OR pass `prompt` to regenerate keywords and labels. |
|
|
138
|
+
| `delete_reddit_watchlist` | Delete a reddit watchlist and all its tracked data. |
|
|
132
139
|
|
|
133
140
|
### Posts & Engagement (operates on posts your watchlists captured)
|
|
134
141
|
|
|
135
142
|
| Tool | Description |
|
|
136
143
|
|------|-------------|
|
|
137
|
-
| `get_posts` | Search and filter posts
|
|
138
|
-
| `get_interactions` | Retrieve likes and comments for posts in a watchlist
|
|
139
|
-
| `like_watchlist_post` | Like a post
|
|
140
|
-
| `comment_on_watchlist_post` | Comment on a post
|
|
144
|
+
| `get_posts` | Search and filter posts your watchlists captured. Supports keyword search, date range, seniority, trending, language, and more. |
|
|
145
|
+
| `get_interactions` | Retrieve likes and comments for posts in a specific watchlist. Use to analyze engagement activity, build reports, or power dashboards. |
|
|
146
|
+
| `like_watchlist_post` | Like a LinkedIn post that came from one of your OutX watchlists. Takes an OutX `post_id` (from `get_posts` results). |
|
|
147
|
+
| `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). |
|
|
141
148
|
|
|
142
149
|
### LinkedIn Data API (direct LinkedIn actions, no watchlist required)
|
|
143
150
|
|
|
@@ -145,19 +152,28 @@ Async tools, the MCP server polls LinkedIn for ~150s and returns the result dire
|
|
|
145
152
|
|
|
146
153
|
| Tool | Description |
|
|
147
154
|
|------|-------------|
|
|
148
|
-
| `fetch_linkedin_profile` | Fetch
|
|
149
|
-
| `fetch_linkedin_profile_posts` | Fetch recent posts from one or more profiles by URN. |
|
|
150
|
-
| `
|
|
151
|
-
| `
|
|
152
|
-
| `
|
|
153
|
-
| `
|
|
154
|
-
| `send_linkedin_message` | Send a direct message to a 1st-degree connection
|
|
155
|
-
| `
|
|
156
|
-
| `
|
|
157
|
-
| `
|
|
155
|
+
| `fetch_linkedin_profile` | Fetch a LinkedIn profile by slug. Returns full profile data including name, headline, experience, education, and skills. |
|
|
156
|
+
| `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. |
|
|
157
|
+
| `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. |
|
|
158
|
+
| `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. |
|
|
159
|
+
| `fetch_linkedin_company` | Fetch a LinkedIn company page by slug. Returns company data including name, industry, employee count, description, headquarters, and logo. |
|
|
160
|
+
| `fetch_linkedin_company_posts` | Fetch recent posts from a LinkedIn company page by slug. Returns posts with engagement data (likes, comments, shares). |
|
|
161
|
+
| `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). |
|
|
162
|
+
| `send_linkedin_connection_request` | Send a LinkedIn connection request to a profile, with an optional note. Requires the person URN (get it from fetch_linkedin_profile or search_linkedin_profiles). |
|
|
163
|
+
| `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. |
|
|
164
|
+
| `fetch_linkedin_connections` | Fetch your 1st-degree LinkedIn connections. Optionally filter by keyword, sort by recently added, and paginate. |
|
|
165
|
+
| `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. |
|
|
166
|
+
|
|
167
|
+
### Account
|
|
168
|
+
|
|
169
|
+
| Tool | Description |
|
|
170
|
+
|------|-------------|
|
|
171
|
+
| `get_team` | Read your OutX team account: identity, effective plan (with expiry), and plan limits with current usage (watchlists and team members). Call this before creating watchlists to check remaining quota and avoid a 402. |
|
|
158
172
|
|
|
159
173
|
> **Note:** LinkedIn Data tools require the [OutX Chrome extension](https://outx.ai/docs/resources/chrome-extension) to be active within the last 48 hours.
|
|
160
174
|
|
|
175
|
+
<!-- END GENERATED TOOL TABLE -->
|
|
176
|
+
|
|
161
177
|
## Example Prompts
|
|
162
178
|
|
|
163
179
|
Once connected, try these with your AI agent:
|
|
@@ -186,19 +202,19 @@ Once connected, try these with your AI agent:
|
|
|
186
202
|
|
|
187
203
|
## Prerequisites
|
|
188
204
|
|
|
189
|
-
- **Node.js 18
|
|
190
|
-
- **OutX account
|
|
191
|
-
- **OutX Chrome extension
|
|
205
|
+
- **Node.js 18+**: Required for the MCP server runtime
|
|
206
|
+
- **OutX account**: [Sign up free](https://mentions.outx.ai/login) and get your API key
|
|
207
|
+
- **OutX Chrome extension**: Required for LinkedIn Data API tools (profile fetching, direct engagement). [Install here](https://outx.ai/docs/resources/chrome-extension)
|
|
192
208
|
|
|
193
209
|
## How It Works
|
|
194
210
|
|
|
195
211
|
The OutX API has two surfaces:
|
|
196
212
|
|
|
197
|
-
1. **Watchlists & Engagement API** (sync)
|
|
213
|
+
1. **Watchlists & Engagement API** (sync): Create watchlists to monitor LinkedIn by keywords, people, or companies. OutX scans on your schedule and stores posts. Query and engage via API.
|
|
198
214
|
|
|
199
|
-
2. **LinkedIn Data API** (async)
|
|
215
|
+
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.
|
|
200
216
|
|
|
201
|
-
The MCP server wraps both APIs into
|
|
217
|
+
The MCP server wraps both APIs into the tools listed above, callable by any MCP-compatible AI agent.
|
|
202
218
|
|
|
203
219
|
## Development
|
|
204
220
|
|
|
@@ -216,42 +232,48 @@ For development with auto-reload:
|
|
|
216
232
|
OUTX_API_KEY=your-key npm run dev
|
|
217
233
|
```
|
|
218
234
|
|
|
235
|
+
The "Available Tools" table above is generated from the registered tools, so it cannot drift from the code. After adding or renaming a tool, regenerate it. The script rewrites README.md in place, between the GENERATED TOOL TABLE markers:
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
npx tsx scripts/gen-tool-table.ts
|
|
239
|
+
```
|
|
240
|
+
|
|
219
241
|
## Documentation
|
|
220
242
|
|
|
221
|
-
- [MCP Integration Guide](https://outx.ai/docs/integrations/mcp)
|
|
222
|
-
- [API Reference](https://outx.ai/docs/api-reference/introduction)
|
|
223
|
-
- [API Quick Start](https://outx.ai/docs/api-reference/quickstart)
|
|
224
|
-
- [LinkedIn Data API Quick Start](https://outx.ai/docs/linkedin-api/quickstart)
|
|
225
|
-
- [Authentication Guide](https://outx.ai/docs/api-reference/authentication)
|
|
226
|
-
- [Rate Limits](https://outx.ai/docs/api-reference/rate-limits)
|
|
227
|
-
- [API Use Cases](https://outx.ai/docs/api-reference/use-cases)
|
|
228
|
-
- [Chrome Extension](https://outx.ai/docs/resources/chrome-extension)
|
|
229
|
-
- [LinkedIn Safety Guide](https://outx.ai/docs/resources/linkedin-safety)
|
|
243
|
+
- [MCP Integration Guide](https://outx.ai/docs/integrations/mcp): Detailed setup and configuration
|
|
244
|
+
- [API Reference](https://outx.ai/docs/api-reference/introduction): Full REST API documentation
|
|
245
|
+
- [API Quick Start](https://outx.ai/docs/api-reference/quickstart): Create watchlists and retrieve posts
|
|
246
|
+
- [LinkedIn Data API Quick Start](https://outx.ai/docs/linkedin-api/quickstart): Fetch profiles in 2 minutes
|
|
247
|
+
- [Authentication Guide](https://outx.ai/docs/api-reference/authentication): API keys and OTP auth
|
|
248
|
+
- [Rate Limits](https://outx.ai/docs/api-reference/rate-limits): Usage limits and best practices
|
|
249
|
+
- [API Use Cases](https://outx.ai/docs/api-reference/use-cases): Sales signals, competitor monitoring, hiring alerts
|
|
250
|
+
- [Chrome Extension](https://outx.ai/docs/resources/chrome-extension): Required for LinkedIn Data tools
|
|
251
|
+
- [LinkedIn Safety Guide](https://outx.ai/docs/resources/linkedin-safety): Rate limiting and account protection
|
|
230
252
|
|
|
231
253
|
## Integrations
|
|
232
254
|
|
|
233
|
-
- [Python SDK](https://outx.ai/docs/integrations/python-sdk)
|
|
234
|
-
- [LangChain Integration](https://outx.ai/docs/integrations/langchain)
|
|
235
|
-
- [n8n Integration](https://outx.ai/docs/integrations/n8n)
|
|
255
|
+
- [Python SDK](https://outx.ai/docs/integrations/python-sdk): Drop-in Python wrapper for the OutX API
|
|
256
|
+
- [LangChain Integration](https://outx.ai/docs/integrations/langchain): Use OutX as a LangChain tool for AI agents
|
|
257
|
+
- [n8n Integration](https://outx.ai/docs/integrations/n8n): No-code LinkedIn automation workflows
|
|
236
258
|
|
|
237
259
|
## Guides & Tutorials
|
|
238
260
|
|
|
239
|
-
- [How to Connect AI Agents to LinkedIn](https://www.outx.ai/blog/linkedin-api-for-ai-agents)
|
|
240
|
-
- [LinkedIn API Guide](https://www.outx.ai/blog/linkedin-api-guide)
|
|
241
|
-
- [LinkedIn API Alternatives 2026](https://www.outx.ai/blog/linkedin-api-alternatives-2026)
|
|
242
|
-
- [How to Build a Sales Signal Pipeline](https://www.outx.ai/blog/linkedin-sales-signal-pipeline)
|
|
243
|
-
- [LinkedIn Competitor Monitoring Guide](https://www.outx.ai/blog/linkedin-competitor-monitoring-guide)
|
|
244
|
-
- [Social Listening on LinkedIn](https://www.outx.ai/blog/guide-social-listening-linkedin)
|
|
245
|
-
- [How to Automate LinkedIn Likes & Comments](https://www.outx.ai/blog/automate-linkedin-likes-comments)
|
|
246
|
-
- [LinkedIn Automation Safety Guide](https://www.outx.ai/blog/linkedin-automation-safety-guide-best-practices-2026)
|
|
261
|
+
- [How to Connect AI Agents to LinkedIn](https://www.outx.ai/blog/linkedin-api-for-ai-agents): LangChain, Claude, GPT, and MCP examples
|
|
262
|
+
- [LinkedIn API Guide](https://www.outx.ai/blog/linkedin-api-guide): Comprehensive API overview
|
|
263
|
+
- [LinkedIn API Alternatives 2026](https://www.outx.ai/blog/linkedin-api-alternatives-2026): OutX vs Proxycurl vs PhantomBuster vs Unipile
|
|
264
|
+
- [How to Build a Sales Signal Pipeline](https://www.outx.ai/blog/linkedin-sales-signal-pipeline): Detect buying intent with the OutX API
|
|
265
|
+
- [LinkedIn Competitor Monitoring Guide](https://www.outx.ai/blog/linkedin-competitor-monitoring-guide): Track competitor activity via API
|
|
266
|
+
- [Social Listening on LinkedIn](https://www.outx.ai/blog/guide-social-listening-linkedin): Complete guide to LinkedIn monitoring
|
|
267
|
+
- [How to Automate LinkedIn Likes & Comments](https://www.outx.ai/blog/automate-linkedin-likes-comments): Engagement automation best practices
|
|
268
|
+
- [LinkedIn Automation Safety Guide](https://www.outx.ai/blog/linkedin-automation-safety-guide-best-practices-2026): Keep your account safe
|
|
247
269
|
|
|
248
270
|
## Links
|
|
249
271
|
|
|
250
|
-
- [OutX Platform](https://outx.ai)
|
|
251
|
-
- [Get API Key](https://mentions.outx.ai/api-doc)
|
|
252
|
-
- [OutX for AI Agents](https://outx.ai/docs/ai)
|
|
253
|
-
- [Pricing](https://outx.ai/docs/documentation/pricing-and-subscription)
|
|
254
|
-
- [FAQ](https://outx.ai/docs/resources/faq)
|
|
272
|
+
- [OutX Platform](https://outx.ai): Sign up and get started
|
|
273
|
+
- [Get API Key](https://mentions.outx.ai/api-doc): Generate your API key
|
|
274
|
+
- [OutX for AI Agents](https://outx.ai/docs/ai): All AI integration options (MCP, skill file, llms.txt)
|
|
275
|
+
- [Pricing](https://outx.ai/docs/documentation/pricing-and-subscription): Free, Pro, and Enterprise plans
|
|
276
|
+
- [FAQ](https://outx.ai/docs/resources/faq): Common questions answered
|
|
255
277
|
|
|
256
278
|
## Partnerships
|
|
257
279
|
|
package/WORKLOG.md
ADDED
package/dist/client.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* OutX API client
|
|
2
|
+
* OutX API client: shared HTTP wrapper with auth, error handling, and async task polling.
|
|
3
3
|
*/
|
|
4
4
|
export declare class OutxClient {
|
|
5
5
|
private baseUrl;
|
|
@@ -14,6 +14,9 @@ export declare class OutxClient {
|
|
|
14
14
|
/**
|
|
15
15
|
* Poll an async LinkedIn Data API task until it completes or fails.
|
|
16
16
|
* Returns the task_output on success.
|
|
17
|
+
*
|
|
18
|
+
* Statuses are pending, completed and failed. A failed task carries the
|
|
19
|
+
* reason in `error` and says in `retryable` whether reissuing it is safe.
|
|
17
20
|
*/
|
|
18
21
|
pollTask(taskId: string, maxAttempts?: number, delayMs?: number): Promise<unknown>;
|
|
19
22
|
}
|
package/dist/client.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* OutX API client
|
|
2
|
+
* OutX API client: shared HTTP wrapper with auth, error handling, and async task polling.
|
|
3
3
|
*/
|
|
4
4
|
export class OutxClient {
|
|
5
5
|
baseUrl = "https://api.outx.ai";
|
|
@@ -15,20 +15,29 @@ export class OutxClient {
|
|
|
15
15
|
}
|
|
16
16
|
async handleResponse(res) {
|
|
17
17
|
if (!res.ok) {
|
|
18
|
-
|
|
18
|
+
// Read the body once. A proxy or gateway failure answers with HTML or
|
|
19
|
+
// nothing at all, and calling .json() and then .text() on the same
|
|
20
|
+
// response throws "body already used", which swallowed the real reason
|
|
21
|
+
// and left the agent with a bare status.
|
|
22
|
+
const trimmed = (await res.text().catch(() => "")).trim();
|
|
23
|
+
let parsed = null;
|
|
19
24
|
try {
|
|
20
|
-
|
|
21
|
-
if (body.error)
|
|
22
|
-
message = body.error;
|
|
23
|
-
else if (body.message)
|
|
24
|
-
message = body.message;
|
|
25
|
-
else
|
|
26
|
-
message = JSON.stringify(body);
|
|
25
|
+
parsed = JSON.parse(trimmed);
|
|
27
26
|
}
|
|
28
27
|
catch {
|
|
29
|
-
|
|
28
|
+
parsed = null;
|
|
30
29
|
}
|
|
31
|
-
|
|
30
|
+
// The API's own errors are {"error": "..."}. Pass that string through
|
|
31
|
+
// untouched: it names the allowed values for a rejected parameter.
|
|
32
|
+
const apiMessage = parsed && typeof parsed.error === "string" && parsed.error
|
|
33
|
+
? parsed.error
|
|
34
|
+
: parsed && typeof parsed.message === "string" && parsed.message
|
|
35
|
+
? parsed.message
|
|
36
|
+
: "";
|
|
37
|
+
// Anything else (an HTML gateway page, an empty body) keeps its status
|
|
38
|
+
// and its raw text rather than being reported as a bare HTTP number.
|
|
39
|
+
throw new Error(apiMessage ||
|
|
40
|
+
(trimmed ? `HTTP ${res.status}: ${trimmed}` : `HTTP ${res.status}`));
|
|
32
41
|
}
|
|
33
42
|
return res.json();
|
|
34
43
|
}
|
|
@@ -70,17 +79,34 @@ export class OutxClient {
|
|
|
70
79
|
/**
|
|
71
80
|
* Poll an async LinkedIn Data API task until it completes or fails.
|
|
72
81
|
* Returns the task_output on success.
|
|
82
|
+
*
|
|
83
|
+
* Statuses are pending, completed and failed. A failed task carries the
|
|
84
|
+
* reason in `error` and says in `retryable` whether reissuing it is safe.
|
|
73
85
|
*/
|
|
74
86
|
async pollTask(taskId, maxAttempts = 30, delayMs = 5000) {
|
|
75
87
|
for (let i = 0; i < maxAttempts; i++) {
|
|
76
88
|
const result = (await this.get("/linkedin-agent/get-task-status", {
|
|
77
89
|
api_agent_task_id: taskId,
|
|
78
90
|
}));
|
|
79
|
-
const { status, task_output } = result.data;
|
|
91
|
+
const { status, error, retryable, task_output } = result.data;
|
|
80
92
|
if (status === "completed")
|
|
81
93
|
return task_output;
|
|
82
94
|
if (status === "failed") {
|
|
83
|
-
|
|
95
|
+
// `error` is where the reason lives. task_output is the fallback for a
|
|
96
|
+
// task that failed before the column existed.
|
|
97
|
+
const reason = error ||
|
|
98
|
+
(task_output
|
|
99
|
+
? JSON.stringify(task_output)
|
|
100
|
+
: "no reason reported by the extension");
|
|
101
|
+
// An older API build does not send `retryable` at all, which is not the
|
|
102
|
+
// same as saying no. Say nothing rather than warn about an action the
|
|
103
|
+
// task may not perform.
|
|
104
|
+
const advice = retryable === undefined
|
|
105
|
+
? ""
|
|
106
|
+
: retryable
|
|
107
|
+
? " Retryable: yes, this task only reads from LinkedIn, so calling the tool again is safe."
|
|
108
|
+
: " Retryable: no, this task acts on LinkedIn and may have run before it stopped reporting. Check LinkedIn first.";
|
|
109
|
+
throw new Error(`Task ${taskId} failed: ${reason}${advice}`);
|
|
84
110
|
}
|
|
85
111
|
await new Promise((r) => setTimeout(r, delayMs));
|
|
86
112
|
}
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,OAAO,UAAU;IACb,OAAO,GAAG,qBAAqB,CAAC;IAChC,MAAM,CAAS;IAEvB,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAEO,OAAO;QACb,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,MAAM;YACxB,cAAc,EAAE,kBAAkB;SACnC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,GAAa;QACxC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,OAAO,UAAU;IACb,OAAO,GAAG,qBAAqB,CAAC;IAChC,MAAM,CAAS;IAEvB,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAEO,OAAO;QACb,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,MAAM;YACxB,cAAc,EAAE,kBAAkB;SACnC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,GAAa;QACxC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,sEAAsE;YACtE,mEAAmE;YACnE,uEAAuE;YACvE,yCAAyC;YACzC,MAAM,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAE1D,IAAI,MAAM,GAAkD,IAAI,CAAC;YACjE,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,GAAG,IAAI,CAAC;YAChB,CAAC;YAED,sEAAsE;YACtE,mEAAmE;YACnE,MAAM,UAAU,GACd,MAAM,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK;gBACxD,CAAC,CAAC,MAAM,CAAC,KAAK;gBACd,CAAC,CAAC,MAAM,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO;oBAC9D,CAAC,CAAC,MAAM,CAAC,OAAO;oBAChB,CAAC,CAAC,EAAE,CAAC;YAEX,uEAAuE;YACvE,qEAAqE;YACrE,MAAM,IAAI,KAAK,CACb,UAAU;gBACR,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CACtE,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,MAA+B;QACrD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC,CAAC;QAC9C,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE;oBAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,IAAa;QACpC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;YAChD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;YACvB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,IAAa;QACnC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;YAChD,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;YACvB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,IAAa;QACtC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;YAChD,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;YACvB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC3B,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,QAAQ,CACZ,MAAc,EACd,WAAW,GAAG,EAAE,EAChB,OAAO,GAAG,IAAI;QAEd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,iCAAiC,EAAE;gBAChE,iBAAiB,EAAE,MAAM;aAC1B,CAAC,CAOD,CAAC;YAEF,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;YAE9D,IAAI,MAAM,KAAK,WAAW;gBAAE,OAAO,WAAW,CAAC;YAC/C,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACxB,uEAAuE;gBACvE,8CAA8C;gBAC9C,MAAM,MAAM,GACV,KAAK;oBACL,CAAC,WAAW;wBACV,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;wBAC7B,CAAC,CAAC,qCAAqC,CAAC,CAAC;gBAC7C,wEAAwE;gBACxE,sEAAsE;gBACtE,wBAAwB;gBACxB,MAAM,MAAM,GACV,SAAS,KAAK,SAAS;oBACrB,CAAC,CAAC,EAAE;oBACJ,CAAC,CAAC,SAAS;wBACT,CAAC,CAAC,yFAAyF;wBAC3F,CAAC,CAAC,gHAAgH,CAAC;gBACzH,MAAM,IAAI,KAAK,CAAC,QAAQ,MAAM,YAAY,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;YAC/D,CAAC;YAED,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,IAAI,KAAK,CACb,QAAQ,MAAM,4BAA4B,CAAC,WAAW,GAAG,OAAO,CAAC,GAAG,IAAI,KAAK;YAC3E,wCAAwC,CAC3C,CAAC;IACJ,CAAC;CACF"}
|
package/dist/index.js
CHANGED
package/dist/tools/linkedin.js
CHANGED
|
@@ -160,13 +160,38 @@ export function registerLinkedInTools(server, client) {
|
|
|
160
160
|
const result = await client.pollTask(response.api_agent_task_id);
|
|
161
161
|
return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
|
|
162
162
|
});
|
|
163
|
-
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
|
|
163
|
+
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 is pending, completed or failed. A failed task puts the reason in `error` and says in `retryable` whether reissuing it is safe: false for the four tools that act on LinkedIn (like, comment, message, connection request), because the action may already have gone through. A task still pending after 24 hours is failed automatically.", {
|
|
164
164
|
task_id: z.string().describe("The `api_agent_task_id` from the timeout error message of another LinkedIn Data tool."),
|
|
165
165
|
}, async (params) => {
|
|
166
|
-
const result = await client.get("/linkedin-agent/get-task-status", {
|
|
166
|
+
const result = (await client.get("/linkedin-agent/get-task-status", {
|
|
167
167
|
api_agent_task_id: params.task_id,
|
|
168
|
-
});
|
|
169
|
-
|
|
168
|
+
}));
|
|
169
|
+
// Lead with the verdict. The reason for a failure lives in `error`, not
|
|
170
|
+
// in task_output, which is empty on most failures.
|
|
171
|
+
const task = result?.data;
|
|
172
|
+
let summary = "";
|
|
173
|
+
if (task?.status === "failed") {
|
|
174
|
+
// An older API build does not send `retryable` at all, which is not the
|
|
175
|
+
// same as saying no. Leave the line out rather than guess.
|
|
176
|
+
const advice = task.retryable === undefined
|
|
177
|
+
? ""
|
|
178
|
+
: task.retryable
|
|
179
|
+
? " Retryable: yes, this task only reads from LinkedIn, so calling the tool again is safe."
|
|
180
|
+
: " Retryable: no, this task acts on LinkedIn and may have run before it stopped reporting. Check LinkedIn first.";
|
|
181
|
+
summary =
|
|
182
|
+
`Task failed: ${task.error || "no reason reported by the extension"}${advice}\n\n`;
|
|
183
|
+
}
|
|
184
|
+
else if (task?.status) {
|
|
185
|
+
summary = `Task status: ${task.status}.\n\n`;
|
|
186
|
+
}
|
|
187
|
+
return {
|
|
188
|
+
content: [
|
|
189
|
+
{
|
|
190
|
+
type: "text",
|
|
191
|
+
text: summary + JSON.stringify(result, null, 2),
|
|
192
|
+
},
|
|
193
|
+
],
|
|
194
|
+
};
|
|
170
195
|
});
|
|
171
196
|
}
|
|
172
197
|
//# sourceMappingURL=linkedin.js.map
|
|
@@ -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/posts.js
CHANGED
|
@@ -1,12 +1,36 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* One line saying which intent labels the watchlist opens on and which ones
|
|
4
|
+
* actually filtered this response, so the agent can tell "no posts" apart from
|
|
5
|
+
* "no posts under this filter" without reading the whole envelope.
|
|
6
|
+
*/
|
|
7
|
+
function labelSummary(result) {
|
|
8
|
+
const envelope = result;
|
|
9
|
+
const defaults = Array.isArray(envelope?.default_labels)
|
|
10
|
+
? envelope.default_labels
|
|
11
|
+
: null;
|
|
12
|
+
const applied = Array.isArray(envelope?.applied_labels)
|
|
13
|
+
? envelope.applied_labels
|
|
14
|
+
: null;
|
|
15
|
+
// People and company watchlists carry no labels, so the fields can be absent.
|
|
16
|
+
if (defaults === null && applied === null)
|
|
17
|
+
return "";
|
|
18
|
+
const defaultsText = defaults && defaults.length > 0
|
|
19
|
+
? defaults.join(", ")
|
|
20
|
+
: "none (this watchlist has no default labels)";
|
|
21
|
+
const appliedText = applied && applied.length > 0
|
|
22
|
+
? applied.join(", ")
|
|
23
|
+
: "none (no label filter, every post in range returned)";
|
|
24
|
+
return `Default labels: ${defaultsText}. Applied labels: ${appliedText}.\n\n`;
|
|
25
|
+
}
|
|
2
26
|
export function registerPostTools(server, client) {
|
|
3
|
-
server.tool("get_posts", "Search and filter
|
|
27
|
+
server.tool("get_posts", "Search and filter posts your watchlists captured. Supports keyword search, date range, seniority, trending, language, and more. Returns 20 posts per page. The response reports `default_labels` (the intent labels this watchlist opens on) and `applied_labels` (the labels that actually filtered this response).", {
|
|
4
28
|
watchlist_id: z.string().optional().describe("Filter by watchlist ID (omit for all)"),
|
|
5
29
|
search_term: z.string().optional().describe("Search within post content"),
|
|
6
30
|
sort_by: z
|
|
7
31
|
.enum(["recent", "popular_first", "engagement", "relevance_first"])
|
|
8
32
|
.optional()
|
|
9
|
-
.describe("Sort order (default: recent)"),
|
|
33
|
+
.describe("Sort order (default: recent). A LinkedIn watchlist (keyword, people, company) accepts recent, popular_first and engagement. A Reddit watchlist accepts those plus relevance_first. Sending relevance_first to a LinkedIn watchlist is a 400."),
|
|
10
34
|
page: z.string().optional().describe("Page number (default: 1)"),
|
|
11
35
|
start_date: z.string().optional().describe("Filter posts after this date (ISO 8601)"),
|
|
12
36
|
end_date: z.string().optional().describe("Filter posts before this date (ISO 8601)"),
|
|
@@ -14,7 +38,10 @@ export function registerPostTools(server, client) {
|
|
|
14
38
|
trending: z.string().optional().describe("Set to 'true' to show only trending posts"),
|
|
15
39
|
lang: z.string().optional().describe("Filter by language code (e.g. 'en', 'es')"),
|
|
16
40
|
post_type: z.string().optional().describe("Filter by post type"),
|
|
17
|
-
labels: z
|
|
41
|
+
labels: z
|
|
42
|
+
.string()
|
|
43
|
+
.optional()
|
|
44
|
+
.describe("Filter by intent label. Pass `default` to read the watchlist's default intent labels: this is the recommended first read, and it is the view the product app opens on. Omit the parameter to get every post. Takes a comma-separated list and mixes the two, e.g. 'default,hiring'. A watchlist with no default labels applies no filter."),
|
|
18
45
|
people_slug: z.string().optional().describe("Filter by author's LinkedIn slug"),
|
|
19
46
|
company_slug: z.string().optional().describe("Filter by company's LinkedIn slug"),
|
|
20
47
|
interacted: z.string().optional().describe("Set to 'true' to show only posts you've interacted with"),
|
|
@@ -25,8 +52,19 @@ export function registerPostTools(server, client) {
|
|
|
25
52
|
if (v !== undefined)
|
|
26
53
|
queryParams[k] = v;
|
|
27
54
|
}
|
|
55
|
+
// A rejected filter (relevance_first on a LinkedIn watchlist, an unknown
|
|
56
|
+
// param) throws with the API's own message, which the MCP SDK hands the
|
|
57
|
+
// agent verbatim. Do not catch it: that message names the values this
|
|
58
|
+
// watchlist type allows.
|
|
28
59
|
const result = await client.get("/api-posts", queryParams);
|
|
29
|
-
return {
|
|
60
|
+
return {
|
|
61
|
+
content: [
|
|
62
|
+
{
|
|
63
|
+
type: "text",
|
|
64
|
+
text: labelSummary(result) + JSON.stringify(result, null, 2),
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
};
|
|
30
68
|
});
|
|
31
69
|
}
|
|
32
70
|
//# sourceMappingURL=posts.js.map
|
package/dist/tools/posts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"posts.js","sourceRoot":"","sources":["../../src/tools/posts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,UAAU,iBAAiB,CAC/B,MAAiB,EACjB,MAAkB;IAElB,MAAM,CAAC,IAAI,CACT,WAAW,EACX,
|
|
1
|
+
{"version":3,"file":"posts.js","sourceRoot":"","sources":["../../src/tools/posts.ts"],"names":[],"mappings":"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"}
|