@maheidem/linkedin-mcp
npm
v2.2.0
Published by @maheidem — no publish provenance, so origin is unverified, but the source is public: the repository link below is self-declared yet readable, so you can inspect the code before adopting it.
Comprehensive LinkedIn API MCP server with automatic Claude configuration
The grade answers one question — how safe is this server for you to adopt — so it is computed in two auditable stages. Nothing below is an opinion or an LLM's guess; every line is a real term the deterministic engine applied, and the same input always yields the same number.
1. Threat score — 100 − 0 = 100. What the published surface and source actually contain:
The deterministic scan raised no scored threat in the surface it inspected — the threat score stayed at 100. Capability observations and advisory notes are recorded but never lower it.
2. Client adoption risk — 100 − 7 = 93. Three small, subtract-only factors that reflect your risk in adopting it — a clean scan proves less on a powerful, unverified or barely-inspectable package, so the grade says so plainly:
| Points | Adoption-risk factor |
|---|---|
| −6 | capability blast radius (high) — client exposure if the model is manipulated |
| −1 | publisher verification (public source) — no provenance, but the source is public and inspectable |
Capability observations and info notes are shown under Findings but never scored.
Open any row's finding below for the file, line and evidence behind a deduction.
In the server's implementation (`dist/linkedin-complete-mcp.js:45`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: require("http"); const child_process_1 = require("child_process"); const simple_token_manager_js_1 = require("./simple-
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/linkedin-complete-mcp.js
In the server's implementation (`dist/oauth-setup.js:50`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: (require("url")); const child_process_1 = require("child_process"); const inquirer_1 = __importDefault(require("inquirer
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/oauth-setup.js
In the server's implementation (`dist/api/linkedin-client.js:89`): A hardcoded outbound call to a fixed external host inside server code is a classic exfiltration/telemetry channel — especially paired with reads of local data. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: const response = await fetch('https://www.linkedin.com/oauth/v2/accessToken', { method: 'POST',
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/api/linkedin-client.js
In the server's implementation (`dist/linkedin-basic-mcp.js:303`): A hardcoded outbound call to a fixed external host inside server code is a classic exfiltration/telemetry channel — especially paired with reads of local data. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: const response = await fetch('https://api.linkedin.com/v2', { method: 'GET', }); tests.push
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/linkedin-basic-mcp.js
In the server's implementation (`dist/linkedin-complete-mcp-v2.js:405`): A hardcoded outbound call to a fixed external host inside server code is a classic exfiltration/telemetry channel — especially paired with reads of local data. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: st userResponse = await fetch('https://api.linkedin.com/v2/userinfo', { headers: { 'Authoriz
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/linkedin-complete-mcp-v2.js
In the server's implementation (`dist/linkedin-complete-mcp.js:250`): A hardcoded outbound call to a fixed external host inside server code is a classic exfiltration/telemetry channel — especially paired with reads of local data. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: const response = await fetch('https://www.linkedin.com/oauth/v2/accessToken', { method: 'POST', headers
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/linkedin-complete-mcp.js
In the server's implementation (`dist/linkedin-working-mcp.js:190`): A hardcoded outbound call to a fixed external host inside server code is a classic exfiltration/telemetry channel — especially paired with reads of local data. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: const response = await fetch('https://www.linkedin.com/oauth/v2/accessToken', { method: 'POST', headers
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/linkedin-working-mcp.js
In the server's implementation (`dist/oauth-setup.js:266`): A hardcoded outbound call to a fixed external host inside server code is a classic exfiltration/telemetry channel — especially paired with reads of local data. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: const response = await fetch('https://www.linkedin.com/oauth/v2/accessToken', { method: 'POST',
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server dist/oauth-setup.js
In a packaging/dev/install script (shipped, but not the server runtime) (`examples/post-to-linkedin.js:31`): A hardcoded outbound call to a fixed external host inside server code is a classic exfiltration/telemetry channel — especially paired with reads of local data. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: st userResponse = await fetch('https://api.linkedin.com/v2/userinfo', { headers: { 'Authorization': `Beare
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server examples/post-to-linkedin.js
In a packaging/dev/install script (shipped, but not the server runtime) (`examples/get-linkedin-token.js:3`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: st { spawn } = require('child_process'); const readline = require('readline'); async function getLinkedInToken() { co
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server examples/get-linkedin-token.js
In a packaging/dev/install script (shipped, but not the server runtime) (`examples/linkedin-mcp-demo.js:3`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: st { spawn } = require('child_process'); async function callLinkedIn(toolName, args = {}) { const process = spawn('np
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server examples/linkedin-mcp-demo.js
In a packaging/dev/install script (shipped, but not the server runtime) (`examples/linkedin-oauth-complete.js:3`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: st { spawn } = require('child_process'); const http = require('http'); const url = require('url'); const { execSync } =
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server examples/linkedin-oauth-complete.js
In a packaging/dev/install script (shipped, but not the server runtime) (`examples/linkedin-oauth-debug.js:3`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: st { spawn } = require('child_process'); const http = require('http'); const url = require('url'); const { execSync } =
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server examples/linkedin-oauth-debug.js
In a packaging/dev/install script (shipped, but not the server runtime) (`examples/linkedin-oauth-local.js:3`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: st { spawn } = require('child_process'); const http = require('http'); const url = require('url'); const { execSync } =
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server examples/linkedin-oauth-local.js
In a packaging/dev/install script (shipped, but not the server runtime) (`examples/linkedin-success.js:8`): Spawning a shell/process is command-execution capability; with unsanitized tool input it is command injection / RCE. This is read from the code itself — not from the tool description — so a poisoned server cannot hide it behind honest-looking metadata.
Evidence: st { spawn } = require('child_process'); const http = require('http'); const url = require('url'); const { execSync } =
Fix: Review this call path: confirm it never receives unsanitized tool input, constrain it, or remove it. Treat a server whose code reaches these sinks as high-capability regardless of what its tools claim.
Location: server examples/linkedin-success.js
Each tool and what it can reach — statically extracted from the published source.
linkedin_messaging_send_messagenetwork egresscreate_update_guideno sensitive capabilitygenerate_summaryno sensitive capabilitylinkedin_ads_create_campaignno sensitive capabilitylinkedin_ads_get_analyticsno sensitive capabilitylinkedin_ads_get_campaignsno sensitive capabilitylinkedin_ads_get_targeting_facetsno sensitive capabilitylinkedin_ads_update_campaignno sensitive capabilitylinkedin_analyze_profile_from_datano sensitive capabilitylinkedin_assets_get_upload_urlno sensitive capabilitylinkedin_assets_uploadno sensitive capabilitylinkedin_authenticateno sensitive capabilitylinkedin_auto_authno sensitive capabilitylinkedin_check_authno sensitive capabilitylinkedin_compliance_get_eventsno sensitive capabilitylinkedin_create_optimized_postno sensitive capabilitylinkedin_create_postno sensitive capabilitylinkedin_events_createno sensitive capabilitylinkedin_events_getno sensitive capabilitylinkedin_exchange_codeno sensitive capabilitylinkedin_generate_optimized_contentno sensitive capabilitylinkedin_get_api_healthno sensitive capabilitylinkedin_get_auth_urlno sensitive capabilitylinkedin_get_feedno sensitive capabilitylinkedin_get_post_commentsno sensitive capabilitylinkedin_get_post_detailsno sensitive capabilitylinkedin_get_profileno sensitive capabilitylinkedin_get_rate_limitsno sensitive capabilitylinkedin_get_user_activityno sensitive capabilitylinkedin_get_user_infono sensitive capabilitylinkedin_get_user_postsno sensitive capabilitylinkedin_jobs_postno sensitive capabilitylinkedin_jobs_searchno sensitive capabilitylinkedin_learning_get_classificationsno sensitive capabilitylinkedin_learning_get_coursesno sensitive capabilitylinkedin_logoutno sensitive capabilitylinkedin_messaging_get_conversationsno sensitive capabilitylinkedin_oauth_exchange_codeno sensitive capabilitylinkedin_oauth_get_auth_urlno sensitive capabilitylinkedin_oauth_refresh_tokenno sensitive capabilitylinkedin_organizations_get_companyno sensitive capabilitylinkedin_organizations_get_follower_statsno sensitive capabilitylinkedin_people_get_profileno sensitive capabilitylinkedin_people_search_membersno sensitive capabilitylinkedin_post_profile_updateno sensitive capabilitylinkedin_posts_createno sensitive capabilitylinkedin_posts_deleteno sensitive capabilitylinkedin_posts_getno sensitive capabilitylinkedin_posts_updateno sensitive capabilitylinkedin_request_profile_api_accessno sensitive capabilitylinkedin_sales_navigator_profile_associationno sensitive capabilitylinkedin_social_actions_commentno sensitive capabilitylinkedin_social_actions_likeno sensitive capabilitylinkedin_social_actions_shareno sensitive capabilitylinkedin_talent_unified_searchno sensitive capabilitylinkedin_test_connectionno sensitive capabilitylinkedin_ugc_createno sensitive capabilitytrack_updatesno sensitive capabilityScan history per published version. The engine is deterministic — the same version always yields the same score, so a changed score means the package itself changed.
| Version | Score | Findings | Engine | Scanned |
|---|---|---|---|---|
v2.2.0 latest |
A 93/100 | 15 | 1.13.0 | 2026-09-07 |
Show this server's live Trust Score in your README, docs or website. The badge is served straight from the registry and updates automatically after every rescan — no API key needed. It links back to this page, so anyone who sees the grade can also read the findings behind it instead of taking a number on faith.
The score above is reproducible: the same package version always yields the same result. Run it locally or over the free API — no account, no LLM, fully deterministic.
npx mcptrustchecker scan @maheidem/linkedin-mcp --online
Independent packages implementing the same tool, scanned with the same engine. Compare all 21 side by side →
LinkedIn Ads MCP Server - Campaign entity management and reporting via LinkedIn Marketing API v2
LinkedIn MCP server — publish posts, articles, and media via the LinkedIn API
MCP server for LinkedIn API via HarvestAPI - Returns cleaned data in TOON format for token efficiency
MCP server for LinkedIn — post, comment, react, and manage content via AI agents
MCP server for linkedin API integration
MCP server for posting to LinkedIn via the LinkedIn API using an OAuth access token
Official Abyssfall game info, newsletter double opt-in, and merch reservation tools.
AdCritter ads platform: docs, API reference, app scaffolding, and white-label integration.
Google AdSense MCP Server - Monitor earnings, reports, and account health via Claude/AI
Operational empathy for technical founders + PE/VC operators navigating high-stakes B2B interactions. 28 MCP tools + CLI: ICP scoring, persona simulation, battlecards, deal classification, prospect discovery, investor matching, founder wellness, plus mark
MCP server for Bing Webmaster Tools — SEO site management, URL submission, sitemaps, stats, keywords
MCP (Model Context Protocol) server that helps AI agents use Primer Brand (@primer/react-brand) correctly when building GitHub marketing and landing pages.