Skip to main content

MCP server for LinkedIn Company Page administration - read analytics, manage posts, edit page details, grow followers. Includes personal->company bridge tools for employee advocacy.

Project description

linkedin-company-admin-mcp

Python License: MIT Code style: ruff Checked with mypy

MCP server for LinkedIn Company Page administration. Read analytics, manage posts, edit page details, grow followers, and bridge your personal profile for employee advocacy workflows.

Complementary to stickerdaniel/linkedin-mcp-server. Stickerdaniel's project covers personal LinkedIn use cases (feed, messaging, search). This project fills the gap nobody else fills: full administrative control of your LinkedIn Company Page, plus a small set of personal-profile bridge tools used exclusively for employee-advocacy flows.

Why this project

LinkedIn's official Community Management API is invite-only. Scraping personal profiles is already well covered. What was missing: a stable, browser-first MCP that lets a page admin (or their assistant LLM) read analytics, draft posts, edit the about section, invite followers, and tag the page from a personal post - without any of it touching a stored password.

Features at a glance

  • 24 MCP tools across 6 categories - see Tool reference below.
  • Zero credentials on disk. Interactive login via a visible Chromium window; session lives in a persistent profile directory (chmod 0o700 on Unix).
  • Stealth Chromium via Patchright (anti-detection fork of Playwright).
  • Provider abstraction (AdminProvider, PostsProvider) so a future Community Management API backend can slot in without rewriting tools.
  • Rate limiting actually applied (not just imported) - every write tool has a conservative hourly cap.
  • aria-label / role / innerText selectors only - no obfuscated CSS class hashes. When LinkedIn ships a new UI, only selectors/__init__.py changes.
  • No god-files (cap ~300 LOC per file), type-checked with mypy, linted with ruff.

Installation

Option 1: uvx (recommended, once published)

uvx linkedin-company-admin-mcp@latest --login

Then add to your Claude Desktop config (~/.config/Claude/claude_desktop_config.json or platform equivalent):

{
  "mcpServers": {
    "linkedin-company-admin": {
      "command": "uvx",
      "args": ["linkedin-company-admin-mcp@latest"]
    }
  }
}

Option 2: Local development

git clone https://github.com/negrueu/linkedin-company-admin-mcp.git
cd linkedin-company-admin-mcp
uv sync
uv run linkedin-company-admin-mcp --login

Option 3: Docker

docker build -t linkedin-company-admin-mcp .
docker run --rm -it \
  -v linkedin_profile:/home/mcp/.linkedin-company-admin \
  linkedin-company-admin-mcp --login

First-time login

Credentials are never stored in this server. Login is interactive:

uvx linkedin-company-admin-mcp --login

A visible Chromium window opens. Sign in to LinkedIn normally (including 2FA). The persistent browser profile is saved to ~/.linkedin-company-admin/profile (chmod 0o700 on Unix). All subsequent MCP calls reuse this session automatically.

To log out: uvx linkedin-company-admin-mcp --logout (wipes the profile directory).

Tool reference

Full argument lists and examples live in docs/TOOL_REFERENCE.md. Summary:

Session (3)

Tool Purpose
session_status Is the persistent profile live and logged in?
session_warmup Pre-open the browser + /feed/ to reduce first-call latency.
session_logout Close the browser and wipe the profile directory.

Company read (6)

Tool Purpose
company_read_page Name, tagline, followers, about, industry, website.
company_list_posts Recent posts with URN, text, reactions, comments.
company_list_followers Followers list (admin-only; paginated).
company_list_mentions Posts that mentioned the page (admin notifications).
company_manage_admins List admins and their roles.
company_analytics Followers / posts metrics for a 7d / 28d / 90d window.

Company admin write (3)

Tool Purpose
company_edit_about Update the About section (with tagline fallback).
company_edit_logo Upload a new logo (and optional banner).
company_update_details Website, industry, size, specialties.

Company content (6)

Tool Purpose
company_create_post Publish a text post (optional link / image).
company_edit_post Replace the body of an existing post.
company_delete_post Permanent delete - see docs/RCA_DELETE_POST.md.
company_schedule_post Publish at a future ISO-8601 datetime.
company_reply_comment Reply as the page to a comment on one of your posts.
company_reshare_post Reshare another post on the page, optional commentary.

Company growth (2)

Tool Purpose
company_invite_to_follow Send follow invitations to 1st-degree connections (LinkedIn caps 250/month).
company_list_scheduled List posts queued for future publication.

Personal -> Company bridge (4)

Tool Purpose
personal_tag_company Publish a personal post that @-mentions the page.
personal_reshare_company_post Reshare a page post on your personal profile.
personal_comment_as_admin Comment on a page post as the page (or as you).
personal_read_company_mentions Scan your recent activity for posts that tag the page.

Security model

  • No email/password handling. Credentials never touch this code.
  • Session state lives in a persistent browser profile directory, isolated per OS user, outside the repo.
  • .env contains only configuration (log level, transport, tool timeout). No secrets.
  • The profile directory is chmod'd to 0o700 on first login (Unix).
  • Rate limiting is enforced per-tool; the caps are conservative by design, tuned to what LinkedIn tolerates rather than what it allows.

Supported workflows

  • Draft, review, and publish a post on your company page from Claude.
  • Tag the page from a personal post and track how the community responds.
  • Audit who has posted about your page this week (admin mentions).
  • Invite a batch of 1st-degree connections to follow the page, stopping at LinkedIn's monthly quota.
  • Run a full CRUD pass on scheduled posts before a launch.

See docs/TOOL_REFERENCE.md for end-to-end examples.

Troubleshooting

Selector drift, captcha, rate limits, cookie expiry and Chromium launch issues are all covered in docs/TROUBLESHOOTING.md.

Contributing

Contributions welcome. See docs/CONTRIBUTING.md for local setup, test layout, and the workflow for adding a new tool.

Status

Under active development. See CHANGELOG.md for version history and issues for the roadmap. The public release is not yet on PyPI - install from source until then.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

linkedin_company_admin_mcp-0.1.0.tar.gz (45.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

linkedin_company_admin_mcp-0.1.0-py3-none-any.whl (55.7 kB view details)

Uploaded Python 3

File details

Details for the file linkedin_company_admin_mcp-0.1.0.tar.gz.

File metadata

File hashes

Hashes for linkedin_company_admin_mcp-0.1.0.tar.gz
Algorithm Hash digest
SHA256 3fccd7f9a2647ecb464995fa0d6c74fa88fed1bf26eb51905ee9f2451238cb8c
MD5 d72cee6d5ee5a8984c093eb439f1e3df
BLAKE2b-256 6cac05272cea7180293bdd5c972381cff0aff75f461dae9ef7160f934d924447

See more details on using hashes here.

Provenance

The following attestation bundles were made for linkedin_company_admin_mcp-0.1.0.tar.gz:

Publisher: release.yml on negrueu/linkedin-company-admin-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file linkedin_company_admin_mcp-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for linkedin_company_admin_mcp-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 45b3f6324a20be2de8021845f05d3090523c6021e6e568b734beb55113fe8d75
MD5 a571a40d3b4c01a6972a454d5cccdb24
BLAKE2b-256 fda64018cce2092bc829f6cf67840ff0eed625f8dfd9e2a507e20530b95aef7f

See more details on using hashes here.

Provenance

The following attestation bundles were made for linkedin_company_admin_mcp-0.1.0-py3-none-any.whl:

Publisher: release.yml on negrueu/linkedin-company-admin-mcp

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page