name: sync-data-linkedin description: > Fetch LinkedIn conversations from browser into a JSON file. No classification, no actions — just data. Requires browser. allowed-tools: Read, Write, Edit, Glob, Grep, Bash(python3:), mcp__claude-in-chrome__
Sync LinkedIn Data
LinkedIn ingestion via browser automation. No classification, no triage. Slow — requires browser. Cannot run in parallel with other browser-based syncs.
Output File
outputs/sync-data/linkedin.json — full replacement on every run.
Schema
{
"version": 1,
"last_synced": "2026-02-11T09:05:00-08:00",
"conversation_count": 20,
"conversations": [
{
"name": "Contact Name",
"title": "Their LinkedIn title/headline",
"isGroup": false,
"lastActivity": "2026-02-11 08:30",
"unreadCount": 0,
"lastMessagePreview": "text",
"isMessageRequest": false,
"messages": [
{
"sender": "Contact Name",
"timestamp": "2026-02-11 08:30",
"content": "Message text here"
}
]
}
]
}
Steps
- Get browser tab context via
tabs_context_mcp. - Use an existing LinkedIn tab or create a new one. Navigate to
https://www.linkedin.com/messaging/. - Wait for message list to load. If login required, ask Master to authenticate.
- Extract the conversation list (first 20 conversations) from the sidebar.
For each conversation, capture list-level metadata:
name: contact name (or group name)title: their LinkedIn headline/title if visible in the sidebarisGroup: true if group conversation indicator presentlastActivity: timestamp of last messageunreadCount: unread badge count (0 if none)lastMessagePreview: the preview text visible in the sidebar
Open EVERY conversation and extract messages. For each conversation in the list:
a. Click on the conversation in the sidebar. b. Wait 1-2 seconds for messages to load. c. Verify the conversation opened by checking the header matches the expected contact name. d. Extract the last 5-10 visible messages. Each message:
{ sender, timestamp, content }e. If the contact's title wasn't visible in the sidebar, capture it from the conversation header.Check "Message Requests" tab. After processing regular conversations: a. Look for "Message Requests" or "Other" tab/filter in the messaging sidebar. b. If found, click into it and scan for conversations with messages. c. Extract these the same way, with
isMessageRequest: true. d. Include them in the conversations array.Only include conversations currently visible. The output is a full replacement — do NOT carry forward conversations from previous syncs. Output reflects exactly what's in the message list now.
Build the output object with
version,last_synced(current ISO timestamp with timezone offset),conversation_count, andconversations.Write to
outputs/sync-data/linkedin.json(full replacement).Log: "Synced {N} LinkedIn conversations at {timestamp}"
Known Issues
- LinkedIn messaging UI changes frequently. If selectors break, use
read_pageorfindtools to locate elements by their purpose rather than hardcoded selectors. - LinkedIn may show "Premium" upsell overlays — dismiss them and continue.
- Message timestamps on LinkedIn are often relative ("2h ago", "3d") — capture as-is, don't try to convert.
- Some conversations may show "InMail" badge — still extract normally.
- LinkedIn virtualizes the conversation list — scroll down if fewer than 20 conversations are visible.
Notes
- This skill does NOT classify or triage. That's
alfred-linkedin-message-triage. - The file is always the latest snapshot. No historical accumulation.
- Requires exclusive browser access — cannot run in parallel with other browser-based skills.