Skip to main content
Glama
nudavinci64

LinkedIn Archive MCP

by nudavinci64
README.md
# LinkedIn Archive MCP

Read your own LinkedIn profile from Claude — no copying and pasting.

An MCP server that reads the data export LinkedIn gives you and exposes it as
tools. Ask *"what's my current headline?"* or *"rewrite my About section to lead
with platform work"* and Claude just has the data.

**No API keys. No OAuth. No scraping.** It reads files already on your disk.

---

## Contents

- [Why this exists](#why-this-exists)
- [1. Get your archive](#1-get-your-archive)
- [2. Install](#2-install)
- [3. Point it at your archive](#3-point-it-at-your-archive)
- [4. Verify](#4-verify)
- [Using it](#using-it)
- [Optional: symlink a cloud folder](#optional-symlink-a-cloud-folder)
- [Keeping multiple exports](#keeping-multiple-exports)
- [Tools](#tools)
- [Troubleshooting](#troubleshooting)
- [Privacy](#privacy)

---

## Why this exists

LinkedIn's API can't do this. The two self-serve products are *Sign In with
LinkedIn* and *Share on LinkedIn*, and the profile endpoint returns only your
name, photo, locale, and email — not your headline, experience, or skills.
Everything richer sits behind partner approval. A *Profile Edit API* exists in
the docs but is restricted to approved developers.

Meanwhile LinkedIn will hand you all of it for free, as CSVs, if you ask. This
reads those.

**Consequences worth knowing up front:**

- **Read-only.** There's no way to write back to your profile. You'll still
  paste edits into the LinkedIn UI yourself — but that's ~30 seconds, and the
  thinking happens in Claude with your real data in front of it.
- **Your data only.** No other people's profiles. Your own connections list is
  in there (names, titles, companies), but nothing beyond that.
- **A snapshot, not a live feed.** Current as of the day you exported. Request a
  fresh one after you make changes.

---

## 1. Get your archive

**Direct link:** <https://www.linkedin.com/mypreferences/d/download-my-data>

Or navigate: profile photo → **Settings & Privacy** → **Data Privacy** → **Get a
copy of your data**.

**Desktop browser only.** The mobile app doesn't expose this page.

You'll see two options:

| Option | Contains | Wait |
| --- | --- | --- |
| **Want something in particular** | Tick Profile, Positions, Education, Skills, Certifications, Recommendations, Shares | ~10 minutes |
| **The works** | All of the above plus connections, messages, invitations, ad data | Up to 24 hours |

Pick the targeted one unless you want `search_connections` to work — connections
aren't available as a standalone item.

Re-enter your password, wait for the email, download the ZIP. The link expires
after a few days.

**No need to unzip.** This server reads CSVs directly out of the `.zip`.

---

## 2. Install

```bash
git clone https://github.com/nudavinci64/linkedin-archive-mcp.git
cd linkedin-archive-mcp
pip3 install -r requirements.txt
```

Requires **Python 3.10+** and **Claude Desktop** (or any MCP client). This won't
work in the Claude web app — a local MCP server needs a desktop client to talk
to over stdio.

---

## 3. Point it at your archive

Make a folder to hold your exports and drop the ZIP in:

```
~/linkedin-archive/
    Basic_LinkedInDataExport_08-05-2026.zip
```

Then add the server to your Claude Desktop config:

- **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`

Or in-app: **Settings → Developer → Edit Config**.

```json
{
  "mcpServers": {
    "linkedin": {
      "command": "python3",
      "args": ["/absolute/path/to/linkedin_archive_mcp.py"],
      "env": { "LINKEDIN_ARCHIVE_DIR": "/absolute/path/to/linkedin-archive" }
    }
  }
}
```

**`LINKEDIN_ARCHIVE_DIR` is the only thing you configure.** Point it at the
*folder holding your exports*, not at a ZIP or a CSV.

Both paths must be **absolute**. `~` isn't expanded inside `args`, and relative
paths break because Claude Desktop launches the server from an unpredictable
working directory. On Windows, escape backslashes: `"C:\\Users\\you\\..."`.

Already have servers in the file? Add `"linkedin"` alongside them — don't
replace the block.

Then **fully quit** Claude Desktop (Cmd+Q on macOS, right-click → Exit on
Windows; closing the window isn't enough) and reopen.

---

## 4. Verify

Check it standalone before involving Claude — much easier to debug:

```bash
cd linkedin-archive-mcp
LINKEDIN_ARCHIVE_DIR=~/linkedin-archive python3 -c \
  "import linkedin_archive_mcp as m; f=getattr(m.list_archives,'fn',m.list_archives); print(f())"
```

Expected:

```
Looking in: /Users/you/linkedin-archive

  Basic_LinkedInDataExport_08-05-2026.zip  [zip, 2026-08-05, 25 files] <- ACTIVE
```

If that works, restart Claude Desktop and look for the tools icon near the
message box. `linkedin` should be listed.

---

## Using it

Just ask in plain language — Claude picks the tool.

**Reading:**
- "What's my LinkedIn headline?"
- "Show me my full profile"
- "What skills do I have listed, and which have the most endorsements?"
- "What did I write about in my last 10 posts?"

**Editing (Claude drafts, you paste):**
- "Rewrite my About section to lead with platform work, keep it under 2000 characters"
- "My headline is vague. Give me three sharper options."
- "Tighten the bullets on my current role — they're too long"

**Cross-checking:**
- "Here's my résumé — does it contradict my LinkedIn anywhere?" *(attach it)*
- "Turn my profile into a one-page résumé in Markdown"
- "Which roles are missing descriptions?"

**Network** *(needs the full export)*:
- "Which of my connections work at Stripe?"
- "Who do I know with 'product' in their title?"

**Over time** *(needs two or more exports)*:
- "How did my headline change between February and August?"
- "Which skills did I add this year?"

For anything involving a rewrite, `profile_as_markdown` gives Claude everything
at once — it'll usually reach for that on its own.

---

## Optional: symlink a cloud folder

If you keep your archive in Google Drive, Dropbox, or iCloud, the real path is
long and full of spaces. A symlink gives you a short stable one, so the config
never has to change:

```bash
ln -s "/long/path/to/your/cloud/folder/LinkedIn" ~/linkedin-archive
```

Real example (Google Drive on macOS):

```bash
ln -s "/Users/you/Library/CloudStorage/GoogleDrive-you@gmail.com/My Drive/LinkedIn" ~/linkedin-archive
```

Then set `"LINKEDIN_ARCHIVE_DIR": "/Users/you/linkedin-archive"` and you're done.

Check it: `ls ~/linkedin-archive` should list your export. Remove it with
`rm ~/linkedin-archive` — that deletes only the link, never the folder.

**Two gotchas with cloud storage:**

- **Quote the path.** `My Drive` and `Shared drives` contain spaces.
- **Mark it available offline.** Drive and Dropbox stream files on demand, so a
  cold read can hang or fail. On macOS: right-click the folder in Finder →
  Offline access → Available offline.

Cloud folders sync across machines, which is convenient — but see
[Privacy](#privacy) before putting a full export in a *shared* one.

---

## Keeping multiple exports

Point at a folder and keep as many as you like. Any mix of formats works:

```
~/linkedin-archive/
    Basic_LinkedInDataExport_08-05-2026.zip        <- read in place, no unzip
    Complete_LinkedInDataExport_02-11-2026/        <- unzipped folder
        Profile.csv, Positions.csv, Jobs/, ...
    Profile.csv                                    <- loose CSVs also fine
```

The newest is selected automatically. Dates are read from LinkedIn's filename
(`MM-DD-YYYY`, and ISO `YYYY-MM-DD` if you rename them), falling back to file
modification time.

Old exports are worth keeping: LinkedIn gives you no profile history, so a
second export is the only way to answer *"what changed since last time?"*

Switch with `use_archive("02-11")` — partial names work — and `use_archive()`
with no argument returns to the newest.

---

## Tools

| Tool | What it does |
| --- | --- |
| `profile_as_markdown` | Whole profile as one document — **the one to use before any rewrite** |
| `get_profile` | Name, headline, About, industry, location |
| `get_positions` | Full work history with descriptions |
| `get_education` | Schools, degrees, dates |
| `get_skills` | Skills with endorsement counts |
| `get_certifications` | Certs and licenses |
| `get_recommendations` | Received or given |
| `get_posts` | Past posts, newest first, optional keyword filter |
| `search_connections` | Your 1st-degree connections by name, company, or title |
| `search_all` | Full-text search across every file |
| `list_archives` | All exports found, with dates, and which is active |
| `use_archive` | Switch to a different export |
| `archive_status` | Active export and its files with row counts |
| `inspect_file` | Raw columns and sample rows for one file |

---

## Troubleshooting

**Tools don't appear in Claude Desktop.**
Almost always the config. Check in order:
1. Valid JSON — a trailing comma will silently break the whole file
2. Both paths absolute, no `~`
3. `python3` resolvable — run `which python3` and paste the full binary path
   into `"command"` if Claude Desktop can't find it on PATH
4. Actually quit the app, not just the window
5. Logs: `~/Library/Logs/Claude/mcp*.log` on macOS

**"No LinkedIn export found."**
The folder is empty, or you pointed at a ZIP/CSV instead of the folder
containing it. `list_archives` shows what was found and where it looked.

**A section comes back empty.**
LinkedIn renames files and columns periodically. Run `archive_status` to see
what you actually got, then `inspect_file` on the one you expected — it prints
the real column names. Matching is fuzzy and case-insensitive so most renames
are absorbed, but please open an issue if one isn't.

**Reads are slow or fail from cloud storage.**
Mark the folder available offline, or keep the archive on local disk.

**`Connections.csv` looks garbled in other tools.**
LinkedIn puts several lines of human-readable notes above the real header. This
server finds the header by column-count consensus, so it handles it.

---

## Privacy

Your export is sensitive. The full archive includes your **message history**,
your connections' names and titles, and email addresses for those who chose to
share them.

**This server makes no network calls.** It imports only Python's standard
library — `csv`, `io`, `os`, `re`, `zipfile`, `datetime`, `pathlib` — and has no
HTTP client, no telemetry, and no third-party dependencies beyond the MCP SDK
itself. Your data is read from disk and returned to your MCP client. Nothing
else. It's ~600 lines; you can confirm this in a couple of minutes.

- Your data never leaves your machine except as tool results you ask Claude for.
- The included `.gitignore` blocks `*.csv`, `*.zip`, and `*LinkedInDataExport*`
  so you don't commit your own data. **Don't remove those lines.**
- Before putting a full export in a *shared* cloud folder, remember everyone
  with access can read all of it. The targeted export (no messages, no
  connections) is much safer to sync.

---

## License

MIT

## Disclaimer

Unofficial. Not affiliated with, endorsed by, or sponsored by LinkedIn
Corporation. It only reads data LinkedIn has already given you, so it doesn't
touch the scraping and automation prohibitions in LinkedIn's User Agreement.