@clickonsearch/linkedin-agent 0.1.0 → 0.1.2
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 +108 -50
- package/dist/cli.js +1 -1
- package/dist/providers.js +9 -2
- package/dist/providers.js.map +1 -1
- package/dist/server-cli.js +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -1,74 +1,132 @@
|
|
|
1
1
|
# linkedin-agent
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
one-shot CLI and an AG-UI browser chat UI, both routed through whichever
|
|
6
|
-
provider you pick (OpenAI, Claude, or DeepSeek).
|
|
3
|
+
Read your LinkedIn profile and publish posts to your feed, through chat.
|
|
4
|
+
Pick which AI model does the thinking — OpenAI, Claude, or DeepSeek.
|
|
7
5
|
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
```
|
|
7
|
+
your prompt
|
|
8
|
+
│
|
|
9
|
+
▼
|
|
10
|
+
┌─────────────────────────────┐
|
|
11
|
+
│ linkedin-agent │ reads your prompt
|
|
12
|
+
└──────────────┬──────────────┘
|
|
13
|
+
│
|
|
14
|
+
▼
|
|
15
|
+
┌─────────────────────────────┐
|
|
16
|
+
│ bridge │ openai / claude / deepseek — talks to the AI model
|
|
17
|
+
└──────────────┬──────────────┘
|
|
18
|
+
│
|
|
19
|
+
▼
|
|
20
|
+
┌─────────────────────────────┐
|
|
21
|
+
│ linkedin-mcp-server │ reads/posts your profile
|
|
22
|
+
└──────────────┬──────────────┘
|
|
23
|
+
│
|
|
24
|
+
▼
|
|
25
|
+
an answer, or a new post on your feed
|
|
26
|
+
```
|
|
10
27
|
|
|
11
|
-
##
|
|
28
|
+
## What you need
|
|
12
29
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
API for
|
|
16
|
-
LinkedIn Developer Program approval most apps don't have). If you ask it to
|
|
17
|
-
do either, it's instructed to say so rather than pretend.
|
|
30
|
+
- Node.js 18+
|
|
31
|
+
- A LinkedIn Developer app (free, a few minutes — see step 1 below)
|
|
32
|
+
- An API key for at least one of: OpenAI, Anthropic (Claude), DeepSeek
|
|
18
33
|
|
|
19
34
|
## Setup
|
|
20
35
|
|
|
36
|
+
**1. Create a LinkedIn app:**
|
|
37
|
+
|
|
38
|
+
1. Go to [linkedin.com/developers/apps](https://www.linkedin.com/developers/apps) → Create app.
|
|
39
|
+
2. Under **Products**, add **"Sign In with LinkedIn using OpenID Connect"** and **"Share on LinkedIn"**.
|
|
40
|
+
3. Under **Auth**, add an **Authorized redirect URL**: `http://localhost:3300/callback`.
|
|
41
|
+
4. Copy the app's **Client ID** and **Client Secret**.
|
|
42
|
+
|
|
43
|
+
**2. Authorize it** (one time — run from a folder you'll reuse in step 3):
|
|
44
|
+
|
|
21
45
|
```bash
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
npm run dev:authorize # one-time OAuth consent
|
|
26
|
-
npm run dev
|
|
46
|
+
LINKEDIN_CLIENT_ID=<id> LINKEDIN_CLIENT_SECRET=<secret> \
|
|
47
|
+
npx -p @clickonsearch/linkedin-mcp-server linkedin-authorize
|
|
48
|
+
```
|
|
27
49
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
50
|
+
This opens a link — sign in, approve, done. It saves a token to
|
|
51
|
+
`linkedin-token.json` in the current folder, so step 3 needs to run from
|
|
52
|
+
this same folder.
|
|
53
|
+
|
|
54
|
+
**3. Start the LinkedIn connection** (own terminal, keep it running):
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
LINKEDIN_CLIENT_ID=<id> LINKEDIN_CLIENT_SECRET=<secret> \
|
|
58
|
+
npx @clickonsearch/linkedin-mcp-server
|
|
33
59
|
```
|
|
34
60
|
|
|
35
|
-
##
|
|
61
|
+
## Use it: command line
|
|
36
62
|
|
|
37
63
|
```bash
|
|
38
|
-
|
|
39
|
-
npm run dev -- --provider openai "post: excited to share our new release today"
|
|
64
|
+
ANTHROPIC_API_KEY=<your-key> npx @clickonsearch/linkedin-agent --provider claude "what does my profile look like?"
|
|
40
65
|
```
|
|
41
66
|
|
|
42
|
-
|
|
67
|
+
Swap in `OPENAI_API_KEY` + `--provider openai`, or `DEEPSEEK_API_KEY` +
|
|
68
|
+
`--provider deepseek`, to use a different model.
|
|
69
|
+
|
|
70
|
+
## Use it: browser chat
|
|
43
71
|
|
|
44
72
|
```bash
|
|
45
|
-
|
|
46
|
-
npm start -- --provider claude "your prompt here"
|
|
73
|
+
ANTHROPIC_API_KEY=<your-key> npx -p @clickonsearch/linkedin-agent linkedin-agent-serve
|
|
47
74
|
```
|
|
48
75
|
|
|
49
|
-
|
|
76
|
+
Then open `http://localhost:3200` and start chatting.
|
|
77
|
+
|
|
78
|
+
## Use it: embedded in another tool
|
|
79
|
+
|
|
80
|
+
The browser chat server speaks the [AG-UI protocol](https://ag-ui.com)
|
|
81
|
+
(`POST /agent`, streaming SSE) — any AG-UI-compatible client can drive it
|
|
82
|
+
as a backend, not just the bundled page.
|
|
83
|
+
|
|
84
|
+
## Config reference
|
|
85
|
+
|
|
86
|
+
| Env var | Required | Default |
|
|
87
|
+
| -------------------- | -------------------- | -------------------------- |
|
|
88
|
+
| `PROVIDER` | no | `openai` |
|
|
89
|
+
| `OPENAI_API_KEY` | if using OpenAI | |
|
|
90
|
+
| `OPENAI_MODEL` | no | `gpt-4.1` |
|
|
91
|
+
| `ANTHROPIC_API_KEY` | if using Claude | |
|
|
92
|
+
| `ANTHROPIC_MODEL` | no | `claude-sonnet-5` |
|
|
93
|
+
| `DEEPSEEK_API_KEY` | if using DeepSeek | |
|
|
94
|
+
| `DEEPSEEK_MODEL` | no | `deepseek-chat` |
|
|
95
|
+
| `LINKEDIN_MCP_URL` | no | `http://127.0.0.1:4300` |
|
|
96
|
+
| `LINKEDIN_MCP_TOKEN` | only if the server needs one | |
|
|
97
|
+
| `PORT` | no, browser chat only | `3200` |
|
|
98
|
+
|
|
99
|
+
## Good to know
|
|
100
|
+
|
|
101
|
+
This agent can only do two things: read your own profile, and post to your
|
|
102
|
+
own feed. It **can't** send LinkedIn messages (no public API exists for
|
|
103
|
+
that, for anyone) or reply to other people's posts (needs special LinkedIn
|
|
104
|
+
approval most apps don't have). If you ask it to do either, it'll tell you
|
|
105
|
+
it can't rather than pretend.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## For developers
|
|
110
|
+
|
|
111
|
+
**Running from source:**
|
|
50
112
|
|
|
51
113
|
```bash
|
|
52
|
-
|
|
53
|
-
|
|
114
|
+
# terminal 1
|
|
115
|
+
cd mcp-servers/linkedin-mcp-server
|
|
116
|
+
npm install
|
|
117
|
+
cp .env.example .env # fill in LINKEDIN_CLIENT_ID / LINKEDIN_CLIENT_SECRET
|
|
118
|
+
npm run dev:authorize # opens a consent link in your browser, one time
|
|
119
|
+
npm run dev
|
|
120
|
+
|
|
121
|
+
# terminal 2
|
|
122
|
+
cd agents/linkedin-agent
|
|
123
|
+
npm install
|
|
124
|
+
cp .env.example .env # fill in a provider key
|
|
125
|
+
npm run dev -- --provider claude "what does my profile look like?"
|
|
126
|
+
npm run serve # or browser chat
|
|
54
127
|
```
|
|
55
128
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
- `GET /health` — liveness check.
|
|
61
|
-
|
|
62
|
-
## Config
|
|
63
|
-
|
|
64
|
-
| Env var | Required | Notes |
|
|
65
|
-
| -------------------- | ----------------------- | ----------------------------------------------------- |
|
|
66
|
-
| `LINKEDIN_MCP_URL` | no (default `http://localhost:4300`) | where linkedin-mcp-server is running |
|
|
67
|
-
| `PORT` | no (default `3200`) | AG-UI server only |
|
|
68
|
-
| `PROVIDER` | no (default `openai`) | CLI: overridden by `--provider`. Server: default only, overridden per-request by `forwardedProps.provider` |
|
|
69
|
-
| `OPENAI_API_KEY` | when provider=openai | |
|
|
70
|
-
| `OPENAI_MODEL` | no (default `gpt-4.1`) | |
|
|
71
|
-
| `ANTHROPIC_API_KEY` | when provider=claude | |
|
|
72
|
-
| `ANTHROPIC_MODEL` | no (default `claude-sonnet-5`) | |
|
|
73
|
-
| `DEEPSEEK_API_KEY` | when provider=deepseek | |
|
|
74
|
-
| `DEEPSEEK_MODEL` | no (default `deepseek-chat`) | |
|
|
129
|
+
Same shape as [`github-agent`](../github-agent): both the CLI and the
|
|
130
|
+
browser chat UI (an AG-UI protocol server, same `POST /agent` shape) call
|
|
131
|
+
through to [`linkedin-mcp-server`](../../mcp-servers/linkedin-mcp-server)'s
|
|
132
|
+
two tools.
|
package/dist/cli.js
CHANGED
|
@@ -39,7 +39,7 @@ async function main() {
|
|
|
39
39
|
return;
|
|
40
40
|
}
|
|
41
41
|
const provider = resolveProvider(providerFlag);
|
|
42
|
-
const linkedinMcpUrl = process.env.LINKEDIN_MCP_URL ?? "http://
|
|
42
|
+
const linkedinMcpUrl = process.env.LINKEDIN_MCP_URL ?? "http://127.0.0.1:4300";
|
|
43
43
|
const answer = await runLinkedInAgent(provider, {
|
|
44
44
|
prompt,
|
|
45
45
|
linkedinMcpUrl,
|
package/dist/providers.js
CHANGED
|
@@ -8,9 +8,16 @@ export function isProvider(value) {
|
|
|
8
8
|
return typeof value === "string" && PROVIDERS.includes(value);
|
|
9
9
|
}
|
|
10
10
|
export const LINKEDIN_SERVER_NAME = "linkedin";
|
|
11
|
-
/** `baseUrl` is linkedin-mcp-server's origin (e.g. "http://
|
|
11
|
+
/** `baseUrl` is linkedin-mcp-server's origin (e.g. "http://127.0.0.1:4300") — its MCP endpoint is at /mcp. */
|
|
12
12
|
export function linkedinServerConfig(baseUrl) {
|
|
13
|
-
|
|
13
|
+
// Same LINKEDIN_MCP_TOKEN linkedin-mcp-server checks; omitted when that server doesn't require one.
|
|
14
|
+
const token = process.env.LINKEDIN_MCP_TOKEN;
|
|
15
|
+
return {
|
|
16
|
+
name: LINKEDIN_SERVER_NAME,
|
|
17
|
+
url: new URL("/mcp", baseUrl).toString(),
|
|
18
|
+
transport: "http",
|
|
19
|
+
...(token ? { headers: { Authorization: `Bearer ${token}` } } : {}),
|
|
20
|
+
};
|
|
14
21
|
}
|
|
15
22
|
export const DEFAULT_SYSTEM_PROMPT = [
|
|
16
23
|
"You are an assistant for the user's personal LinkedIn account. You have",
|
package/dist/providers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAwB,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAE/E,MAAM,UAAU,UAAU,CAAC,KAAc;IACvC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,SAA+B,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAG,UAAU,CAAC;AAE/C,8GAA8G;AAC9G,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,OAAO,
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"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"}
|
package/dist/server-cli.js
CHANGED
|
@@ -21,7 +21,7 @@ function main() {
|
|
|
21
21
|
process.exitCode = 1;
|
|
22
22
|
return;
|
|
23
23
|
}
|
|
24
|
-
const linkedinMcpUrl = process.env.LINKEDIN_MCP_URL ?? "http://
|
|
24
|
+
const linkedinMcpUrl = process.env.LINKEDIN_MCP_URL ?? "http://127.0.0.1:4300";
|
|
25
25
|
const port = Number(process.env.PORT ?? 3200);
|
|
26
26
|
const app = createServer({ linkedinMcpUrl, defaultProvider });
|
|
27
27
|
app.listen(port, () => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clickonsearch/linkedin-agent",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Agent for a personal LinkedIn account (read your profile, publish posts) via linkedin-mcp-server, routed through OpenAI, Claude, or DeepSeek depending on preference. Ships an AG-UI protocol server plus a browser chat UI.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -29,9 +29,9 @@
|
|
|
29
29
|
"dev:serve": "tsx src/server-cli.ts"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@clickonsearch/openai-remote-mcp-bridge": "^0.
|
|
33
|
-
"@clickonsearch/claude-remote-mcp-bridge": "^0.
|
|
34
|
-
"@clickonsearch/deepseek-remote-mcp-bridge": "^0.
|
|
32
|
+
"@clickonsearch/openai-remote-mcp-bridge": "^0.2.0",
|
|
33
|
+
"@clickonsearch/claude-remote-mcp-bridge": "^0.2.0",
|
|
34
|
+
"@clickonsearch/deepseek-remote-mcp-bridge": "^0.2.0",
|
|
35
35
|
"openai": "^4.68.0",
|
|
36
36
|
"@anthropic-ai/sdk": "^0.32.1",
|
|
37
37
|
"@ag-ui/core": "^1.0.0",
|