# How to Configure LinkedIn Access in Agent Reach Using linkedin-mcp or Jina Reader

> Configure LinkedIn access in Agent Reach with linkedin-mcp or Jina Reader. Learn to set up LinkedIn scraping for your outreach campaigns efficiently.

- Repository: [Pnant/Agent-Reach](https://github.com/Panniantong/Agent-Reach)
- Tags: how-to-guide
- Published: 2026-06-14

---

**Agent Reach supports two backends for LinkedIn access: the full-featured `linkedin-scraper-mcp` server requiring `mcporter` configuration, or the zero-install Jina Reader fallback for public pages.**

The **Panniantong/Agent-Reach** repository treats LinkedIn as a tier-2 channel, meaning you can configure LinkedIn access in Agent Reach through either a dedicated MCP server for rich data extraction or a simple HTTP fallback for basic page rendering. According to the source code in [`agent_reach/channels/linkedin.py`](https://github.com/Panniantong/Agent-Reach/blob/main/agent_reach/channels/linkedin.py), the system automatically detects which backend is available and prefers the MCP implementation when present.

## Understanding LinkedIn Backend Options

Agent Reach implements a dual-backend strategy for LinkedIn integration. The `LinkedInChannel.check()` method (lines 22-41 in [`agent_reach/channels/linkedin.py`](https://github.com/Panniantong/Agent-Reach/blob/main/agent_reach/channels/linkedin.py)) probes for available services and sets the `active_backend` attribute accordingly.

### Full Access with linkedin-scraper-mcp

The **linkedin-scraper-mcp** backend provides API-like access to LinkedIn profiles, companies, and job searches. This requires installing the Python package `linkedin-scraper-mcp` and running the `mcporter` MCP server runtime. When properly configured, `LinkedInChannel.check()` returns `status: "ok"` and enables structured data extraction.

### Fallback with Jina Reader

The **Jina Reader** backend requires no installation and renders public LinkedIn pages as Markdown via `https://r.jina.ai/`. If the `mcporter` probe fails, the channel automatically falls back to this method, setting `active_backend = "Jina Reader"` and returning `status: "off"` (but remaining usable).

## Installing the linkedin-scraper-mcp Backend

To enable full LinkedIn functionality including structured profile and company data, follow these steps:

1. **Install the Python package**

   ```bash
   pip install linkedin-scraper-mcp
   ```

2. **Install the MCP server runner**

   Agent Reach requires `mcporter` to host the LinkedIn MCP server. Install it globally via npm:

   ```bash
   npm install -g mcporter
   ```

3. **Start the LinkedIn MCP server**

   Run the server using Docker (default port 3000):

   ```bash
   docker run -d --name linkedin-mcp -p 3000:3000 stickerdaniel/linkedin-mcp-server
   ```

   Alternatively, start it locally if you have the source:

   ```bash
   mcporter serve linkedin
   ```

4. **Register the backend with mcporter**

   Agent Reach expects the service under the name `linkedin`:

   ```bash
   mcporter config add linkedin http://localhost:3000/mcp
   ```

   Verify registration with:

   ```bash
   mcporter config list
   ```

   You should see output containing:
   
   ```

   linkedin  http://localhost:3000/mcp
   ```

5. **Verify Agent Reach detection**

   Run the health check to confirm the channel detects your MCP server:

   ```bash
   agent-reach doctor --json | jq .linkedin
   ```

   Expected output:

   ```json
   {
     "status": "ok",
     "message": "完整可用（Profile、公司、职位搜索）"
   }
   ```

The probing logic in [`agent_reach/probe.py`](https://github.com/Panniantong/Agent-Reach/blob/main/agent_reach/probe.py) (lines 46-77) executes `mcporter config list` and searches for the string "linkedin" to determine availability.

## Using the Jina Reader Backend (No Installation)

If you prefer not to run an MCP server, Agent Reach automatically uses Jina Reader for any public LinkedIn URL:

```bash
agent-reach read https://www.linkedin.com/in/example-profile

```

This command invokes `LinkedInChannel.read()`, which forwards to the selected backend. With Jina Reader active, the output is a Markdown rendering of the HTML page suitable for LLM consumption or quick browsing. No additional configuration is required; simply ensure the `mcporter` service is not running or registered.

## Verifying and Troubleshooting Configuration

The `agent-reach doctor` command runs `LinkedInChannel.check()` to report which backend is active. The check logic in [`linkedin.py`](https://github.com/Panniantong/Agent-Reach/blob/main/linkedin.py) executes `probe_command("mcporter", ["config", "list"])` and parses the output:

- If the command succeeds and contains "linkedin", the channel marks `active_backend = "linkedin-scraper-mcp"` and reports **ok**
- If the probe fails, it falls back to **Jina Reader** and reports **off**

To force a specific backend, control the `mcporter` service availability:

- **Enable MCP**: Ensure `mcporter config list` shows the LinkedIn entry and the Docker container is running
- **Disable MCP**: Stop the container (`docker stop linkedin-mcp`) or remove the config (`mcporter config remove linkedin`)

## How Backend Selection Works in the Source Code

The channel implementation in [`agent_reach/channels/linkedin.py`](https://github.com/Panniantong/Agent-Reach/blob/main/agent_reach/channels/linkedin.py) defines the discovery logic:

- `LinkedInChannel.check()` (lines 22-41): Probes for `mcporter` and sets backend priority
- [`agent_reach/probe.py`](https://github.com/Panniantong/Agent-Reach/blob/main/agent_reach/probe.py): Contains the `probe_command` utility that classifies command execution as *missing*, *broken*, *ok*, *timeout*, or *error*
- [`agent_reach/cli.py`](https://github.com/Panniantong/Agent-Reach/blob/main/agent_reach/cli.py): Lines 96-106 define `CHANNEL_INSTALLERS`, noting LinkedIn as "manual setup, no auto-install"

The CLI entry points `_cmd_install` and `_cmd_doctor` in [`cli.py`](https://github.com/Panniantong/Agent-Reach/blob/main/cli.py) handle the installation guidance and health check reporting.

## Summary

- **Agent Reach** detects LinkedIn backends automatically through the `LinkedInChannel.check()` method in [`agent_reach/channels/linkedin.py`](https://github.com/Panniantong/Agent-Reach/blob/main/agent_reach/channels/linkedin.py)
- **Full functionality** requires installing `linkedin-scraper-mcp`, running the `mcporter` server, and registering the service via `mcporter config add linkedin`
- **Zero-config fallback** uses Jina Reader for public LinkedIn pages when the MCP server is unavailable
- **Verification** uses `agent-reach doctor --json` to check which backend is active based on `mcporter` probe results
- **Backend switching** is controlled by starting or stopping the MCP Docker container

## Frequently Asked Questions

### Do I need a LinkedIn API key to use Agent Reach?

No. Agent Reach does not use the official LinkedIn API. The `linkedin-scraper-mcp` backend uses web scraping techniques through the MCP server, while the Jina Reader backend fetches public HTML pages and converts them to Markdown. Neither method requires API credentials, though you should respect LinkedIn's robots.txt and terms of service.

### Can I switch between backends without reinstalling Agent Reach?

Yes. Simply start or stop the `mcporter` service. When `mcporter` is running and configured with `mcporter config add linkedin`, Agent Reach automatically selects the full MCP backend. When the service is stopped or unregistered, the `LinkedInChannel.check()` method falls back to Jina Reader. No changes to Agent Reach configuration files are needed.

### Is Jina Reader sufficient for scraping company data?

Jina Reader only renders public HTML pages as Markdown, so it works for publicly visible LinkedIn profiles and company pages. However, it cannot access structured data like connection lists, job applicant details, or private profile sections. For programmatic access to LinkedIn data fields, you must configure the `linkedin-scraper-mcp` backend.

### Where does Agent Reach store the backend configuration?

Agent Reach itself does not store LinkedIn credentials. The `linkedin-scraper-mcp` backend stores its configuration in `mcporter`'s config file (typically `~/.mcporter.yaml`), which Agent Reach probes at runtime using `mcporter config list`. The Jina Reader backend requires no local storage and operates statelessly via HTTP requests to `https://r.jina.ai/`.