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 CHANGED
@@ -3,7 +3,7 @@
3
3
  [![npm version](https://img.shields.io/npm/v/outx-mcp-server.svg)](https://www.npmjs.com/package/outx-mcp-server)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](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 create watchlists, search posts, fetch profiles, and engage, all through natural language.
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** 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
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
- ## Available Tools (26)
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
- | `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. |
121
- | `list_keyword_watchlists` | List all keyword watchlists on your account. |
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. |
123
- | `delete_keyword_watchlist` | Delete a keyword watchlist and all tracked data. |
124
- | `create_people_watchlist` | Create a watchlist that tracks posts from specific LinkedIn profiles by URL or slug. |
125
- | `list_people_watchlists` | List all people watchlists on your account. |
126
- | `update_people_watchlist` | Patch a people watchlist: `name`, `fetchFreqInHours`, `disable` (pause/resume), or `slack_webhook_url`. |
127
- | `delete_people_watchlist` | Delete a people watchlist. |
128
- | `create_company_watchlist` | Create a watchlist that tracks posts from LinkedIn company pages by URL or slug. |
129
- | `list_company_watchlists` | List all company watchlists on your account. |
130
- | `update_company_watchlist` | Patch a company watchlist: `name`, `fetchFreqInHours`, `disable` (pause/resume), or `slack_webhook_url`. |
131
- | `delete_company_watchlist` | Delete a company watchlist. |
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 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`. |
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 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. |
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+** Required for the MCP server runtime
190
- - **OutX account** [Sign up free](https://mentions.outx.ai/login) and get your API key
191
- - **OutX Chrome extension** Required for LinkedIn Data API tools (profile fetching, direct engagement). [Install here](https://outx.ai/docs/resources/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) Create watchlists to monitor LinkedIn by keywords, people, or companies. OutX scans on your schedule and stores posts. Query and engage via API.
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) 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.
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 28 tools that any MCP-compatible AI agent can call.
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) Detailed setup and configuration
222
- - [API Reference](https://outx.ai/docs/api-reference/introduction) Full REST API documentation
223
- - [API Quick Start](https://outx.ai/docs/api-reference/quickstart) Create watchlists and retrieve posts
224
- - [LinkedIn Data API Quick Start](https://outx.ai/docs/linkedin-api/quickstart) Fetch profiles in 2 minutes
225
- - [Authentication Guide](https://outx.ai/docs/api-reference/authentication) API keys and OTP auth
226
- - [Rate Limits](https://outx.ai/docs/api-reference/rate-limits) Usage limits and best practices
227
- - [API Use Cases](https://outx.ai/docs/api-reference/use-cases) Sales signals, competitor monitoring, hiring alerts
228
- - [Chrome Extension](https://outx.ai/docs/resources/chrome-extension) Required for LinkedIn Data tools
229
- - [LinkedIn Safety Guide](https://outx.ai/docs/resources/linkedin-safety) Rate limiting and account protection
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) Drop-in Python wrapper for the OutX API
234
- - [LangChain Integration](https://outx.ai/docs/integrations/langchain) Use OutX as a LangChain tool for AI agents
235
- - [n8n Integration](https://outx.ai/docs/integrations/n8n) No-code LinkedIn automation workflows
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) LangChain, Claude, GPT, and MCP examples
240
- - [LinkedIn API Guide](https://www.outx.ai/blog/linkedin-api-guide) Comprehensive API overview
241
- - [LinkedIn API Alternatives 2026](https://www.outx.ai/blog/linkedin-api-alternatives-2026) OutX vs Proxycurl vs PhantomBuster vs Unipile
242
- - [How to Build a Sales Signal Pipeline](https://www.outx.ai/blog/linkedin-sales-signal-pipeline) Detect buying intent with the OutX API
243
- - [LinkedIn Competitor Monitoring Guide](https://www.outx.ai/blog/linkedin-competitor-monitoring-guide) Track competitor activity via API
244
- - [Social Listening on LinkedIn](https://www.outx.ai/blog/guide-social-listening-linkedin) Complete guide to LinkedIn monitoring
245
- - [How to Automate LinkedIn Likes & Comments](https://www.outx.ai/blog/automate-linkedin-likes-comments) Engagement automation best practices
246
- - [LinkedIn Automation Safety Guide](https://www.outx.ai/blog/linkedin-automation-safety-guide-best-practices-2026) Keep your account safe
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) Sign up and get started
251
- - [Get API Key](https://mentions.outx.ai/api-doc) Generate your API key
252
- - [OutX for AI Agents](https://outx.ai/docs/ai) All AI integration options (MCP, skill file, llms.txt)
253
- - [Pricing](https://outx.ai/docs/documentation/pricing-and-subscription) Free, Pro, and Enterprise plans
254
- - [FAQ](https://outx.ai/docs/resources/faq) Common questions answered
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
@@ -0,0 +1,7 @@
1
+ # Work log
2
+
3
+ What the OutX MCP server worked on, newest first, one line per item.
4
+
5
+ ## 2026-08-27
6
+
7
+ MCP: labels=default, list_watchlists, add/remove members, failed task reasons, generated objective flag, README table generated from source (PR #7)
package/dist/client.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * OutX API client shared HTTP wrapper with auth, error handling, and async task polling.
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 shared HTTP wrapper with auth, error handling, and async task polling.
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
- let message = `HTTP ${res.status}`;
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
- const body = await res.json();
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
- message = await res.text().catch(() => message);
28
+ parsed = null;
30
29
  }
31
- throw new Error(message);
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
- throw new Error(`Task failed: ${task_output ? JSON.stringify(task_output) : "unknown error"}`);
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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -16,7 +16,7 @@ if (!apiKey) {
16
16
  const client = new OutxClient(apiKey);
17
17
  const server = new McpServer({
18
18
  name: "outx",
19
- version: "1.7.0",
19
+ version: "1.8.0",
20
20
  });
21
21
  registerWatchlistTools(server, client);
22
22
  registerPostTools(server, client);
@@ -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 values: pending, processing, completed, failed.", {
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
- return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
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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"}
@@ -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 LinkedIn posts from your watchlists. Supports keyword search, date range, seniority, trending, language, and more. Returns 20 posts per page.", {
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.string().optional().describe("Filter by label"),
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 { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
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
@@ -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,iKAAiK,EACjK;QACE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;QACrF,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QACzE,OAAO,EAAE,CAAC;aACP,IAAI,CAAC,CAAC,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,iBAAiB,CAAC,CAAC;aAClE,QAAQ,EAAE;aACV,QAAQ,CAAC,8BAA8B,CAAC;QAC3C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;QAChE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;QACrF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;QACpF,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oDAAoD,CAAC;QACrG,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;QACrF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;QACjF,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QAChE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QACzD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;QAC/E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QACjF,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yDAAyD,CAAC;QACrG,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0CAA0C,CAAC;KAC/F,EACD,KAAK,EAAE,MAAM,EAAE,EAAE;QACf,MAAM,WAAW,GAA2B,EAAE,CAAC;QAC/C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,KAAK,SAAS;gBAAE,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QAC3D,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;AACJ,CAAC"}
1
+ {"version":3,"file":"posts.js","sourceRoot":"","sources":["../../src/tools/posts.ts"],"names":[],"mappings":"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"}