v0.0.4
uvx linkedin-api-mcp@latestExperience and education now return data
They came back empty in 0.0.3, and the assumption was lazy loading: sections that render once you scroll. That was wrong. Scrolling six full screens leaves the page text byte-identical, 11,659 characters every time.
They are not on the profile page at all. They live at their own routes, /in/<id>/details/experience/ and /details/education/, fully rendered. One navigation gets the lot.
experience: 4 entries
'Technology Lead' at 'Twiss' (Sep 2025 - Present, 1 yr)
'Tech Intern' at 'Biohackk, Internship' (May 2025 - Aug 2025, 4 mos)
education: 2 entries
'National University of Singapore' 'BComp (CS), Computer Science'
Entries are found with the same rule the search parser uses: an entry is the smallest ancestor holding exactly one company or school link. The date range is the one field with a recognisable shape, a year plus a dash or "Present", so what precedes it is title and organisation and what follows is location and description. No positional assumptions.
Education is labelled separately, because LinkedIn lists the school first and the qualification second, the reverse of experience. Naming those by position would have quietly swapped them, and a university name sitting in a field called title looks plausible enough to survive review.
Each section costs one extra navigation, so the caller asks for them rather than paying by default.
One-click install
Buttons for Claude Code, Claude Desktop, Cursor, VS Code, Zed, Windsurf and Codex CLI. The Cursor and VS Code deeplink payloads were decoded and confirmed to produce exactly uvx linkedin-api-mcp, because a malformed payload silently installs a broken server and the person who clicks it never comes back.
Plus an animated header showing a people search, then a message being sent and confirmed by reading the thread back.
A bug worth recording
The author asked for no em-dashes anywhere in the project. A sweep removed them, including one inside a regex character class matching date separators:
/[-<en-dash><em-dash>]|Present|\bto\b/iLinkedIn writes education ranges as Aug 2023 <en-dash> May 2027, so that class must match an en-dash. Removing it turned the class into a character range that matched almost any field containing a year.
It is written as – and — escapes now, so a style rule and the code can no longer collide.
Still open
conversation_idisnullfrom the inbox: LinkedIn binds each row's click to an in-memory object rather than a URL. See #2.- Post reaction and comment counts return
null. See #1.
Disclaimer: This is an independent, community project. It is not affiliated with, authorized by, endorsed by, or sponsored by LinkedIn Corporation or Microsoft. "LinkedIn" is a registered trademark of LinkedIn Corporation and is used here only descriptively to identify the third-party service this software interoperates with.