# Directory Structure ``` ├── .gitignore ├── .python-version ├── pyproject.toml ├── README.md ├── server.py └── uv.lock ``` # Files -------------------------------------------------------------------------------- /.python-version: -------------------------------------------------------------------------------- ``` 3.12 ``` -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- ``` # Python-generated files __pycache__/ *.py[oc] build/ dist/ wheels/ *.egg-info # Virtual environments .venv .env ``` -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- ```markdown # LinkedIn Profile Scraper This project is a LinkedIn Profile Scraper built using FastMCP and httpx to fetch LinkedIn profile data via the RapidAPI LinkedIn Profile Scraper API. ## Features + Retrieves LinkedIn profile data asynchronously. + Allows selective inclusion of data like skills, certifications, and more. + Uses FastMCP for structured execution. + Integrated with Claude Desktop for AI-powered processing. ## Prerequisites + A RapidAPI account with access to the LinkedIn Profile Scraper API. + A valid RAPIDAPI_KEY. + Installed dependencies from requirements.txt. # Video Link: https://drive.google.com/file/d/1I3V8SlOgvMgg8hiMxO3Z2lrZl7v00VqM/view?usp=sharing ``` -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- ```toml [project] name = "linkedln-mcp" version = "0.1.0" description = "Add your description here" readme = "README.md" requires-python = ">=3.12" dependencies = [ "httpx>=0.28.1", "mcp[cli]>=1.4.1", ] ``` -------------------------------------------------------------------------------- /server.py: -------------------------------------------------------------------------------- ```python from typing import Any import httpx import json from mcp.server.fastmcp import FastMCP import os from dotenv import load_dotenv load_dotenv() RAPIDAPI_KEY = os.getenv("RAPIDAPI_KEY") if not RAPIDAPI_KEY: raise ValueError("RAPIDAPI_KEY is not set in the environment variables") mcp = FastMCP("linkedin_profile_scrapper") LINKEDIN_API_BASE = "https://fresh-linkedin-profile-data.p.rapidapi.com" RAPIDAPI_HOST = "fresh-linkedin-profile-data.p.rapidapi.com" async def get_linkedin_data(linkedin_url: str) -> dict[str, Any] | None: params = { "linkedin_url": linkedin_url, "include_skills": "true", "include_certifications": "false", "include_publications": "false", "include_honors": "false", "include_volunteers": "false", "include_projects": "false", "include_patents": "false", "include_courses": "false", "include_organizations": "false", "include_profile_status": "false", "include_company_public_url": "false" } headers = { "x-rapidapi-key": RAPIDAPI_KEY, "x-rapidapi-host": RAPIDAPI_HOST } async with httpx.AsyncClient() as client: try: response = await client.get( f"{LINKEDIN_API_BASE}/get-linkedin-profile", headers=headers, params=params, timeout=30.0 ) response.raise_for_status() return response.json() except Exception: return None @mcp.tool() async def get_profile(linkedin_url: str) -> str: data = await get_linkedin_data(linkedin_url) if not data: return "Unable to fetch LinkedIn profile data." return json.dumps(data, indent=2) if __name__ == "__main__": mcp.run(transport="stdio") ```