lhremote 0.8.0 → 0.9.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 +346 -5
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -20,10 +20,28 @@ lhremote lets AI assistants (Claude, etc.) control LinkedHelper through the [Mod
|
|
|
20
20
|
- **Campaign automation** — create, configure, start, stop, and monitor campaigns with full action-chain management
|
|
21
21
|
- **People import** — import LinkedIn profile URLs into campaign target lists
|
|
22
22
|
- **Profile queries** — look up and search cached LinkedIn profiles from the local database
|
|
23
|
-
- **Messaging** — query messaging history
|
|
23
|
+
- **Messaging** — send direct messages, InMails, and connection requests; query messaging history and check for replies
|
|
24
|
+
- **LinkedIn engagement** — visit profiles, endorse skills, follow/unfollow, like posts, comment, and react
|
|
25
|
+
- **Feed & post intelligence** — read the LinkedIn feed, search posts, get post details, engagement stats, and engager lists
|
|
26
|
+
- **Profile enrichment** — extract emails, phones, socials, and company data from LinkedIn profiles
|
|
27
|
+
- **LinkedIn search** — build search URLs, resolve entity IDs, and query reference data for search filters
|
|
28
|
+
- **Budget & throttle monitoring** — check daily action limits and LinkedIn throttling status
|
|
24
29
|
- **Action discovery** — list available LinkedHelper action types with configuration schemas
|
|
25
30
|
|
|
26
|
-
|
|
31
|
+
## Quick Start
|
|
32
|
+
|
|
33
|
+
```sh
|
|
34
|
+
npm install -g lhremote # or: npx lhremote --help
|
|
35
|
+
lhremote launch-app # start LinkedHelper with remote debugging
|
|
36
|
+
lhremote list-accounts # find your LinkedIn account ID
|
|
37
|
+
lhremote start-instance # start an instance (auto-selects single account)
|
|
38
|
+
lhremote campaign-create --file my-campaign.yaml # create a campaign
|
|
39
|
+
lhremote import-people-from-urls <campaignId> --urls "https://www.linkedin.com/in/..."
|
|
40
|
+
lhremote campaign-start <campaignId> --person-ids <id1,id2,...>
|
|
41
|
+
lhremote campaign-status <campaignId> # monitor progress
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
> **Pacing**: LinkedIn monitors automated activity. See the [Rate Limiting guide](docs/rate-limiting.md) for recommended settings.
|
|
27
45
|
|
|
28
46
|
## Prerequisites
|
|
29
47
|
|
|
@@ -57,7 +75,7 @@ Add to your Claude Desktop configuration (`claude_desktop_config.json`):
|
|
|
57
75
|
}
|
|
58
76
|
```
|
|
59
77
|
|
|
60
|
-
Once configured, Claude can use all
|
|
78
|
+
Once configured, Claude can use all 68 tools directly. A typical workflow:
|
|
61
79
|
|
|
62
80
|
1. **`find-app`** — Detect a running LinkedHelper instance (or **`launch-app`** to start one)
|
|
63
81
|
2. **`list-accounts`** — See available LinkedIn accounts
|
|
@@ -77,8 +95,8 @@ The `lhremote` command provides the same functionality as the MCP server. Every
|
|
|
77
95
|
|
|
78
96
|
```sh
|
|
79
97
|
lhremote find-app [--json]
|
|
80
|
-
lhremote launch-app
|
|
81
|
-
lhremote quit-app
|
|
98
|
+
lhremote launch-app
|
|
99
|
+
lhremote quit-app
|
|
82
100
|
```
|
|
83
101
|
|
|
84
102
|
### Account & Instance
|
|
@@ -99,6 +117,7 @@ lhremote campaign-get <campaignId> [--cdp-port <port>] [--json]
|
|
|
99
117
|
lhremote campaign-export <campaignId> [--format yaml|json] [--output <path>] [--cdp-port <port>]
|
|
100
118
|
lhremote campaign-update <campaignId> [--name <name>] [--description <text>] [--clear-description] [--cdp-port <port>] [--json]
|
|
101
119
|
lhremote campaign-delete <campaignId> [--cdp-port <port>] [--json]
|
|
120
|
+
lhremote campaign-erase <campaignId> [--cdp-port <port>] [--json]
|
|
102
121
|
lhremote campaign-start <campaignId> --person-ids <ids> | --person-ids-file <path> [--cdp-port <port>] [--json]
|
|
103
122
|
lhremote campaign-stop <campaignId> [--cdp-port <port>] [--json]
|
|
104
123
|
lhremote campaign-status <campaignId> [--include-results] [--limit <n>] [--cdp-port <port>] [--json]
|
|
@@ -150,11 +169,48 @@ lhremote check-replies [--since <timestamp>] [--cdp-port <port>] [--json]
|
|
|
150
169
|
lhremote scrape-messaging-history --person-ids <ids> | --person-ids-file <path> [--cdp-port <port>] [--json]
|
|
151
170
|
```
|
|
152
171
|
|
|
172
|
+
### LinkedIn Actions
|
|
173
|
+
|
|
174
|
+
```sh
|
|
175
|
+
lhremote visit-profile --person-id <id> | --url <url> [--extract-current-organizations] [--cdp-port <port>] [--json]
|
|
176
|
+
lhremote endorse-skills --person-id <id> | --url <url> [--skill-name <name>]... [--limit <n>] [--skip-if-not-endorsable] [--keep-campaign] [--cdp-port <port>] [--json]
|
|
177
|
+
lhremote enrich-profile --person-id <id> | --url <url> [--enrich-profile-info] [--enrich-phones] [--enrich-emails] [--enrich-socials] [--enrich-companies] [--keep-campaign] [--cdp-port <port>] [--json]
|
|
178
|
+
lhremote follow-person --person-id <id> | --url <url> [--mode <follow|unfollow>] [--skip-if-unfollowable] [--keep-campaign] [--cdp-port <port>] [--json]
|
|
179
|
+
lhremote like-person-posts --person-id <id> | --url <url> [--number-of-articles <n>] [--number-of-posts <n>] [--max-age-of-articles <days>] [--max-age-of-posts <days>] [--should-add-comment] [--message-template <json>] [--skip-if-not-liked] [--keep-campaign] [--cdp-port <port>] [--json]
|
|
180
|
+
lhremote message-person --person-id <id> | --url <url> --message-template <json> [--subject-template <json>] [--reject-if-replied] [--reject-if-messaged] [--keep-campaign] [--cdp-port <port>] [--json]
|
|
181
|
+
lhremote send-invite --person-id <id> | --url <url> [--message-template <json>] [--save-as-lead-sn] [--keep-campaign] [--cdp-port <port>] [--json]
|
|
182
|
+
lhremote send-inmail --person-id <id> | --url <url> --message-template <json> [--subject-template <json>] [--reject-if-replied] [--proceed-on-out-of-credits] [--keep-campaign] [--cdp-port <port>] [--json]
|
|
183
|
+
lhremote remove-connection --person-id <id> | --url <url> [--keep-campaign] [--cdp-port <port>] [--json]
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### Feed & Posts
|
|
187
|
+
|
|
188
|
+
```sh
|
|
189
|
+
lhremote get-feed [--count <n>] [--cursor <token>] [--cdp-port <port>] [--json]
|
|
190
|
+
lhremote get-post <postUrl> [--comment-count <n>] [--cdp-port <port>] [--json]
|
|
191
|
+
lhremote get-post-stats <postUrl> [--cdp-port <port>] [--json]
|
|
192
|
+
lhremote get-profile-activity <profile> [--count <n>] [--cursor <token>] [--cdp-port <port>] [--json]
|
|
193
|
+
lhremote search-posts <query> [--count <n>] [--cursor <n>] [--cdp-port <port>] [--json]
|
|
194
|
+
lhremote comment-on-post --url <url> --text <text> [--cdp-port <port>] [--json]
|
|
195
|
+
lhremote react-to-post <postUrl> [--type <like|celebrate|support|love|insightful|funny>] [--cdp-port <port>] [--json]
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### LinkedIn Search & Reference
|
|
199
|
+
|
|
200
|
+
```sh
|
|
201
|
+
lhremote build-url <sourceType> [--keywords <keywords>] [--current-company <id>]... [--past-company <id>]... [--geo <id>]... [--industry <id>]... [--school <id>]... [--network <code>]... [--profile-language <code>]... [--service-category <id>]... [--filter <spec>]... [--slug <slug>] [--id <id>] [--json]
|
|
202
|
+
lhremote resolve-entity <entityType> <query> [--limit <n>] [--cdp-port <port>] [--json]
|
|
203
|
+
lhremote list-reference-data <dataType> [--json]
|
|
204
|
+
```
|
|
205
|
+
|
|
153
206
|
### Utilities
|
|
154
207
|
|
|
155
208
|
```sh
|
|
156
209
|
lhremote describe-actions [--category <category>] [--type <type>] [--json]
|
|
157
210
|
lhremote get-errors [--cdp-port <port>] [--json]
|
|
211
|
+
lhremote dismiss-errors [--cdp-port <port>] [--json]
|
|
212
|
+
lhremote get-action-budget [--cdp-port <port>] [--json]
|
|
213
|
+
lhremote get-throttle-status [--cdp-port <port>] [--json]
|
|
158
214
|
```
|
|
159
215
|
|
|
160
216
|
## MCP Tools
|
|
@@ -292,6 +348,15 @@ Delete (archive) a campaign.
|
|
|
292
348
|
| `campaignId` | number | Yes | — | Campaign ID |
|
|
293
349
|
| `cdpPort` | number | No | 9222 | CDP port |
|
|
294
350
|
|
|
351
|
+
#### `campaign-erase`
|
|
352
|
+
|
|
353
|
+
Permanently erase a campaign and all related data from the database. This is irreversible — unlike `campaign-delete` (which archives), this removes all campaign data permanently.
|
|
354
|
+
|
|
355
|
+
| Parameter | Type | Required | Default | Description |
|
|
356
|
+
|-----------|------|----------|---------|-------------|
|
|
357
|
+
| `campaignId` | number | Yes | — | Campaign ID |
|
|
358
|
+
| `cdpPort` | number | No | 9222 | CDP port |
|
|
359
|
+
|
|
295
360
|
#### `campaign-start`
|
|
296
361
|
|
|
297
362
|
Start a campaign with specified target persons. Returns immediately (async execution).
|
|
@@ -609,6 +674,258 @@ Scrape messaging history from LinkedIn for specified people into the local datab
|
|
|
609
674
|
| `personIds` | number[] | Yes | — | Person IDs whose messaging history should be scraped |
|
|
610
675
|
| `cdpPort` | number | No | 9222 | CDP port |
|
|
611
676
|
|
|
677
|
+
### LinkedIn Actions
|
|
678
|
+
|
|
679
|
+
#### `visit-profile`
|
|
680
|
+
|
|
681
|
+
Visit a LinkedIn profile via LinkedHelper's VisitAndExtract action and return the extracted profile data. Deducts from the daily action budget.
|
|
682
|
+
|
|
683
|
+
| Parameter | Type | Required | Default | Description |
|
|
684
|
+
|-----------|------|----------|---------|-------------|
|
|
685
|
+
| `personId` | number | No | — | Internal person ID (provide this or `url`) |
|
|
686
|
+
| `url` | string | No | — | LinkedIn profile URL (provide this or `personId`) |
|
|
687
|
+
| `extractCurrentOrganizations` | boolean | No | false | Extract current company info during visit |
|
|
688
|
+
| `cdpPort` | number | No | 9222 | CDP port |
|
|
689
|
+
|
|
690
|
+
#### `endorse-skills`
|
|
691
|
+
|
|
692
|
+
Endorse skills on a LinkedIn profile via an ephemeral campaign. Deducts from the daily action budget.
|
|
693
|
+
|
|
694
|
+
| Parameter | Type | Required | Default | Description |
|
|
695
|
+
|-----------|------|----------|---------|-------------|
|
|
696
|
+
| `personId` | number | No | — | Internal person ID (provide this or `url`) |
|
|
697
|
+
| `url` | string | No | — | LinkedIn profile URL (provide this or `personId`) |
|
|
698
|
+
| `skillNames` | string[] | No | — | Specific skill names to endorse (mutually exclusive with `limit`) |
|
|
699
|
+
| `limit` | number | No | — | Max number of skills to endorse (mutually exclusive with `skillNames`) |
|
|
700
|
+
| `skipIfNotEndorsable` | boolean | No | true | Skip if person has no endorsable skills |
|
|
701
|
+
| `keepCampaign` | boolean | No | false | Archive the ephemeral campaign instead of deleting it |
|
|
702
|
+
| `cdpPort` | number | No | 9222 | CDP port |
|
|
703
|
+
|
|
704
|
+
#### `enrich-profile`
|
|
705
|
+
|
|
706
|
+
Enrich a LinkedIn profile by extracting additional data (emails, phones, socials, company info) via an ephemeral campaign. Deducts from the daily action budget.
|
|
707
|
+
|
|
708
|
+
| Parameter | Type | Required | Default | Description |
|
|
709
|
+
|-----------|------|----------|---------|-------------|
|
|
710
|
+
| `personId` | number | No | — | Internal person ID (provide this or `url`) |
|
|
711
|
+
| `url` | string | No | — | LinkedIn profile URL (provide this or `personId`) |
|
|
712
|
+
| `profileInfo` | object | No | — | Enrich profile info (`shouldEnrich` required) |
|
|
713
|
+
| `phones` | object | No | — | Enrich phone numbers (`shouldEnrich` required) |
|
|
714
|
+
| `emails` | object | No | — | Enrich email addresses (`shouldEnrich` required) |
|
|
715
|
+
| `socials` | object | No | — | Enrich social profiles (`shouldEnrich` required) |
|
|
716
|
+
| `companies` | object | No | — | Enrich company data (`shouldEnrich` required) |
|
|
717
|
+
| `keepCampaign` | boolean | No | false | Archive the ephemeral campaign instead of deleting it |
|
|
718
|
+
| `cdpPort` | number | No | 9222 | CDP port |
|
|
719
|
+
|
|
720
|
+
#### `follow-person`
|
|
721
|
+
|
|
722
|
+
Follow or unfollow a LinkedIn profile via an ephemeral campaign. Deducts from the daily action budget.
|
|
723
|
+
|
|
724
|
+
| Parameter | Type | Required | Default | Description |
|
|
725
|
+
|-----------|------|----------|---------|-------------|
|
|
726
|
+
| `personId` | number | No | — | Internal person ID (provide this or `url`) |
|
|
727
|
+
| `url` | string | No | — | LinkedIn profile URL (provide this or `personId`) |
|
|
728
|
+
| `mode` | string | No | `follow` | `follow` or `unfollow` |
|
|
729
|
+
| `skipIfUnfollowable` | boolean | No | true | Skip if person cannot be unfollowed |
|
|
730
|
+
| `keepCampaign` | boolean | No | false | Archive the ephemeral campaign instead of deleting it |
|
|
731
|
+
| `cdpPort` | number | No | 9222 | CDP port |
|
|
732
|
+
|
|
733
|
+
#### `like-person-posts`
|
|
734
|
+
|
|
735
|
+
Like and optionally comment on posts and articles by a LinkedIn profile via an ephemeral campaign. Deducts from the daily action budget.
|
|
736
|
+
|
|
737
|
+
| Parameter | Type | Required | Default | Description |
|
|
738
|
+
|-----------|------|----------|---------|-------------|
|
|
739
|
+
| `personId` | number | No | — | Internal person ID (provide this or `url`) |
|
|
740
|
+
| `url` | string | No | — | LinkedIn profile URL (provide this or `personId`) |
|
|
741
|
+
| `numberOfArticles` | number | No | — | Number of articles to like |
|
|
742
|
+
| `numberOfPosts` | number | No | — | Number of posts to like |
|
|
743
|
+
| `maxAgeOfArticles` | number | No | — | Maximum age of articles in days |
|
|
744
|
+
| `maxAgeOfPosts` | number | No | — | Maximum age of posts in days |
|
|
745
|
+
| `shouldAddComment` | boolean | No | false | Also add a comment to liked posts/articles |
|
|
746
|
+
| `messageTemplate` | string | No | — | Comment text template as JSON (required when `shouldAddComment` is true) |
|
|
747
|
+
| `skipIfNotLiked` | boolean | No | true | Skip if nothing was liked |
|
|
748
|
+
| `keepCampaign` | boolean | No | false | Archive the ephemeral campaign instead of deleting it |
|
|
749
|
+
| `cdpPort` | number | No | 9222 | CDP port |
|
|
750
|
+
|
|
751
|
+
#### `message-person`
|
|
752
|
+
|
|
753
|
+
Send a direct message to a 1st-degree LinkedIn connection via an ephemeral campaign. Deducts from the daily action budget.
|
|
754
|
+
|
|
755
|
+
| Parameter | Type | Required | Default | Description |
|
|
756
|
+
|-----------|------|----------|---------|-------------|
|
|
757
|
+
| `personId` | number | No | — | Internal person ID (provide this or `url`) |
|
|
758
|
+
| `url` | string | No | — | LinkedIn profile URL (provide this or `personId`) |
|
|
759
|
+
| `messageTemplate` | string | Yes | — | Message template as JSON |
|
|
760
|
+
| `subjectTemplate` | string | No | — | Subject line template as JSON |
|
|
761
|
+
| `rejectIfReplied` | boolean | No | false | Skip if person already replied |
|
|
762
|
+
| `rejectIfMessaged` | boolean | No | false | Skip if already messaged |
|
|
763
|
+
| `keepCampaign` | boolean | No | false | Archive the ephemeral campaign instead of deleting it |
|
|
764
|
+
| `cdpPort` | number | No | 9222 | CDP port |
|
|
765
|
+
|
|
766
|
+
#### `send-invite`
|
|
767
|
+
|
|
768
|
+
Send a LinkedIn connection request via an ephemeral campaign. Deducts from the daily action budget.
|
|
769
|
+
|
|
770
|
+
| Parameter | Type | Required | Default | Description |
|
|
771
|
+
|-----------|------|----------|---------|-------------|
|
|
772
|
+
| `personId` | number | No | — | Internal person ID (provide this or `url`) |
|
|
773
|
+
| `url` | string | No | — | LinkedIn profile URL (provide this or `personId`) |
|
|
774
|
+
| `messageTemplate` | string | No | — | Invitation message template as JSON (empty for no message) |
|
|
775
|
+
| `saveAsLeadSN` | boolean | No | false | Save as lead in Sales Navigator |
|
|
776
|
+
| `keepCampaign` | boolean | No | false | Archive the ephemeral campaign instead of deleting it |
|
|
777
|
+
| `cdpPort` | number | No | 9222 | CDP port |
|
|
778
|
+
|
|
779
|
+
#### `send-inmail`
|
|
780
|
+
|
|
781
|
+
Send an InMail message to a LinkedIn member (no connection required) via an ephemeral campaign. Deducts from the daily action budget.
|
|
782
|
+
|
|
783
|
+
| Parameter | Type | Required | Default | Description |
|
|
784
|
+
|-----------|------|----------|---------|-------------|
|
|
785
|
+
| `personId` | number | No | — | Internal person ID (provide this or `url`) |
|
|
786
|
+
| `url` | string | No | — | LinkedIn profile URL (provide this or `personId`) |
|
|
787
|
+
| `messageTemplate` | string | Yes | — | InMail body template as JSON |
|
|
788
|
+
| `subjectTemplate` | string | No | — | InMail subject line template as JSON |
|
|
789
|
+
| `rejectIfReplied` | boolean | No | false | Skip if person already replied |
|
|
790
|
+
| `proceedOnOutOfCredits` | boolean | No | false | Continue even when InMail credits are exhausted |
|
|
791
|
+
| `keepCampaign` | boolean | No | false | Archive the ephemeral campaign instead of deleting it |
|
|
792
|
+
| `cdpPort` | number | No | 9222 | CDP port |
|
|
793
|
+
|
|
794
|
+
#### `remove-connection`
|
|
795
|
+
|
|
796
|
+
Remove a person from 1st-degree LinkedIn connections (unfriend) via an ephemeral campaign. Deducts from the daily action budget.
|
|
797
|
+
|
|
798
|
+
| Parameter | Type | Required | Default | Description |
|
|
799
|
+
|-----------|------|----------|---------|-------------|
|
|
800
|
+
| `personId` | number | No | — | Internal person ID (provide this or `url`) |
|
|
801
|
+
| `url` | string | No | — | LinkedIn profile URL (provide this or `personId`) |
|
|
802
|
+
| `keepCampaign` | boolean | No | false | Archive the ephemeral campaign instead of deleting it |
|
|
803
|
+
| `cdpPort` | number | No | 9222 | CDP port |
|
|
804
|
+
|
|
805
|
+
### Feed & Posts
|
|
806
|
+
|
|
807
|
+
#### `get-feed`
|
|
808
|
+
|
|
809
|
+
Read the LinkedIn home feed. Returns structured post data with cursor-based pagination.
|
|
810
|
+
|
|
811
|
+
| Parameter | Type | Required | Default | Description |
|
|
812
|
+
|-----------|------|----------|---------|-------------|
|
|
813
|
+
| `count` | number | No | 10 | Number of posts per page |
|
|
814
|
+
| `cursor` | string | No | — | Cursor token from a previous call for the next page |
|
|
815
|
+
| `cdpPort` | number | No | 9222 | CDP port |
|
|
816
|
+
|
|
817
|
+
#### `get-post`
|
|
818
|
+
|
|
819
|
+
Get detailed data for a single LinkedIn post including its comment thread.
|
|
820
|
+
|
|
821
|
+
| Parameter | Type | Required | Default | Description |
|
|
822
|
+
|-----------|------|----------|---------|-------------|
|
|
823
|
+
| `postUrl` | string | Yes | — | LinkedIn post URL or URN |
|
|
824
|
+
| `commentCount` | number | No | 100 | Maximum number of comments to load (0 to skip) |
|
|
825
|
+
| `cdpPort` | number | No | 9222 | CDP port |
|
|
826
|
+
|
|
827
|
+
#### `get-post-stats`
|
|
828
|
+
|
|
829
|
+
Get engagement statistics for a LinkedIn post: reaction count (broken down by type), comment count, and share count.
|
|
830
|
+
|
|
831
|
+
| Parameter | Type | Required | Default | Description |
|
|
832
|
+
|-----------|------|----------|---------|-------------|
|
|
833
|
+
| `postUrl` | string | Yes | — | LinkedIn post URL or URN |
|
|
834
|
+
| `cdpPort` | number | No | 9222 | CDP port |
|
|
835
|
+
|
|
836
|
+
#### `get-post-engagers`
|
|
837
|
+
|
|
838
|
+
List people who engaged with a LinkedIn post (reacted, etc.) with their profile info and engagement type. Supports pagination. *MCP tool only — no CLI command.*
|
|
839
|
+
|
|
840
|
+
| Parameter | Type | Required | Default | Description |
|
|
841
|
+
|-----------|------|----------|---------|-------------|
|
|
842
|
+
| `postUrl` | string | Yes | — | LinkedIn post URL or URN |
|
|
843
|
+
| `start` | number | No | 0 | Pagination offset |
|
|
844
|
+
| `count` | number | No | 20 | Number of engagers per page |
|
|
845
|
+
| `cdpPort` | number | No | 9222 | CDP port |
|
|
846
|
+
|
|
847
|
+
#### `get-profile-activity`
|
|
848
|
+
|
|
849
|
+
Get recent posts/activity from a LinkedIn profile with cursor-based pagination.
|
|
850
|
+
|
|
851
|
+
| Parameter | Type | Required | Default | Description |
|
|
852
|
+
|-----------|------|----------|---------|-------------|
|
|
853
|
+
| `profile` | string | Yes | — | LinkedIn profile public ID or URL |
|
|
854
|
+
| `count` | number | No | 10 | Number of posts per page |
|
|
855
|
+
| `cursor` | string | No | — | Cursor token from a previous call for the next page |
|
|
856
|
+
| `cdpPort` | number | No | 9222 | CDP port |
|
|
857
|
+
|
|
858
|
+
#### `search-posts`
|
|
859
|
+
|
|
860
|
+
Search LinkedIn for posts by keyword or hashtag. Returns structured post data with cursor-based pagination.
|
|
861
|
+
|
|
862
|
+
| Parameter | Type | Required | Default | Description |
|
|
863
|
+
|-----------|------|----------|---------|-------------|
|
|
864
|
+
| `query` | string | Yes | — | Search query — keywords or hashtag |
|
|
865
|
+
| `count` | number | No | 10 | Number of results per page |
|
|
866
|
+
| `cursor` | number | No | — | Index-based cursor from a previous call for the next page |
|
|
867
|
+
| `cdpPort` | number | No | 9222 | CDP port |
|
|
868
|
+
|
|
869
|
+
#### `comment-on-post`
|
|
870
|
+
|
|
871
|
+
Post a comment on a LinkedIn post. Checks action budget before attempting.
|
|
872
|
+
|
|
873
|
+
| Parameter | Type | Required | Default | Description |
|
|
874
|
+
|-----------|------|----------|---------|-------------|
|
|
875
|
+
| `postUrl` | string | Yes | — | LinkedIn post URL |
|
|
876
|
+
| `text` | string | Yes | — | Comment text to post |
|
|
877
|
+
| `cdpPort` | number | No | 9222 | CDP port |
|
|
878
|
+
|
|
879
|
+
#### `react-to-post`
|
|
880
|
+
|
|
881
|
+
React to a LinkedIn post with a specific reaction type.
|
|
882
|
+
|
|
883
|
+
| Parameter | Type | Required | Default | Description |
|
|
884
|
+
|-----------|------|----------|---------|-------------|
|
|
885
|
+
| `postUrl` | string | Yes | — | LinkedIn post URL |
|
|
886
|
+
| `reactionType` | string | No | `like` | `like`, `celebrate`, `support`, `love`, `insightful`, or `funny` |
|
|
887
|
+
| `cdpPort` | number | No | 9222 | CDP port |
|
|
888
|
+
|
|
889
|
+
### LinkedIn Search & Reference
|
|
890
|
+
|
|
891
|
+
#### `build-linkedin-url`
|
|
892
|
+
|
|
893
|
+
Build a LinkedIn URL for any supported source type. Supports SearchPage (basic search with faceted filters), SNSearchPage (Sales Navigator), and parameterised templates for company, school, group, and event pages. CLI command: `build-url`.
|
|
894
|
+
|
|
895
|
+
| Parameter | Type | Required | Default | Description |
|
|
896
|
+
|-----------|------|----------|---------|-------------|
|
|
897
|
+
| `sourceType` | string | Yes | — | LinkedIn source type (e.g., `SearchPage`, `SNSearchPage`, `OrganizationPeople`) |
|
|
898
|
+
| `keywords` | string | No | — | Search keywords |
|
|
899
|
+
| `currentCompany` | string[] | No | — | Current company IDs (SearchPage) |
|
|
900
|
+
| `pastCompany` | string[] | No | — | Past company IDs (SearchPage) |
|
|
901
|
+
| `geoUrn` | string[] | No | — | Geographic URN IDs (SearchPage) |
|
|
902
|
+
| `industry` | string[] | No | — | Industry IDs (SearchPage) |
|
|
903
|
+
| `school` | string[] | No | — | School IDs (SearchPage) |
|
|
904
|
+
| `network` | string[] | No | — | Connection degree codes: `F`, `S`, `O` (SearchPage) |
|
|
905
|
+
| `profileLanguage` | string[] | No | — | Profile language codes (SearchPage) |
|
|
906
|
+
| `serviceCategory` | string[] | No | — | Service category IDs (SearchPage) |
|
|
907
|
+
| `filters` | object[] | No | — | Sales Navigator filters (SNSearchPage) — each with `type`, `values[]` |
|
|
908
|
+
| `slug` | string | No | — | Company or school slug (OrganizationPeople, Alumni) |
|
|
909
|
+
| `id` | string | No | — | Entity ID (Group, Event, SNListPage, etc.) |
|
|
910
|
+
|
|
911
|
+
#### `resolve-linkedin-entity`
|
|
912
|
+
|
|
913
|
+
Resolve human-readable names (company names, locations, schools) to LinkedIn entity IDs via typeahead endpoints. CLI command: `resolve-entity`.
|
|
914
|
+
|
|
915
|
+
| Parameter | Type | Required | Default | Description |
|
|
916
|
+
|-----------|------|----------|---------|-------------|
|
|
917
|
+
| `query` | string | Yes | — | Search query (e.g., company name, city) |
|
|
918
|
+
| `entityType` | string | Yes | — | `COMPANY`, `GEO`, or `SCHOOL` |
|
|
919
|
+
| `cdpPort` | number | No | 9222 | CDP port |
|
|
920
|
+
|
|
921
|
+
#### `list-linkedin-reference-data`
|
|
922
|
+
|
|
923
|
+
List LinkedIn reference data for finite enumerations (industries, seniority levels, functions, company sizes, connection degrees, profile languages). Use this to discover valid IDs for search filters. CLI command: `list-reference-data`.
|
|
924
|
+
|
|
925
|
+
| Parameter | Type | Required | Default | Description |
|
|
926
|
+
|-----------|------|----------|---------|-------------|
|
|
927
|
+
| `dataType` | string | Yes | — | `INDUSTRY`, `SENIORITY`, `FUNCTION`, `COMPANY_SIZE`, `CONNECTION_DEGREE`, or `PROFILE_LANGUAGE` |
|
|
928
|
+
|
|
612
929
|
### Utilities
|
|
613
930
|
|
|
614
931
|
#### `describe-actions`
|
|
@@ -628,6 +945,30 @@ Query current LinkedHelper UI errors, dialogs, and blocking popups.
|
|
|
628
945
|
|-----------|------|----------|---------|-------------|
|
|
629
946
|
| `cdpPort` | number | No | 9222 | CDP port |
|
|
630
947
|
|
|
948
|
+
#### `dismiss-errors`
|
|
949
|
+
|
|
950
|
+
Dismiss closable error popups in the LinkedHelper instance UI by clicking their close/OK buttons. Recommended after `UIBlockedError`.
|
|
951
|
+
|
|
952
|
+
| Parameter | Type | Required | Default | Description |
|
|
953
|
+
|-----------|------|----------|---------|-------------|
|
|
954
|
+
| `cdpPort` | number | No | 9222 | CDP port |
|
|
955
|
+
|
|
956
|
+
#### `get-action-budget`
|
|
957
|
+
|
|
958
|
+
Get daily action budget showing limit types, thresholds, and today's usage from LH campaigns and CDP-direct actions.
|
|
959
|
+
|
|
960
|
+
| Parameter | Type | Required | Default | Description |
|
|
961
|
+
|-----------|------|----------|---------|-------------|
|
|
962
|
+
| `cdpPort` | number | No | 9222 | CDP port |
|
|
963
|
+
|
|
964
|
+
#### `get-throttle-status`
|
|
965
|
+
|
|
966
|
+
Check if LinkedIn is currently throttling the account.
|
|
967
|
+
|
|
968
|
+
| Parameter | Type | Required | Default | Description |
|
|
969
|
+
|-----------|------|----------|---------|-------------|
|
|
970
|
+
| `cdpPort` | number | No | 9222 | CDP port |
|
|
971
|
+
|
|
631
972
|
## Known Limitations
|
|
632
973
|
|
|
633
974
|
- **Platform support**: LinkedHelper runs on macOS, Windows, and Linux. Binary paths are detected automatically but can be overridden with the `LINKEDHELPER_PATH` environment variable.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lhremote",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "LinkedHelper automation toolkit — CLI & MCP server",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -37,8 +37,8 @@
|
|
|
37
37
|
"dist"
|
|
38
38
|
],
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@lhremote/cli": "^0.
|
|
41
|
-
"@lhremote/mcp": "^0.
|
|
40
|
+
"@lhremote/cli": "^0.9.0",
|
|
41
|
+
"@lhremote/mcp": "^0.9.0"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@types/node": "^25",
|