LinkedIn Model Context Protocol (MCP) Server
Project description
LinkedIn Model Context Protocol (MCP) Server
A powerful Model Context Protocol server for LinkedIn interactions that enables AI assistants to search for jobs, generate resumes and cover letters, and manage job applications programmatically.
Features
- Authentication: Secure OAuth 2.0 authentication with token refresh
- Profile Management: Access and update LinkedIn profile information
- Job Search: Advanced job search with filtering and pagination
- Resume & Cover Letters: Generate tailored resumes and cover letters
- Messaging: Send messages and connection requests
- Analytics: Track job applications and engagement metrics
- Async API: Built with asyncio for high performance
- Modular Design: Clean, maintainable code with separation of concerns
Architecture
This project implements the Model Context Protocol (MCP) specification, allowing AI assistants to interact with LinkedIn through standardized JSON-RPC style requests and responses.
Project Structure
linkedin_mcp/
├── api/
│ ├── clients/ # API client implementations
│ │ ├── __init__.py # Client factory functions
│ │ ├── linkedin.py # LinkedIn API client
│ │ └── openai.py # OpenAI integration
│ │
│ ├── models/ # Data models and schemas
│ │ ├── __init__.py # Model exports
│ │ ├── common.py # Common data models
│ │ ├── enums.py # Enumerations
│ │ ├── requests.py # Request models
│ │ └── responses.py # Response models
│ │
│ └── services/ # Business logic
│ └── ...
│
├── core/ # Core application logic
│ ├── __init__.py
│ ├── exceptions.py # Custom exceptions
│ ├── mcp_handler.py # MCP protocol handler
│ └── protocol.py # Protocol definitions
│
├── utils/ # Utility functions
│ ├── __init__.py
│ ├── auth.py # Authentication helpers
│ ├── rate_limiter.py # Rate limiting
│ └── retry.py # Retry mechanisms
│
├── examples/ # Example scripts
│ └── basic_usage.py # Basic client usage example
│
├── .env.example # Example environment variables
├── README.md # This file
└── requirements.txt # Project dependencies
Getting Started
Prerequisites
- Python 3.8+
- LinkedIn Developer Account
- OAuth 2.0 credentials from LinkedIn Developers
Installation
-
Clone the repository
git clone https://github.com/yourusername/linkedin-mcp.git cd linkedin-mcp
-
Create and activate a virtual environment
# Linux/macOS python -m venv venv source venv/bin/activate # Windows python -m venv venv .\venv\Scripts\activate
-
Install dependencies
pip install -r requirements.txt
-
Set up environment variables
cp .env.example .env
Edit the
.envfile with your LinkedIn API credentials and other settings.
Configuration
Create a .env file in the project root with the following variables (see .env.example for details):
# LinkedIn API Credentials (required)
LINKEDIN_CLIENT_ID=your_client_id_here
LINKEDIN_CLIENT_SECRET=your_client_secret_here
LINKEDIN_REDIRECT_URI=http://localhost:8080/callback
# Optional: OpenAI API Key (for resume/cover letter generation)
# OPENAI_API_KEY=your_openai_api_key_here
# Optional: Logging
LOG_LEVEL=INFO
# API Settings
OPENAI_API_KEY=your_openai_api_key
SESSION_DIR=sessions
DATA_DIR=data
Usage
Starting the Server
python server.py
Example MCP Requests
Authentication
{
"jsonrpc": "2.0",
"id": 1,
"method": "linkedin.login",
"params": {
"username": "user@example.com",
"password": "password123"
}
}
Searching for Jobs
{
"jsonrpc": "2.0",
"id": 2,
"method": "linkedin.searchJobs",
"params": {
"filter": {
"keywords": "software engineer",
"location": "New York, NY",
"distance": 25
},
"page": 1,
"count": 20
}
}
Generating a Resume
{
"jsonrpc": "2.0",
"id": 3,
"method": "linkedin.generateResume",
"params": {
"profileId": "user123",
"template": "standard",
"format": "pdf"
}
}
Available Methods
| Method | Description |
|---|---|
linkedin.login |
Authenticate with LinkedIn |
linkedin.logout |
End the current session |
linkedin.checkSession |
Check if the current session is valid |
linkedin.getFeed |
Get LinkedIn feed posts |
linkedin.getProfile |
Get LinkedIn profile information |
linkedin.getCompany |
Get company profile information |
linkedin.searchJobs |
Search for jobs with filters |
linkedin.getJobDetails |
Get detailed information about a job |
linkedin.getRecommendedJobs |
Get job recommendations |
linkedin.generateResume |
Generate a resume from a LinkedIn profile |
linkedin.generateCoverLetter |
Generate a cover letter for a job application |
linkedin.tailorResume |
Customize a resume for a specific job |
linkedin.applyToJob |
Apply to a job |
linkedin.getApplicationStatus |
Check application status |
linkedin.getSavedJobs |
Get saved jobs |
linkedin.saveJob |
Save a job for later |
Development
Project Structure
linkedin-mcp/
├── README.md
├── requirements.txt
├── server.py
├── data/
│ ├── applications/
│ ├── companies/
│ ├── cover_letters/
│ ├── jobs/
│ ├── profiles/
│ └── resumes/
├── linkedin_mcp/
│ ├── api/
│ │ ├── auth.py
│ │ ├── cover_letter_generator.py
│ │ ├── job_application.py
│ │ ├── job_search.py
│ │ ├── profile.py
│ │ └── resume_generator.py
│ ├── core/
│ │ ├── mcp_handler.py
│ │ └── protocol.py
│ └── utils/
│ └── config.py
├── sessions/
└── templates/
├── cover_letter/
│ └── standard.html
└── resume/
└── standard.html
Running Tests
pytest
License
This project is licensed under the MIT License - see the LICENSE file for details.
Acknowledgments
- LinkedIn API documentation
- Model Context Protocol specification
Project details
Release history Release notifications | RSS feed
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 iflow_mcp_rayyan9477_linkedin_mcp-0.1.0.tar.gz.
File metadata
- Download URL: iflow_mcp_rayyan9477_linkedin_mcp-0.1.0.tar.gz
- Upload date:
- Size: 62.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4e374c0a77a25bcd99a98b20c0a4fab8d5eb2028d155f7895eeb7a5226c0ddaa
|
|
| MD5 |
957152573fdc1550d5b0814af58de53c
|
|
| BLAKE2b-256 |
ceb6aae725d489d91bd13ade6d35805a9baac2a3cfcbec1ffd67559a6bec0248
|
File details
Details for the file iflow_mcp_rayyan9477_linkedin_mcp-0.1.0-py3-none-any.whl.
File metadata
- Download URL: iflow_mcp_rayyan9477_linkedin_mcp-0.1.0-py3-none-any.whl
- Upload date:
- Size: 75.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.0 {"installer":{"name":"uv","version":"0.10.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a016ad12925199915b732e286ee58af4c808fc0bdda43cc2125570b994b6cda3
|
|
| MD5 |
879fc743c40e1cf1e6709da5c9e4229b
|
|
| BLAKE2b-256 |
14a9083cf7609c6f27715bf9b5db197019e0335cd9177a9074f2c77b36dfb691
|