Atlas / MCP servers / gnmike57 / linkedin-osint-cli

linkedin-osint-cliCAUTION

mcp/gnmike57/linkedin-osint-cli

LinkedIn CLI + MCP server: 43 platform commands plus a 13-command OSINT suite (company discovery, employee scraping, username generation, role classification, org charts). Interactive console, cookie-session auth, AI-agent native.

Verdict
CAUTION
Grade
B
Trust score
89 /100
Exposed tools
1 1r · 0w · 0d
Transport
stdio
License
MIT
Stars
0
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

[](https://github.com/gnmike57/linkedin-osint-cli/actions/workflows/ci.yml) [](./LICENSE)

Full LinkedIn platform management from your terminal. 43 platform commands (profiles, posts, messaging, connections, search, feed, engagement) plus an OSINT suite: company discovery, employee scraping, username generation, role classification, org charts, and email deanonymization — powered by cookie session auth.

Works as a CLI and an MCP server (for Claude Code, Cursor, Windsurf, and other AI agents). All 56 tools (43 platform + 13 OSINT) are exposed over MCP automatically, plus an interactive console for humans.

OSINT Suite

The osint command group ports the best of three legacy Python toolkits (legacy/python/) into the TypeScript engine — API-native, no browser needed:

Read from source at commit 46f3150a6376OBSERVED · 2026-10-11
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add linkedincli --env GROQ_API_KEY=${GROQ_API_KEY} --env LINKEDIN_MS_TOKEN=${LINKEDIN_MS_TOKEN} --env LINKEDIN_PASSWORD=${LINKEDIN_PASSWORD} -- npx -y @bcharleson/[email protected]
claude-desktop
{
  "mcpServers": {
    "linkedincli": {
      "command": "npx",
      "args": [
        "-y",
        "@bcharleson/[email protected]"
      ],
      "env": {
        "GROQ_API_KEY": "${GROQ_API_KEY}",
        "LINKEDIN_MS_TOKEN": "${LINKEDIN_MS_TOKEN}",
        "LINKEDIN_PASSWORD": "${LINKEDIN_PASSWORD}"
      }
    }
  }
}
03

Exposed tools (1)

1 read · 0 write · 0 destructive.

ToolRiskDescription
internal-pdf-viewerreadPortable Document Format
04

Trust audit

CAUTIONgrade B · trust 89/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (6 observation(s))
Network
declared (6 observation(s))
Shell
declared (2 observation(s))
Dependencies
not all pinned
Secrets in source
none-found

Findings (16)

HIGHNetwork egress · net.tls_off · CWE-200, CWE-319
legacy/python/linkedin2username-master/linkedin2username.py:743
session.verify = False
Why it matters. certificate verification is disabled
Fix. leave verification on
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/commands/analytics/analytics.ts:2
import type { CommandDefinition } from '../../core/types.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/commands/auth/login.ts:3
import { saveConfig } from '../../core/config.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/commands/auth/login.ts:4
import { createClient } from '../../core/client.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/commands/auth/login.ts:5
import { output, outputError } from '../../core/output.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/commands/auth/login.ts:6
import { resolveAuth, wantsFromChrome } from '../../core/auth.js';
LOWNetwork egress · net.beacon_words · CWE-200, CWE-319
tests/bugfixes.test.ts:39
it('neutralizes non-http image URLs (data: exfiltration)', () => {
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
legacy/python/linkedin-osint-toolkit-main/src/osint_scrape_company.py:682
f.write(base64.b64decode(b64_data))
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
legacy/python/linkedin-osint-toolkit-main/requirements.txt
selenium, webdriver-manager, python-dotenv, groq
Why it matters. 4 requirement(s) not pinned with ==
Fix. pin exact versions
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@modelcontextprotocol/sdk, commander, zod, @types/node, tsup, tsx, typescript, vitest
Why it matters. 9 dependency range(s) float
Fix. pin exact versions or ship a lockfile
INFOInventory / provenance · inv.oversize · CWE-1104
legacy/python/linkedin-osint-toolkit-main/assets/logo.png
legacy/python/linkedin-osint-toolkit-main/assets/logo.png
Why it matters. 8155719 bytes not read
INFOPrompt injection · prompt.authority_framing · CWE-94, CWE-1427
legacy/python/linkedin-osint-toolkit-main/src/prompts/system_prompt.md:7
- You are a senior open-source intelligence (OSINT) analyst specializing in organizational mapping and corporate intelligence.
INFOPrompt injection · prompt.authority_framing · CWE-94, CWE-1427
src/osint/prompts/system_prompt.md:7
- You are a senior open-source intelligence (OSINT) analyst specializing in organizational mapping and corporate intelligence.
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
legacy/python/linkedin-osint-toolkit-main/README.md:158
> **Note:** All scripts read `LINKEDIN_EMAIL` and `LINKEDIN_PASSWORD` from `.env` automatically. You can also pass `-e`/`-p` flags to override.
Why it matters. asks the agent to read credentials
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
legacy/python/linkedin-osint-toolkit-main/docs/USAGE.md:142
The individual scripts below can be used for more granular control. Each script that requires a browser session will start its own browser. Credentials are read from `.env` automatically; you can also
Why it matters. asks the agent to read credentials
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
legacy/python/linkedin-osint-toolkit-main/docs/USAGE.md:369
One-liner commands to test every stage of the OSINT funnel. All scripts read credentials from `.env` automatically -- no need for `-e`/`-p` flags if `LINKEDIN_EMAIL` and `LINKEDIN_PASSWORD` are set th
Why it matters. asks the agent to read credentials

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 46f3150a6376full audit observations/trust-audit/mcp-server/gnmike57__linkedin-osint-cli.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-1146f3150a6376CAUTIONB89first audit
06

Questions

What is the linkedin-osint-cli MCP server?

LinkedIn CLI + MCP server: 43 platform commands plus a 13-command OSINT suite (company discovery, employee scraping, username generation, role classification, org charts). Interactive console, cookie-session auth, AI-agent native.

What tools does linkedin-osint-cli expose?

1 in total: 1 read-only, 0 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is linkedin-osint-cli safe to connect to an agent?

With care. The audit graded it B (89/100) and found 16 things worth knowing before you trust this server, listed below with the exact line each was found on.

What credentials does linkedin-osint-cli need?

It reads GROQ_API_KEY, LINKEDIN_MS_TOKEN and LINKEDIN_PASSWORD from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does linkedin-osint-cli run?

It speaks stdio, so it runs as a local process your client starts. It is published on npm as @bcharleson/linkedincli at 0.2.0.

How current is this page?

The grade is for one exact copy of the source (46f3150a6376), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement