Skip to main content

Local MCP server for authenticated LinkedIn member post snapshots

Project description

flin-linkedin-posts-mcp

flin-linkedin-posts-mcp is a local MCP server for reading and analyzing the authenticated member's own LinkedIn post/share data.

It uses LinkedIn native OAuth PKCE login and the Member Data Portability API. Each user runs the MCP locally, signs into their own LinkedIn account in the system browser, and stores their token on their own machine.

Important Access Requirement

This MCP does not bypass LinkedIn API approval. The LinkedIn Developer app used by the local user must have access to Member Data Portability API (3rd Party) and the r_dma_portability_3rd_party permission. Without that product/scope, LinkedIn returns 403 ACCESS_DENIED for memberSnapshotData.

Relevant LinkedIn docs:

Features

  • Browser-based LinkedIn login with OAuth PKCE
  • Local token storage outside the repository
  • Auth status and logout tools
  • Snapshot domain count/debug tool
  • Authenticated member post/share listing from MEMBER_SHARE_INFO
  • Post analysis for counts, text length, hashtags, mentions, and top terms

MCP Tools

  1. auth_status
  2. login
  3. logout
  4. list_snapshot_domains
  5. list_member_posts
  6. analyze_member_posts

Configuration

Required for login:

  • LINKEDIN_CLIENT_ID: LinkedIn Developer app client ID

Optional:

  • LINKEDIN_SCOPES: defaults to r_dma_portability_3rd_party
  • LINKEDIN_API_VERSION: defaults to 202312
  • LINKEDIN_RESTLI_PROTOCOL_VERSION: defaults to 2.0.0
  • LINKEDIN_TIMEOUT_SECONDS: defaults to 30
  • LINKEDIN_MAX_RETRIES: defaults to 3
  • LINKEDIN_OAUTH_TIMEOUT_SECONDS: defaults to 300
  • LINKEDIN_TOKEN_FILE: defaults to ~/.flin-linkedin-posts-mcp/tokens.json

The MCP intentionally does not require LINKEDIN_ACCESS_TOKEN anymore. Tokens are created through the login tool.

LinkedIn Developer App Setup

  1. Create or open a LinkedIn Developer app.
  2. Add/obtain access to Member Data Portability API (3rd Party).
  3. Make sure the app can request r_dma_portability_3rd_party.
  4. Configure native PKCE OAuth support with loopback redirect URIs.
  5. Add a loopback redirect URI pattern supported by LinkedIn, for example http://127.0.0.1:{port}/callback if the portal allows dynamic loopback ports. If the portal requires exact ports, run the MCP with a matching callback port after extending the config.
  6. Use the app's Client ID as LINKEDIN_CLIENT_ID.

Claude Desktop Configuration

For a published package:

{
  "mcpServers": {
    "flin-linkedin-posts-mcp": {
      "command": "uvx",
      "args": ["--refresh", "flin-linkedin-posts-mcp@latest"],
      "env": {
        "LINKEDIN_CLIENT_ID": "<YOUR_LINKEDIN_CLIENT_ID>",
        "LINKEDIN_API_VERSION": "202312"
      }
    }
  }
}

For local development from this repository:

{
  "mcpServers": {
    "flin-linkedin-posts-mcp": {
      "command": "uv",
      "args": ["run", "flin-linkedin-posts-mcp"],
      "cwd": "/path/to/flin-linkedin-posts-mcp",
      "env": {
        "LINKEDIN_CLIENT_ID": "<YOUR_LINKEDIN_CLIENT_ID>",
        "LINKEDIN_API_VERSION": "202312"
      }
    }
  }
}

After adding the config, restart the MCP host and call:

  1. auth_status
  2. login
  3. list_snapshot_domains
  4. list_member_posts or analyze_member_posts

Local Development

python3 -m pip install -e '.[dev]'
pytest -q
ruff check .

Packaging

python3 -m build

The package entry point is:

flin-linkedin-posts-mcp

Troubleshooting

  • LINKEDIN_CLIENT_ID is required before running login: set LINKEDIN_CLIENT_ID in the MCP config.
  • 403 ACCESS_DENIED for partnerApiMemberSnapshotData: the LinkedIn Developer app/token likely does not have Member Data Portability API access or r_dma_portability_3rd_party.
  • LinkedIn token has expired: run login again. If LinkedIn issued a refresh token, the MCP attempts a refresh automatically before requiring login.
  • Timed out waiting for LinkedIn OAuth callback: rerun login and complete the browser flow within LINKEDIN_OAUTH_TIMEOUT_SECONDS.

Notes

  • The MCP reads only the authenticated member's own snapshot data.
  • It does not support arbitrary-author LinkedIn post lookup.
  • MEMBER_SHARE_INFO is snapshot/export-style data, so field names can vary. The normalizer is intentionally tolerant and keeps include_raw=true available for debugging.

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

flin_linkedin_posts_mcp-0.2.0.tar.gz (21.8 kB view details)

Uploaded Source

Built Distribution

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

flin_linkedin_posts_mcp-0.2.0-py3-none-any.whl (19.7 kB view details)

Uploaded Python 3

File details

Details for the file flin_linkedin_posts_mcp-0.2.0.tar.gz.

File metadata

  • Download URL: flin_linkedin_posts_mcp-0.2.0.tar.gz
  • Upload date:
  • Size: 21.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for flin_linkedin_posts_mcp-0.2.0.tar.gz
Algorithm Hash digest
SHA256 ef51f2dad7eb4b906499e7f6d026b45adaf6161f27d781908119d20c3d08318e
MD5 a69b60c33bd01ed066c4316f73bfae1b
BLAKE2b-256 22dfda1bb8cbbe76650c4799261e98d810e4a54be72c80c98fa2546ed9418572

See more details on using hashes here.

Provenance

The following attestation bundles were made for flin_linkedin_posts_mcp-0.2.0.tar.gz:

Publisher: release.yml on flin-agency/flin-linkedin-posts-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 flin_linkedin_posts_mcp-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for flin_linkedin_posts_mcp-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ab4e0dca145959d276ba25791772e4f331e61edb99fa405b61c0520f79e1887d
MD5 f944dcb2e814ef0cdf33b0bb09063d18
BLAKE2b-256 a2fd86f9615411ce2c00246b3127a994e37a2e33cc168d402924eae17aa0c6c9

See more details on using hashes here.

Provenance

The following attestation bundles were made for flin_linkedin_posts_mcp-0.2.0-py3-none-any.whl:

Publisher: release.yml on flin-agency/flin-linkedin-posts-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