Remote MCP connector wrapping linkedin-mcp-scheduler with LinkedIn OAuth 2.0 over Streamable HTTP
Project description
linkedin-scheduler-remote
Remote MCP server wrapping linkedin-mcp-scheduler with LinkedIn OAuth 2.0 and Streamable HTTP transport — designed for Claude.ai connectors.
How it works
Claude.ai ──HTTP+Bearer──> linkedin-scheduler-remote ──LinkedIn API──> LinkedIn
│
imports linkedin-mcp-scheduler's FastMCP (all 8 tools)
patches get_client() with per-request ContextVar
adds LinkedIn OAuth + /health + /oauth/callback
Three-party OAuth: Claude <-> this server <-> LinkedIn. Each user authorizes their own LinkedIn account via OAuth. The server stores per-user LinkedIn access tokens (encrypted at rest).
Prerequisites
- A LinkedIn Developer App at LinkedIn Developer Portal:
- Create an app (or use existing)
- Under Auth settings, add authorized redirect URL:
{BASE_URL}/oauth/callback - Note the Client ID and Client Secret
- Ensure the app has the products: "Share on LinkedIn" and "Sign In with LinkedIn using OpenID Connect"
- Scopes required:
openid,profile,email,w_member_social
Setup
git clone https://github.com/ldraney/linkedin-scheduler-remote.git
cd linkedin-scheduler-remote
cp .env.example .env
# Edit .env with your LinkedIn OAuth credentials, BASE_URL, and SESSION_SECRET
make install
make run
Environment Variables
| Variable | Description |
|---|---|
LINKEDIN_OAUTH_CLIENT_ID |
LinkedIn app Client ID |
LINKEDIN_OAUTH_CLIENT_SECRET |
LinkedIn app Client Secret |
SESSION_SECRET |
Random secret for encrypting token store |
BASE_URL |
Public HTTPS URL where this server is reachable |
HOST |
Bind address (default: 127.0.0.1) |
PORT |
Listen port (default: 8002) |
Verification
curl http://127.0.0.1:8002/health # {"status": "ok"}
curl http://127.0.0.1:8002/.well-known/oauth-authorization-server # OAuth metadata
curl -X POST http://127.0.0.1:8002/mcp # 401 (auth required)
Tools (8)
All scheduling tools from linkedin-mcp-scheduler are exposed:
- schedule_post — Schedule a LinkedIn post for future publication
- list_scheduled_posts — List posts with optional status filter
- get_scheduled_post — Get details of a scheduled post
- cancel_scheduled_post — Cancel a pending post
- update_scheduled_post — Edit pending post fields
- reschedule_post — Change the scheduled time
- retry_failed_post — Reset failed posts to pending
- queue_summary — Get queue statistics
Deploying
Standalone
Use any HTTPS tunnel (Tailscale Funnel, ngrok, Cloudflare Tunnel) to expose the server publicly, then add the URL as a Claude.ai connector.
A systemd service file is provided in systemd/linkedin-scheduler-mcp-remote.service.
Kubernetes (production)
Production deployment is managed by mcp-gateway-k8s, which runs this server as a pod with Tailscale Funnel ingress.
Design Notes
The scheduler-remote differs from gcal/notion remotes in one key way: there's a daemon (linkedin-mcp-scheduler-daemon) that publishes posts to LinkedIn. Currently operates in single-user mode — the daemon uses its own env-var credentials. Multi-user daemon support (per-user credentials stored with each post) is a future enhancement.
Privacy
See PRIVACY.md for our privacy policy.
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file linkedin_scheduler_remote_ldraney-0.2.0.tar.gz.
File metadata
- Download URL: linkedin_scheduler_remote_ldraney-0.2.0.tar.gz
- Upload date:
- Size: 6.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ccfb5eda174327e156e91f9ac3c3aad1d011a0169b7e9699c54955910f3df73a
|
|
| MD5 |
4a52c6a3de68534b26210b394ab9c9b9
|
|
| BLAKE2b-256 |
55f294cb9dadfd055239d20e7d6d25ad3bd12dfaf7bbd76e3b757a732eda7a4a
|
Provenance
The following attestation bundles were made for linkedin_scheduler_remote_ldraney-0.2.0.tar.gz:
Publisher:
publish.yml on ldraney/linkedin-scheduler-remote
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
linkedin_scheduler_remote_ldraney-0.2.0.tar.gz -
Subject digest:
ccfb5eda174327e156e91f9ac3c3aad1d011a0169b7e9699c54955910f3df73a - Sigstore transparency entry: 974882739
- Sigstore integration time:
-
Permalink:
ldraney/linkedin-scheduler-remote@698ee56972ef8010a31bb9a940884327e6eb7038 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/ldraney
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@698ee56972ef8010a31bb9a940884327e6eb7038 -
Trigger Event:
push
-
Statement type:
File details
Details for the file linkedin_scheduler_remote_ldraney-0.2.0-py3-none-any.whl.
File metadata
- Download URL: linkedin_scheduler_remote_ldraney-0.2.0-py3-none-any.whl
- Upload date:
- Size: 7.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
298a776a98a12914df93e58fad7cbda929b565eb6ede0b3d76fd91f8d3d609c1
|
|
| MD5 |
e7134f75bcb6dd09c34e00f42b5c2799
|
|
| BLAKE2b-256 |
ee4becadd6619e48e75d2af3a552a82865af5dfc00f0d8de990370dd7d766f78
|
Provenance
The following attestation bundles were made for linkedin_scheduler_remote_ldraney-0.2.0-py3-none-any.whl:
Publisher:
publish.yml on ldraney/linkedin-scheduler-remote
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
linkedin_scheduler_remote_ldraney-0.2.0-py3-none-any.whl -
Subject digest:
298a776a98a12914df93e58fad7cbda929b565eb6ede0b3d76fd91f8d3d609c1 - Sigstore transparency entry: 974882768
- Sigstore integration time:
-
Permalink:
ldraney/linkedin-scheduler-remote@698ee56972ef8010a31bb9a940884327e6eb7038 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/ldraney
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@698ee56972ef8010a31bb9a940884327e6eb7038 -
Trigger Event:
push
-
Statement type: