ECC
The agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.
npx ecc-install --profile fullThe agent harness performance optimization system. Skills, instincts, memory, security, and research-first development for Claude Code, Codex, Opencode, Cursor and beyond.
npx ecc-install --profile fullFair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
npx n8nAn open-source AI agent that brings the power of Gemini directly into your terminal.
npx @google/gemini-cli2720 GitHub stars recorded
| Tool | Description | Status |
|---|---|---|
get_person_profile | Get profile info with explicit section selection (experience, education, interests, honors, languages, certifications, skills, projects, contact_info, posts) | working |
get_my_profile | Get the authenticated user's own LinkedIn profile (same sections as get_person_profile) | working |
connect_with_person | Send a connection request or accept an incoming one, with optional note | #407 #432 #454 |
get_sidebar_profiles | Extract profile URLs from sidebar recommendation sections ("More profiles for you", "Explore premium profiles", "People you may know") on a profile page | working |
get_inbox | List recent conversations from the LinkedIn messaging inbox | working |
get_conversation | Read a specific messaging conversation by username or thread ID | working |
search_conversations | Search messages by keyword | working |
send_message | Send a message to a LinkedIn user (requires confirmation) | #433 #441 #483 #560 |
get_company_profile | Extract company information with explicit section selection (posts, jobs); about-section references may include a company_urn entry carrying the numeric id used by LinkedIn's people-search currentCompany URL facet | working |
get_company_posts | Get recent posts from a company's LinkedIn feed | working |
search_companies | Search for companies on LinkedIn by keywords | working |
get_company_employees | List employees at a company from the /people/ page, with optional keyword filter | working |
search_jobs | Search for jobs with keywords and location filters | working |
search_people | Search for people by keywords, location, connection degree (1st/2nd/3rd), and current company | working |
get_job_details | Get detailed information about a specific job posting | working |
get_feed | Get recent posts from the authenticated user's home feed | working |
close_session | Close browser session and clean up resources | working |
Contributions are welcome! See CONTRIBUTING.md for architecture guidelines and checklists. Please open an issue first to discuss the feature or bug fix before submitting a PR.
Prerequisites: Git and uv installed
# 1. Clone repository
git clone https://github.com/stickerdaniel/linkedin-mcp-server
cd linkedin-mcp-server
# 2. Install UV package manager (if not already installed)
curl -LsSf https://astral.sh/uv/install.sh | sh
# 3. Install dependencies
uv sync
uv sync --group dev
# 4. Install pre-commit hooks
uv run pre-commit install
# 5. Start the server
uv run -m linkedin_mcp_server
The local server uses the same managed-runtime flow as MCPB and uvx: it prepares the Patchright Chromium browser cache in the background and opens LinkedIn login on the first auth-requiring tool call. You can still run uv run -m linkedin_mcp_server --login when you want to create the session explicitly.
CLI Options:
--login - Open browser to log in and save persistent profile--import-from-browser [BROWSER] - Import a LinkedIn session from a locally logged-in Chromium browser (chrome, chromium, brave, edge, , , , , , or ). Bare flag picks , which auto-selects the most recently used browser with a live LinkedIn session.arcvivaldiheliumyandexwhaleautoauto--no-headless - Show browser window (useful for debugging scraping issues)--log-level {DEBUG,INFO,WARNING,ERROR} - Set logging level (default: WARNING)--transport {stdio,streamable-http} - Optional: force transport mode (default: stdio)--host HOST - HTTP server host (default: 127.0.0.1)--port PORT - HTTP server port (default: 8000)--path PATH - HTTP server path (default: /mcp)--logout - Clear stored LinkedIn browser profile--timeout MS - Browser timeout for page operations in milliseconds (default: 5000)--tool-timeout SECONDS - Per-tool MCP execution timeout in seconds (default: 180.0). Increase further for heavy scrapes / cold-start Chromium / slow networks.--status - Check if current session is valid and exit--user-data-dir PATH - Path to persistent browser profile directory (default: ~/.linkedin-mcp/profile)--slow-mo MS - Delay between browser actions in milliseconds (default: 0, useful for debugging)--user-agent STRING - Custom browser user agent--viewport WxH - Browser viewport size (default: 1280x720)--chrome-path PATH - Path to Chrome/Chromium executable (for custom browser installations)--help - Show helpNote: Most CLI options have environment variable equivalents. See
.env.examplefor details.
HTTP Mode Example (for web-based MCP clients):
uv run -m linkedin_mcp_server --transport streamable-http --host 127.0.0.1 --port 8000 --path /mcp
Claude Desktop:
{
"mcpServers": {
"mcp-server-linkedin": {
"command": "uv",
"args": ["--directory", "/path/to/linkedin-mcp-server", "run", "-m", "linkedin_mcp_server"]
}
}
}
stdio is used by default for this config.
Login issues:
--login--login command opens a browser where you can solve it manually.Scraping issues:
--no-headless to see browser actions and debug scraping problems--log-level DEBUG to see more detailed loggingSession issues:
~/.linkedin-mcp/profile/--logout to clear the profile and start freshPython/Patchright issues:
python --version (should be 3.12+)uv run patchright install chromiumuv sync --reinstallTimeout issues:
--timeout 10000 or TIMEOUT=10000 (milliseconds, default 5000).--tool-timeout 300 or TOOL_TIMEOUT=300 (seconds, default 180).AUTO_IMPORT_FROM_BROWSER / --auto-import) instead of forcing a manual login. On macOS the keychain may prompt once for Safe Storage access. If no importable browser session exists, it falls back to opening a login window and waits up to LOGIN_INLINE_WAIT seconds (default 25, max 45; --login-inline-wait) so a quick sign-in resolves in one call. If the wait elapses, the tool returns a pending signal and the model retries in about 30 seconds. Neither the auto-import nor the inline wait applies under Docker or when the server is bound to a non-loopback HTTP host; create the session on the host with --login.Custom Chrome path:
--chrome-path /path/to/chromeCHROME_PATH=/path/to/chrome[!IMPORTANT] FAQ
Is this safe to use? Will I get banned? This tool controls a real browser session; it doesn't exploit undocumented APIs or bypass authentication. LinkedIn's User Agreement prohibits automated access, and accounts using automated tools can be restricted or banned. Use at your own risk; there is no guarantee of account safety. If you encounter any issues, let me know in the Discussions.
What if my agents execute too many actions? Tool calls run sequentially through a queue. You are responsible for the volume of automation you run; use it sparingly and prompt your agents responsibly.
Transport Modes:
stdioCLI Options:
--log-level {DEBUG,INFO,WARNING,ERROR} - Set logging level (default: WARNING)--transport {stdio,streamable-http} - Optional: force transport mode (default: stdio)--host HOST - HTTP server host (default: 127.0.0.1)--port PORT - HTTP server port (default: 8000)--path PATH - HTTP server path (default: /mcp)--logout - Clear all stored LinkedIn auth state, including source and derived runtime profiles--timeout MS - Browser timeout for page operations in milliseconds (default: 5000)--tool-timeout SECONDS - Per-tool MCP execution timeout in seconds (default: 180.0). Increase further for heavy scrapes / cold-start Chromium / slow networks.--login-timeout SECONDS - Manual login wait timeout in seconds (default: 1800; 0 = no limit). How long the --login browser waits for you to finish signing in.--login-inline-wait SECONDS - Bounded inline wait for a tool call to resume after login completes, in seconds (default: 25, max 45; 0 = return immediately).--auto-import / --no-auto-import - Enable or disable auto-import of a session from a locally logged-in browser on the first no-session tool call (before falling back to manual login). Auto-import is on by default across interactive and non-interactive desktop runs; pass --no-auto-import (or AUTO_IMPORT_FROM_BROWSER=false) to require --login / --import-from-browser instead. No effect under Docker or on a non-loopback HTTP bind. On macOS the keychain may prompt once for Safe Storage access.--user-data-dir PATH - Path to persistent browser profile directory (default: ~/.linkedin-mcp/profile)--chrome-path PATH - Path to Chrome/Chromium executable (rarely needed in Docker)[!NOTE]
--loginand--no-headlessare not available in Docker (no display server). Use the uvx setup to create profiles.
HTTP Mode Example (for web-based MCP clients):
docker run -it --rm \
-v ~/.linkedin-mcp:/home/pwuser/.linkedin-mcp \
-p 8080:8080 \
stickerdaniel/linkedin-mcp-server:latest \
--transport streamable-http --host 0.0.0.0 --port 8080 --path /mcp
Runtime server logs are emitted by FastMCP/Uvicorn.
Test with mcp inspector:
bunx @modelcontextprotocol/inspectorStreamable HTTP as Transport TypeURL to http://localhost:8080/mcpDocker issues:
docker psLogin issues:
--loginuvx mcp-server-linkedin@latest --login which opens a browser where you can solve captchas manually. See the uvx setup for prerequisites.Timeout issues:
--timeout 10000 or TIMEOUT=10000 (milliseconds, default 5000).--tool-timeout 300 or TOOL_TIMEOUT=300 (seconds, default 180).AUTO_IMPORT_FROM_BROWSER / --auto-import) instead of forcing a manual login. On macOS the keychain may prompt once for Safe Storage access. If no importable browser session exists, it falls back to opening a login window and waits up to LOGIN_INLINE_WAIT seconds (default 25, max 45; --login-inline-wait) so a quick sign-in resolves in one call. If the wait elapses, the tool returns a pending signal and the model retries in about 30 seconds. Neither the auto-import nor the inline wait applies under Docker or when the server is bound to a non-loopback HTTP host; create the session on the host with --login.Custom Chrome path:
--chrome-path /path/to/chromeCHROME_PATH=/path/to/chrome