Skip to content

Commit 93cde28

Browse files
feat(mcpb): add one-click bootstrap (#251)
2 parents 5a66b1c + 7cc5fee commit 93cde28

23 files changed

Lines changed: 842 additions & 206 deletions

.github/workflows/release.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ jobs:
7474
run: |
7575
set -e
7676
sed -i 's/"version": ".*"/"version": "'$VERSION'"/' manifest.json
77-
sed -i 's/stickerdaniel\/linkedin-mcp-server:[^"]*/stickerdaniel\/linkedin-mcp-server:'$VERSION'/' manifest.json
7877
sed -i 's/stickerdaniel\/linkedin-mcp-server:[^ ]*/stickerdaniel\/linkedin-mcp-server:'$VERSION'/' docker-compose.yml
7978
echo "✅ Updated manifest.json and docker-compose.yml to version $VERSION"
8079
@@ -171,10 +170,11 @@ jobs:
171170
- name: Optimize uv cache for CI
172171
run: uv cache prune --ci
173172

174-
- name: Build DXT extension
173+
- name: Validate and build MCP bundle
175174
run: |
176-
bunx @anthropic-ai/dxt pack
177-
mv linkedin-mcp-server.dxt linkedin-mcp-server-v$VERSION.dxt
175+
bunx @anthropic-ai/mcpb validate
176+
bunx @anthropic-ai/mcpb pack
177+
mv linkedin-mcp-server.mcpb linkedin-mcp-server-v$VERSION.mcpb
178178
179179
- name: Generate release notes
180180
run: |
@@ -188,7 +188,7 @@ jobs:
188188
with:
189189
tag_name: v${{ env.VERSION }}
190190
files: |
191-
*.dxt
191+
*.mcpb
192192
generate_release_notes: true
193193
draft: false
194194
prerelease: false

.mcpbignore

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
.git
2+
.github
3+
.claude
4+
.cursor
5+
.gemini
6+
.mcp.json
7+
.opencode
8+
.vscode
9+
.venv
10+
.venv.*
11+
.pytest_cache
12+
.ruff_cache
13+
.coverage
14+
.coverage.*
15+
.debug
16+
__pycache__
17+
build
18+
dist
19+
htmlcov
20+
docs
21+
scripts
22+
tests
23+
AGENTS.md
24+
CLAUDE.md
25+
CONTRIBUTING.md
26+
docker-compose.yml
27+
Dockerfile
28+
RELEASE_NOTES_TEMPLATE.md
29+
btca.config.jsonc
30+
pytest.ini
31+
renovate.json
32+
*.mcpb
33+
*.dxt
34+
.DS_Store

README.md

Lines changed: 23 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ Through this LinkedIn MCP server, AI assistants like Claude can connect to your
1313

1414
[![uvx](https://img.shields.io/badge/uvx-Quick_Install-de5fe9?style=for-the-badge&logo=data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDEiIGhlaWdodD0iNDEiIHZpZXdCb3g9IjAgMCA0MSA0MSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTS01LjI4NjE5ZS0wNiAwLjE2ODYyOUwwLjA4NDMwOTggMjAuMTY4NUwwLjE1MTc2MiAzNi4xNjgzQzAuMTYxMDc1IDM4LjM3NzQgMS45NTk0NyA0MC4xNjA3IDQuMTY4NTkgNDAuMTUxNEwyMC4xNjg0IDQwLjA4NEwzMC4xNjg0IDQwLjA0MThMMzEuMTg1MiA0MC4wMzc1QzMzLjM4NzcgNDAuMDI4MiAzNS4xNjgzIDM4LjIwMjYgMzUuMTY4MyAzNlYzNkwzNy4wMDAzIDM2TDM3LjAwMDMgMzkuOTk5Mkw0MC4xNjgzIDM5Ljk5OTZMMzkuOTk5NiAtOS45NDY1M2UtMDdMMjEuNTk5OCAwLjA3NzU2ODlMMjEuNjc3NCAxNi4wMTg1TDIxLjY3NzQgMjUuOTk5OEwyMC4wNzc0IDI1Ljk5OThMMTguMzk5OCAyNS45OTk4TDE4LjQ3NzQgMTYuMDMyTDE4LjM5OTggMC4wOTEwNTkzTC01LjI4NjE5ZS0wNiAwLjE2ODYyOVoiIGZpbGw9IiNERTVGRTkiLz4KPC9zdmc+Cg==)](#-uvx-setup-recommended---universal)
1515
[![Docker](https://img.shields.io/badge/Docker-Universal_MCP-008fe2?style=for-the-badge&logo=docker&logoColor=008fe2)](#-docker-setup)
16-
[![Install DXT Extension](https://img.shields.io/badge/Claude_Desktop_DXT-d97757?style=for-the-badge&logo=anthropic)](#-claude-desktop-dxt-extension)
16+
[![Install MCP Bundle](https://img.shields.io/badge/Claude_Desktop_MCPB-d97757?style=for-the-badge&logo=anthropic)](#-claude-desktop-mcp-bundle-formerly-dxt)
1717
[![Development](https://img.shields.io/badge/Development-Local-ffdc53?style=for-the-badge&logo=python&logoColor=ffdc53)](#-local-setup-develop--contribute)
1818

1919
<https://github.com/user-attachments/assets/eb84419a-6eaf-47bd-ac52-37bc59c83680>
@@ -60,19 +60,11 @@ When one section fails but the overall tool call still completes, responses may
6060

6161
## 🚀 uvx Setup (Recommended - Universal)
6262

63-
**Prerequisites:** [Install uv](https://docs.astral.sh/uv/getting-started/installation/) and run `uvx patchright install chromium` to set up the browser.
63+
**Prerequisites:** [Install uv](https://docs.astral.sh/uv/getting-started/installation/).
6464

6565
### Installation
6666

67-
**Step 1: Create a session (first time only)**
68-
69-
```bash
70-
uvx linkedin-scraper-mcp --login
71-
```
72-
73-
This opens a browser for you to log in manually (5 minute timeout for 2FA, captcha, etc.). The browser profile is saved to `~/.linkedin-mcp/profile/`.
74-
75-
**Step 2: Client Configuration:**
67+
**Client Configuration**
7668

7769
```json
7870
{
@@ -85,8 +77,10 @@ This opens a browser for you to log in manually (5 minute timeout for 2FA, captc
8577
}
8678
```
8779

80+
The server starts quickly, prepares the shared Patchright Chromium browser cache in the background under `~/.linkedin-mcp/patchright-browsers`, and opens a LinkedIn login browser window on the first tool call that needs authentication.
81+
8882
> [!NOTE]
89-
> Sessions may expire over time. If you encounter authentication issues, run `uvx linkedin-scraper-mcp --login` again
83+
> Early tool calls may return a setup/authentication-in-progress error until browser setup or login finishes. If you prefer to create a session explicitly, run `uvx linkedin-scraper-mcp --login`.
9084
9185
### uvx Setup Help
9286

@@ -117,9 +111,6 @@ This opens a browser for you to log in manually (5 minute timeout for 2FA, captc
117111
**Basic Usage Examples:**
118112

119113
```bash
120-
# Create a session interactively
121-
uvx linkedin-scraper-mcp --login
122-
123114
# Run with debug logging
124115
uvx linkedin-scraper-mcp --log-level DEBUG
125116
```
@@ -158,6 +149,7 @@ parallel. Use `--log-level DEBUG` to see scraper lock wait/acquire/release logs.
158149
**Session issues:**
159150

160151
- Browser profile is stored at `~/.linkedin-mcp/profile/`
152+
- Managed browser downloads are cached at `~/.linkedin-mcp/patchright-browsers/`
161153
- Make sure you have only one active LinkedIn session at a time
162154

163155
**Login issues:**
@@ -301,40 +293,29 @@ Runtime server logs are emitted by FastMCP/Uvicorn.
301293
<br/>
302294
<br/>
303295

304-
## 📦 Claude Desktop (DXT Extension)
296+
## 📦 Claude Desktop MCP Bundle (formerly DXT)
305297

306-
**Prerequisites:** [Claude Desktop](https://claude.ai/download) and [Docker](https://www.docker.com/get-started/) installed & running
298+
**Prerequisites:** [Claude Desktop](https://claude.ai/download).
307299

308300
**One-click installation** for Claude Desktop users:
309301

310-
1. Download the [DXT extension](https://github.com/stickerdaniel/linkedin-mcp-server/releases/latest)
311-
2. Double-click to install into Claude Desktop
312-
3. Create a session: `uvx linkedin-scraper-mcp --login`
302+
1. Download the latest `.mcpb` artifact from [releases](https://github.com/stickerdaniel/linkedin-mcp-server/releases/latest)
303+
2. Double-click to install it into Claude Desktop
304+
3. Restart Claude Desktop
305+
4. Call any LinkedIn tool
313306

314-
> [!NOTE]
315-
> Sessions may expire over time. If you encounter authentication issues, run `uvx linkedin-scraper-mcp --login` again.
307+
On startup, the MCP Bundle starts preparing the shared Patchright Chromium browser cache in the background. If you call a tool too early, Claude will surface a setup-in-progress error. On the first tool call that needs authentication, the server opens a LinkedIn login browser window and asks you to retry after sign-in.
316308

317-
### DXT Extension Setup Help
309+
### MCP Bundle Setup Help
318310

319311
<details>
320312
<summary><b>❗ Troubleshooting</b></summary>
321313

322-
**First-time setup timeout:**
314+
**First-time setup behavior:**
323315

324-
- Claude Desktop has a ~60 second connection timeout
325-
- If the Docker image isn't cached, the pull may exceed this timeout
326-
- **Fix:** Pre-pull the image before first use:
327-
328-
```bash
329-
docker pull stickerdaniel/linkedin-mcp-server:2.3.0
330-
```
331-
332-
- Then restart Claude Desktop
333-
334-
**Docker issues:**
335-
336-
- Make sure [Docker](https://www.docker.com/get-started/) is installed
337-
- Check if Docker is running: `docker ps`
316+
- Claude Desktop starts the bundle immediately; browser setup continues in the background
317+
- If the Patchright Chromium browser is still downloading, retry the tool after a short wait
318+
- Managed browser downloads are shared under `~/.linkedin-mcp/patchright-browsers/`
338319

339320
**Login issues:**
340321

@@ -373,19 +354,15 @@ curl -LsSf https://astral.sh/uv/install.sh | sh
373354
uv sync
374355
uv sync --group dev
375356

376-
# 4. Install Patchright browser
377-
uv run patchright install chromium
378-
379-
# 5. Install pre-commit hooks
357+
# 4. Install pre-commit hooks
380358
uv run pre-commit install
381359

382-
# 6. Create a session (first time only)
383-
uv run -m linkedin_mcp_server --login
384-
385-
# 7. Start the server
360+
# 5. Start the server
386361
uv run -m linkedin_mcp_server
387362
```
388363

364+
The local server uses the same managed-runtime flow as MCPB and `uvx`: it prepares the Patchright Chromium browser cache in the background and opens LinkedIn login on the first auth-requiring tool call. You can still run `uv run -m linkedin_mcp_server --login` when you want to create the session explicitly.
365+
389366
### Local Setup Help
390367

391368
<details>

RELEASE_NOTES_TEMPLATE.md

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,10 @@ To pull this specific version, run:
1111
docker pull stickerdaniel/linkedin-mcp-server:${VERSION}
1212
```
1313

14-
## 📦 Update DXT Extension Installation
14+
## 📦 Update MCP Bundle Installation
1515
**For Claude Desktop users:**
16-
1. Download the `.dxt` file below
17-
2. Pre-pull the Docker image to avoid timeout issues:
18-
```bash
19-
docker pull stickerdaniel/linkedin-mcp-server:${VERSION}
20-
```
21-
3. Double-click the `.dxt` file to install in Claude Desktop
22-
4. Restart Claude Desktop
16+
1. Download the `.mcpb` file below
17+
2. Double-click the `.mcpb` file to install in Claude Desktop
18+
3. Restart Claude Desktop
2319

24-
> **Note:** The pre-pull step is important because Claude Desktop has a ~60 second connection timeout. Without pre-pulling, the initial image download may exceed this limit.
20+
> **Note:** MCP Bundles (MCPB) are the renamed successor to DXT/Desktop Extensions.

assets/icons/linkedin.png

14.7 KB
Loading

docs/docker-hub.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ A Model Context Protocol (MCP) server that connects AI assistants to LinkedIn. A
1515

1616
## Quick Start
1717

18-
Create a browser profile locally, then mount it into Docker.
18+
Create a browser profile locally, then mount it into Docker. Docker already includes its own Chromium runtime, so the managed Patchright Chromium browser download used by MCPB/`uvx` is not needed here.
1919

2020
**Step 1: Create profile on the host (one-time setup)**
2121

linkedin_mcp_server/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
- Playwright browser automation with session persistence
1414
- Layered configuration system with secure credential storage
1515
- Docker containerization for easy deployment
16-
- Claude Desktop DXT extension support
16+
- Claude Desktop MCP Bundle (MCPB, formerly DXT) support
1717
1818
Architecture:
1919
- Clean separation between authentication, driver management, and MCP server

0 commit comments

Comments
 (0)