LinkedIn MCP Server (thomascox/LinkedInMCP) is an MCP server listed on the M8ven Trust Index. It scores 52 out of 100, grade D. It declares 23 tools. No publisher has claimed this listing.
Enables LinkedIn automation including search, profile viewing, connection management, job details, and Easy Apply via Playwright with stealth and rate limiting.
Caution. Specific findings reduced this grade. They are listed on the page. Grades reflect the full trust pyramid: code, verification depth, and reputation. New projects cap at C until adoption is earned.
How we verified
Verified is a snapshot. Live keeps it current, and builds your track record.
⚡ Connect GitHub → continuous verification on every pushwhy connect →Who stands behind it
thomascox
Source: Glama
Claim it to get a verified publisher badge, a free copy of our full audit findings, and direct contact for any high-priority issues we find. Or connect your repo for our deepest verification, Live Monitored: read-only, revoke anytime. What we access →
Install from
The grade above is for the source repository. Registries can serve a different version, so we mark the ones we were not able to read.
These names and descriptions are the publisher's own, read from the source code. We print them as written. Our assessment is the findings above, not this list.
linkedin_pingCheck that the LinkedIn MCP server is running
manage_auth_sessionManage LinkedIn authentication. Use 'capture' to open a browser for manual login and save the session. Use 'verify' to check validity. NOTE: Sessions expire after ~24-48 hours. If any tool returns a session-expired error, re-run with 'capture'. LinkedIn may present CAPTCHA challenges during capture…
search_linkedinSearch LinkedIn for people or jobs. Returns structured JSON results including profile URLs (people) or job IDs with Easy Apply status (jobs).
get_messagesRetrieve the last 10 conversation threads from the LinkedIn messaging inbox. Returns sender names and message snippets.
send_linkedin_messageSend a direct message to a LinkedIn user via their profile URL. Only works for 1st-degree connections where the Message button is available.
manage_profileManage your LinkedIn profile. Use 'get_profile' to scrape your headline, about, and experience. Use 'update_section' to edit a specific section (headline or about).
start_applicationStart an Easy Apply application for a LinkedIn job. Returns structured form fields and a text summary for each step. The browser session stays alive for subsequent fill_application_step calls. IMPORTANT: If you get a session-expired error, call manage_auth_session with 'capture' first. If Easy Appl…
fill_application_stepFill the current Easy Apply form step and advance. Match answers to fields by their 'label' from the previous step's fields array. Tips: Use action='next' for intermediate steps, 'review' for the review page, 'submit' only on the final review step. If validation errors are returned, check required …
cancel_applicationCancel and clean up an in-progress Easy Apply session. Call this to abort, on unrecoverable errors mid-application, or before starting a new application (each job requires its own session).
view_profileView any LinkedIn profile by URL. Returns name, headline, location, about, experience (top 5), education (top 3), and skills (top 10) as compact JSON. The profile_url must be a full LinkedIn URL (e.g. 'https://www.linkedin.com/in/username'). If a profile is private or out-of-network, some sections …
send_connection_requestSend a LinkedIn connection request to a profile. Returns status: sent | already_connected | pending | limit_reached | connect_button_not_found. IMPORTANT: If status is 'limit_reached', stop and inform the user — LinkedIn enforces a weekly cap on invitations. Optional note is capped at 300 character…
get_job_detailsGet full details for a LinkedIn job posting. Returns title, company, location, workplace type, posted date, applicant count, Easy Apply status, and description (capped at 2000 chars). Use the job_id from search_linkedin results. If the listing was removed, you will get an empty response — search ag…
save_jobBookmark/save a LinkedIn job for later. Returns status: saved | already_saved. Use job_id from search_linkedin or get_job_details.
get_saved_jobsRetrieve your saved/bookmarked LinkedIn jobs. Returns up to 20 jobs with the same structure as search_linkedin (jobId, title, company, location, easyApply).
get_conversationRead the full message history of a LinkedIn conversation thread. Returns up to 20 messages with sender, text (capped at 500 chars), and timestamp. Use the conversationUrl from get_messages results. Call get_messages first if you don't have a conversation URL.
get_unread_countGet the count of unread messages and unread notifications from the LinkedIn nav badges. Fast check — navigates to the feed and reads badge numbers without loading full inbox.
get_feedFetch the top 10 non-promoted posts from your LinkedIn home feed. Returns author, headline, post text snippet (300 chars), reaction count, comment count, and post URL.
create_postCreate a new LinkedIn post. IMPORTANT: Always confirm the exact post text with the user before calling this tool — posts are immediately visible to your network. Returns status: posted. visibility defaults to 'anyone' (public). Use 'connections' to limit to 1st-degree connections only.
react_to_postReact to a LinkedIn post. Use the postUrl from get_feed results. Available reactions: like | celebrate | support | funny | love | insightful. If the reaction picker does not open, fall back to 'like'.
get_notificationsFetch your 10 most recent LinkedIn notifications. Returns type (connection | job | reaction | comment | mention | birthday | work_anniversary | profile_view | post_share), actor name, text snippet (200 chars), and timestamp.
get_connectionsList your LinkedIn connections. Returns up to 20 connections with name, headline, and profile URL. Use the optional search keyword to filter by name.
manage_connection_requestsManage incoming LinkedIn connection requests. Use action='list_received' to see pending invites (returns name, headline, profileUrl, mutualConnections). Use 'accept' or 'decline' with a profile_url to respond to a specific request.
manage_experienceAdd or edit a LinkedIn experience entry on your profile. Use action='add' to create a new position, or action='edit' with match_title to update an existing entry. For 'edit': match_title is matched case-insensitively against existing entry titles — use get_profile to see current titles. All fields …
Disclosed vulnerabilities in this server's declared npm dependencies (via OSV). Whether each is reachable depends on the installed versions.
@modelcontextprotocol/sdk has cross-client data leak via shared server/transport instance reuse
Anthropic's MCP TypeScript SDK has a ReDoS vulnerability
Model Context Protocol (MCP) TypeScript SDK does not enable DNS rebinding protection by default
Playwright downloads and installs browsers without verifying the authenticity of the SSL certificate
Tool annotations
No tools have read-only/destructive annotations
Add readOnlyHint or destructiveHint annotations to every tool so hosts can warn users before invoking.
All four hints declared on every tool
23/23 tools missing one or more hints — linkedin_ping (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint); manage_auth_session (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint); search_linkedin (missing: readOnlyHint, destructiveHint, idempotentHint, openWorldHint), +20 more. OpenAI's directory rejects tools where any of the four hints are missing or non-boolean.
For every tool, set all four hints (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) to explicit true/false values that match the handler’s actual behaviour.
Tool inputs are validated
Only 6/23 tool handlers declare input schemas (26%)
Declare an inputSchema with zod/joi/yup on every tool definition.
Tool handlers catch errors
22/23 tool handlers wrap calls in try/catch (96%)
Wrap each tool handler body in try/catch and return a structured error response.
License file
No license file
Add a LICENSE file (MIT, Apache-2.0, etc.).
Tests exist
No test files found
Add tests that exercise each declared tool.
Production dependencies are patched
0 critical, 4 high severity in production deps — @modelcontextprotocol/sdk@1.12.1 (high), @modelcontextprotocol/sdk@1.12.1 (high)
Run npm audit fix, or upgrade the affected packages to a non-vulnerable version.
Claim the listing to review these findings one by one and send us a correction where you disagree, straight to the team. Claiming also means we tell you when the grade moves, and reach you first if we find anything urgent.
[](https://m8ven.ai/mcp/thomascox/linkedinmcp)?variant=verified from the URL.Vetting this one by hand? Tool Check is an MCP that scores other MCPs. Add it once and ask Claude, ChatGPT, or any MCP client to grade a server, surface CVEs, check the publisher, and suggest safer alternatives — before you install.
https://m8ven.ai/api/mcp/tool-check